// Copyright 2013 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_LOCAL_DISCOVERY_PRIVET_HTTP_H_ #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_ #include <string> #include "base/callback.h" #include "chrome/browser/local_discovery/privet_url_fetcher.h" #include "chrome/browser/local_discovery/pwg_raster_converter.h" #include "net/base/host_port_pair.h" namespace base { class RefCountedBytes; } namespace gfx { class Size; } namespace printing { class PdfRenderSettings; } namespace local_discovery { class PrivetHTTPClient; // Represents a request to /privet/info. Will store a cached response and token // in the PrivetHTTPClient that created. class PrivetInfoOperation { public: class Delegate { public: virtual ~Delegate() {} // In case of non-HTTP errors, |http_code| will be -1. // TODO(noamsml): Remove http_code from this delegate; it's unnecessary in // practice virtual void OnPrivetInfoDone( PrivetInfoOperation* operation, int http_code, const base::DictionaryValue* json_value) = 0; }; virtual ~PrivetInfoOperation() {} virtual void Start() = 0; virtual PrivetHTTPClient* GetHTTPClient() = 0; }; // Represents a full registration flow (/privet/register), normally consisting // of calling the start action, the getClaimToken action, and calling the // complete action. Some intervention from the caller is required to display the // claim URL to the user (noted in OnPrivetRegisterClaimURL). class PrivetRegisterOperation { public: enum FailureReason { FAILURE_NETWORK, FAILURE_HTTP_ERROR, FAILURE_JSON_ERROR, FAILURE_MALFORMED_RESPONSE, FAILURE_TOKEN, FAILURE_RETRY }; class Delegate { public: ~Delegate() {} // Called when a user needs to claim the printer by visiting the given URL. virtual void OnPrivetRegisterClaimToken( PrivetRegisterOperation* operation, const std::string& token, const GURL& url) = 0; // TODO(noamsml): Remove all unnecessary parameters. // Called in case of an error while registering. |action| is the // registration action taken during the error. |reason| is the reason for // the failure. |printer_http_code| is the http code returned from the // printer. If it is -1, an internal error occurred while trying to complete // the request. |json| may be null if printer_http_code signifies an error. virtual void OnPrivetRegisterError(PrivetRegisterOperation* operation, const std::string& action, FailureReason reason, int printer_http_code, const DictionaryValue* json) = 0; // Called when the registration is done. virtual void OnPrivetRegisterDone(PrivetRegisterOperation* operation, const std::string& device_id) = 0; }; virtual ~PrivetRegisterOperation() {} virtual void Start() = 0; // Owner SHOULD call explicitly before destroying operation. virtual void Cancel() = 0; virtual void CompleteRegistration() = 0; virtual PrivetHTTPClient* GetHTTPClient() = 0; }; class PrivetCapabilitiesOperation { public: class Delegate { public: virtual ~Delegate() {} // |capabilities| will be NULL in case of an error. virtual void OnPrivetCapabilities( PrivetCapabilitiesOperation* capabilities_operation, int http_error, const base::DictionaryValue* capabilities) = 0; }; virtual ~PrivetCapabilitiesOperation() {} virtual void Start() = 0; virtual PrivetHTTPClient* GetHTTPClient() = 0; }; class PrivetLocalPrintOperation { public: class Delegate { public: virtual ~Delegate() {} virtual void OnPrivetPrintingDone( const PrivetLocalPrintOperation* print_operation) = 0; virtual void OnPrivetPrintingError( const PrivetLocalPrintOperation* print_operation, int http_code) = 0; }; virtual ~PrivetLocalPrintOperation() {} virtual void Start() = 0; // Required print data. MUST be called before calling |Start()|. virtual void SetData(base::RefCountedBytes* data) = 0; // Optional attributes for /submitdoc. Call before calling |Start()| // |ticket| should be in CJT format. virtual void SetTicket(const std::string& ticket) = 0; // Username and jobname are for display only. virtual void SetUsername(const std::string& username) = 0; virtual void SetJobname(const std::string& jobname) = 0; // If |offline| is true, we will indicate to the printer not to post the job // to Google Cloud Print. virtual void SetOffline(bool offline) = 0; // Document page size. virtual void SetConversionSettings( const printing::PdfRenderSettings& conversion_settings) = 0; // For testing, inject an alternative PWG raster converter. virtual void SetPWGRasterConverterForTesting( scoped_ptr<PWGRasterConverter> pwg_raster_converter) = 0; virtual PrivetHTTPClient* GetHTTPClient() = 0; }; // Privet HTTP client. Must not outlive the operations it creates. class PrivetHTTPClient { public: virtual ~PrivetHTTPClient() {} virtual const base::DictionaryValue* GetCachedInfo() const = 0; virtual scoped_ptr<PrivetRegisterOperation> CreateRegisterOperation( const std::string& user, PrivetRegisterOperation::Delegate* delegate) = 0; virtual scoped_ptr<PrivetInfoOperation> CreateInfoOperation( PrivetInfoOperation::Delegate* delegate) = 0; virtual scoped_ptr<PrivetCapabilitiesOperation> CreateCapabilitiesOperation( PrivetCapabilitiesOperation::Delegate* delegate) = 0; virtual scoped_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation( PrivetLocalPrintOperation::Delegate* delegate) = 0; // A name for the HTTP client, e.g. the device name for the privet device. virtual const std::string& GetName() = 0; }; } // namespace local_discovery #endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_