summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cloud_print/common/win/cloud_print_utils.cc40
-rw-r--r--cloud_print/common/win/cloud_print_utils.h27
-rw-r--r--cloud_print/service/service.gyp3
-rw-r--r--cloud_print/service/win/cloud_print_service.cc4
-rw-r--r--cloud_print/service/win/service_controller.cc17
-rw-r--r--cloud_print/virtual_driver/win/install/setup.cc3
-rw-r--r--cloud_print/virtual_driver/win/port_monitor/port_monitor_dll.cc1
-rw-r--r--cloud_print/virtual_driver/win/virtual_driver.gypi2
-rw-r--r--cloud_print/virtual_driver/win/virtual_driver_helpers.cc39
-rw-r--r--cloud_print/virtual_driver/win/virtual_driver_helpers.h11
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_