| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/host/setup/daemon_controller_delegate_win.h" | 5 #include "remoting/host/setup/daemon_controller_delegate_win.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/json/json_reader.h" | 11 #include "base/json/json_reader.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/strings/string16.h" | 14 #include "base/strings/string16.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/thread_task_runner_handle.h" | 16 #include "base/thread_task_runner_handle.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "base/timer/timer.h" | 18 #include "base/timer/timer.h" |
| 19 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "base/win/scoped_bstr.h" | 20 #include "base/win/scoped_bstr.h" |
| 21 #include "base/win/scoped_comptr.h" | 21 #include "base/win/scoped_comptr.h" |
| 22 #include "base/win/windows_version.h" | 22 #include "base/win/windows_version.h" |
| 23 #include "remoting/base/scoped_sc_handle_win.h" | 23 #include "remoting/base/scoped_sc_handle_win.h" |
| 24 #include "remoting/host/branding.h" | 24 #include "remoting/host/branding.h" |
| 25 // chromoting_lib.h contains MIDL-generated declarations. | 25 // chromoting_lib.h contains MIDL-generated declarations. |
| 26 #include "remoting/host/chromoting_lib.h" | 26 #include "remoting/host/chromoting_lib.h" |
| 27 #include "remoting/host/setup/daemon_installer_win.h" | |
| 28 #include "remoting/host/usage_stats_consent.h" | 27 #include "remoting/host/usage_stats_consent.h" |
| 29 | 28 |
| 30 using base::win::ScopedBstr; | 29 using base::win::ScopedBstr; |
| 31 using base::win::ScopedComPtr; | 30 using base::win::ScopedComPtr; |
| 32 | 31 |
| 33 namespace remoting { | 32 namespace remoting { |
| 34 | 33 |
| 35 namespace { | 34 namespace { |
| 36 | 35 |
| 37 // ProgID of the daemon controller. | 36 // ProgID of the daemon controller. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 return DaemonController::RESULT_OK; | 120 return DaemonController::RESULT_OK; |
| 122 } else if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { | 121 } else if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) { |
| 123 return DaemonController::RESULT_CANCELLED; | 122 return DaemonController::RESULT_CANCELLED; |
| 124 } else { | 123 } else { |
| 125 // TODO(sergeyu): Report other errors to the webapp once it knows | 124 // TODO(sergeyu): Report other errors to the webapp once it knows |
| 126 // how to handle them. | 125 // how to handle them. |
| 127 return DaemonController::RESULT_FAILED; | 126 return DaemonController::RESULT_FAILED; |
| 128 } | 127 } |
| 129 } | 128 } |
| 130 | 129 |
| 130 void InvokeCompletionCallback( |
| 131 const DaemonController::CompletionCallback& done, HRESULT hr) { |
| 132 done.Run(HResultToAsyncResult(hr)); |
| 133 } |
| 134 |
| 131 } // namespace | 135 } // namespace |
| 132 | 136 |
| 133 DaemonControllerDelegateWin::DaemonControllerDelegateWin() | 137 DaemonControllerDelegateWin::DaemonControllerDelegateWin() |
| 134 : control_is_elevated_(false), | 138 : control_is_elevated_(false), |
| 135 window_handle_(NULL) { | 139 window_handle_(NULL) { |
| 136 } | 140 } |
| 137 | 141 |
| 138 DaemonControllerDelegateWin::~DaemonControllerDelegateWin() { | 142 DaemonControllerDelegateWin::~DaemonControllerDelegateWin() { |
| 139 } | 143 } |
| 140 | 144 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 base::JSONReader::Read(base::UTF16ToUTF8(file_content), | 190 base::JSONReader::Read(base::UTF16ToUTF8(file_content), |
| 187 base::JSON_ALLOW_TRAILING_COMMAS)); | 191 base::JSON_ALLOW_TRAILING_COMMAS)); |
| 188 | 192 |
| 189 if (!config || config->GetType() != base::Value::TYPE_DICTIONARY) | 193 if (!config || config->GetType() != base::Value::TYPE_DICTIONARY) |
| 190 return scoped_ptr<base::DictionaryValue>(); | 194 return scoped_ptr<base::DictionaryValue>(); |
| 191 | 195 |
| 192 return scoped_ptr<base::DictionaryValue>( | 196 return scoped_ptr<base::DictionaryValue>( |
| 193 static_cast<base::DictionaryValue*>(config.release())); | 197 static_cast<base::DictionaryValue*>(config.release())); |
| 194 } | 198 } |
| 195 | 199 |
| 200 void DaemonControllerDelegateWin::InstallHost( |
| 201 const DaemonController::CompletionCallback& done) { |
| 202 DoInstallHost(base::Bind(&InvokeCompletionCallback, done)); |
| 203 } |
| 204 |
| 196 void DaemonControllerDelegateWin::SetConfigAndStart( | 205 void DaemonControllerDelegateWin::SetConfigAndStart( |
| 197 scoped_ptr<base::DictionaryValue> config, | 206 scoped_ptr<base::DictionaryValue> config, |
| 198 bool consent, | 207 bool consent, |
| 199 const DaemonController::CompletionCallback& done) { | 208 const DaemonController::CompletionCallback& done) { |
| 209 DoInstallHost( |
| 210 base::Bind(&DaemonControllerDelegateWin::StartHostWithConfig, |
| 211 base::Unretained(this), base::Passed(&config), consent, done)); |
| 212 } |
| 213 |
| 214 void DaemonControllerDelegateWin::DoInstallHost( |
| 215 const DaemonInstallerWin::CompletionCallback& done) { |
| 200 // Configure and start the Daemon Controller if it is installed already. | 216 // Configure and start the Daemon Controller if it is installed already. |
| 201 HRESULT hr = ActivateElevatedController(); | 217 HRESULT hr = ActivateElevatedController(); |
| 202 if (SUCCEEDED(hr)) { | 218 if (SUCCEEDED(hr)) { |
| 203 OnInstallationComplete(config.Pass(), consent, done, S_OK); | 219 done.Run(S_OK); |
| 204 return; | 220 return; |
| 205 } | 221 } |
| 206 | 222 |
| 207 // Otherwise, install it if its COM registration entry is missing. | 223 // Otherwise, install it if its COM registration entry is missing. |
| 208 if (hr == CO_E_CLASSSTRING) { | 224 if (hr == CO_E_CLASSSTRING) { |
| 209 DCHECK(!installer_); | 225 DCHECK(!installer_); |
| 210 | 226 |
| 211 installer_ = DaemonInstallerWin::Create( | 227 installer_ = DaemonInstallerWin::Create( |
| 212 GetTopLevelWindow(window_handle_), | 228 GetTopLevelWindow(window_handle_), done); |
| 213 base::Bind(&DaemonControllerDelegateWin::OnInstallationComplete, | |
| 214 base::Unretained(this), | |
| 215 base::Passed(&config), | |
| 216 consent, | |
| 217 done)); | |
| 218 installer_->Install(); | 229 installer_->Install(); |
| 219 return; | 230 return; |
| 220 } | 231 } |
| 221 | 232 |
| 222 LOG(ERROR) << "Failed to initiate the Chromoting Host installation " | 233 LOG(ERROR) << "Failed to initiate the Chromoting Host installation " |
| 223 << "(error: 0x" << std::hex << hr << std::dec << ")."; | 234 << "(error: 0x" << std::hex << hr << std::dec << ")."; |
| 224 done.Run(HResultToAsyncResult(hr)); | 235 done.Run(hr); |
| 225 } | 236 } |
| 226 | 237 |
| 227 void DaemonControllerDelegateWin::UpdateConfig( | 238 void DaemonControllerDelegateWin::UpdateConfig( |
| 228 scoped_ptr<base::DictionaryValue> config, | 239 scoped_ptr<base::DictionaryValue> config, |
| 229 const DaemonController::CompletionCallback& done) { | 240 const DaemonController::CompletionCallback& done) { |
| 230 HRESULT hr = ActivateElevatedController(); | 241 HRESULT hr = ActivateElevatedController(); |
| 231 if (FAILED(hr)) { | 242 if (FAILED(hr)) { |
| 232 done.Run(HResultToAsyncResult(hr)); | 243 InvokeCompletionCallback(done, hr); |
| 233 return; | 244 return; |
| 234 } | 245 } |
| 235 | 246 |
| 236 // Update the configuration. | 247 // Update the configuration. |
| 237 ScopedBstr config_str(NULL); | 248 ScopedBstr config_str(NULL); |
| 238 ConfigToString(*config, &config_str); | 249 ConfigToString(*config, &config_str); |
| 239 if (config_str == NULL) { | 250 if (config_str == NULL) { |
| 240 done.Run(HResultToAsyncResult(E_OUTOFMEMORY)); | 251 InvokeCompletionCallback(done, E_OUTOFMEMORY); |
| 241 return; | 252 return; |
| 242 } | 253 } |
| 243 | 254 |
| 244 // Make sure that the PIN confirmation dialog is focused properly. | 255 // Make sure that the PIN confirmation dialog is focused properly. |
| 245 hr = control_->SetOwnerWindow( | 256 hr = control_->SetOwnerWindow( |
| 246 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); | 257 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); |
| 247 if (FAILED(hr)) { | 258 if (FAILED(hr)) { |
| 248 done.Run(HResultToAsyncResult(hr)); | 259 InvokeCompletionCallback(done, hr); |
| 249 return; | 260 return; |
| 250 } | 261 } |
| 251 | 262 |
| 252 hr = control_->UpdateConfig(config_str); | 263 hr = control_->UpdateConfig(config_str); |
| 253 done.Run(HResultToAsyncResult(hr)); | 264 InvokeCompletionCallback(done, hr); |
| 254 } | 265 } |
| 255 | 266 |
| 256 void DaemonControllerDelegateWin::Stop( | 267 void DaemonControllerDelegateWin::Stop( |
| 257 const DaemonController::CompletionCallback& done) { | 268 const DaemonController::CompletionCallback& done) { |
| 258 HRESULT hr = ActivateElevatedController(); | 269 HRESULT hr = ActivateElevatedController(); |
| 259 if (SUCCEEDED(hr)) | 270 if (SUCCEEDED(hr)) |
| 260 hr = control_->StopDaemon(); | 271 hr = control_->StopDaemon(); |
| 261 | 272 |
| 262 done.Run(HResultToAsyncResult(hr)); | 273 InvokeCompletionCallback(done, hr); |
| 263 } | 274 } |
| 264 | 275 |
| 265 void DaemonControllerDelegateWin::SetWindow(void* window_handle) { | 276 void DaemonControllerDelegateWin::SetWindow(void* window_handle) { |
| 266 window_handle_ = reinterpret_cast<HWND>(window_handle); | 277 window_handle_ = reinterpret_cast<HWND>(window_handle); |
| 267 } | 278 } |
| 268 | 279 |
| 269 std::string DaemonControllerDelegateWin::GetVersion() { | 280 std::string DaemonControllerDelegateWin::GetVersion() { |
| 270 // Configure and start the Daemon Controller if it is installed already. | 281 // Configure and start the Daemon Controller if it is installed already. |
| 271 HRESULT hr = ActivateController(); | 282 HRESULT hr = ActivateController(); |
| 272 if (FAILED(hr)) | 283 if (FAILED(hr)) |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 return S_OK; | 398 return S_OK; |
| 388 } | 399 } |
| 389 | 400 |
| 390 void DaemonControllerDelegateWin::ReleaseController() { | 401 void DaemonControllerDelegateWin::ReleaseController() { |
| 391 control_.Release(); | 402 control_.Release(); |
| 392 control2_.Release(); | 403 control2_.Release(); |
| 393 release_timer_.reset(); | 404 release_timer_.reset(); |
| 394 control_is_elevated_ = false; | 405 control_is_elevated_ = false; |
| 395 } | 406 } |
| 396 | 407 |
| 397 void DaemonControllerDelegateWin::OnInstallationComplete( | 408 void DaemonControllerDelegateWin::StartHostWithConfig( |
| 398 scoped_ptr<base::DictionaryValue> config, | 409 scoped_ptr<base::DictionaryValue> config, |
| 399 bool consent, | 410 bool consent, |
| 400 const DaemonController::CompletionCallback& done, | 411 const DaemonController::CompletionCallback& done, |
| 401 HRESULT hr) { | 412 HRESULT hr) { |
| 402 installer_.reset(); | 413 installer_.reset(); |
| 403 | 414 |
| 404 if (FAILED(hr)) { | 415 if (FAILED(hr)) { |
| 405 LOG(ERROR) << "Failed to install the Chromoting Host " | 416 LOG(ERROR) << "Failed to install the Chromoting Host " |
| 406 << "(error: 0x" << std::hex << hr << std::dec << ")."; | 417 << "(error: 0x" << std::hex << hr << std::dec << ")."; |
| 407 done.Run(HResultToAsyncResult(hr)); | 418 InvokeCompletionCallback(done, hr); |
| 408 return; | 419 return; |
| 409 } | 420 } |
| 410 | 421 |
| 411 hr = ActivateElevatedController(); | 422 hr = ActivateElevatedController(); |
| 412 if (FAILED(hr)) { | 423 if (FAILED(hr)) { |
| 413 done.Run(HResultToAsyncResult(hr)); | 424 InvokeCompletionCallback(done, hr); |
| 414 return; | 425 return; |
| 415 } | 426 } |
| 416 | 427 |
| 417 // Record the user's consent. | 428 // Record the user's consent. |
| 418 if (control2_) { | 429 if (control2_) { |
| 419 hr = control2_->SetUsageStatsConsent(consent); | 430 hr = control2_->SetUsageStatsConsent(consent); |
| 420 if (FAILED(hr)) { | 431 if (FAILED(hr)) { |
| 421 done.Run(HResultToAsyncResult(hr)); | 432 InvokeCompletionCallback(done, hr); |
| 422 return; | 433 return; |
| 423 } | 434 } |
| 424 } | 435 } |
| 425 | 436 |
| 426 // Set the configuration. | 437 // Set the configuration. |
| 427 ScopedBstr config_str(NULL); | 438 ScopedBstr config_str(NULL); |
| 428 ConfigToString(*config, &config_str); | 439 ConfigToString(*config, &config_str); |
| 429 if (config_str == NULL) { | 440 if (config_str == NULL) { |
| 430 done.Run(HResultToAsyncResult(E_OUTOFMEMORY)); | 441 InvokeCompletionCallback(done, E_OUTOFMEMORY); |
| 431 return; | 442 return; |
| 432 } | 443 } |
| 433 | 444 |
| 434 hr = control_->SetOwnerWindow( | 445 hr = control_->SetOwnerWindow( |
| 435 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); | 446 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); |
| 436 if (FAILED(hr)) { | 447 if (FAILED(hr)) { |
| 437 done.Run(HResultToAsyncResult(hr)); | 448 InvokeCompletionCallback(done, hr); |
| 438 return; | 449 return; |
| 439 } | 450 } |
| 440 | 451 |
| 441 hr = control_->SetConfig(config_str); | 452 hr = control_->SetConfig(config_str); |
| 442 if (FAILED(hr)) { | 453 if (FAILED(hr)) { |
| 443 done.Run(HResultToAsyncResult(hr)); | 454 InvokeCompletionCallback(done, hr); |
| 444 return; | 455 return; |
| 445 } | 456 } |
| 446 | 457 |
| 447 // Start daemon. | 458 // Start daemon. |
| 448 hr = control_->StartDaemon(); | 459 hr = control_->StartDaemon(); |
| 449 done.Run(HResultToAsyncResult(hr)); | 460 InvokeCompletionCallback(done, hr); |
| 450 } | 461 } |
| 451 | 462 |
| 452 scoped_refptr<DaemonController> DaemonController::Create() { | 463 scoped_refptr<DaemonController> DaemonController::Create() { |
| 453 scoped_ptr<DaemonController::Delegate> delegate( | 464 scoped_ptr<DaemonController::Delegate> delegate( |
| 454 new DaemonControllerDelegateWin()); | 465 new DaemonControllerDelegateWin()); |
| 455 return new DaemonController(delegate.Pass()); | 466 return new DaemonController(delegate.Pass()); |
| 456 } | 467 } |
| 457 | 468 |
| 458 } // namespace remoting | 469 } // namespace remoting |
| OLD | NEW |