summaryrefslogtreecommitdiffstats
path: root/printing
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-05 23:17:25 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-05 23:17:25 +0000
commitde6ac3294417e61248aa0574365c2782b68f89c9 (patch)
treeeec71bfb59ac16c2ef92bf59d2c0ff40b9328e9f /printing
parentdfe14730bc4052cad2329088f827404570c1d9f8 (diff)
downloadchromium_src-de6ac3294417e61248aa0574365c2782b68f89c9.zip
chromium_src-de6ac3294417e61248aa0574365c2782b68f89c9.tar.gz
chromium_src-de6ac3294417e61248aa0574365c2782b68f89c9.tar.bz2
Added PrinterDriverInfo and PrintBackend::GetPrinterDriverInfo for windows.
BUG=108194 TEST=none Review URL: http://codereview.chromium.org/9516010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125020 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r--printing/backend/print_backend.cc6
-rw-r--r--printing/backend/print_backend.h17
-rw-r--r--printing/backend/print_backend_chromeos.cc12
-rw-r--r--printing/backend/print_backend_cups.cc9
-rw-r--r--printing/backend/print_backend_win.cc47
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();
}