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

Side by Side Diff: components/copresence/rpc/rpc_handler.cc

Issue 461803003: Stop playing/recording when not needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
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 "components/copresence/rpc/rpc_handler.h" 5 #include "components/copresence/rpc/rpc_handler.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 // from the publishes and subscribes in a report request. 98 // from the publishes and subscribes in a report request.
99 // TODO(ckehoe): Delete this when the server supports 99 // TODO(ckehoe): Delete this when the server supports
100 // BroadcastScanConfiguration. 100 // BroadcastScanConfiguration.
101 BroadcastScanConfiguration ExtractTokenExchangeStrategy( 101 BroadcastScanConfiguration ExtractTokenExchangeStrategy(
102 const ReportRequest& request) { 102 const ReportRequest& request) {
103 bool broadcast_only = false; 103 bool broadcast_only = false;
104 bool scan_only = false; 104 bool scan_only = false;
105 105
106 // Strategies for publishes. 106 // Strategies for publishes.
107 if (request.has_manage_messages_request()) { 107 if (request.has_manage_messages_request()) {
108 const RepeatedPtrField<PublishedMessage> messages = 108 const RepeatedPtrField<PublishedMessage>& messages =
109 request.manage_messages_request().message_to_publish(); 109 request.manage_messages_request().message_to_publish();
110 for (int i = 0; i < messages.size(); ++i) { 110 for (int i = 0; i < messages.size(); ++i) {
111 BroadcastScanConfiguration config = 111 BroadcastScanConfiguration config =
112 GetBroadcastScanConfig(messages.Get(i)); 112 GetBroadcastScanConfig(messages.Get(i));
113 broadcast_only = broadcast_only || config == BROADCAST_ONLY; 113 broadcast_only = broadcast_only || config == BROADCAST_ONLY;
114 scan_only = scan_only || config == SCAN_ONLY; 114 scan_only = scan_only || config == SCAN_ONLY;
115 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only)) 115 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only))
116 return BROADCAST_AND_SCAN; 116 return BROADCAST_AND_SCAN;
117 } 117 }
118 } 118 }
119 119
120 // Strategies for subscriptions. 120 // Strategies for subscriptions.
121 if (request.has_manage_subscriptions_request()) { 121 if (request.has_manage_subscriptions_request()) {
122 const RepeatedPtrField<Subscription> messages = 122 const RepeatedPtrField<Subscription>& messages =
123 request.manage_subscriptions_request().subscription(); 123 request.manage_subscriptions_request().subscription();
124 for (int i = 0; i < messages.size(); ++i) { 124 for (int i = 0; i < messages.size(); ++i) {
125 BroadcastScanConfiguration config = 125 BroadcastScanConfiguration config =
126 GetBroadcastScanConfig(messages.Get(i)); 126 GetBroadcastScanConfig(messages.Get(i));
127 broadcast_only = broadcast_only || config == BROADCAST_ONLY; 127 broadcast_only = broadcast_only || config == BROADCAST_ONLY;
128 scan_only = scan_only || config == SCAN_ONLY; 128 scan_only = scan_only || config == SCAN_ONLY;
129 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only)) 129 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only))
130 return BROADCAST_AND_SCAN; 130 return BROADCAST_AND_SCAN;
131 } 131 }
132 } 132 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 ClientVersion* CreateVersion(const std::string& client, 187 ClientVersion* CreateVersion(const std::string& client,
188 const std::string& version_name) { 188 const std::string& version_name) {
189 ClientVersion* version = new ClientVersion; 189 ClientVersion* version = new ClientVersion;
190 190
191 version->set_client(client); 191 version->set_client(client);
192 version->set_version_name(version_name); 192 version->set_version_name(version_name);
193 193
194 return version; 194 return version;
195 } 195 }
196 196
197 void AddTokenToRequest(ReportRequest* request, const AudioToken& token) {
198 TokenObservation* token_observation =
199 request->mutable_update_signals_request()->add_token_observation();
200 token_observation->set_token_id(ToUrlSafe(token.token));
201
202 TokenSignals* signals = token_observation->add_signals();
203 signals->set_medium(token.audible ? AUDIO_AUDIBLE_DTMF
204 : AUDIO_ULTRASOUND_PASSBAND);
205 signals->set_observed_time_millis(base::Time::Now().ToJsTime());
206 }
207
197 } // namespace 208 } // namespace
198 209
199 // Public methods 210 // Public methods
200 211
201 RpcHandler::RpcHandler(CopresenceClientDelegate* delegate) 212 RpcHandler::RpcHandler(CopresenceClientDelegate* delegate)
202 : delegate_(delegate), 213 : delegate_(delegate),
203 invalid_audio_token_cache_( 214 invalid_audio_token_cache_(
204 base::TimeDelta::FromMilliseconds(kInvalidTokenExpiryTimeMs), 215 base::TimeDelta::FromMilliseconds(kInvalidTokenExpiryTimeMs),
205 kMaxInvalidTokens), 216 kMaxInvalidTokens),
206 server_post_callback_(base::Bind(&RpcHandler::SendHttpPost, 217 server_post_callback_(base::Bind(&RpcHandler::SendHttpPost,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request, 255 void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request,
245 const std::string& app_id, 256 const std::string& app_id,
246 const StatusCallback& status_callback) { 257 const StatusCallback& status_callback) {
247 DCHECK(request.get()); 258 DCHECK(request.get());
248 DCHECK(!device_id_.empty()) 259 DCHECK(!device_id_.empty())
249 << "RpcHandler::Initialize() must complete successfully " 260 << "RpcHandler::Initialize() must complete successfully "
250 << "before other RpcHandler methods are called."; 261 << "before other RpcHandler methods are called.";
251 262
252 DVLOG(3) << "Sending report request to server."; 263 DVLOG(3) << "Sending report request to server.";
253 264
265 // If we are unpublishing or unsubscribing, we need to stop those publish or
266 // subscribes right away, we don't need to wait for the server to tell us.
267 ProcessRemovedOperations(*request);
268
254 request->mutable_update_signals_request()->set_allocated_state( 269 request->mutable_update_signals_request()->set_allocated_state(
255 GetDeviceCapabilities(*request).release()); 270 GetDeviceCapabilities(*request).release());
271
272 AddPlayingTokens(request.get());
273
256 SendServerRequest(kReportRequestRpcName, 274 SendServerRequest(kReportRequestRpcName,
257 app_id, 275 app_id,
258 request.Pass(), 276 request.Pass(),
259 // On destruction, this request will be cancelled. 277 // On destruction, this request will be cancelled.
260 base::Bind(&RpcHandler::ReportResponseHandler, 278 base::Bind(&RpcHandler::ReportResponseHandler,
261 base::Unretained(this), 279 base::Unretained(this),
262 status_callback)); 280 status_callback));
263 } 281 }
264 282
265 void RpcHandler::ReportTokens(const std::vector<FullToken>& tokens) { 283 void RpcHandler::ReportTokens(const std::vector<AudioToken>& tokens) {
266 DCHECK(!tokens.empty()); 284 DCHECK(!tokens.empty());
267 285
268 scoped_ptr<ReportRequest> request(new ReportRequest); 286 scoped_ptr<ReportRequest> request(new ReportRequest);
269 for (size_t i = 0; i < tokens.size(); ++i) { 287 for (size_t i = 0; i < tokens.size(); ++i) {
270 const std::string& token = ToUrlSafe(tokens[i].token); 288 if (invalid_audio_token_cache_.HasKey(ToUrlSafe(tokens[i].token)))
271 if (invalid_audio_token_cache_.HasKey(token))
272 continue; 289 continue;
273 290 DVLOG(3) << "Sending token " << tokens[i].token << " to server.";
274 DVLOG(3) << "Sending token " << token << " to server."; 291 AddTokenToRequest(request.get(), tokens[i]);
275
276 TokenObservation* token_observation =
277 request->mutable_update_signals_request()->add_token_observation();
278 token_observation->set_token_id(token);
279
280 TokenSignals* signals = token_observation->add_signals();
281 signals->set_medium(tokens[i].audible ? AUDIO_AUDIBLE_DTMF
282 : AUDIO_ULTRASOUND_PASSBAND);
283 signals->set_observed_time_millis(base::Time::Now().ToJsTime());
284 } 292 }
285 SendReportRequest(request.Pass()); 293 SendReportRequest(request.Pass());
286 } 294 }
287 295
288 void RpcHandler::ConnectToWhispernet() { 296 void RpcHandler::ConnectToWhispernet() {
289 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); 297 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient();
290 298
291 // |directive_handler_| will be destructed with us, so unretained is safe. 299 // |directive_handler_| will be destructed with us, so unretained is safe.
292 directive_handler_.reset(new DirectiveHandler); 300 directive_handler_.reset(new DirectiveHandler);
293 directive_handler_->Initialize( 301 directive_handler_->Initialize(
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 << tokens.Get(i).status(); 416 << tokens.Get(i).status();
409 } 417 }
410 } 418 }
411 } 419 }
412 420
413 // TODO(ckehoe): Return a more detailed status response. 421 // TODO(ckehoe): Return a more detailed status response.
414 if (!status_callback.is_null()) 422 if (!status_callback.is_null())
415 status_callback.Run(SUCCESS); 423 status_callback.Run(SUCCESS);
416 } 424 }
417 425
426 void RpcHandler::ProcessRemovedOperations(const ReportRequest& request) {
427 // Remove unpublishes.
428 if (request.has_manage_messages_request()) {
429 const RepeatedPtrField<std::string>& unpublishes =
430 request.manage_messages_request().id_to_unpublish();
431 for (int i = 0; i < unpublishes.size(); ++i)
432 directive_handler_->RemoveDirectives(unpublishes.Get(i));
433 }
434
435 // Remove unsubscribes.
436 if (request.has_manage_subscriptions_request()) {
437 const RepeatedPtrField<std::string>& unsubscribes =
438 request.manage_subscriptions_request().id_to_unsubscribe();
439 for (int i = 0; i < unsubscribes.size(); ++i)
440 directive_handler_->RemoveDirectives(unsubscribes.Get(i));
441 }
442 }
443
444 void RpcHandler::AddPlayingTokens(ReportRequest* request) {
445 if (!directive_handler_)
446 return;
447
448 const std::string& audible_token = directive_handler_->CurrentAudibleToken();
449 const std::string& inaudible_token =
450 directive_handler_->CurrentInaudibleToken();
451
452 if (!audible_token.empty())
453 AddTokenToRequest(request, AudioToken(audible_token, true));
454 if (!inaudible_token.empty())
455 AddTokenToRequest(request, AudioToken(inaudible_token, false));
456 }
457
418 void RpcHandler::DispatchMessages( 458 void RpcHandler::DispatchMessages(
419 const RepeatedPtrField<SubscribedMessage>& messages) { 459 const RepeatedPtrField<SubscribedMessage>& messages) {
420 if (messages.size() == 0) 460 if (messages.size() == 0)
421 return; 461 return;
422 462
423 // Index the messages by subscription id. 463 // Index the messages by subscription id.
424 std::map<std::string, std::vector<Message> > messages_by_subscription; 464 std::map<std::string, std::vector<Message> > messages_by_subscription;
425 DVLOG(3) << "Dispatching " << messages.size() << " messages"; 465 DVLOG(3) << "Dispatching " << messages.size() << " messages";
426 for (int m = 0; m < messages.size(); ++m) { 466 for (int m = 0; m < messages.size(); ++m) {
427 const RepeatedPtrField<std::string>& subscription_ids = 467 const RepeatedPtrField<std::string>& subscription_ids =
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 bool audible, 540 bool audible,
501 const WhispernetClient::SamplesCallback& samples_callback) { 541 const WhispernetClient::SamplesCallback& samples_callback) {
502 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); 542 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient();
503 if (whispernet_client) { 543 if (whispernet_client) {
504 whispernet_client->RegisterSamplesCallback(samples_callback); 544 whispernet_client->RegisterSamplesCallback(samples_callback);
505 whispernet_client->EncodeToken(token, audible); 545 whispernet_client->EncodeToken(token, audible);
506 } 546 }
507 } 547 }
508 548
509 } // namespace copresence 549 } // namespace copresence
OLDNEW
« no previous file with comments | « components/copresence/rpc/rpc_handler.h ('k') | components/copresence/rpc/rpc_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698