• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_
7 
8 #include <string>
9 
10 #include "base/callback.h"
11 #include "chrome/browser/local_discovery/privet_url_fetcher.h"
12 #include "chrome/browser/local_discovery/pwg_raster_converter.h"
13 #include "net/base/host_port_pair.h"
14 
15 namespace base {
16 class RefCountedBytes;
17 }
18 
19 namespace gfx {
20 class Size;
21 }
22 
23 namespace printing {
24 class PdfRenderSettings;
25 }
26 
27 namespace local_discovery {
28 
29 class PrivetHTTPClient;
30 
31 // Represents a request to /privet/info. Will store a cached response and token
32 // in the PrivetHTTPClient that created.
33 class PrivetInfoOperation {
34  public:
35   class Delegate {
36    public:
~Delegate()37     virtual ~Delegate() {}
38 
39     // In case of non-HTTP errors, |http_code| will be -1.
40 
41     // TODO(noamsml): Remove http_code from this delegate; it's unnecessary in
42     // practice
43     virtual void OnPrivetInfoDone(
44         PrivetInfoOperation* operation,
45         int http_code,
46         const base::DictionaryValue* json_value) = 0;
47   };
48 
~PrivetInfoOperation()49   virtual ~PrivetInfoOperation() {}
50 
51   virtual void Start() = 0;
52 
53   virtual PrivetHTTPClient* GetHTTPClient() = 0;
54 };
55 
56 // Represents a full registration flow (/privet/register), normally consisting
57 // of calling the start action, the getClaimToken action, and calling the
58 // complete action. Some intervention from the caller is required to display the
59 // claim URL to the user (noted in OnPrivetRegisterClaimURL).
60 class PrivetRegisterOperation {
61  public:
62   enum FailureReason {
63     FAILURE_NETWORK,
64     FAILURE_HTTP_ERROR,
65     FAILURE_JSON_ERROR,
66     FAILURE_MALFORMED_RESPONSE,
67     FAILURE_TOKEN,
68     FAILURE_RETRY
69   };
70 
71   class Delegate {
72    public:
~Delegate()73     ~Delegate() {}
74 
75     // Called when a user needs to claim the printer by visiting the given URL.
76     virtual void OnPrivetRegisterClaimToken(
77         PrivetRegisterOperation* operation,
78         const std::string& token,
79         const GURL& url) = 0;
80 
81     // TODO(noamsml): Remove all unnecessary parameters.
82     // Called in case of an error while registering.  |action| is the
83     // registration action taken during the error. |reason| is the reason for
84     // the failure. |printer_http_code| is the http code returned from the
85     // printer. If it is -1, an internal error occurred while trying to complete
86     // the request. |json| may be null if printer_http_code signifies an error.
87     virtual void OnPrivetRegisterError(PrivetRegisterOperation* operation,
88                                        const std::string& action,
89                                        FailureReason reason,
90                                        int printer_http_code,
91                                        const DictionaryValue* json) = 0;
92 
93     // Called when the registration is done.
94     virtual void OnPrivetRegisterDone(PrivetRegisterOperation* operation,
95                                       const std::string& device_id) = 0;
96   };
97 
~PrivetRegisterOperation()98   virtual ~PrivetRegisterOperation() {}
99 
100   virtual void Start() = 0;
101   // Owner SHOULD call explicitly before destroying operation.
102   virtual void Cancel() = 0;
103   virtual void CompleteRegistration() = 0;
104 
105   virtual PrivetHTTPClient* GetHTTPClient() = 0;
106 };
107 
108 class PrivetCapabilitiesOperation {
109  public:
110   class Delegate {
111    public:
~Delegate()112     virtual ~Delegate() {}
113 
114     // |capabilities| will be NULL in case of an error.
115     virtual void OnPrivetCapabilities(
116         PrivetCapabilitiesOperation* capabilities_operation,
117         int http_error,
118         const base::DictionaryValue* capabilities) = 0;
119   };
120 
~PrivetCapabilitiesOperation()121   virtual ~PrivetCapabilitiesOperation() {}
122   virtual void Start() = 0;
123 
124   virtual PrivetHTTPClient* GetHTTPClient() = 0;
125 };
126 
127 class PrivetLocalPrintOperation {
128  public:
129   class Delegate {
130    public:
~Delegate()131     virtual ~Delegate() {}
132     virtual void OnPrivetPrintingDone(
133         const PrivetLocalPrintOperation* print_operation) = 0;
134     virtual void OnPrivetPrintingError(
135         const PrivetLocalPrintOperation* print_operation, int http_code) = 0;
136   };
137 
~PrivetLocalPrintOperation()138   virtual ~PrivetLocalPrintOperation() {}
139 
140   virtual void Start() = 0;
141 
142 
143   // Required print data. MUST be called before calling |Start()|.
144   virtual void SetData(base::RefCountedBytes* data) = 0;
145 
146   // Optional attributes for /submitdoc. Call before calling |Start()|
147   // |ticket| should be in CJT format.
148   virtual void SetTicket(const std::string& ticket) = 0;
149   // Username and jobname are for display only.
150   virtual void SetUsername(const std::string& username) = 0;
151   virtual void SetJobname(const std::string& jobname) = 0;
152   // If |offline| is true, we will indicate to the printer not to post the job
153   // to Google Cloud Print.
154   virtual void SetOffline(bool offline) = 0;
155   // Document page size.
156   virtual void SetConversionSettings(
157       const printing::PdfRenderSettings& conversion_settings) = 0;
158 
159   // For testing, inject an alternative PWG raster converter.
160   virtual void SetPWGRasterConverterForTesting(
161       scoped_ptr<PWGRasterConverter> pwg_raster_converter) = 0;
162 
163   virtual PrivetHTTPClient* GetHTTPClient() = 0;
164 };
165 
166 // Privet HTTP client. Must not outlive the operations it creates.
167 class PrivetHTTPClient {
168  public:
~PrivetHTTPClient()169   virtual ~PrivetHTTPClient() {}
170   virtual const base::DictionaryValue* GetCachedInfo() const = 0;
171 
172   virtual scoped_ptr<PrivetRegisterOperation> CreateRegisterOperation(
173       const std::string& user,
174       PrivetRegisterOperation::Delegate* delegate) = 0;
175   virtual scoped_ptr<PrivetInfoOperation> CreateInfoOperation(
176       PrivetInfoOperation::Delegate* delegate) = 0;
177   virtual scoped_ptr<PrivetCapabilitiesOperation> CreateCapabilitiesOperation(
178       PrivetCapabilitiesOperation::Delegate* delegate) = 0;
179   virtual scoped_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation(
180       PrivetLocalPrintOperation::Delegate* delegate) = 0;
181 
182   // A name for the HTTP client, e.g. the device name for the privet device.
183   virtual const std::string& GetName() = 0;
184 };
185 
186 }  // namespace local_discovery
187 #endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_
188