| 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 96 |
| 97 template <typename T> | 97 template <typename T> |
| 98 BroadcastScanConfiguration GetBroadcastScanConfig(const T& msg) { | 98 BroadcastScanConfiguration GetBroadcastScanConfig(const T& msg) { |
| 99 if (msg.has_token_exchange_strategy() && | 99 if (msg.has_token_exchange_strategy() && |
| 100 msg.token_exchange_strategy().has_broadcast_scan_configuration()) { | 100 msg.token_exchange_strategy().has_broadcast_scan_configuration()) { |
| 101 return msg.token_exchange_strategy().broadcast_scan_configuration(); | 101 return msg.token_exchange_strategy().broadcast_scan_configuration(); |
| 102 } | 102 } |
| 103 return BROADCAST_SCAN_CONFIGURATION_UNKNOWN; | 103 return BROADCAST_SCAN_CONFIGURATION_UNKNOWN; |
| 104 } | 104 } |
| 105 | 105 |
| 106 // This method will extract token exchange strategies | |
| 107 // from the publishes and subscribes in a report request. | |
| 108 // TODO(ckehoe): Delete this when the server supports | |
| 109 // BroadcastScanConfiguration. | |
| 110 BroadcastScanConfiguration ExtractTokenExchangeStrategy( | |
| 111 const ReportRequest& request) { | |
| 112 bool broadcast_only = false; | |
| 113 bool scan_only = false; | |
| 114 | |
| 115 // Strategies for publishes. | |
| 116 if (request.has_manage_messages_request()) { | |
| 117 const RepeatedPtrField<PublishedMessage>& messages = | |
| 118 request.manage_messages_request().message_to_publish(); | |
| 119 for (int i = 0; i < messages.size(); ++i) { | |
| 120 BroadcastScanConfiguration config = | |
| 121 GetBroadcastScanConfig(messages.Get(i)); | |
| 122 broadcast_only = broadcast_only || config == BROADCAST_ONLY; | |
| 123 scan_only = scan_only || config == SCAN_ONLY; | |
| 124 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only)) | |
| 125 return BROADCAST_AND_SCAN; | |
| 126 } | |
| 127 } | |
| 128 | |
| 129 // Strategies for subscriptions. | |
| 130 if (request.has_manage_subscriptions_request()) { | |
| 131 const RepeatedPtrField<Subscription> subscriptions = | |
| 132 request.manage_subscriptions_request().subscription(); | |
| 133 for (int i = 0; i < subscriptions.size(); ++i) { | |
| 134 BroadcastScanConfiguration config = | |
| 135 GetBroadcastScanConfig(subscriptions.Get(i)); | |
| 136 broadcast_only = broadcast_only || config == BROADCAST_ONLY; | |
| 137 scan_only = scan_only || config == SCAN_ONLY; | |
| 138 if (config == BROADCAST_AND_SCAN || (broadcast_only && scan_only)) | |
| 139 return BROADCAST_AND_SCAN; | |
| 140 } | |
| 141 } | |
| 142 | |
| 143 if (broadcast_only) | |
| 144 return BROADCAST_ONLY; | |
| 145 if (scan_only) | |
| 146 return SCAN_ONLY; | |
| 147 | |
| 148 // If nothing else is specified, default to both broadcast and scan. | |
| 149 return BROADCAST_AND_SCAN; | |
| 150 } | |
| 151 | |
| 152 // TODO(rkc): Fix this hack once the server supports setting strategies per | |
| 153 // operation. | |
| 154 bool ExtractIsAudibleStrategy(const ReportRequest& request) { | |
| 155 if (request.has_manage_messages_request()) { | |
| 156 const RepeatedPtrField<PublishedMessage> messages = | |
| 157 request.manage_messages_request().message_to_publish(); | |
| 158 for (int i = 0; i < messages.size(); ++i) { | |
| 159 const PublishedMessage& msg = messages.Get(i); | |
| 160 if (msg.has_token_exchange_strategy() && | |
| 161 msg.token_exchange_strategy().has_use_audible() && | |
| 162 msg.token_exchange_strategy().use_audible()) { | |
| 163 return true; | |
| 164 } | |
| 165 } | |
| 166 } | |
| 167 return false; | |
| 168 } | |
| 169 | |
| 170 scoped_ptr<DeviceState> GetDeviceCapabilities(const ReportRequest& request) { | 106 scoped_ptr<DeviceState> GetDeviceCapabilities(const ReportRequest& request) { |
| 171 scoped_ptr<DeviceState> state(new DeviceState); | 107 scoped_ptr<DeviceState> state(new DeviceState); |
| 172 | 108 |
| 173 TokenTechnology* token_technology = | 109 TokenTechnology* ultrasound = |
| 174 state->mutable_capabilities()->add_token_technology(); | 110 state->mutable_capabilities()->add_token_technology(); |
| 175 token_technology->set_medium(AUDIO_ULTRASOUND_PASSBAND); | 111 ultrasound->set_medium(AUDIO_ULTRASOUND_PASSBAND); |
| 176 if (ExtractIsAudibleStrategy(request)) | 112 ultrasound->add_instruction_type(TRANSMIT); |
| 177 token_technology->set_medium(AUDIO_AUDIBLE_DTMF); | 113 ultrasound->add_instruction_type(RECEIVE); |
| 178 | 114 |
| 179 BroadcastScanConfiguration config = | 115 TokenTechnology* audible = |
| 180 ExtractTokenExchangeStrategy(request); | 116 state->mutable_capabilities()->add_token_technology(); |
| 181 if (config == BROADCAST_ONLY || config == BROADCAST_AND_SCAN) | 117 audible->set_medium(AUDIO_AUDIBLE_DTMF); |
| 182 token_technology->add_instruction_type(TRANSMIT); | 118 audible->add_instruction_type(TRANSMIT); |
| 183 if (config == SCAN_ONLY || config == BROADCAST_AND_SCAN) | 119 audible->add_instruction_type(RECEIVE); |
| 184 token_technology->add_instruction_type(RECEIVE); | |
| 185 | 120 |
| 186 return state.Pass(); | 121 return state.Pass(); |
| 187 } | 122 } |
| 188 | 123 |
| 189 // TODO(ckehoe): We're keeping this code in a separate function for now | 124 // TODO(ckehoe): We're keeping this code in a separate function for now |
| 190 // because we get a version string from Chrome, but the proto expects | 125 // because we get a version string from Chrome, but the proto expects |
| 191 // an int64 version. We should probably change the version proto | 126 // an int64 version. We should probably change the version proto |
| 192 // to handle a more detailed version. | 127 // to handle a more detailed version. |
| 193 ClientVersion* CreateVersion(const std::string& client, | 128 ClientVersion* CreateVersion(const std::string& client, |
| 194 const std::string& version_name) { | 129 const std::string& version_name) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 205 |
| 271 // If we are unpublishing or unsubscribing, we need to stop those publish or | 206 // If we are unpublishing or unsubscribing, we need to stop those publish or |
| 272 // subscribes right away, we don't need to wait for the server to tell us. | 207 // subscribes right away, we don't need to wait for the server to tell us. |
| 273 ProcessRemovedOperations(*request); | 208 ProcessRemovedOperations(*request); |
| 274 | 209 |
| 275 request->mutable_update_signals_request()->set_allocated_state( | 210 request->mutable_update_signals_request()->set_allocated_state( |
| 276 GetDeviceCapabilities(*request).release()); | 211 GetDeviceCapabilities(*request).release()); |
| 277 | 212 |
| 278 AddPlayingTokens(request.get()); | 213 AddPlayingTokens(request.get()); |
| 279 | 214 |
| 280 // TODO(ckehoe): Currently the server supports only BROADCAST_AND_SCAN. | |
| 281 // Remove this once b/16715253 is fixed. | |
| 282 if (request->has_manage_messages_request()) { | |
| 283 RepeatedPtrField<PublishedMessage>* messages = request | |
| 284 ->mutable_manage_messages_request()->mutable_message_to_publish(); | |
| 285 for (int i = 0; i < messages->size(); ++i) { | |
| 286 messages->Mutable(i)->mutable_token_exchange_strategy() | |
| 287 ->set_broadcast_scan_configuration(BROADCAST_AND_SCAN); | |
| 288 } | |
| 289 } | |
| 290 if (request->has_manage_subscriptions_request()) { | |
| 291 RepeatedPtrField<Subscription>* subscriptions = | |
| 292 request->mutable_manage_subscriptions_request()->mutable_subscription(); | |
| 293 for (int i = 0; i < subscriptions->size(); ++i) { | |
| 294 subscriptions->Mutable(i)->mutable_token_exchange_strategy() | |
| 295 ->set_broadcast_scan_configuration(BROADCAST_AND_SCAN); | |
| 296 } | |
| 297 } | |
| 298 | |
| 299 SendServerRequest(kReportRequestRpcName, | 215 SendServerRequest(kReportRequestRpcName, |
| 300 app_id, | 216 app_id, |
| 301 request.Pass(), | 217 request.Pass(), |
| 302 // On destruction, this request will be cancelled. | 218 // On destruction, this request will be cancelled. |
| 303 base::Bind(&RpcHandler::ReportResponseHandler, | 219 base::Bind(&RpcHandler::ReportResponseHandler, |
| 304 base::Unretained(this), | 220 base::Unretained(this), |
| 305 status_callback)); | 221 status_callback)); |
| 306 } | 222 } |
| 307 | 223 |
| 308 void RpcHandler::ReportTokens(const std::vector<AudioToken>& tokens) { | 224 void RpcHandler::ReportTokens(const std::vector<AudioToken>& tokens) { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 bool audible, | 489 bool audible, |
| 574 const WhispernetClient::SamplesCallback& samples_callback) { | 490 const WhispernetClient::SamplesCallback& samples_callback) { |
| 575 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); | 491 WhispernetClient* whispernet_client = delegate_->GetWhispernetClient(); |
| 576 if (whispernet_client) { | 492 if (whispernet_client) { |
| 577 whispernet_client->RegisterSamplesCallback(samples_callback); | 493 whispernet_client->RegisterSamplesCallback(samples_callback); |
| 578 whispernet_client->EncodeToken(token, audible); | 494 whispernet_client->EncodeToken(token, audible); |
| 579 } | 495 } |
| 580 } | 496 } |
| 581 | 497 |
| 582 } // namespace copresence | 498 } // namespace copresence |
| OLD | NEW |