blob: 6d052474a74835ec343a54ef90930c4e753037e7 [file] [log] [blame]
// Copyright (c) 2012 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_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_
#define CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_
#include <list>
#include <map>
#include <string>
#include "base/threading/thread.h"
#include "base/values.h"
#include "chrome/service/cloud_print/connector_settings.h"
#include "chrome/service/cloud_print/print_system.h"
#include "chrome/service/cloud_print/printer_job_handler.h"
namespace cloud_print {
// CloudPrintConnector handles top printer management tasks.
// - Matching local and cloud printers
// - Registration of local printers
// - Deleting cloud printers
// All tasks are posted to the common queue (PendingTasks) and executed
// one-by-one in FIFO order.
// CloudPrintConnector will notify client over Client interface.
class CloudPrintConnector
: public base::RefCountedThreadSafe<CloudPrintConnector>,
private PrintSystem::PrintServerWatcher::Delegate,
private PrinterJobHandlerDelegate,
private CloudPrintURLFetcherDelegate {
public:
class Client {
public:
virtual void OnAuthFailed() = 0;
virtual void OnXmppPingUpdated(int ping_timeout) = 0;
protected:
virtual ~Client() {}
};
CloudPrintConnector(Client* client, const ConnectorSettings& settings);
bool Start();
void Stop();
bool IsRunning();
// Return list of printer ids registered with CloudPrint.
void GetPrinterIds(std::list<std::string>* printer_ids);
// Check for jobs for specific printer. If printer id is empty
// jobs will be checked for all available printers.
void CheckForJobs(const std::string& reason, const std::string& printer_id);
// Update settings for specific printer.
void UpdatePrinterSettings(const std::string& printer_id);
private:
friend class base::RefCountedThreadSafe<CloudPrintConnector>;
// Prototype for a response handler.
typedef CloudPrintURLFetcher::ResponseAction
(CloudPrintConnector::*ResponseHandler)(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded);
enum PendingTaskType {
PENDING_PRINTERS_NONE,
PENDING_PRINTERS_AVAILABLE,
PENDING_PRINTER_REGISTER,
PENDING_PRINTER_DELETE
};
// TODO(vitalybuka): Consider delete pending_tasks_ and just use MessageLoop.
struct PendingTask {
PendingTaskType type;
// Optional members, depending on type.
std::string printer_id; // For pending delete.
printing::PrinterBasicInfo printer_info; // For pending registration.
PendingTask() : type(PENDING_PRINTERS_NONE) {}
~PendingTask() {}
};
~CloudPrintConnector() override;
// PrintServerWatcherDelegate implementation
void OnPrinterAdded() override;
// PrinterJobHandler::Delegate implementation
void OnPrinterDeleted(const std::string& printer_name) override;
void OnAuthError() override;
// CloudPrintURLFetcher::Delegate implementation.
CloudPrintURLFetcher::ResponseAction HandleRawData(
const net::URLFetcher* source,
const GURL& url,
const std::string& data) override;
CloudPrintURLFetcher::ResponseAction HandleJSONData(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded) override;
CloudPrintURLFetcher::ResponseAction OnRequestAuthError() override;
std::string GetAuthHeader() override;
// Begin response handlers
CloudPrintURLFetcher::ResponseAction HandlePrinterListResponse(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded);
CloudPrintURLFetcher::ResponseAction HandlePrinterListResponseSettingsUpdate(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded);
CloudPrintURLFetcher::ResponseAction HandlePrinterDeleteResponse(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded);
CloudPrintURLFetcher::ResponseAction HandleRegisterPrinterResponse(
const net::URLFetcher* source,
const GURL& url,
base::DictionaryValue* json_data,
bool succeeded);
// End response handlers
// Helper functions for network requests.
void StartGetRequest(const GURL& url,
int max_retries,
ResponseHandler handler);
void StartPostRequest(CloudPrintURLFetcher::RequestType type,
const GURL& url,
int max_retries,
const std::string& mime_type,
const std::string& post_data,
ResponseHandler handler);
// Reports a diagnostic message to the server.
void ReportUserMessage(const std::string& message_id,
const std::string& failure_message);
bool RemovePrinterFromList(const std::string& printer_name,
printing::PrinterList* printer_list);
void InitJobHandlerForPrinter(base::DictionaryValue* printer_data);
void UpdateSettingsFromPrintersList(base::DictionaryValue* json_data);
void AddPendingAvailableTask();
void AddPendingDeleteTask(const std::string& id);
void AddPendingRegisterTask(const printing::PrinterBasicInfo& info);
void AddPendingTask(const PendingTask& task);
void ProcessPendingTask();
void ContinuePendingTaskProcessing();
void OnPrintersAvailable();
void OnPrinterRegister(const printing::PrinterBasicInfo& info);
void OnPrinterDelete(const std::string& name);
void OnReceivePrinterCaps(
bool succeeded,
const std::string& printer_name,
const printing::PrinterCapsAndDefaults& caps_and_defaults);
// Register printer from the list.
void RegisterPrinters(const printing::PrinterList& printers);
bool IsSamePrinter(const std::string& name1, const std::string& name2) const;
bool InitPrintSystem();
void ScheduleStatsReport();
void ReportStats();
// CloudPrintConnector client.
Client* client_;
// Connector settings.
ConnectorSettings settings_;
// Pointer to current print system.
scoped_refptr<PrintSystem> print_system_;
// Watcher for print system updates.
scoped_refptr<PrintSystem::PrintServerWatcher>
print_server_watcher_;
// A map of printer id to job handler.
typedef std::map<std::string, scoped_refptr<PrinterJobHandler> >
JobHandlerMap;
JobHandlerMap job_handler_map_;
// Next response handler.
ResponseHandler next_response_handler_;
// The list of pending tasks to be done in the background.
std::list<PendingTask> pending_tasks_;
// The CloudPrintURLFetcher instance for the current request.
scoped_refptr<CloudPrintURLFetcher> request_;
// The CloudPrintURLFetcher instance for the user message request.
scoped_refptr<CloudPrintURLFetcher> user_message_request_;
base::WeakPtrFactory<CloudPrintConnector> stats_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(CloudPrintConnector);
};
} // namespace cloud_print
#endif // CHROME_SERVICE_CLOUD_PRINT_CLOUD_PRINT_CONNECTOR_H_