1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cloud_print/virtual_driver/win/virtual_driver_helpers.h"
6
7#include <windows.h>
8#include <winspool.h>
9
10#include "base/files/file_util.h"
11#include "base/logging.h"
12#include "base/strings/string16.h"
13#include "base/win/windows_version.h"
14#include "cloud_print/common/win/cloud_print_utils.h"
15
16namespace cloud_print {
17
18const size_t kMaxMessageLen = 100;
19
20void DisplayWindowsMessage(HWND hwnd, HRESULT hr,
21                           const base::string16 &caption) {
22  ::MessageBox(hwnd, GetErrorMessage(hr).c_str(), caption.c_str(), MB_OK);
23}
24
25base::string16 GetPortMonitorDllName() {
26  if (IsSystem64Bit()) {
27    return base::string16(L"gcp_portmon64.dll");
28  } else {
29    return base::string16(L"gcp_portmon.dll");
30  }
31}
32
33HRESULT GetPrinterDriverDir(base::FilePath* path) {
34  BYTE driver_dir_buffer[MAX_PATH * sizeof(wchar_t)];
35  DWORD needed = 0;
36  if (!GetPrinterDriverDirectory(NULL,
37                                 NULL,
38                                 1,
39                                 driver_dir_buffer,
40                                 MAX_PATH * sizeof(wchar_t),
41                                 &needed)) {
42    // We could try to allocate a larger buffer if needed > MAX_PATH
43    // but that really shouldn't happen.
44    return cloud_print::GetLastHResult();
45  }
46  *path = base::FilePath(reinterpret_cast<wchar_t*>(driver_dir_buffer));
47
48  // The XPS driver is a "Level 3" driver
49  *path = path->Append(L"3");
50  return S_OK;
51}
52
53bool IsSystem64Bit() {
54  base::win::OSInfo::WindowsArchitecture arch =
55      base::win::OSInfo::GetInstance()->architecture();
56  return (arch == base::win::OSInfo::X64_ARCHITECTURE) ||
57         (arch == base::win::OSInfo::IA64_ARCHITECTURE);
58}
59
60}
61
62