Home | History | Annotate | Download | only in local_discovery
      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 "net/base/host_port_pair.h"
     13 
     14 namespace base {
     15 class RefCountedBytes;
     16 }
     17 
     18 namespace gfx {
     19 class Size;
     20 }
     21 
     22 namespace printing {
     23 class PdfRenderSettings;
     24 }
     25 
     26 namespace local_discovery {
     27 
     28 class PWGRasterConverter;
     29 class PrivetHTTPClient;
     30 
     31 // Represents a simple request that returns pure JSON.
     32 class PrivetJSONOperation {
     33  public:
     34   // If value is null, the operation failed.
     35   typedef base::Callback<void(
     36       const base::DictionaryValue* /*value*/)> ResultCallback;
     37 
     38   virtual ~PrivetJSONOperation() {}
     39 
     40   virtual void Start() = 0;
     41 
     42   virtual PrivetHTTPClient* GetHTTPClient() = 0;
     43 };
     44 
     45 // Privet HTTP client. Must outlive the operations it creates.
     46 class PrivetHTTPClient {
     47  public:
     48   virtual ~PrivetHTTPClient() {}
     49 
     50   // A name for the HTTP client, e.g. the device name for the privet device.
     51   virtual const std::string& GetName() = 0;
     52 
     53   // Creates operation to query basic information about local device.
     54   virtual scoped_ptr<PrivetJSONOperation> CreateInfoOperation(
     55       const PrivetJSONOperation::ResultCallback& callback) = 0;
     56 
     57   // Creates a URL fetcher for PrivetV1.
     58   virtual scoped_ptr<PrivetURLFetcher> CreateURLFetcher(
     59       const GURL& url,
     60       net::URLFetcher::RequestType request_type,
     61       PrivetURLFetcher::Delegate* delegate) = 0;
     62 
     63   virtual void RefreshPrivetToken(
     64       const PrivetURLFetcher::TokenCallback& token_callback) = 0;
     65 };
     66 
     67 class PrivetDataReadOperation {
     68  public:
     69   enum ResponseType {
     70     RESPONSE_TYPE_ERROR,
     71     RESPONSE_TYPE_STRING,
     72     RESPONSE_TYPE_FILE
     73   };
     74 
     75   // If value is null, the operation failed.
     76   typedef base::Callback<void(
     77       ResponseType /*response_type*/,
     78       const std::string& /*response_str*/,
     79       const base::FilePath& /*response_file_path*/)> ResultCallback;
     80 
     81   virtual ~PrivetDataReadOperation() {}
     82 
     83   virtual void Start() = 0;
     84 
     85   virtual void SetDataRange(int range_start, int range_end) = 0;
     86 
     87   virtual void SaveDataToFile() = 0;
     88 
     89   virtual PrivetHTTPClient* GetHTTPClient() = 0;
     90 };
     91 
     92 // Represents a full registration flow (/privet/register), normally consisting
     93 // of calling the start action, the getClaimToken action, and calling the
     94 // complete action. Some intervention from the caller is required to display the
     95 // claim URL to the user (noted in OnPrivetRegisterClaimURL).
     96 class PrivetRegisterOperation {
     97  public:
     98   enum FailureReason {
     99     FAILURE_NETWORK,
    100     FAILURE_HTTP_ERROR,
    101     FAILURE_JSON_ERROR,
    102     FAILURE_MALFORMED_RESPONSE,
    103     FAILURE_TOKEN,
    104     FAILURE_RETRY
    105   };
    106 
    107   class Delegate {
    108    public:
    109     ~Delegate() {}
    110 
    111     // Called when a user needs to claim the printer by visiting the given URL.
    112     virtual void OnPrivetRegisterClaimToken(
    113         PrivetRegisterOperation* operation,
    114         const std::string& token,
    115         const GURL& url) = 0;
    116 
    117     // TODO(noamsml): Remove all unnecessary parameters.
    118     // Called in case of an error while registering.  |action| is the
    119     // registration action taken during the error. |reason| is the reason for
    120     // the failure. |printer_http_code| is the http code returned from the
    121     // printer. If it is -1, an internal error occurred while trying to complete
    122     // the request. |json| may be null if printer_http_code signifies an error.
    123     virtual void OnPrivetRegisterError(PrivetRegisterOperation* operation,
    124                                        const std::string& action,
    125                                        FailureReason reason,
    126                                        int printer_http_code,
    127                                        const base::DictionaryValue* json) = 0;
    128 
    129     // Called when the registration is done.
    130     virtual void OnPrivetRegisterDone(PrivetRegisterOperation* operation,
    131                                       const std::string& device_id) = 0;
    132   };
    133 
    134   virtual ~PrivetRegisterOperation() {}
    135 
    136   virtual void Start() = 0;
    137   // Owner SHOULD call explicitly before destroying operation.
    138   virtual void Cancel() = 0;
    139   virtual void CompleteRegistration() = 0;
    140 
    141   virtual PrivetHTTPClient* GetHTTPClient() = 0;
    142 };
    143 
    144 class PrivetLocalPrintOperation {
    145  public:
    146   class Delegate {
    147    public:
    148     virtual ~Delegate() {}
    149     virtual void OnPrivetPrintingDone(
    150         const PrivetLocalPrintOperation* print_operation) = 0;
    151     virtual void OnPrivetPrintingError(
    152         const PrivetLocalPrintOperation* print_operation, int http_code) = 0;
    153   };
    154 
    155   virtual ~PrivetLocalPrintOperation() {}
    156 
    157   virtual void Start() = 0;
    158 
    159 
    160   // Required print data. MUST be called before calling |Start()|.
    161   virtual void SetData(const scoped_refptr<base::RefCountedBytes>& data) = 0;
    162 
    163   // Optional attributes for /submitdoc. Call before calling |Start()|
    164   // |ticket| should be in CJT format.
    165   virtual void SetTicket(const std::string& ticket) = 0;
    166   // |capabilities| should be in CDD format.
    167   virtual void SetCapabilities(const std::string& capabilities) = 0;
    168   // Username and jobname are for display only.
    169   virtual void SetUsername(const std::string& username) = 0;
    170   virtual void SetJobname(const std::string& jobname) = 0;
    171   // If |offline| is true, we will indicate to the printer not to post the job
    172   // to Google Cloud Print.
    173   virtual void SetOffline(bool offline) = 0;
    174   // Document page size.
    175   virtual void SetPageSize(const gfx::Size& page_size) = 0;
    176 
    177   // For testing, inject an alternative PWG raster converter.
    178   virtual void SetPWGRasterConverterForTesting(
    179       scoped_ptr<PWGRasterConverter> pwg_raster_converter) = 0;
    180 
    181   virtual PrivetHTTPClient* GetHTTPClient() = 0;
    182 };
    183 
    184 // Privet HTTP client. Must outlive the operations it creates.
    185 class PrivetV1HTTPClient {
    186  public:
    187   virtual ~PrivetV1HTTPClient() {}
    188 
    189   static scoped_ptr<PrivetV1HTTPClient> CreateDefault(
    190       scoped_ptr<PrivetHTTPClient> info_client);
    191 
    192   // A name for the HTTP client, e.g. the device name for the privet device.
    193   virtual const std::string& GetName() = 0;
    194 
    195   // Creates operation to query basic information about local device.
    196   virtual scoped_ptr<PrivetJSONOperation> CreateInfoOperation(
    197       const PrivetJSONOperation::ResultCallback& callback) = 0;
    198 
    199   // Creates operation to register local device using Privet v1 protocol.
    200   virtual scoped_ptr<PrivetRegisterOperation> CreateRegisterOperation(
    201       const std::string& user,
    202       PrivetRegisterOperation::Delegate* delegate) = 0;
    203 
    204   // Creates operation to query capabilities of local printer.
    205   virtual scoped_ptr<PrivetJSONOperation> CreateCapabilitiesOperation(
    206       const PrivetJSONOperation::ResultCallback& callback) = 0;
    207 
    208   // Creates operation to submit print job to local printer.
    209   virtual scoped_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation(
    210       PrivetLocalPrintOperation::Delegate* delegate) = 0;
    211 };
    212 
    213 }  // namespace local_discovery
    214 #endif  // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_
    215