15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/connector_settings.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/print_system.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/printer_job_handler.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cloud_print { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintConnector handles top printer management tasks. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Matching local and cloud printers 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Registration of local printers 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Deleting cloud printers 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All tasks are posted to the common queue (PendingTasks) and executed 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// one-by-one in FIFO order. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CloudPrintConnector will notify client over Client interface. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPrintConnector 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<CloudPrintConnector>, 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private PrintSystem::PrintServerWatcher::Delegate, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private PrinterJobHandlerDelegate, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private CloudPrintURLFetcherDelegate { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Client { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAuthFailed() = 0; 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual void OnXmppPingUpdated(int ping_timeout) = 0; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Client() {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintConnector(Client* client, const ConnectorSettings& settings); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Start(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Stop(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsRunning(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return list of printer ids registered with CloudPrint. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetPrinterIds(std::list<std::string>* printer_ids); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for jobs for specific printer. If printer id is empty 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // jobs will be checked for all available printers. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckForJobs(const std::string& reason, const std::string& printer_id); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Update settings for specific printer. 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void UpdatePrinterSettings(const std::string& printer_id); 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<CloudPrintConnector>; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prototype for a response handler. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef CloudPrintURLFetcher::ResponseAction 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (CloudPrintConnector::*ResponseHandler)( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* json_data, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PendingTaskType { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PENDING_PRINTERS_NONE, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PENDING_PRINTERS_AVAILABLE, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PENDING_PRINTER_REGISTER, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PENDING_PRINTER_DELETE 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(vitalybuka): Consider delete pending_tasks_ and just use MessageLoop. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PendingTask { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingTaskType type; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Optional members, depending on type. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string printer_id; // For pending delete. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrinterBasicInfo printer_info; // For pending registration. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingTask() : type(PENDING_PRINTERS_NONE) {} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingTask() {} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CloudPrintConnector(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PrintServerWatcherDelegate implementation 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPrinterAdded() OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrinterJobHandler::Delegate implementation 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPrinterDeleted(const std::string& printer_name) OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAuthError() OVERRIDE; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CloudPrintURLFetcher::Delegate implementation. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual CloudPrintURLFetcher::ResponseAction HandleRawData( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& data) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual CloudPrintURLFetcher::ResponseAction HandleJSONData( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::DictionaryValue* json_data, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded) OVERRIDE; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual CloudPrintURLFetcher::ResponseAction OnRequestAuthError() OVERRIDE; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetAuthHeader() OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begin response handlers 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURLFetcher::ResponseAction HandlePrinterListResponse( 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* json_data, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CloudPrintURLFetcher::ResponseAction HandlePrinterListResponseSettingsUpdate( 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const net::URLFetcher* source, 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& url, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* json_data, 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool succeeded); 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURLFetcher::ResponseAction HandlePrinterDeleteResponse( 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* json_data, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloudPrintURLFetcher::ResponseAction HandleRegisterPrinterResponse( 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::URLFetcher* source, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DictionaryValue* json_data, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // End response handlers 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper functions for network requests. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartGetRequest(const GURL& url, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_retries, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHandler handler); 1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void StartPostRequest(CloudPrintURLFetcher::RequestType type, 1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const GURL& url, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_retries, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& mime_type, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& post_data, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHandler handler); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reports a diagnostic message to the server. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportUserMessage(const std::string& message_id, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& failure_message); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool RemovePrinterFromList(const std::string& printer_name, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::PrinterList* printer_list); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InitJobHandlerForPrinter(base::DictionaryValue* printer_data); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UpdateSettingsFromPrintersList(base::DictionaryValue* json_data); 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPendingAvailableTask(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPendingDeleteTask(const std::string& id); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPendingRegisterTask(const printing::PrinterBasicInfo& info); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPendingTask(const PendingTask& task); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProcessPendingTask(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ContinuePendingTaskProcessing(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPrintersAvailable(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPrinterRegister(const printing::PrinterBasicInfo& info); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPrinterDelete(const std::string& name); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnReceivePrinterCaps( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool succeeded, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& printer_name, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const printing::PrinterCapsAndDefaults& caps_and_defaults); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register printer from the list. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterPrinters(const printing::PrinterList& printers); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsSamePrinter(const std::string& name1, const std::string& name2) const; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool InitPrintSystem(); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void ScheduleStatsReport(); 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) void ReportStats(); 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CloudPrintConnector client. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Client* client_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connector settings. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConnectorSettings settings_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to current print system. 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PrintSystem> print_system_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Watcher for print system updates. 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PrintSystem::PrintServerWatcher> 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_server_watcher_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A map of printer id to job handler. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, scoped_refptr<PrinterJobHandler> > 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JobHandlerMap; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JobHandlerMap job_handler_map_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Next response handler. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResponseHandler next_response_handler_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The list of pending tasks to be done in the background. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<PendingTask> pending_tasks_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The CloudPrintURLFetcher instance for the current request. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintURLFetcher> request_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The CloudPrintURLFetcher instance for the user message request. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CloudPrintURLFetcher> user_message_request_; 1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::WeakPtrFactory<CloudPrintConnector> stats_ptr_factory_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CloudPrintConnector); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cloud_print 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208