Chromium Code Reviews| Index: components/copresence/rpc/rpc_handler.cc |
| diff --git a/components/copresence/rpc/rpc_handler.cc b/components/copresence/rpc/rpc_handler.cc |
| index 2ca127ea7955fca154b1e9750389a24db0e5695b..a80c75e25f2e84f225a64e0ec4e971b07132ebf7 100644 |
| --- a/components/copresence/rpc/rpc_handler.cc |
| +++ b/components/copresence/rpc/rpc_handler.cc |
| @@ -105,7 +105,7 @@ BroadcastScanConfiguration ExtractTokenExchangeStrategy( |
| // Strategies for publishes. |
| if (request.has_manage_messages_request()) { |
| - const RepeatedPtrField<PublishedMessage> messages = |
| + const RepeatedPtrField<PublishedMessage>& messages = |
| request.manage_messages_request().message_to_publish(); |
| for (int i = 0; i < messages.size(); ++i) { |
| BroadcastScanConfiguration config = |
| @@ -119,7 +119,7 @@ BroadcastScanConfiguration ExtractTokenExchangeStrategy( |
| // Strategies for subscriptions. |
| if (request.has_manage_subscriptions_request()) { |
| - const RepeatedPtrField<Subscription> messages = |
| + const RepeatedPtrField<Subscription>& messages = |
| request.manage_subscriptions_request().subscription(); |
| for (int i = 0; i < messages.size(); ++i) { |
| BroadcastScanConfiguration config = |
| @@ -194,6 +194,17 @@ ClientVersion* CreateVersion(const std::string& client, |
| return version; |
| } |
| +void AddTokenToRequest(ReportRequest* request, const AudioToken& token) { |
| + TokenObservation* token_observation = |
| + request->mutable_update_signals_request()->add_token_observation(); |
| + token_observation->set_token_id(ToUrlSafe(token.token)); |
| + |
| + TokenSignals* signals = token_observation->add_signals(); |
| + signals->set_medium(token.audible ? AUDIO_AUDIBLE_DTMF |
| + : AUDIO_ULTRASOUND_PASSBAND); |
| + signals->set_observed_time_millis(base::Time::Now().ToJsTime()); |
| +} |
| + |
| } // namespace |
| // Public methods |
| @@ -251,8 +262,15 @@ void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request, |
| DVLOG(3) << "Sending report request to server."; |
| + // If we are unpublishing or unsubscribing, we need to stop those publish or |
| + // subscribes right away, we don't need to wait for the server to tell us. |
| + ProcessRemovedOperations(*request); |
| + |
| request->mutable_update_signals_request()->set_allocated_state( |
| GetDeviceCapabilities(*request).release()); |
| + |
| + AddPlayingTokens(request.get()); |
| + |
| SendServerRequest(kReportRequestRpcName, |
| app_id, |
| request.Pass(), |
| @@ -262,25 +280,15 @@ void RpcHandler::SendReportRequest(scoped_ptr<ReportRequest> request, |
| status_callback)); |
| } |
| -void RpcHandler::ReportTokens(const std::vector<FullToken>& tokens) { |
| +void RpcHandler::ReportTokens(const std::vector<AudioToken>& tokens) { |
| DCHECK(!tokens.empty()); |
| scoped_ptr<ReportRequest> request(new ReportRequest); |
| for (size_t i = 0; i < tokens.size(); ++i) { |
| - const std::string& token = ToUrlSafe(tokens[i].token); |
| - if (invalid_audio_token_cache_.HasKey(token)) |
| + if (invalid_audio_token_cache_.HasKey(ToUrlSafe(tokens[i].token))) |
| continue; |
| - |
| - DVLOG(3) << "Sending token " << token << " to server."; |
| - |
| - TokenObservation* token_observation = |
| - request->mutable_update_signals_request()->add_token_observation(); |
| - token_observation->set_token_id(token); |
| - |
| - TokenSignals* signals = token_observation->add_signals(); |
| - signals->set_medium(tokens[i].audible ? AUDIO_AUDIBLE_DTMF |
| - : AUDIO_ULTRASOUND_PASSBAND); |
| - signals->set_observed_time_millis(base::Time::Now().ToJsTime()); |
| + DVLOG(3) << "Sending token " << tokens[i].token << " to server."; |
| + AddTokenToRequest(request.get(), tokens[i]); |
| } |
| SendReportRequest(request.Pass()); |
| } |
| @@ -415,6 +423,35 @@ void RpcHandler::ReportResponseHandler(const StatusCallback& status_callback, |
| status_callback.Run(SUCCESS); |
| } |
| +void RpcHandler::ProcessRemovedOperations(const ReportRequest& request) { |
| + // Remove unpublishes. |
| + if (request.has_manage_messages_request()) { |
| + const RepeatedPtrField<std::string>& unpublishes = |
| + request.manage_messages_request().id_to_unpublish(); |
| + for (int i = 0; i < unpublishes.size(); ++i) |
| + directive_handler_->RemoveDirectives(unpublishes.Get(i)); |
| + } |
| + |
| + // Remove unsubscribes. |
| + if (request.has_manage_subscriptions_request()) { |
| + const RepeatedPtrField<std::string>& unsubscribes = |
| + request.manage_subscriptions_request().id_to_unsubscribe(); |
| + for (int i = 0; i < unsubscribes.size(); ++i) |
| + directive_handler_->RemoveDirectives(unsubscribes.Get(i)); |
| + } |
| +} |
| + |
| +void RpcHandler::AddPlayingTokens(ReportRequest* request) { |
| + 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
|
| + const std::string& inaudible_token = |
| + directive_handler_->CurrentInaudibleToken(); |
| + |
| + if (!audible_token.empty()) |
| + AddTokenToRequest(request, AudioToken(audible_token, true)); |
| + if (!inaudible_token.empty()) |
| + AddTokenToRequest(request, AudioToken(inaudible_token, false)); |
| +} |
| + |
| void RpcHandler::DispatchMessages( |
| const RepeatedPtrField<SubscribedMessage>& messages) { |
| if (messages.size() == 0) |