| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/copresence/chrome_whispernet_client.h" | 5 #include "chrome/browser/copresence/chrome_whispernet_client.h" |
| 6 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "chrome/browser/copresence/chrome_whispernet_config.h" |
| 8 #include "chrome/browser/extensions/api/copresence_private/copresence_private_ap
i.h" | 9 #include "chrome/browser/extensions/api/copresence_private/copresence_private_ap
i.h" |
| 9 #include "chrome/browser/extensions/component_loader.h" | 10 #include "chrome/browser/extensions/component_loader.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | 11 #include "chrome/browser/extensions/extension_service.h" |
| 11 #include "chrome/common/extensions/api/copresence_private.h" | 12 #include "chrome/common/extensions/api/copresence_private.h" |
| 12 #include "components/copresence/public/copresence_constants.h" | |
| 13 #include "content/public/browser/browser_context.h" | 13 #include "content/public/browser/browser_context.h" |
| 14 #include "extensions/browser/event_router.h" | 14 #include "extensions/browser/event_router.h" |
| 15 #include "extensions/browser/extension_system.h" | 15 #include "extensions/browser/extension_system.h" |
| 16 #include "grit/browser_resources.h" | 16 #include "grit/browser_resources.h" |
| 17 | 17 |
| 18 using audio_modem::AUDIBLE; |
| 19 using audio_modem::AudioType; |
| 20 using audio_modem::BOTH; |
| 21 using audio_modem::INAUDIBLE; |
| 22 using audio_modem::SamplesCallback; |
| 23 using audio_modem::SuccessCallback; |
| 24 using audio_modem::TokensCallback; |
| 25 |
| 26 namespace copresence_private = extensions::api::copresence_private; |
| 27 |
| 18 namespace { | 28 namespace { |
| 19 | 29 |
| 20 copresence::config::AudioParamData GetDefaultAudioConfig() { | 30 AudioParamData GetDefaultAudioConfig() { |
| 21 copresence::config::AudioParamData config_data = {}; | 31 AudioParamData config_data = {}; |
| 22 config_data.audio_dtmf.coder_sample_rate = | 32 config_data.audio_dtmf.coder_sample_rate = |
| 23 config_data.audio_dsss.coder_sample_rate = copresence::kDefaultSampleRate; | 33 config_data.audio_dsss.coder_sample_rate = |
| 34 audio_modem::kDefaultSampleRate; |
| 24 config_data.audio_dtmf.num_repetitions_to_play = | 35 config_data.audio_dtmf.num_repetitions_to_play = |
| 25 config_data.audio_dsss.num_repetitions_to_play = | 36 config_data.audio_dsss.num_repetitions_to_play = |
| 26 copresence::kDefaultRepetitions; | 37 audio_modem::kDefaultRepetitions; |
| 27 | 38 |
| 28 config_data.audio_dsss.upsampling_factor = copresence::kDefaultBitsPerSample; | 39 config_data.audio_dsss.upsampling_factor = audio_modem::kDefaultBitsPerSample; |
| 29 config_data.audio_dsss.desired_carrier_frequency = | 40 config_data.audio_dsss.desired_carrier_frequency = |
| 30 copresence::kDefaultCarrierFrequency; | 41 audio_modem::kDefaultCarrierFrequency; |
| 31 | 42 |
| 32 config_data.recording_channels = copresence::kDefaultChannels; | 43 config_data.recording_channels = audio_modem::kDefaultChannels; |
| 33 | 44 |
| 34 return config_data; | 45 return config_data; |
| 35 } | 46 } |
| 36 | 47 |
| 37 } // namespace | 48 } // namespace |
| 38 | 49 |
| 39 // static | 50 // static |
| 40 const char ChromeWhispernetClient::kWhispernetProxyExtensionId[] = | 51 const char ChromeWhispernetClient::kWhispernetProxyExtensionId[] = |
| 41 "bpfmnplchembfbdgieamdodgaencleal"; | 52 "bpfmnplchembfbdgieamdodgaencleal"; |
| 42 | 53 |
| 43 // Public: | 54 // Public: |
| 44 | 55 |
| 45 ChromeWhispernetClient::ChromeWhispernetClient( | 56 ChromeWhispernetClient::ChromeWhispernetClient( |
| 46 content::BrowserContext* browser_context) | 57 content::BrowserContext* browser_context) |
| 47 : browser_context_(browser_context), extension_loaded_(false) { | 58 : browser_context_(browser_context), extension_loaded_(false) { |
| 48 } | 59 } |
| 49 | 60 |
| 50 ChromeWhispernetClient::~ChromeWhispernetClient() { | 61 ChromeWhispernetClient::~ChromeWhispernetClient() { |
| 51 } | 62 } |
| 52 | 63 |
| 53 void ChromeWhispernetClient::Initialize( | 64 void ChromeWhispernetClient::Initialize( |
| 54 const copresence::SuccessCallback& init_callback) { | 65 const SuccessCallback& init_callback) { |
| 55 DVLOG(3) << "Initializing whispernet proxy client."; | 66 DVLOG(3) << "Initializing whispernet proxy client."; |
| 56 init_callback_ = init_callback; | 67 init_callback_ = init_callback; |
| 57 | 68 |
| 58 extensions::ExtensionSystem* es = | 69 extensions::ExtensionSystem* es = |
| 59 extensions::ExtensionSystem::Get(browser_context_); | 70 extensions::ExtensionSystem::Get(browser_context_); |
| 60 DCHECK(es); | 71 DCHECK(es); |
| 61 ExtensionService* service = es->extension_service(); | 72 ExtensionService* service = es->extension_service(); |
| 62 DCHECK(service); | 73 DCHECK(service); |
| 63 extensions::ComponentLoader* loader = service->component_loader(); | 74 extensions::ComponentLoader* loader = service->component_loader(); |
| 64 DCHECK(loader); | 75 DCHECK(loader); |
| 65 | 76 |
| 66 // This callback is cancelled in Shutdown(). | 77 // This callback is cancelled in Shutdown(). |
| 67 extension_loaded_callback_ = base::Bind( | 78 extension_loaded_callback_ = base::Bind( |
| 68 &ChromeWhispernetClient::OnExtensionLoaded, base::Unretained(this)); | 79 &ChromeWhispernetClient::OnExtensionLoaded, base::Unretained(this)); |
| 69 | 80 |
| 70 if (!loader->Exists(kWhispernetProxyExtensionId)) { | 81 if (!loader->Exists(kWhispernetProxyExtensionId)) { |
| 71 DVLOG(3) << "Loading Whispernet proxy."; | 82 DVLOG(3) << "Loading Whispernet proxy."; |
| 72 loader->Add(IDR_WHISPERNET_PROXY_MANIFEST, | 83 loader->Add(IDR_WHISPERNET_PROXY_MANIFEST, |
| 73 base::FilePath(FILE_PATH_LITERAL("whispernet_proxy"))); | 84 base::FilePath(FILE_PATH_LITERAL("whispernet_proxy"))); |
| 74 } else { | 85 } else { |
| 75 init_callback_.Run(true); | 86 init_callback_.Run(true); |
| 76 } | 87 } |
| 77 } | 88 } |
| 78 | 89 |
| 79 void ChromeWhispernetClient::Shutdown() { | |
| 80 extension_loaded_callback_.Reset(); | |
| 81 init_callback_.Reset(); | |
| 82 tokens_callback_.Reset(); | |
| 83 samples_callback_.Reset(); | |
| 84 db_callback_.Reset(); | |
| 85 } | |
| 86 | |
| 87 void AudioConfiguration(const copresence::config::AudioParamData& data, | |
| 88 const copresence::SuccessCallback& init_callback) { | |
| 89 } | |
| 90 | |
| 91 void ChromeWhispernetClient::EncodeToken(const std::string& token_str, | 90 void ChromeWhispernetClient::EncodeToken(const std::string& token_str, |
| 92 copresence::AudioType type) { | 91 AudioType type) { |
| 93 DCHECK(extension_loaded_); | 92 DCHECK(extension_loaded_); |
| 94 DCHECK(browser_context_); | 93 DCHECK(browser_context_); |
| 95 DCHECK(extensions::EventRouter::Get(browser_context_)); | 94 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 96 | 95 |
| 97 extensions::api::copresence_private::EncodeTokenParameters params; | 96 copresence_private::EncodeTokenParameters params; |
| 98 params.token.token = token_str; | 97 params.token.token = token_str; |
| 99 params.token.audible = type == copresence::AUDIBLE; | 98 params.token.audible = type == AUDIBLE; |
| 100 scoped_ptr<extensions::Event> event(new extensions::Event( | 99 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 101 extensions::api::copresence_private::OnEncodeTokenRequest::kEventName, | 100 copresence_private::OnEncodeTokenRequest::kEventName, |
| 102 extensions::api::copresence_private::OnEncodeTokenRequest::Create(params), | 101 copresence_private::OnEncodeTokenRequest::Create(params), |
| 103 browser_context_)); | 102 browser_context_)); |
| 104 | 103 |
| 105 extensions::EventRouter::Get(browser_context_) | 104 extensions::EventRouter::Get(browser_context_) |
| 106 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); | 105 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 107 } | 106 } |
| 108 | 107 |
| 109 void ChromeWhispernetClient::DecodeSamples(copresence::AudioType type, | 108 void ChromeWhispernetClient::DecodeSamples(AudioType type, |
| 110 const std::string& samples, | 109 const std::string& samples, |
| 111 const size_t token_length[2]) { | 110 const size_t token_length[2]) { |
| 112 DCHECK(extension_loaded_); | 111 DCHECK(extension_loaded_); |
| 113 DCHECK(browser_context_); | 112 DCHECK(browser_context_); |
| 114 DCHECK(extensions::EventRouter::Get(browser_context_)); | 113 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 115 | 114 |
| 116 extensions::api::copresence_private::DecodeSamplesParameters params; | 115 copresence_private::DecodeSamplesParameters params; |
| 117 params.samples.assign(samples.begin(), samples.end()); | 116 params.samples.assign(samples.begin(), samples.end()); |
| 118 params.decode_audible = | 117 params.decode_audible = |
| 119 type == copresence::AUDIBLE || type == copresence::BOTH; | 118 type == AUDIBLE || type == BOTH; |
| 120 params.decode_inaudible = | 119 params.decode_inaudible = |
| 121 type == copresence::INAUDIBLE || type == copresence::BOTH; | 120 type == INAUDIBLE || type == BOTH; |
| 122 params.audible_token_length = token_length[copresence::AUDIBLE]; | 121 params.audible_token_length = token_length[AUDIBLE]; |
| 123 params.inaudible_token_length = token_length[copresence::INAUDIBLE]; | 122 params.inaudible_token_length = token_length[INAUDIBLE]; |
| 124 | 123 |
| 125 scoped_ptr<extensions::Event> event(new extensions::Event( | 124 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 126 extensions::api::copresence_private::OnDecodeSamplesRequest::kEventName, | 125 copresence_private::OnDecodeSamplesRequest::kEventName, |
| 127 extensions::api::copresence_private::OnDecodeSamplesRequest::Create( | 126 copresence_private::OnDecodeSamplesRequest::Create( |
| 128 params), | 127 params), |
| 129 browser_context_)); | 128 browser_context_)); |
| 130 | 129 |
| 131 extensions::EventRouter::Get(browser_context_) | 130 extensions::EventRouter::Get(browser_context_) |
| 132 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); | 131 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 133 } | 132 } |
| 134 | 133 |
| 135 void ChromeWhispernetClient::DetectBroadcast() { | 134 void ChromeWhispernetClient::DetectBroadcast() { |
| 136 DCHECK(extension_loaded_); | 135 DCHECK(extension_loaded_); |
| 137 DCHECK(browser_context_); | 136 DCHECK(browser_context_); |
| 138 DCHECK(extensions::EventRouter::Get(browser_context_)); | 137 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 139 | 138 |
| 140 scoped_ptr<extensions::Event> event(new extensions::Event( | 139 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 141 extensions::api::copresence_private::OnDetectBroadcastRequest::kEventName, | 140 copresence_private::OnDetectBroadcastRequest::kEventName, |
| 142 make_scoped_ptr(new base::ListValue()), | 141 make_scoped_ptr(new base::ListValue()), |
| 143 browser_context_)); | 142 browser_context_)); |
| 144 | 143 |
| 145 extensions::EventRouter::Get(browser_context_) | 144 extensions::EventRouter::Get(browser_context_) |
| 146 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); | 145 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 147 } | 146 } |
| 148 | 147 |
| 149 void ChromeWhispernetClient::RegisterTokensCallback( | 148 void ChromeWhispernetClient::RegisterTokensCallback( |
| 150 const copresence::TokensCallback& tokens_callback) { | 149 const TokensCallback& tokens_callback) { |
| 151 tokens_callback_ = tokens_callback; | 150 tokens_callback_ = tokens_callback; |
| 152 } | 151 } |
| 153 | 152 |
| 154 void ChromeWhispernetClient::RegisterSamplesCallback( | 153 void ChromeWhispernetClient::RegisterSamplesCallback( |
| 155 const copresence::SamplesCallback& samples_callback) { | 154 const SamplesCallback& samples_callback) { |
| 156 samples_callback_ = samples_callback; | 155 samples_callback_ = samples_callback; |
| 157 } | 156 } |
| 158 | 157 |
| 159 void ChromeWhispernetClient::RegisterDetectBroadcastCallback( | 158 void ChromeWhispernetClient::RegisterDetectBroadcastCallback( |
| 160 const copresence::SuccessCallback& db_callback) { | 159 const SuccessCallback& db_callback) { |
| 161 db_callback_ = db_callback; | 160 db_callback_ = db_callback; |
| 162 } | 161 } |
| 163 | 162 |
| 164 copresence::TokensCallback ChromeWhispernetClient::GetTokensCallback() { | 163 TokensCallback ChromeWhispernetClient::GetTokensCallback() { |
| 165 return tokens_callback_; | 164 return tokens_callback_; |
| 166 } | 165 } |
| 167 | 166 |
| 168 copresence::SamplesCallback ChromeWhispernetClient::GetSamplesCallback() { | 167 SamplesCallback ChromeWhispernetClient::GetSamplesCallback() { |
| 169 return samples_callback_; | 168 return samples_callback_; |
| 170 } | 169 } |
| 171 | 170 |
| 172 copresence::SuccessCallback | 171 SuccessCallback ChromeWhispernetClient::GetDetectBroadcastCallback() { |
| 173 ChromeWhispernetClient::GetDetectBroadcastCallback() { | |
| 174 return db_callback_; | 172 return db_callback_; |
| 175 } | 173 } |
| 176 | 174 |
| 177 copresence::SuccessCallback ChromeWhispernetClient::GetInitializedCallback() { | 175 SuccessCallback ChromeWhispernetClient::GetInitializedCallback() { |
| 178 return extension_loaded_callback_; | 176 return extension_loaded_callback_; |
| 179 } | 177 } |
| 180 | 178 |
| 181 // Private: | 179 // Private: |
| 182 | 180 |
| 183 void ChromeWhispernetClient::AudioConfiguration( | 181 void ChromeWhispernetClient::AudioConfiguration( |
| 184 const copresence::config::AudioParamData& params) { | 182 const AudioParamData& params) { |
| 185 DCHECK(browser_context_); | 183 DCHECK(browser_context_); |
| 186 DCHECK(extensions::EventRouter::Get(browser_context_)); | 184 DCHECK(extensions::EventRouter::Get(browser_context_)); |
| 187 | 185 |
| 188 extensions::api::copresence_private::AudioParameters audio_params; | 186 copresence_private::AudioParameters audio_params; |
| 189 | 187 |
| 190 // We serialize AudioConfigData to a string and send it to the whispernet | 188 // We serialize AudioConfigData to a string and send it to the whispernet |
| 191 // nacl wrapper. | 189 // nacl wrapper. |
| 192 const size_t params_size = sizeof(params); | 190 const size_t params_size = sizeof(params); |
| 193 audio_params.param_data.resize(params_size); | 191 audio_params.param_data.resize(params_size); |
| 194 memcpy(vector_as_array(&audio_params.param_data), ¶ms, params_size); | 192 memcpy(vector_as_array(&audio_params.param_data), ¶ms, params_size); |
| 195 | 193 |
| 196 scoped_ptr<extensions::Event> event(new extensions::Event( | 194 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 197 extensions::api::copresence_private::OnConfigAudio::kEventName, | 195 copresence_private::OnConfigAudio::kEventName, |
| 198 extensions::api::copresence_private::OnConfigAudio::Create(audio_params), | 196 copresence_private::OnConfigAudio::Create(audio_params), |
| 199 browser_context_)); | 197 browser_context_)); |
| 200 | 198 |
| 201 extensions::EventRouter::Get(browser_context_) | 199 extensions::EventRouter::Get(browser_context_) |
| 202 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); | 200 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); |
| 203 } | 201 } |
| 204 | 202 |
| 205 void ChromeWhispernetClient::OnExtensionLoaded(bool success) { | 203 void ChromeWhispernetClient::OnExtensionLoaded(bool success) { |
| 206 if (extension_loaded_) { | 204 if (extension_loaded_) { |
| 207 if (!init_callback_.is_null()) | 205 if (!init_callback_.is_null()) |
| 208 init_callback_.Run(success); | 206 init_callback_.Run(success); |
| 209 return; | 207 return; |
| 210 } | 208 } |
| 211 | 209 |
| 212 // Our extension just got loaded, initialize whispernet. | 210 // Our extension just got loaded, initialize whispernet. |
| 213 extension_loaded_ = true; | 211 extension_loaded_ = true; |
| 214 | 212 |
| 215 // This will fire another OnExtensionLoaded call once the initialization is | 213 // This will fire another OnExtensionLoaded call once the initialization is |
| 216 // done, which means we've initialized for realz, hence call the init | 214 // done, which means we've initialized for realz, hence call the init |
| 217 // callback. | 215 // callback. |
| 218 | 216 |
| 219 AudioConfiguration(GetDefaultAudioConfig()); | 217 AudioConfiguration(GetDefaultAudioConfig()); |
| 220 } | 218 } |
| OLD | NEW |