OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "remoting/client/plugin/chromoting_instance.h" | 5 #include "remoting/client/plugin/chromoting_instance.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 base::LazyInstance<scoped_refptr<base::SingleThreadTaskRunner> >::Leaky | 130 base::LazyInstance<scoped_refptr<base::SingleThreadTaskRunner> >::Leaky |
131 g_logging_task_runner = LAZY_INSTANCE_INITIALIZER; | 131 g_logging_task_runner = LAZY_INSTANCE_INITIALIZER; |
132 base::LazyInstance<base::WeakPtr<ChromotingInstance> >::Leaky | 132 base::LazyInstance<base::WeakPtr<ChromotingInstance> >::Leaky |
133 g_logging_instance = LAZY_INSTANCE_INITIALIZER; | 133 g_logging_instance = LAZY_INSTANCE_INITIALIZER; |
134 base::LazyInstance<base::Lock>::Leaky | 134 base::LazyInstance<base::Lock>::Leaky |
135 g_logging_lock = LAZY_INSTANCE_INITIALIZER; | 135 g_logging_lock = LAZY_INSTANCE_INITIALIZER; |
136 logging::LogMessageHandlerFunction g_logging_old_handler = NULL; | 136 logging::LogMessageHandlerFunction g_logging_old_handler = NULL; |
137 | 137 |
138 } // namespace | 138 } // namespace |
139 | 139 |
140 // String sent in the "hello" message to the plugin to describe features. | 140 // String sent in the "hello" message to the webapp to describe features. |
141 const char ChromotingInstance::kApiFeatures[] = | 141 const char ChromotingInstance::kApiFeatures[] = |
142 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey " | 142 "highQualityScaling injectKeyEvent sendClipboardItem remapKey trapKey " |
143 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio " | 143 "notifyClientDimensions notifyClientResolution pauseVideo pauseAudio " |
144 "asyncPin thirdPartyAuth"; | 144 "asyncPin thirdPartyAuth"; |
145 | 145 |
| 146 const char ChromotingInstance::kRequestedCapabilities[] = ""; |
| 147 const char ChromotingInstance::kSupportedCapabilities[] = ""; |
| 148 |
146 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str, | 149 bool ChromotingInstance::ParseAuthMethods(const std::string& auth_methods_str, |
147 ClientConfig* config) { | 150 ClientConfig* config) { |
148 std::vector<std::string> auth_methods; | 151 std::vector<std::string> auth_methods; |
149 base::SplitString(auth_methods_str, ',', &auth_methods); | 152 base::SplitString(auth_methods_str, ',', &auth_methods); |
150 for (std::vector<std::string>::iterator it = auth_methods.begin(); | 153 for (std::vector<std::string>::iterator it = auth_methods.begin(); |
151 it != auth_methods.end(); ++it) { | 154 it != auth_methods.end(); ++it) { |
152 protocol::AuthenticationMethod authentication_method = | 155 protocol::AuthenticationMethod authentication_method = |
153 protocol::AuthenticationMethod::FromString(*it); | 156 protocol::AuthenticationMethod::FromString(*it); |
154 if (authentication_method.is_valid()) | 157 if (authentication_method.is_valid()) |
155 config->authentication_methods.push_back(authentication_method); | 158 config->authentication_methods.push_back(authentication_method); |
(...skipping 28 matching lines...) Expand all Loading... |
184 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); | 187 RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
185 | 188 |
186 // Resister this instance to handle debug log messsages. | 189 // Resister this instance to handle debug log messsages. |
187 RegisterLoggingInstance(); | 190 RegisterLoggingInstance(); |
188 | 191 |
189 // Send hello message. | 192 // Send hello message. |
190 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 193 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
191 data->SetInteger("apiVersion", kApiVersion); | 194 data->SetInteger("apiVersion", kApiVersion); |
192 data->SetString("apiFeatures", kApiFeatures); | 195 data->SetString("apiFeatures", kApiFeatures); |
193 data->SetInteger("apiMinVersion", kApiMinMessagingVersion); | 196 data->SetInteger("apiMinVersion", kApiMinMessagingVersion); |
| 197 data->SetString("requestedCapabilities", kRequestedCapabilities); |
| 198 data->SetString("supportedCapabilities", kSupportedCapabilities); |
| 199 |
194 PostChromotingMessage("hello", data.Pass()); | 200 PostChromotingMessage("hello", data.Pass()); |
195 } | 201 } |
196 | 202 |
197 ChromotingInstance::~ChromotingInstance() { | 203 ChromotingInstance::~ChromotingInstance() { |
198 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); | 204 DCHECK(plugin_task_runner_->BelongsToCurrentThread()); |
199 | 205 |
200 // Unregister this instance so that debug log messages will no longer be sent | 206 // Unregister this instance so that debug log messages will no longer be sent |
201 // to it. This will stop all logging in all Chromoting instances. | 207 // to it. This will stop all logging in all Chromoting instances. |
202 UnregisterLoggingInstance(); | 208 UnregisterLoggingInstance(); |
203 | 209 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 this->AsWeakPtr()); | 296 this->AsWeakPtr()); |
291 } else { | 297 } else { |
292 std::string shared_secret; | 298 std::string shared_secret; |
293 if (!data->GetString("sharedSecret", &shared_secret)) { | 299 if (!data->GetString("sharedSecret", &shared_secret)) { |
294 LOG(ERROR) << "sharedSecret not specified in connect()."; | 300 LOG(ERROR) << "sharedSecret not specified in connect()."; |
295 return; | 301 return; |
296 } | 302 } |
297 config.fetch_secret_callback = | 303 config.fetch_secret_callback = |
298 base::Bind(&ChromotingInstance::FetchSecretFromString, shared_secret); | 304 base::Bind(&ChromotingInstance::FetchSecretFromString, shared_secret); |
299 } | 305 } |
| 306 |
| 307 // Read the list of capabilities, if any. |
| 308 if (data->HasKey("capabilities")) { |
| 309 if (!data->GetString("capabilities", &config.capabilities)) { |
| 310 LOG(ERROR) << "Invalid connect() data."; |
| 311 return; |
| 312 } |
| 313 } |
| 314 |
300 Connect(config); | 315 Connect(config); |
301 } else if (method == "disconnect") { | 316 } else if (method == "disconnect") { |
302 Disconnect(); | 317 Disconnect(); |
303 } else if (method == "incomingIq") { | 318 } else if (method == "incomingIq") { |
304 std::string iq; | 319 std::string iq; |
305 if (!data->GetString("iq", &iq)) { | 320 if (!data->GetString("iq", &iq)) { |
306 LOG(ERROR) << "Invalid onIq() data."; | 321 LOG(ERROR) << "Invalid onIq() data."; |
307 return; | 322 return; |
308 } | 323 } |
309 OnIncomingIq(iq); | 324 OnIncomingIq(iq); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 data->SetString("scope", scope); | 486 data->SetString("scope", scope); |
472 PostChromotingMessage("fetchThirdPartyToken", data.Pass()); | 487 PostChromotingMessage("fetchThirdPartyToken", data.Pass()); |
473 } | 488 } |
474 | 489 |
475 void ChromotingInstance::OnConnectionReady(bool ready) { | 490 void ChromotingInstance::OnConnectionReady(bool ready) { |
476 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 491 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
477 data->SetBoolean("ready", ready); | 492 data->SetBoolean("ready", ready); |
478 PostChromotingMessage("onConnectionReady", data.Pass()); | 493 PostChromotingMessage("onConnectionReady", data.Pass()); |
479 } | 494 } |
480 | 495 |
| 496 void ChromotingInstance::SetCapabilities(const std::string& capabilities) { |
| 497 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
| 498 data->SetString("capabilities", capabilities); |
| 499 PostChromotingMessage("setCapabilities", data.Pass()); |
| 500 } |
| 501 |
481 void ChromotingInstance::FetchSecretFromDialog( | 502 void ChromotingInstance::FetchSecretFromDialog( |
482 const protocol::SecretFetchedCallback& secret_fetched_callback) { | 503 const protocol::SecretFetchedCallback& secret_fetched_callback) { |
483 // Once the Session object calls this function, it won't continue the | 504 // Once the Session object calls this function, it won't continue the |
484 // authentication until the callback is called (or connection is canceled). | 505 // authentication until the callback is called (or connection is canceled). |
485 // So, it's impossible to reach this with a callback already registered. | 506 // So, it's impossible to reach this with a callback already registered. |
486 DCHECK(secret_fetched_callback_.is_null()); | 507 DCHECK(secret_fetched_callback_.is_null()); |
487 secret_fetched_callback_ = secret_fetched_callback; | 508 secret_fetched_callback_ = secret_fetched_callback; |
488 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); | 509 scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); |
489 PostChromotingMessage("fetchPin", data.Pass()); | 510 PostChromotingMessage("fetchPin", data.Pass()); |
490 } | 511 } |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 url_components.scheme.len); | 939 url_components.scheme.len); |
919 return url_scheme == kChromeExtensionUrlScheme; | 940 return url_scheme == kChromeExtensionUrlScheme; |
920 } | 941 } |
921 | 942 |
922 bool ChromotingInstance::IsConnected() { | 943 bool ChromotingInstance::IsConnected() { |
923 return host_connection_.get() && | 944 return host_connection_.get() && |
924 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED); | 945 (host_connection_->state() == protocol::ConnectionToHost::CONNECTED); |
925 } | 946 } |
926 | 947 |
927 } // namespace remoting | 948 } // namespace remoting |
OLD | NEW |