Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: cloud_print/service/win/service_controller.cc

Issue 606443003: Remove implicit HANDLE conversions from cloud_print. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cloud_print/service/win/chrome_launcher.cc ('k') | cloud_print/service/win/service_listener.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "cloud_print/service/win/service_controller.h" 5 #include "cloud_print/service/win/service_controller.h"
6 6
7 #include <atlbase.h> 7 #include <atlbase.h>
8 #include <atlcom.h> 8 #include <atlcom.h>
9 #include <atlctl.h> 9 #include <atlctl.h>
10 10
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 HRESULT OpenService(const base::string16& name, DWORD access, 64 HRESULT OpenService(const base::string16& name, DWORD access,
65 ServiceHandle* service) { 65 ServiceHandle* service) {
66 if (!service) 66 if (!service)
67 return E_POINTER; 67 return E_POINTER;
68 68
69 ServiceHandle scm; 69 ServiceHandle scm;
70 HRESULT hr = OpenServiceManager(&scm); 70 HRESULT hr = OpenServiceManager(&scm);
71 if (FAILED(hr)) 71 if (FAILED(hr))
72 return hr; 72 return hr;
73 73
74 service->Set(::OpenService(scm, name.c_str(), access)); 74 service->Set(::OpenService(scm.Get(), name.c_str(), access));
75 75
76 if (!service->IsValid()) 76 if (!service->IsValid())
77 return cloud_print::GetLastHResult(); 77 return cloud_print::GetLastHResult();
78 78
79 return S_OK; 79 return S_OK;
80 } 80 }
81 81
82 } // namespace 82 } // namespace
83 83
84 ServiceController::ServiceController() 84 ServiceController::ServiceController()
85 : name_(cloud_print::LoadLocalString(IDS_SERVICE_NAME)), 85 : name_(cloud_print::LoadLocalString(IDS_SERVICE_NAME)),
86 command_line_(CommandLine::NO_PROGRAM) { 86 command_line_(CommandLine::NO_PROGRAM) {
87 } 87 }
88 88
89 ServiceController::~ServiceController() { 89 ServiceController::~ServiceController() {
90 } 90 }
91 91
92 HRESULT ServiceController::StartService() { 92 HRESULT ServiceController::StartService() {
93 ServiceHandle service; 93 ServiceHandle service;
94 HRESULT hr = OpenService(name_, SERVICE_START| SERVICE_QUERY_STATUS, 94 HRESULT hr = OpenService(name_, SERVICE_START| SERVICE_QUERY_STATUS,
95 &service); 95 &service);
96 if (FAILED(hr)) 96 if (FAILED(hr))
97 return hr; 97 return hr;
98 if (!::StartService(service, 0, NULL)) 98 if (!::StartService(service.Get(), 0, NULL))
99 return cloud_print::GetLastHResult(); 99 return cloud_print::GetLastHResult();
100 SERVICE_STATUS status = {0}; 100 SERVICE_STATUS status = {0};
101 while (::QueryServiceStatus(service, &status) && 101 while (::QueryServiceStatus(service.Get(), &status) &&
102 status.dwCurrentState == SERVICE_START_PENDING) { 102 status.dwCurrentState == SERVICE_START_PENDING) {
103 Sleep(100); 103 Sleep(100);
104 } 104 }
105 return S_OK; 105 return S_OK;
106 } 106 }
107 107
108 HRESULT ServiceController::StopService() { 108 HRESULT ServiceController::StopService() {
109 ServiceHandle service; 109 ServiceHandle service;
110 HRESULT hr = OpenService(name_, SERVICE_STOP | SERVICE_QUERY_STATUS, 110 HRESULT hr = OpenService(name_, SERVICE_STOP | SERVICE_QUERY_STATUS,
111 &service); 111 &service);
112 if (FAILED(hr)) 112 if (FAILED(hr))
113 return hr; 113 return hr;
114 SERVICE_STATUS status = {0}; 114 SERVICE_STATUS status = {0};
115 if (!::ControlService(service, SERVICE_CONTROL_STOP, &status)) 115 if (!::ControlService(service.Get(), SERVICE_CONTROL_STOP, &status))
116 return cloud_print::GetLastHResult(); 116 return cloud_print::GetLastHResult();
117 while (::QueryServiceStatus(service, &status) && 117 while (::QueryServiceStatus(service.Get(), &status) &&
118 status.dwCurrentState > SERVICE_STOPPED) { 118 status.dwCurrentState > SERVICE_STOPPED) {
119 Sleep(500); 119 Sleep(500);
120 ::ControlService(service, SERVICE_CONTROL_STOP, &status); 120 ::ControlService(service.Get(), SERVICE_CONTROL_STOP, &status);
121 } 121 }
122 return S_OK; 122 return S_OK;
123 } 123 }
124 124
125 base::FilePath ServiceController::GetBinary() const { 125 base::FilePath ServiceController::GetBinary() const {
126 base::FilePath service_path; 126 base::FilePath service_path;
127 CHECK(PathService::Get(base::FILE_EXE, &service_path)); 127 CHECK(PathService::Get(base::FILE_EXE, &service_path));
128 return service_path.DirName().Append(base::FilePath(kServiceExeName)); 128 return service_path.DirName().Append(base::FilePath(kServiceExeName));
129 } 129 }
130 130
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 190
191 ServiceHandle scm; 191 ServiceHandle scm;
192 hr = OpenServiceManager(&scm); 192 hr = OpenServiceManager(&scm);
193 if (FAILED(hr)) 193 if (FAILED(hr))
194 return hr; 194 return hr;
195 195
196 base::string16 display_name = 196 base::string16 display_name =
197 cloud_print::LoadLocalString(IDS_SERVICE_DISPLAY_NAME); 197 cloud_print::LoadLocalString(IDS_SERVICE_DISPLAY_NAME);
198 ServiceHandle service( 198 ServiceHandle service(
199 ::CreateService( 199 ::CreateService(
200 scm, name_.c_str(), display_name.c_str(), SERVICE_ALL_ACCESS, 200 scm.Get(), name_.c_str(), display_name.c_str(), SERVICE_ALL_ACCESS,
201 SERVICE_WIN32_OWN_PROCESS, 201 SERVICE_WIN32_OWN_PROCESS,
202 auto_start ? SERVICE_AUTO_START : SERVICE_DEMAND_START, 202 auto_start ? SERVICE_AUTO_START : SERVICE_DEMAND_START,
203 SERVICE_ERROR_NORMAL, command_line.GetCommandLineString().c_str(), 203 SERVICE_ERROR_NORMAL, command_line.GetCommandLineString().c_str(),
204 NULL, NULL, NULL, user.empty() ? NULL : user.c_str(), 204 NULL, NULL, NULL, user.empty() ? NULL : user.c_str(),
205 password.empty() ? NULL : password.c_str())); 205 password.empty() ? NULL : password.c_str()));
206 206
207 if (!service.IsValid()) { 207 if (!service.IsValid()) {
208 LOG(ERROR) << "Failed to install service as " << user << "."; 208 LOG(ERROR) << "Failed to install service as " << user << ".";
209 return cloud_print::GetLastHResult(); 209 return cloud_print::GetLastHResult();
210 } 210 }
211 211
212 base::string16 description_string = 212 base::string16 description_string =
213 cloud_print::LoadLocalString(IDS_SERVICE_DESCRIPTION); 213 cloud_print::LoadLocalString(IDS_SERVICE_DESCRIPTION);
214 SERVICE_DESCRIPTION description = {0}; 214 SERVICE_DESCRIPTION description = {0};
215 description.lpDescription = const_cast<wchar_t*>(description_string.c_str()); 215 description.lpDescription = const_cast<wchar_t*>(description_string.c_str());
216 ::ChangeServiceConfig2(service, SERVICE_CONFIG_DESCRIPTION, &description); 216 ::ChangeServiceConfig2(service.Get(), SERVICE_CONFIG_DESCRIPTION,
217 &description);
217 218
218 return S_OK; 219 return S_OK;
219 } 220 }
220 221
221 HRESULT ServiceController::UninstallService() { 222 HRESULT ServiceController::UninstallService() {
222 StopService(); 223 StopService();
223 224
224 ServiceHandle service; 225 ServiceHandle service;
225 OpenService(name_, SERVICE_STOP | DELETE, &service); 226 OpenService(name_, SERVICE_STOP | DELETE, &service);
226 HRESULT hr = S_FALSE; 227 HRESULT hr = S_FALSE;
227 if (service) { 228 if (service.IsValid()) {
228 if (!::DeleteService(service)) { 229 if (!::DeleteService(service.Get())) {
229 LOG(ERROR) << "Failed to uninstall service"; 230 LOG(ERROR) << "Failed to uninstall service";
230 hr = cloud_print::GetLastHResult(); 231 hr = cloud_print::GetLastHResult();
231 } 232 }
232 } 233 }
233 UpdateRegistryAppId(false); 234 UpdateRegistryAppId(false);
234 return hr; 235 return hr;
235 } 236 }
236 237
237 HRESULT ServiceController::UpdateBinaryPath() { 238 HRESULT ServiceController::UpdateBinaryPath() {
238 UpdateState(); 239 UpdateState();
239 ServiceController::State origina_state = state(); 240 ServiceController::State origina_state = state();
240 if (origina_state < ServiceController::STATE_STOPPED) 241 if (origina_state < ServiceController::STATE_STOPPED)
241 return S_FALSE; 242 return S_FALSE;
242 243
243 ServiceHandle service; 244 ServiceHandle service;
244 HRESULT hr = OpenService(name_, SERVICE_CHANGE_CONFIG, &service); 245 HRESULT hr = OpenService(name_, SERVICE_CHANGE_CONFIG, &service);
245 if (FAILED(hr)) 246 if (FAILED(hr))
246 return hr; 247 return hr;
247 248
248 base::FilePath service_path = GetBinary(); 249 base::FilePath service_path = GetBinary();
249 if (!base::PathExists(service_path)) 250 if (!base::PathExists(service_path))
250 return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); 251 return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
251 252
252 command_line_.SetProgram(service_path); 253 command_line_.SetProgram(service_path);
253 if (!::ChangeServiceConfig(service, SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, 254 if (!::ChangeServiceConfig(service.Get(), SERVICE_NO_CHANGE,
254 SERVICE_NO_CHANGE, 255 SERVICE_NO_CHANGE, SERVICE_NO_CHANGE,
255 command_line_.GetCommandLineString().c_str(), NULL, 256 command_line_.GetCommandLineString().c_str(), NULL,
256 NULL, NULL, NULL, NULL, NULL)) { 257 NULL, NULL, NULL, NULL, NULL)) {
257 return cloud_print::GetLastHResult(); 258 return cloud_print::GetLastHResult();
258 } 259 }
259 260
260 if (origina_state != ServiceController::STATE_RUNNING) 261 if (origina_state != ServiceController::STATE_RUNNING)
261 return S_OK; 262 return S_OK;
262 263
263 hr = StopService(); 264 hr = StopService();
264 if (FAILED(hr)) 265 if (FAILED(hr))
(...skipping 12 matching lines...) Expand all
277 is_logging_enabled_ = false; 278 is_logging_enabled_ = false;
278 279
279 ServiceHandle service; 280 ServiceHandle service;
280 HRESULT hr = OpenService(name_, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG, 281 HRESULT hr = OpenService(name_, SERVICE_QUERY_STATUS | SERVICE_QUERY_CONFIG,
281 &service); 282 &service);
282 if (FAILED(hr)) 283 if (FAILED(hr))
283 return; 284 return;
284 285
285 state_ = STATE_STOPPED; 286 state_ = STATE_STOPPED;
286 SERVICE_STATUS status = {0}; 287 SERVICE_STATUS status = {0};
287 if (::QueryServiceStatus(service, &status) && 288 if (::QueryServiceStatus(service.Get(), &status) &&
288 status.dwCurrentState == SERVICE_RUNNING) { 289 status.dwCurrentState == SERVICE_RUNNING) {
289 state_ = STATE_RUNNING; 290 state_ = STATE_RUNNING;
290 } 291 }
291 292
292 DWORD config_size = 0; 293 DWORD config_size = 0;
293 ::QueryServiceConfig(service, NULL, 0, &config_size); 294 ::QueryServiceConfig(service.Get(), NULL, 0, &config_size);
294 if (!config_size) 295 if (!config_size)
295 return; 296 return;
296 297
297 std::vector<uint8> buffer(config_size, 0); 298 std::vector<uint8> buffer(config_size, 0);
298 QUERY_SERVICE_CONFIG* config = 299 QUERY_SERVICE_CONFIG* config =
299 reinterpret_cast<QUERY_SERVICE_CONFIG*>(&buffer[0]); 300 reinterpret_cast<QUERY_SERVICE_CONFIG*>(&buffer[0]);
300 if (!::QueryServiceConfig(service, config, buffer.size(), &config_size) || 301 if (!::QueryServiceConfig(service.Get(), config, buffer.size(),
302 &config_size) ||
301 config_size != buffer.size()) { 303 config_size != buffer.size()) {
302 return; 304 return;
303 } 305 }
304 306
305 command_line_ = CommandLine::FromString(config->lpBinaryPathName); 307 command_line_ = CommandLine::FromString(config->lpBinaryPathName);
306 if (!command_line_.HasSwitch(kServiceSwitch)) { 308 if (!command_line_.HasSwitch(kServiceSwitch)) {
307 state_ = STATE_NOT_FOUND; 309 state_ = STATE_NOT_FOUND;
308 return; 310 return;
309 } 311 }
310 is_logging_enabled_ = command_line_.HasSwitch(switches::kEnableLogging); 312 is_logging_enabled_ = command_line_.HasSwitch(switches::kEnableLogging);
311 user_ = config->lpServiceStartName; 313 user_ = config->lpServiceStartName;
312 } 314 }
313 315
314 bool ServiceController::is_logging_enabled() const { 316 bool ServiceController::is_logging_enabled() const {
315 return command_line_.HasSwitch(switches::kEnableLogging); 317 return command_line_.HasSwitch(switches::kEnableLogging);
316 } 318 }
OLDNEW
« no previous file with comments | « cloud_print/service/win/chrome_launcher.cc ('k') | cloud_print/service/win/service_listener.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698