diff options
-rw-r--r-- | cloud_print/common/win/cloud_print_utils.cc | 40 | ||||
-rw-r--r-- | cloud_print/common/win/cloud_print_utils.h | 27 | ||||
-rw-r--r-- | cloud_print/service/service.gyp | 3 | ||||
-rw-r--r-- | cloud_print/service/win/cloud_print_service.cc | 4 | ||||
-rw-r--r-- | cloud_print/service/win/service_controller.cc | 17 | ||||
-rw-r--r-- | cloud_print/virtual_driver/win/install/setup.cc | 3 | ||||
-rw-r--r-- | cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc | 1 | ||||
-rw-r--r-- | cloud_print/virtual_driver/win/virtual_driver.gypi | 2 | ||||
-rw-r--r-- | cloud_print/virtual_driver/win/virtual_driver_helpers.cc | 39 | ||||
-rw-r--r-- | cloud_print/virtual_driver/win/virtual_driver_helpers.h | 11 |
10 files changed, 90 insertions, 57 deletions
diff --git a/cloud_print/common/win/cloud_print_utils.cc b/cloud_print/common/win/cloud_print_utils.cc new file mode 100644 index 0000000..5816b64 --- /dev/null +++ b/cloud_print/common/win/cloud_print_utils.cc @@ -0,0 +1,40 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cloud_print/common/win/cloud_print_utils.h" + +#include <windows.h> + +namespace cloud_print { + +HRESULT GetLastHResult() { + DWORD error_code = GetLastError(); + return error_code ? HRESULT_FROM_WIN32(error_code) : E_FAIL; +} + +string16 LoadLocalString(DWORD id) { + static wchar_t dummy = L'\0'; + HMODULE module = NULL; + ::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, &dummy, &module); + LPCWSTR buffer = NULL; + // If the last parameter is 0, LoadString assume that 3rd parameter type is + // LPCWSTR* and assign pointer to read-only memory with resource. + int count = ::LoadString(module, id, reinterpret_cast<LPWSTR>(&buffer), 0); + if (!buffer) + return string16(); + return string16(buffer, buffer + count); +} + +string16 GetErrorMessage(HRESULT hr) { + LPWSTR buffer = NULL; + ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_ALLOCATE_BUFFER, + 0, hr, 0, reinterpret_cast<LPWSTR>(&buffer), 0, NULL); + string16 result(buffer); + ::LocalFree(buffer); + return result; +} + +} // namespace cloud_print diff --git a/cloud_print/common/win/cloud_print_utils.h b/cloud_print/common/win/cloud_print_utils.h new file mode 100644 index 0000000..c38dccd --- /dev/null +++ b/cloud_print/common/win/cloud_print_utils.h @@ -0,0 +1,27 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CLOUD_PRINT_COMMON_CLOUD_PRINT_UTILS_H_ +#define CLOUD_PRINT_COMMON_CLOUD_PRINT_UTILS_H_ + +#include <wtypes.h> + +#include "base/string16.h" + +namespace cloud_print { + +// Similar to the Windows API call GetLastError but returns an HRESULT. +HRESULT GetLastHResult(); + +// Convert an HRESULT to a localized string. +string16 GetErrorMessage(HRESULT hr); + +// Retrieves a string from the string table of the module that contains the +// calling code. +string16 LoadLocalString(DWORD id); + +} // namespace cloud_print + +#endif // CLOUD_PRINT_COMMON_CLOUD_PRINT_UTILS_H_ + diff --git a/cloud_print/service/service.gyp b/cloud_print/service/service.gyp index 24f0d88c..f5e4492 100644 --- a/cloud_print/service/service.gyp +++ b/cloud_print/service/service.gyp @@ -71,7 +71,10 @@ }], ], 'sources': [ + '<(DEPTH)/content/public/common/content_switches.h', '<(DEPTH)/content/public/common/content_switches.cc', + '<(DEPTH)/cloud_print/common/win/cloud_print_utils.cc', + '<(DEPTH)/cloud_print/common/win/cloud_print_utils.h', 'service_state.cc', 'service_state.h', 'service_switches.cc', diff --git a/cloud_print/service/win/cloud_print_service.cc b/cloud_print/service/win/cloud_print_service.cc index 8f387ae..75951b2 100644 --- a/cloud_print/service/win/cloud_print_service.cc +++ b/cloud_print/service/win/cloud_print_service.cc @@ -19,6 +19,7 @@ #include "base/win/scoped_handle.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_switches.h" +#include "cloud_print/common/win/cloud_print_utils.h" #include "cloud_print/service/service_state.h" #include "cloud_print/service/service_switches.h" #include "cloud_print/service/win/chrome_launcher.h" @@ -334,8 +335,7 @@ class CloudPrintServiceModule new_contents.size()); if (written != new_contents.size()) { LOG(ERROR) << "Failed to write file " << file.value() << "."; - DWORD last_error = GetLastError(); - return last_error ? HRESULT_FROM_WIN32(last_error) : E_FAIL; + return cloud_print::GetLastHResult(); } } } diff --git a/cloud_print/service/win/service_controller.cc b/cloud_print/service/win/service_controller.cc index 0db0726..c311424 100644 --- a/cloud_print/service/win/service_controller.cc +++ b/cloud_print/service/win/service_controller.cc @@ -13,15 +13,12 @@ #include "base/path_service.h" #include "base/win/scoped_handle.h" #include "chrome/common/chrome_switches.h" +#include "cloud_print/common/win/cloud_print_utils.h" #include "cloud_print/service/win/chrome_launcher.h" #include "cloud_print/service/win/local_security_policy.h" namespace { -HRESULT HResultFromLastError() { - return GetLastError() ? HRESULT_FROM_WIN32(GetLastError()) : E_FAIL; -} - // The traits class for Windows Service. class ServiceHandleTraits { public: @@ -53,7 +50,7 @@ HRESULT OpenServiceManager(ServiceHandle* service_manager) { service_manager->Set(::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)); if (!service_manager->IsValid()) - return HResultFromLastError(); + return cloud_print::GetLastHResult(); return S_OK; } @@ -71,7 +68,7 @@ HRESULT OpenService(const string16& name, DWORD access, service->Set(::OpenService(scm, name.c_str(), access)); if (!service->IsValid()) - return HResultFromLastError(); + return cloud_print::GetLastHResult(); return S_OK; } @@ -91,7 +88,7 @@ HRESULT ServiceController::StartService() { if (FAILED(hr)) return hr; if (!::StartService(service, 0, NULL)) - return HResultFromLastError(); + return cloud_print::GetLastHResult(); return S_OK; } @@ -103,7 +100,7 @@ HRESULT ServiceController::StopService() { return hr; SERVICE_STATUS status = {0}; if (!::ControlService(service, SERVICE_CONTROL_STOP, &status)) - return HResultFromLastError(); + return cloud_print::GetLastHResult(); while (::QueryServiceStatus(service, &status) && status.dwCurrentState > SERVICE_STOPPED) { Sleep(500); @@ -164,7 +161,7 @@ HRESULT ServiceController::InstallService(const string16& user, if (!service.IsValid()) { LOG(ERROR) << "Failed to install service as " << user << "."; - return HResultFromLastError(); + return cloud_print::GetLastHResult(); } return S_OK; @@ -179,7 +176,7 @@ HRESULT ServiceController::UninstallService() { if (service) { if (!::DeleteService(service)) { LOG(ERROR) << "Failed to uninstall service"; - hr = HResultFromLastError(); + hr = cloud_print::GetLastHResult(); } } UpdateRegistryAppId(false); diff --git a/cloud_print/virtual_driver/win/install/setup.cc b/cloud_print/virtual_driver/win/install/setup.cc index 8f145d6..df7eb57 100644 --- a/cloud_print/virtual_driver/win/install/setup.cc +++ b/cloud_print/virtual_driver/win/install/setup.cc @@ -22,6 +22,7 @@ #include "base/win/registry.h" #include "base/win/scoped_handle.h" #include "base/win/windows_version.h" +#include "cloud_print/common/win/cloud_print_utils.h" #include "cloud_print/virtual_driver/win/virtual_driver_consts.h" #include "cloud_print/virtual_driver/win/virtual_driver_helpers.h" #include "grit/virtual_driver_setup_resources.h" @@ -212,7 +213,7 @@ HRESULT RegisterPortMonitor(bool install, const base::FilePath& install_path) { if (install) { if (!GetExitCodeProcess(regsvr32_handle, &exit_code)) { LOG(ERROR) << "Unable to get regsvr32.exe exit code."; - return cloud_print::GetLastHResult();; + return cloud_print::GetLastHResult(); } if (exit_code != 0) { LOG(ERROR) << "Regsvr32.exe failed with " << exit_code; diff --git a/cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc b/cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc index 2ca2bd7..ae25d55 100644 --- a/cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc +++ b/cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc @@ -24,6 +24,7 @@ #include "base/win/scoped_handle.h" #include "base/win/windows_version.h" #include "chrome/common/chrome_switches.h" +#include "cloud_print/common/win/cloud_print_utils.h" #include "cloud_print/virtual_driver/win/port_monitor/spooler_win.h" #include "cloud_print/virtual_driver/win/virtual_driver_consts.h" #include "cloud_print/virtual_driver/win/virtual_driver_helpers.h" diff --git a/cloud_print/virtual_driver/win/virtual_driver.gypi b/cloud_print/virtual_driver/win/virtual_driver.gypi index dfdc5c1..80c0ffb 100644 --- a/cloud_print/virtual_driver/win/virtual_driver.gypi +++ b/cloud_print/virtual_driver/win/virtual_driver.gypi @@ -19,6 +19,8 @@ 'target_name': 'virtual_driver_lib<(virtual_driver_suffix)', 'type': 'static_library', 'sources': [ + '<(DEPTH)/cloud_print/common/win/cloud_print_utils.cc', + '<(DEPTH)/cloud_print/common/win/cloud_print_utils.h', 'virtual_driver_consts.cc', 'virtual_driver_consts.h', 'virtual_driver_helpers.cc', diff --git a/cloud_print/virtual_driver/win/virtual_driver_helpers.cc b/cloud_print/virtual_driver/win/virtual_driver_helpers.cc index c331ff8..71aa2bf 100644 --- a/cloud_print/virtual_driver/win/virtual_driver_helpers.cc +++ b/cloud_print/virtual_driver/win/virtual_driver_helpers.cc @@ -3,35 +3,22 @@ // found in the LICENSE file. #include "cloud_print/virtual_driver/win/virtual_driver_helpers.h" + #include <windows.h> #include <winspool.h> + #include "base/file_util.h" #include "base/logging.h" #include "base/string16.h" #include "base/win/windows_version.h" +#include "cloud_print/common/win/cloud_print_utils.h" namespace cloud_print { const size_t kMaxMessageLen = 100; -void DisplayWindowsMessage(HWND hwnd, - HRESULT message_id, - const string16 &caption) { - wchar_t message_text[kMaxMessageLen + 1] = L""; - - ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - message_id, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - message_text, - kMaxMessageLen, - NULL); - ::MessageBox(hwnd, message_text, caption.c_str(), MB_OK); -} - -HRESULT GetLastHResult() { - DWORD error_code = GetLastError(); - return HRESULT_FROM_WIN32(error_code); +void DisplayWindowsMessage(HWND hwnd, HRESULT hr, const string16 &caption) { + ::MessageBox(hwnd, GetErrorMessage(hr).c_str(), caption.c_str(), MB_OK); } string16 GetPortMonitorDllName() { @@ -69,21 +56,5 @@ bool IsSystem64Bit() { (arch == base::win::OSInfo::IA64_ARCHITECTURE); } -string16 LoadLocalString(DWORD string_id) { - static wchar_t dummy = L'\0'; -// We never expect strings longer than MAX_PATH characters. - static wchar_t buffer[MAX_PATH]; - HMODULE module = NULL; - GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | - GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - &dummy, - &module); - int count = LoadString(module, - string_id, - buffer, - MAX_PATH); - CHECK_NE(0, count); - return string16(buffer); -} } diff --git a/cloud_print/virtual_driver/win/virtual_driver_helpers.h b/cloud_print/virtual_driver/win/virtual_driver_helpers.h index 5380a36..18736cc 100644 --- a/cloud_print/virtual_driver/win/virtual_driver_helpers.h +++ b/cloud_print/virtual_driver/win/virtual_driver_helpers.h @@ -19,12 +19,7 @@ namespace cloud_print { bool IsSystem64Bit(); // Convert an HRESULT to a localized string and display it in a message box. -void DisplayWindowsMessage(HWND hwnd, - HRESULT message_id, - const string16 &caption); - -// Similar to the Windows API call GetLastError but returns an HRESULT. -HRESULT GetLastHResult(); +void DisplayWindowsMessage(HWND hwnd, HRESULT hr, const string16 &caption); // Returns the correct port monitor DLL file name for the current machine. string16 GetPortMonitorDllName(); @@ -32,10 +27,6 @@ string16 GetPortMonitorDllName(); // Gets the standard install path for "version 3" print drivers. HRESULT GetPrinterDriverDir(base::FilePath* path); -// Retrieves a string from the string table of the module that contains the -// calling code. -string16 LoadLocalString(DWORD string_id); - } // namespace cloud_print #endif // CLOUD_PRINT_VIRTUAL_DRIVER_WIN_VIRTUAL_DRIVER_HELPERS_H_ |