| 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" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 | 83 |
| 84 default: | 84 default: |
| 85 NOTREACHED(); | 85 NOTREACHED(); |
| 86 return DaemonController::STATE_UNKNOWN; | 86 return DaemonController::STATE_UNKNOWN; |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 DWORD OpenService(ScopedScHandle* service_out) { | 90 DWORD OpenService(ScopedScHandle* service_out) { |
| 91 // Open the service and query its current state. | 91 // Open the service and query its current state. |
| 92 ScopedScHandle scmanager( | 92 ScopedScHandle scmanager( |
| 93 ::OpenSCManagerW(NULL, SERVICES_ACTIVE_DATABASE, | 93 ::OpenSCManagerW(nullptr, SERVICES_ACTIVE_DATABASE, |
| 94 SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE)); | 94 SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE)); |
| 95 if (!scmanager.IsValid()) { | 95 if (!scmanager.IsValid()) { |
| 96 DWORD error = GetLastError(); | 96 DWORD error = GetLastError(); |
| 97 PLOG(ERROR) << "Failed to connect to the service control manager"; | 97 PLOG(ERROR) << "Failed to connect to the service control manager"; |
| 98 return error; | 98 return error; |
| 99 } | 99 } |
| 100 | 100 |
| 101 ScopedScHandle service(::OpenServiceW(scmanager.Get(), kWindowsServiceName, | 101 ScopedScHandle service(::OpenServiceW(scmanager.Get(), kWindowsServiceName, |
| 102 SERVICE_QUERY_STATUS)); | 102 SERVICE_QUERY_STATUS)); |
| 103 if (!service.IsValid()) { | 103 if (!service.IsValid()) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 128 | 128 |
| 129 void InvokeCompletionCallback( | 129 void InvokeCompletionCallback( |
| 130 const DaemonController::CompletionCallback& done, HRESULT hr) { | 130 const DaemonController::CompletionCallback& done, HRESULT hr) { |
| 131 done.Run(HResultToAsyncResult(hr)); | 131 done.Run(HResultToAsyncResult(hr)); |
| 132 } | 132 } |
| 133 | 133 |
| 134 } // namespace | 134 } // namespace |
| 135 | 135 |
| 136 DaemonControllerDelegateWin::DaemonControllerDelegateWin() | 136 DaemonControllerDelegateWin::DaemonControllerDelegateWin() |
| 137 : control_is_elevated_(false), | 137 : control_is_elevated_(false), |
| 138 window_handle_(NULL) { | 138 window_handle_(nullptr) { |
| 139 } | 139 } |
| 140 | 140 |
| 141 DaemonControllerDelegateWin::~DaemonControllerDelegateWin() { | 141 DaemonControllerDelegateWin::~DaemonControllerDelegateWin() { |
| 142 } | 142 } |
| 143 | 143 |
| 144 DaemonController::State DaemonControllerDelegateWin::GetState() { | 144 DaemonController::State DaemonControllerDelegateWin::GetState() { |
| 145 if (base::win::GetVersion() < base::win::VERSION_XP) { | 145 if (base::win::GetVersion() < base::win::VERSION_XP) { |
| 146 return DaemonController::STATE_NOT_IMPLEMENTED; | 146 return DaemonController::STATE_NOT_IMPLEMENTED; |
| 147 } | 147 } |
| 148 // TODO(alexeypa): Make the thread alertable, so we can switch to APC | 148 // TODO(alexeypa): Make the thread alertable, so we can switch to APC |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 void DaemonControllerDelegateWin::UpdateConfig( | 235 void DaemonControllerDelegateWin::UpdateConfig( |
| 236 scoped_ptr<base::DictionaryValue> config, | 236 scoped_ptr<base::DictionaryValue> config, |
| 237 const DaemonController::CompletionCallback& done) { | 237 const DaemonController::CompletionCallback& done) { |
| 238 HRESULT hr = ActivateElevatedController(); | 238 HRESULT hr = ActivateElevatedController(); |
| 239 if (FAILED(hr)) { | 239 if (FAILED(hr)) { |
| 240 InvokeCompletionCallback(done, hr); | 240 InvokeCompletionCallback(done, hr); |
| 241 return; | 241 return; |
| 242 } | 242 } |
| 243 | 243 |
| 244 // Update the configuration. | 244 // Update the configuration. |
| 245 ScopedBstr config_str(NULL); | 245 ScopedBstr config_str(nullptr); |
| 246 ConfigToString(*config, &config_str); | 246 ConfigToString(*config, &config_str); |
| 247 if (config_str == NULL) { | 247 if (config_str == nullptr) { |
| 248 InvokeCompletionCallback(done, E_OUTOFMEMORY); | 248 InvokeCompletionCallback(done, E_OUTOFMEMORY); |
| 249 return; | 249 return; |
| 250 } | 250 } |
| 251 | 251 |
| 252 // Make sure that the PIN confirmation dialog is focused properly. | 252 // Make sure that the PIN confirmation dialog is focused properly. |
| 253 hr = control_->SetOwnerWindow( | 253 hr = control_->SetOwnerWindow( |
| 254 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); | 254 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); |
| 255 if (FAILED(hr)) { | 255 if (FAILED(hr)) { |
| 256 InvokeCompletionCallback(done, hr); | 256 InvokeCompletionCallback(done, hr); |
| 257 return; | 257 return; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 consent.set_by_policy = false; | 298 consent.set_by_policy = false; |
| 299 | 299 |
| 300 // Activate the Daemon Controller and see if it supports |IDaemonControl2|. | 300 // Activate the Daemon Controller and see if it supports |IDaemonControl2|. |
| 301 HRESULT hr = ActivateController(); | 301 HRESULT hr = ActivateController(); |
| 302 if (FAILED(hr)) { | 302 if (FAILED(hr)) { |
| 303 // The host is not installed yet. Assume that the user didn't consent to | 303 // The host is not installed yet. Assume that the user didn't consent to |
| 304 // collecting crash dumps. | 304 // collecting crash dumps. |
| 305 return consent; | 305 return consent; |
| 306 } | 306 } |
| 307 | 307 |
| 308 if (control2_.get() == NULL) { | 308 if (control2_.get() == nullptr) { |
| 309 // The host is installed and does not support crash dump reporting. | 309 // The host is installed and does not support crash dump reporting. |
| 310 return consent; | 310 return consent; |
| 311 } | 311 } |
| 312 | 312 |
| 313 // Get the recorded user's consent. | 313 // Get the recorded user's consent. |
| 314 BOOL allowed; | 314 BOOL allowed; |
| 315 BOOL set_by_policy; | 315 BOOL set_by_policy; |
| 316 hr = control2_->GetUsageStatsConsent(&allowed, &set_by_policy); | 316 hr = control2_->GetUsageStatsConsent(&allowed, &set_by_policy); |
| 317 if (FAILED(hr)) { | 317 if (FAILED(hr)) { |
| 318 // If the user's consent is not recorded yet, assume that the user didn't | 318 // If the user's consent is not recorded yet, assume that the user didn't |
| 319 // consent to collecting crash dumps. | 319 // consent to collecting crash dumps. |
| 320 return consent; | 320 return consent; |
| 321 } | 321 } |
| 322 | 322 |
| 323 consent.allowed = !!allowed; | 323 consent.allowed = !!allowed; |
| 324 consent.set_by_policy = !!set_by_policy; | 324 consent.set_by_policy = !!set_by_policy; |
| 325 return consent; | 325 return consent; |
| 326 } | 326 } |
| 327 | 327 |
| 328 HRESULT DaemonControllerDelegateWin::ActivateController() { | 328 HRESULT DaemonControllerDelegateWin::ActivateController() { |
| 329 if (!control_.get()) { | 329 if (!control_.get()) { |
| 330 CLSID class_id; | 330 CLSID class_id; |
| 331 HRESULT hr = CLSIDFromProgID(kDaemonController, &class_id); | 331 HRESULT hr = CLSIDFromProgID(kDaemonController, &class_id); |
| 332 if (FAILED(hr)) { | 332 if (FAILED(hr)) { |
| 333 return hr; | 333 return hr; |
| 334 } | 334 } |
| 335 | 335 |
| 336 hr = CoCreateInstance(class_id, NULL, CLSCTX_LOCAL_SERVER, | 336 hr = CoCreateInstance(class_id, nullptr, CLSCTX_LOCAL_SERVER, |
| 337 IID_IDaemonControl, control_.ReceiveVoid()); | 337 IID_IDaemonControl, control_.ReceiveVoid()); |
| 338 if (FAILED(hr)) { | 338 if (FAILED(hr)) { |
| 339 return hr; | 339 return hr; |
| 340 } | 340 } |
| 341 | 341 |
| 342 // Ignore the error. IID_IDaemonControl2 is optional. | 342 // Ignore the error. IID_IDaemonControl2 is optional. |
| 343 control_.QueryInterface(IID_IDaemonControl2, control2_.ReceiveVoid()); | 343 control_.QueryInterface(IID_IDaemonControl2, control2_.ReceiveVoid()); |
| 344 | 344 |
| 345 // Release |control_| upon expiration of the timeout. | 345 // Release |control_| upon expiration of the timeout. |
| 346 release_timer_.reset(new base::OneShotTimer<DaemonControllerDelegateWin>()); | 346 release_timer_.reset(new base::OneShotTimer<DaemonControllerDelegateWin>()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 // Record the user's consent. | 425 // Record the user's consent. |
| 426 if (control2_.get()) { | 426 if (control2_.get()) { |
| 427 hr = control2_->SetUsageStatsConsent(consent); | 427 hr = control2_->SetUsageStatsConsent(consent); |
| 428 if (FAILED(hr)) { | 428 if (FAILED(hr)) { |
| 429 InvokeCompletionCallback(done, hr); | 429 InvokeCompletionCallback(done, hr); |
| 430 return; | 430 return; |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 | 433 |
| 434 // Set the configuration. | 434 // Set the configuration. |
| 435 ScopedBstr config_str(NULL); | 435 ScopedBstr config_str(nullptr); |
| 436 ConfigToString(*config, &config_str); | 436 ConfigToString(*config, &config_str); |
| 437 if (config_str == NULL) { | 437 if (config_str == nullptr) { |
| 438 InvokeCompletionCallback(done, E_OUTOFMEMORY); | 438 InvokeCompletionCallback(done, E_OUTOFMEMORY); |
| 439 return; | 439 return; |
| 440 } | 440 } |
| 441 | 441 |
| 442 hr = control_->SetOwnerWindow( | 442 hr = control_->SetOwnerWindow( |
| 443 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); | 443 reinterpret_cast<LONG_PTR>(GetTopLevelWindow(window_handle_))); |
| 444 if (FAILED(hr)) { | 444 if (FAILED(hr)) { |
| 445 InvokeCompletionCallback(done, hr); | 445 InvokeCompletionCallback(done, hr); |
| 446 return; | 446 return; |
| 447 } | 447 } |
| 448 | 448 |
| 449 hr = control_->SetConfig(config_str); | 449 hr = control_->SetConfig(config_str); |
| 450 if (FAILED(hr)) { | 450 if (FAILED(hr)) { |
| 451 InvokeCompletionCallback(done, hr); | 451 InvokeCompletionCallback(done, hr); |
| 452 return; | 452 return; |
| 453 } | 453 } |
| 454 | 454 |
| 455 // Start daemon. | 455 // Start daemon. |
| 456 hr = control_->StartDaemon(); | 456 hr = control_->StartDaemon(); |
| 457 InvokeCompletionCallback(done, hr); | 457 InvokeCompletionCallback(done, hr); |
| 458 } | 458 } |
| 459 | 459 |
| 460 scoped_refptr<DaemonController> DaemonController::Create() { | 460 scoped_refptr<DaemonController> DaemonController::Create() { |
| 461 scoped_ptr<DaemonController::Delegate> delegate( | 461 scoped_ptr<DaemonController::Delegate> delegate( |
| 462 new DaemonControllerDelegateWin()); | 462 new DaemonControllerDelegateWin()); |
| 463 return new DaemonController(delegate.Pass()); | 463 return new DaemonController(delegate.Pass()); |
| 464 } | 464 } |
| 465 | 465 |
| 466 } // namespace remoting | 466 } // namespace remoting |
| OLD | NEW |