diff options
-rw-r--r-- | printing/backend/print_backend.cc | 6 | ||||
-rw-r--r-- | printing/backend/print_backend.h | 17 | ||||
-rw-r--r-- | printing/backend/print_backend_chromeos.cc | 12 | ||||
-rw-r--r-- | printing/backend/print_backend_cups.cc | 9 | ||||
-rw-r--r-- | printing/backend/print_backend_win.cc | 47 |
5 files changed, 86 insertions, 5 deletions
diff --git a/printing/backend/print_backend.cc b/printing/backend/print_backend.cc index a876cae..398e698 100644 --- a/printing/backend/print_backend.cc +++ b/printing/backend/print_backend.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -16,6 +16,10 @@ PrinterCapsAndDefaults::PrinterCapsAndDefaults() {} PrinterCapsAndDefaults::~PrinterCapsAndDefaults() {} +PrinterDriverInfo::PrinterDriverInfo() {} + +PrinterDriverInfo::~PrinterDriverInfo() {} + PrintBackend::~PrintBackend() {} } // namespace printing diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h index c788499..878bb25 100644 --- a/printing/backend/print_backend.h +++ b/printing/backend/print_backend.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -43,6 +43,16 @@ struct PRINTING_EXPORT PrinterCapsAndDefaults { std::string defaults_mime_type; }; +struct PRINTING_EXPORT PrinterDriverInfo { + PrinterDriverInfo(); + ~PrinterDriverInfo(); + + std::string driver_name; + std::string driver_version; + std::string product_name; + std::string product_version; +}; + // PrintBackend class will provide interface for different print backends // (Windows, CUPS) to implement. User will call CreateInstance() to // obtain available print backend. @@ -66,6 +76,11 @@ class PRINTING_EXPORT PrintBackend const std::string& printer_name, PrinterCapsAndDefaults* printer_info) = 0; + // Gets the information about driver for a specific printer. + virtual bool GetPrinterDriverInfo( + const std::string& printer_name, + PrinterDriverInfo* driver_info) = 0; + // Returns true if printer_name points to a valid printer. virtual bool IsValidPrinter(const std::string& printer_name) = 0; diff --git a/printing/backend/print_backend_chromeos.cc b/printing/backend/print_backend_chromeos.cc index c61bc1d..ac62d90 100644 --- a/printing/backend/print_backend_chromeos.cc +++ b/printing/backend/print_backend_chromeos.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 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. @@ -22,6 +22,9 @@ class PrintBackendChromeOS : public PrintBackend { virtual bool GetPrinterCapsAndDefaults(const std::string& printer_name, PrinterCapsAndDefaults* printer_info); + virtual bool GetPrinterDriverInfo(const std::string& printer_name, + PrinterDriverInfo* driver_info); + virtual bool IsValidPrinter(const std::string& printer_name); private: @@ -42,6 +45,13 @@ bool PrintBackendChromeOS::GetPrinterCapsAndDefaults( return false; } +bool PrintBackendChromeOS::GetPrinterDriverInfo( + const std::string& printer_name, + PrinterDriverInfo* driver_info) { + NOTREACHED(); + return false; +} + std::string PrintBackendChromeOS::GetDefaultPrinterName() { return std::string(); } diff --git a/printing/backend/print_backend_cups.cc b/printing/backend/print_backend_cups.cc index d543389..736926d 100644 --- a/printing/backend/print_backend_cups.cc +++ b/printing/backend/print_backend_cups.cc @@ -113,6 +113,9 @@ class PrintBackendCUPS : public PrintBackend { const std::string& printer_name, PrinterCapsAndDefaults* printer_info) OVERRIDE; + virtual bool GetPrinterDriverInfo(const std::string& printer_name, + PrinterDriverInfo* driver_info) OVERRIDE; + virtual bool IsValidPrinter(const std::string& printer_name) OVERRIDE; private: @@ -225,6 +228,12 @@ bool PrintBackendCUPS::GetPrinterCapsAndDefaults( return res; } +bool PrintBackendCUPS::GetPrinterDriverInfo(const std::string& printer_name, + PrinterDriverInfo* driver_info) { + // TODO(vitalybuka): MAC implementation. http://crbug.com/108194 + return false; +} + bool PrintBackendCUPS::IsValidPrinter(const std::string& printer_name) { // This is not very efficient way to get specific printer info. CUPS 1.4 // supports cupsGetNamedDest() function. However, CUPS 1.4 is not available diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index 9995005..8377551 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -7,6 +7,8 @@ #include <objidl.h> #include <winspool.h> +#include "base/file_path.h" +#include "base/file_version_info.h" #include "base/memory/scoped_ptr.h" #include "base/string_piece.h" #include "base/utf_string_conversions.h" @@ -47,6 +49,9 @@ class PrintBackendWin : public PrintBackend { virtual bool GetPrinterCapsAndDefaults(const std::string& printer_name, PrinterCapsAndDefaults* printer_info); + virtual bool GetPrinterDriverInfo(const std::string& printer_name, + PrinterDriverInfo* driver_info); + virtual bool IsValidPrinter(const std::string& printer_name); }; @@ -171,10 +176,48 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( return true; } +// Gets the information about driver for a specific printer. +bool PrintBackendWin::GetPrinterDriverInfo(const std::string& printer_name, + PrinterDriverInfo* driver_info) { + DCHECK(driver_info); + ScopedPrinterHandle printer_handle; + if (!::OpenPrinter(const_cast<LPTSTR>(UTF8ToWide(printer_name).c_str()), + printer_handle.Receive(), NULL)) { + return false; + } + DCHECK(printer_handle.IsValid()); + DWORD bytes_needed = 0; + ::GetPrinterDriver(printer_handle, NULL, 6, NULL, 0, &bytes_needed); + scoped_array<BYTE> driver_info_buffer(new BYTE[bytes_needed]); + if (!bytes_needed || !driver_info_buffer.get()) + return false; + if (!::GetPrinterDriver(printer_handle, NULL, 6, driver_info_buffer.get(), + bytes_needed, &bytes_needed)) { + return false; + } + if (!bytes_needed) + return false; + const DRIVER_INFO_6* driver_info_6 = + reinterpret_cast<DRIVER_INFO_6*>(driver_info_buffer.get()); + + if (driver_info_6->pName) + driver_info->driver_name = WideToUTF8(driver_info_6->pName); + + if (driver_info_6->pDriverPath) { + scoped_ptr<FileVersionInfo> version_info( + FileVersionInfo::CreateFileVersionInfo( + FilePath(driver_info_6->pDriverPath))); + driver_info->driver_version = WideToUTF8(version_info->file_version()); + driver_info->product_name = WideToUTF8(version_info->product_name()); + driver_info->product_version = WideToUTF8(version_info->product_version()); + } + + return true; +} + bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { - std::wstring printer_name_wide = UTF8ToWide(printer_name); ScopedPrinterHandle printer_handle; - OpenPrinter(const_cast<LPTSTR>(printer_name_wide.c_str()), + OpenPrinter(const_cast<LPTSTR>(UTF8ToWide(printer_name).c_str()), printer_handle.Receive(), NULL); return printer_handle.IsValid(); } |