17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_ 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_ 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/local_discovery/privet_url_fetcher.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/base/host_port_pair.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base { 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class RefCountedBytes; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gfx { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class Size; 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace printing { 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class PdfRenderSettings; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace local_discovery { 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PWGRasterConverter; 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class PrivetHTTPClient; 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Represents a simple request that returns pure JSON. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrivetJSONOperation { 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If value is null, the operation failed. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef base::Callback<void( 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* /*value*/)> ResultCallback; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PrivetJSONOperation() {} 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Start() = 0; 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual PrivetHTTPClient* GetHTTPClient() = 0; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Privet HTTP client. Must outlive the operations it creates. 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PrivetHTTPClient { 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~PrivetHTTPClient() {} 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // A name for the HTTP client, e.g. the device name for the privet device. 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual const std::string& GetName() = 0; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Creates operation to query basic information about local device. 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual scoped_ptr<PrivetJSONOperation> CreateInfoOperation( 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PrivetJSONOperation::ResultCallback& callback) = 0; 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Creates a URL fetcher for PrivetV1. 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual scoped_ptr<PrivetURLFetcher> CreateURLFetcher( 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const GURL& url, 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::URLFetcher::RequestType request_type, 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrivetURLFetcher::Delegate* delegate) = 0; 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void RefreshPrivetToken( 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PrivetURLFetcher::TokenCallback& token_callback) = 0; 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PrivetDataReadOperation { 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum ResponseType { 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RESPONSE_TYPE_ERROR, 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RESPONSE_TYPE_STRING, 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RESPONSE_TYPE_FILE 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If value is null, the operation failed. 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef base::Callback<void( 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResponseType /*response_type*/, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& /*response_str*/, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::FilePath& /*response_file_path*/)> ResultCallback; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PrivetDataReadOperation() {} 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void Start() = 0; 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetDataRange(int range_start, int range_end) = 0; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SaveDataToFile() = 0; 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual PrivetHTTPClient* GetHTTPClient() = 0; 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Represents a full registration flow (/privet/register), normally consisting 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// of calling the start action, the getClaimToken action, and calling the 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// complete action. Some intervention from the caller is required to display the 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// claim URL to the user (noted in OnPrivetRegisterClaimURL). 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass PrivetRegisterOperation { 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch enum FailureReason { 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILURE_NETWORK, 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILURE_HTTP_ERROR, 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILURE_JSON_ERROR, 1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FAILURE_MALFORMED_RESPONSE, 1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FAILURE_TOKEN, 1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FAILURE_RETRY 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch class Delegate { 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ~Delegate() {} 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called when a user needs to claim the printer by visiting the given URL. 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnPrivetRegisterClaimToken( 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PrivetRegisterOperation* operation, 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& token, 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const GURL& url) = 0; 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // TODO(noamsml): Remove all unnecessary parameters. 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called in case of an error while registering. |action| is the 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // registration action taken during the error. |reason| is the reason for 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the failure. |printer_http_code| is the http code returned from the 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // printer. If it is -1, an internal error occurred while trying to complete 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // the request. |json| may be null if printer_http_code signifies an error. 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnPrivetRegisterError(PrivetRegisterOperation* operation, 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& action, 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FailureReason reason, 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int printer_http_code, 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::DictionaryValue* json) = 0; 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Called when the registration is done. 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnPrivetRegisterDone(PrivetRegisterOperation* operation, 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& device_id) = 0; 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~PrivetRegisterOperation() {} 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void Start() = 0; 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Owner SHOULD call explicitly before destroying operation. 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void Cancel() = 0; 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CompleteRegistration() = 0; 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual PrivetHTTPClient* GetHTTPClient() = 0; 1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class PrivetLocalPrintOperation { 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) class Delegate { 1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual ~Delegate() {} 1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void OnPrivetPrintingDone( 1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const PrivetLocalPrintOperation* print_operation) = 0; 1511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void OnPrivetPrintingError( 1521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const PrivetLocalPrintOperation* print_operation, int http_code) = 0; 1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) }; 1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual ~PrivetLocalPrintOperation() {} 1561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void Start() = 0; 1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Required print data. MUST be called before calling |Start()|. 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetData(const scoped_refptr<base::RefCountedBytes>& data) = 0; 1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Optional attributes for /submitdoc. Call before calling |Start()| 1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // |ticket| should be in CJT format. 1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetTicket(const std::string& ticket) = 0; 166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |capabilities| should be in CDD format. 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void SetCapabilities(const std::string& capabilities) = 0; 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Username and jobname are for display only. 1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetUsername(const std::string& username) = 0; 1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetJobname(const std::string& jobname) = 0; 1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // If |offline| is true, we will indicate to the printer not to post the job 1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // to Google Cloud Print. 1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void SetOffline(bool offline) = 0; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Document page size. 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetPageSize(const gfx::Size& page_size) = 0; 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // For testing, inject an alternative PWG raster converter. 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetPWGRasterConverterForTesting( 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PWGRasterConverter> pwg_raster_converter) = 0; 1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual PrivetHTTPClient* GetHTTPClient() = 0; 1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Privet HTTP client. Must outlive the operations it creates. 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class PrivetV1HTTPClient { 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~PrivetV1HTTPClient() {} 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static scoped_ptr<PrivetV1HTTPClient> CreateDefault( 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<PrivetHTTPClient> info_client); 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // A name for the HTTP client, e.g. the device name for the privet device. 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual const std::string& GetName() = 0; 19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates operation to query basic information about local device. 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<PrivetJSONOperation> CreateInfoOperation( 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrivetJSONOperation::ResultCallback& callback) = 0; 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Creates operation to register local device using Privet v1 protocol. 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual scoped_ptr<PrivetRegisterOperation> CreateRegisterOperation( 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& user, 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrivetRegisterOperation::Delegate* delegate) = 0; 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 20446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates operation to query capabilities of local printer. 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual scoped_ptr<PrivetJSONOperation> CreateCapabilitiesOperation( 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const PrivetJSONOperation::ResultCallback& callback) = 0; 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Creates operation to submit print job to local printer. 2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual scoped_ptr<PrivetLocalPrintOperation> CreateLocalPrintOperation( 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrivetLocalPrintOperation::Delegate* delegate) = 0; 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace local_discovery 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVET_HTTP_H_ 215