summaryrefslogtreecommitdiffstats
path: root/chrome/browser/printing/cloud_print/printer_info.h
blob: 1bb1746a45039fbd6db0cb4c0f213897d333bb1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright (c) 2010 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 CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_INFO_H_
#define CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_INFO_H_

#include <string>
#include <vector>

#include "base/file_path.h"

// This is the interface for platform-specific code for cloud print
namespace cloud_print {

typedef int PlatformJobId;

struct PrinterBasicInfo {
  std::string printer_name;
  std::string printer_description;
  int printer_status;
  PrinterBasicInfo() : printer_status(0) {
  }
};

typedef std::vector<PrinterBasicInfo> PrinterList;

struct PrinterCapsAndDefaults {
  std::string printer_capabilities;
  std::string caps_mime_type;
  std::string printer_defaults;
  std::string defaults_mime_type;
};

enum PrintJobStatus {
  PRINT_JOB_STATUS_INVALID,
  PRINT_JOB_STATUS_IN_PROGRESS,
  PRINT_JOB_STATUS_ERROR,
  PRINT_JOB_STATUS_COMPLETED
};

struct PrintJobDetails {
  PrintJobStatus status;
  int platform_status_flags;
  std::string status_message;
  int total_pages;
  int pages_printed;
  PrintJobDetails() : status(PRINT_JOB_STATUS_INVALID),
                      platform_status_flags(0), total_pages(0),
                      pages_printed(0) {
  }
  void Clear() {
    status = PRINT_JOB_STATUS_INVALID;
    platform_status_flags = 0;
    status_message.clear();
    total_pages = 0;
    pages_printed = 0;
  }
  bool operator ==(const PrintJobDetails& other) const {
    return (status == other.status) &&
           (platform_status_flags == other.platform_status_flags) &&
           (status_message == other.status_message) &&
           (total_pages == other.total_pages) &&
           (pages_printed == other.pages_printed);
  }
  bool operator !=(const PrintJobDetails& other) const {
    return !(*this == other);
  }
};

// Enumerates the list of installed local and network printers.
void EnumeratePrinters(PrinterList* printer_list);
// Gets the capabilities and defaults for a specific printer.
bool GetPrinterCapsAndDefaults(const std::string& printer_name,
                               PrinterCapsAndDefaults* printer_info);
bool ValidatePrintTicket(const std::string& printer_name,
                         const std::string& print_ticket_data);
std::string GenerateProxyId();
bool SpoolPrintJob(const std::string& print_ticket,
                   const FilePath& print_data_file_path,
                   const std::string& print_data_mime_type,
                   const std::string& printer_name,
                   const std::string& job_title,
                   PlatformJobId* job_id_ret);

bool GetJobDetails(const std::string& printer_name,
                   PlatformJobId job_id,
                   PrintJobDetails *job_details);
bool IsValidPrinter(const std::string& printer_name);

// A class that watches changes to a printer or a print server.
// The set of notifications are very coarse-grained (even though the Windows
// API allows for listening to fine-grained details about a printer, this class
// does not support that level of fine-grained control.
class PrinterChangeNotifier {
 public:
  class Delegate {
    public:
      virtual void OnPrinterAdded() = 0;
      virtual void OnPrinterDeleted() = 0;
      virtual void OnPrinterChanged() = 0;
      virtual void OnJobChanged() = 0;
  };
  PrinterChangeNotifier();
  ~PrinterChangeNotifier();
  bool StartWatching(const std::string& printer_name, Delegate* delegate);
  bool StopWatching();
  bool GetCurrentPrinterInfo(PrinterBasicInfo* printer_info);
 private:
  // Internal state maintained by the PrinterChangeNotifier class.
  class NotificationState;
  NotificationState* state_;
  DISALLOW_COPY_AND_ASSIGN(PrinterChangeNotifier);
};

// This typedef is to workaround the issue with certain versions of
// Visual Studio where it gets confused between multiple Delegate
// classes and gives a C2500 error. (I saw this error on the try bots -
// the workaround was not needed for my machine).
typedef PrinterChangeNotifier::Delegate PrinterChangeNotifierDelegate;

}  // namespace cloud_print

#endif  // CHROME_BROWSER_PRINTING_CLOUD_PRINT_PRINTER_INFO_H_