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 |