summaryrefslogtreecommitdiffstats
path: root/printing/backend/printing_info_win.h
diff options
context:
space:
mode:
Diffstat (limited to 'printing/backend/printing_info_win.h')
-rw-r--r--printing/backend/printing_info_win.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h
new file mode 100644
index 0000000..1e9afd9
--- /dev/null
+++ b/printing/backend/printing_info_win.h
@@ -0,0 +1,91 @@
+// 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.
+
+#ifndef PRINTING_BACKEND_PRINTING_INFO_WIN_H_
+#define PRINTING_BACKEND_PRINTING_INFO_WIN_H_
+
+#include <objidl.h>
+#include <winspool.h>
+
+#include "base/memory/scoped_ptr.h"
+#include "printing/printing_export.h"
+
+namespace printing {
+
+namespace internal {
+
+PRINTING_EXPORT uint8* GetDriverInfo(HANDLE printer, int level);
+PRINTING_EXPORT uint8* GetPrinterInfo(HANDLE printer, int level);
+
+// This class is designed to work with PRINTER_INFO_X structures
+// and calls GetPrinter internally with correctly allocated buffer.
+template <typename PrinterInfoType, int level>
+class PrinterInfo {
+ public:
+ bool Init(HANDLE printer) {
+ buffer_.reset(GetPrinterInfo(printer, level));
+ return buffer_;
+ }
+
+ const PrinterInfoType* get() const {
+ return reinterpret_cast<const PrinterInfoType*>(buffer_.get());
+ }
+
+ private:
+ scoped_array<uint8> buffer_;
+};
+
+// This class is designed to work with DRIVER_INFO_X structures
+// and calls GetDriverInfo internally with correctly allocated buffer.
+template <typename DriverInfoType, int level>
+class DriverInfo {
+ public:
+ bool Init(HANDLE printer) {
+ buffer_.reset(GetDriverInfo(printer, level));
+ return buffer_;
+ }
+
+ const DriverInfoType* get() const {
+ return reinterpret_cast<const DriverInfoType*>(buffer_.get());
+ }
+
+ private:
+ scoped_array<uint8> buffer_;
+};
+
+} // namespace internal
+
+typedef internal::PrinterInfo<PRINTER_INFO_2, 2> PrinterInfo2;
+typedef internal::PrinterInfo<PRINTER_INFO_5, 5> PrinterInfo5;
+typedef internal::PrinterInfo<PRINTER_INFO_8, 8> PrinterInfo8;
+typedef internal::PrinterInfo<PRINTER_INFO_9, 9> PrinterInfo9;
+
+typedef internal::DriverInfo<DRIVER_INFO_6, 6> DriverInfo6;
+
+// Retrieves DEVMODE from PRINTER_INFO_* structures.
+// Requests in following order:
+// 9 (user-default),
+// 8 (admin-default),
+// 2 (printer-default).
+class PRINTING_EXPORT UserDefaultDevMode {
+ public:
+ UserDefaultDevMode();
+ ~UserDefaultDevMode();
+
+ bool Init(HANDLE printer);
+
+ const DEVMODE* get() const {
+ return dev_mode_;
+ }
+
+ private:
+ PrinterInfo2 info_2_;
+ PrinterInfo8 info_8_;
+ PrinterInfo9 info_9_;
+ const DEVMODE* dev_mode_;
+};
+
+} // namespace printing
+
+#endif // PRINTING_BACKEND_PRINTING_INFO_WIN_H_