0

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
This commit is contained in:
vitalybuka@chromium.org
2012-03-05 23:17:25 +00:00
parent dfe14730bc
commit de6ac32944
5 changed files with 87 additions and 6 deletions

@ -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

@ -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;

@ -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();
}

@ -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

@ -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;
}
bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) {
std::wstring printer_name_wide = UTF8ToWide(printer_name);
// 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;
OpenPrinter(const_cast<LPTSTR>(printer_name_wide.c_str()),
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) {
ScopedPrinterHandle printer_handle;
OpenPrinter(const_cast<LPTSTR>(UTF8ToWide(printer_name).c_str()),
printer_handle.Receive(), NULL);
return printer_handle.IsValid();
}