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 "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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 const std::string& audible_token = directive_handler_->CurrentAudibleToken(); | |
Charlie
2014/08/13 04:40:20
directive_handler_ can be null if ConnectToWhisper
rkc
2014/08/13 06:06:07
I thought I had fixed this hours ago. Guess I forg
| |
446 const std::string& inaudible_token = | |
447 directive_handler_->CurrentInaudibleToken(); | |
448 | |
449 if (!audible_token.empty()) | |
450 AddTokenToRequest(request, AudioToken(audible_token, true)); | |
451 if (!inaudible_token.empty()) | |
452 AddTokenToRequest(request, AudioToken(inaudible_token, false)); | |
453 } | |
454 | |
418 void RpcHandler::DispatchMessages( | 455 void RpcHandler::DispatchMessages( |
419 const RepeatedPtrField<SubscribedMessage>& messages) { | 456 const RepeatedPtrField<SubscribedMessage>& messages) { |
420 if (messages.size() == 0) | 457 if (messages.size() == 0) |
421 return; | 458 return; |
422 | 459 |
423 // Index the messages by subscription id. | 460 // Index the messages by subscription id. |
424 std::map<std::string, std::vector<Message> > messages_by_subscription; | 461 std::map<std::string, std::vector<Message> > messages_by_subscription; |
425 DVLOG(3) << "Dispatching " << messages.size() << " messages"; | 462 DVLOG(3) << "Dispatching " << messages.size() << " messages"; |
426 for (int m = 0; m < messages.size(); ++m) { | 463 for (int m = 0; m < messages.size(); ++m) { |
427 const RepeatedPtrField<std::string>& subscription_ids = | 464 const RepeatedPtrField<std::string>& subscription_ids = |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
500 bool audible, | 537 bool audible, |
501 const WhispernetClient::SamplesCallback& samples_callback) { | 538 const WhispernetClient::SamplesCallback& samples_callback) { |
502 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); | 539 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); |
503 if (whispernet_client) { | 540 if (whispernet_client) { |
504 whispernet_client->RegisterSamplesCallback(samples_callback); | 541 whispernet_client->RegisterSamplesCallback(samples_callback); |
505 whispernet_client->EncodeToken(token, audible); | 542 whispernet_client->EncodeToken(token, audible); |
506 } | 543 } |
507 } | 544 } |
508 | 545 |
509 } // namespace copresence | 546 } // namespace copresence |
OLD | NEW |