Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: chrome/browser/copresence/chrome_whispernet_client.cc

Issue 916763005: Allowing WhispernetClient to be used during initialization (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/extensions/api/copresence_private/copresence_private_ap i.h" 8 #include "chrome/browser/extensions/api/copresence_private/copresence_private_ap i.h"
9 #include "chrome/browser/extensions/component_loader.h" 9 #include "chrome/browser/extensions/component_loader.h"
10 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
(...skipping 26 matching lines...) Expand all
37 } // namespace 37 } // namespace
38 38
39 // static 39 // static
40 const char ChromeWhispernetClient::kWhispernetProxyExtensionId[] = 40 const char ChromeWhispernetClient::kWhispernetProxyExtensionId[] =
41 "bpfmnplchembfbdgieamdodgaencleal"; 41 "bpfmnplchembfbdgieamdodgaencleal";
42 42
43 // Public: 43 // Public:
44 44
45 ChromeWhispernetClient::ChromeWhispernetClient( 45 ChromeWhispernetClient::ChromeWhispernetClient(
46 content::BrowserContext* browser_context) 46 content::BrowserContext* browser_context)
47 : browser_context_(browser_context), extension_loaded_(false) { 47 : browser_context_(browser_context),
48 event_router_(extensions::EventRouter::Get(browser_context)),
49 extension_loaded_(false) {
50 DCHECK(browser_context_);
51 DCHECK(event_router_);
48 } 52 }
49 53
50 ChromeWhispernetClient::~ChromeWhispernetClient() { 54 ChromeWhispernetClient::~ChromeWhispernetClient() {
51 } 55 }
52 56
53 void ChromeWhispernetClient::Initialize( 57 void ChromeWhispernetClient::Initialize(
54 const copresence::SuccessCallback& init_callback) { 58 const copresence::SuccessCallback& init_callback) {
55 DVLOG(3) << "Initializing whispernet proxy client."; 59 DVLOG(3) << "Initializing whispernet proxy client.";
56 init_callback_ = init_callback; 60 init_callback_ = init_callback;
57 61
58 extensions::ExtensionSystem* es = 62 extensions::ExtensionSystem* es =
59 extensions::ExtensionSystem::Get(browser_context_); 63 extensions::ExtensionSystem::Get(browser_context_);
60 DCHECK(es); 64 DCHECK(es);
61 ExtensionService* service = es->extension_service(); 65 ExtensionService* service = es->extension_service();
62 DCHECK(service); 66 DCHECK(service);
63 extensions::ComponentLoader* loader = service->component_loader(); 67 extensions::ComponentLoader* loader = service->component_loader();
64 DCHECK(loader); 68 DCHECK(loader);
65 69
66 // This callback is cancelled in Shutdown(). 70 // This callback is cancelled in Shutdown().
67 extension_loaded_callback_ = base::Bind( 71 extension_loaded_callback_ = base::Bind(
68 &ChromeWhispernetClient::OnExtensionLoaded, base::Unretained(this)); 72 &ChromeWhispernetClient::OnExtensionLoaded, base::Unretained(this));
69 73
70 if (!loader->Exists(kWhispernetProxyExtensionId)) { 74 if (!loader->Exists(kWhispernetProxyExtensionId)) {
71 DVLOG(3) << "Loading Whispernet proxy."; 75 DVLOG(3) << "Loading Whispernet proxy.";
72 loader->Add(IDR_WHISPERNET_PROXY_MANIFEST, 76 loader->Add(IDR_WHISPERNET_PROXY_MANIFEST,
73 base::FilePath(FILE_PATH_LITERAL("whispernet_proxy"))); 77 base::FilePath(FILE_PATH_LITERAL("whispernet_proxy")));
74 } else { 78 } else {
75 init_callback_.Run(true); 79 init_callback_.Run(true);
76 } 80 }
81
82 AudioConfiguration(GetDefaultAudioConfig());
77 } 83 }
78 84
79 void ChromeWhispernetClient::Shutdown() { 85 void ChromeWhispernetClient::Shutdown() {
80 extension_loaded_callback_.Reset(); 86 extension_loaded_callback_.Reset();
81 init_callback_.Reset(); 87 init_callback_.Reset();
82 tokens_callback_.Reset(); 88 tokens_callback_.Reset();
83 samples_callback_.Reset(); 89 samples_callback_.Reset();
84 db_callback_.Reset(); 90 db_callback_.Reset();
85 } 91 }
86 92
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, 93 void ChromeWhispernetClient::EncodeToken(const std::string& token_str,
92 copresence::AudioType type) { 94 copresence::AudioType type) {
93 DCHECK(extension_loaded_);
94 DCHECK(browser_context_);
95 DCHECK(extensions::EventRouter::Get(browser_context_));
96
97 extensions::api::copresence_private::EncodeTokenParameters params; 95 extensions::api::copresence_private::EncodeTokenParameters params;
98 params.token.token = token_str; 96 params.token.token = token_str;
99 params.token.audible = type == copresence::AUDIBLE; 97 params.token.audible = type == copresence::AUDIBLE;
100 scoped_ptr<extensions::Event> event(new extensions::Event( 98 scoped_ptr<extensions::Event> event(new extensions::Event(
101 extensions::api::copresence_private::OnEncodeTokenRequest::kEventName, 99 extensions::api::copresence_private::OnEncodeTokenRequest::kEventName,
102 extensions::api::copresence_private::OnEncodeTokenRequest::Create(params), 100 extensions::api::copresence_private::OnEncodeTokenRequest::Create(params),
103 browser_context_)); 101 browser_context_));
104 102
105 extensions::EventRouter::Get(browser_context_) 103 SendEventIfLoaded(event.Pass());
106 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass());
107 } 104 }
108 105
109 void ChromeWhispernetClient::DecodeSamples(copresence::AudioType type, 106 void ChromeWhispernetClient::DecodeSamples(copresence::AudioType type,
110 const std::string& samples, 107 const std::string& samples,
111 const size_t token_length[2]) { 108 const size_t token_length[2]) {
112 DCHECK(extension_loaded_);
113 DCHECK(browser_context_);
114 DCHECK(extensions::EventRouter::Get(browser_context_));
115
116 extensions::api::copresence_private::DecodeSamplesParameters params; 109 extensions::api::copresence_private::DecodeSamplesParameters params;
117 params.samples.assign(samples.begin(), samples.end()); 110 params.samples.assign(samples.begin(), samples.end());
118 params.decode_audible = 111 params.decode_audible =
119 type == copresence::AUDIBLE || type == copresence::BOTH; 112 type == copresence::AUDIBLE || type == copresence::BOTH;
120 params.decode_inaudible = 113 params.decode_inaudible =
121 type == copresence::INAUDIBLE || type == copresence::BOTH; 114 type == copresence::INAUDIBLE || type == copresence::BOTH;
122 params.audible_token_length = token_length[copresence::AUDIBLE]; 115 params.audible_token_length = token_length[copresence::AUDIBLE];
123 params.inaudible_token_length = token_length[copresence::INAUDIBLE]; 116 params.inaudible_token_length = token_length[copresence::INAUDIBLE];
124 117
125 scoped_ptr<extensions::Event> event(new extensions::Event( 118 scoped_ptr<extensions::Event> event(new extensions::Event(
126 extensions::api::copresence_private::OnDecodeSamplesRequest::kEventName, 119 extensions::api::copresence_private::OnDecodeSamplesRequest::kEventName,
127 extensions::api::copresence_private::OnDecodeSamplesRequest::Create( 120 extensions::api::copresence_private::OnDecodeSamplesRequest::Create(
128 params), 121 params),
129 browser_context_)); 122 browser_context_));
130 123
131 extensions::EventRouter::Get(browser_context_) 124 SendEventIfLoaded(event.Pass());
132 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass());
133 } 125 }
134 126
135 void ChromeWhispernetClient::DetectBroadcast() { 127 void ChromeWhispernetClient::DetectBroadcast() {
136 DCHECK(extension_loaded_);
137 DCHECK(browser_context_);
138 DCHECK(extensions::EventRouter::Get(browser_context_));
139
140 scoped_ptr<extensions::Event> event(new extensions::Event( 128 scoped_ptr<extensions::Event> event(new extensions::Event(
141 extensions::api::copresence_private::OnDetectBroadcastRequest::kEventName, 129 extensions::api::copresence_private::OnDetectBroadcastRequest::kEventName,
142 make_scoped_ptr(new base::ListValue()), 130 make_scoped_ptr(new base::ListValue()),
143 browser_context_)); 131 browser_context_));
144 132
145 extensions::EventRouter::Get(browser_context_) 133 SendEventIfLoaded(event.Pass());
146 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass());
147 } 134 }
148 135
149 void ChromeWhispernetClient::RegisterTokensCallback( 136 void ChromeWhispernetClient::RegisterTokensCallback(
150 const copresence::TokensCallback& tokens_callback) { 137 const copresence::TokensCallback& tokens_callback) {
151 tokens_callback_ = tokens_callback; 138 tokens_callback_ = tokens_callback;
152 } 139 }
153 140
154 void ChromeWhispernetClient::RegisterSamplesCallback( 141 void ChromeWhispernetClient::RegisterSamplesCallback(
155 const copresence::SamplesCallback& samples_callback) { 142 const copresence::SamplesCallback& samples_callback) {
156 samples_callback_ = samples_callback; 143 samples_callback_ = samples_callback;
(...skipping 18 matching lines...) Expand all
175 } 162 }
176 163
177 copresence::SuccessCallback ChromeWhispernetClient::GetInitializedCallback() { 164 copresence::SuccessCallback ChromeWhispernetClient::GetInitializedCallback() {
178 return extension_loaded_callback_; 165 return extension_loaded_callback_;
179 } 166 }
180 167
181 // Private: 168 // Private:
182 169
183 void ChromeWhispernetClient::AudioConfiguration( 170 void ChromeWhispernetClient::AudioConfiguration(
184 const copresence::config::AudioParamData& params) { 171 const copresence::config::AudioParamData& params) {
185 DCHECK(browser_context_);
186 DCHECK(extensions::EventRouter::Get(browser_context_));
187
188 extensions::api::copresence_private::AudioParameters audio_params; 172 extensions::api::copresence_private::AudioParameters audio_params;
189 173
190 // We serialize AudioConfigData to a string and send it to the whispernet 174 // We serialize AudioConfigData to a string and send it to the whispernet
191 // nacl wrapper. 175 // nacl wrapper.
192 const size_t params_size = sizeof(params); 176 const size_t params_size = sizeof(params);
193 audio_params.param_data.resize(params_size); 177 audio_params.param_data.resize(params_size);
194 memcpy(vector_as_array(&audio_params.param_data), &params, params_size); 178 memcpy(vector_as_array(&audio_params.param_data), &params, params_size);
195 179
196 scoped_ptr<extensions::Event> event(new extensions::Event( 180 scoped_ptr<extensions::Event> event(new extensions::Event(
197 extensions::api::copresence_private::OnConfigAudio::kEventName, 181 extensions::api::copresence_private::OnConfigAudio::kEventName,
198 extensions::api::copresence_private::OnConfigAudio::Create(audio_params), 182 extensions::api::copresence_private::OnConfigAudio::Create(audio_params),
199 browser_context_)); 183 browser_context_));
200 184
201 extensions::EventRouter::Get(browser_context_) 185 SendEventIfLoaded(event.Pass());
202 ->DispatchEventToExtension(kWhispernetProxyExtensionId, event.Pass()); 186 }
187
188 void ChromeWhispernetClient::SendEventIfLoaded(
189 scoped_ptr<extensions::Event> event) {
190 if (extension_loaded_) {
191 event_router_->DispatchEventToExtension(kWhispernetProxyExtensionId,
192 event.Pass());
193 } else {
194 queued_events_.push_back(event.Pass());
195 }
203 } 196 }
204 197
205 void ChromeWhispernetClient::OnExtensionLoaded(bool success) { 198 void ChromeWhispernetClient::OnExtensionLoaded(bool success) {
206 if (extension_loaded_) { 199 if (!init_callback_.is_null())
207 if (!init_callback_.is_null()) 200 init_callback_.Run(success);
208 init_callback_.Run(success); 201
209 return; 202 DVLOG(3) << "Sending " << queued_events_.size()
203 << " queued requests to whispernet";
204 for (scoped_ptr<extensions::Event>& event : queued_events_) {
205 event_router_->DispatchEventToExtension(kWhispernetProxyExtensionId,
206 event.Pass());
210 } 207 }
208 queued_events_.clear();
211 209
212 // Our extension just got loaded, initialize whispernet.
213 extension_loaded_ = true; 210 extension_loaded_ = true;
214
215 // This will fire another OnExtensionLoaded call once the initialization is
216 // done, which means we've initialized for realz, hence call the init
217 // callback.
218
219 AudioConfiguration(GetDefaultAudioConfig());
Charlie 2015/02/11 21:43:56 Audio configuration can now be queued just like an
220 } 211 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698