// 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_PRINT_SYSTEM_H_
#define CHROME_SERVICE_CLOUD_PRINT_PRINT_SYSTEM_H_
#include <map>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "printing/backend/print_backend.h"
namespace base {
class DictionaryValue;
class FilePath;
}
namespace printing {
struct PrinterBasicInfo;
struct PrinterCapsAndDefaults;
}
// This is the interface for platform-specific code for cloud print
namespace cloud_print {
typedef int PlatformJobId;
enum PrintJobStatus {
PRINT_JOB_STATUS_INVALID,
PRINT_JOB_STATUS_IN_PROGRESS,
PRINT_JOB_STATUS_ERROR,
PRINT_JOB_STATUS_COMPLETED,
PRINT_JOB_STATUS_MAX,
};
struct PrintJobDetails {
PrintJobDetails();
void Clear();
bool operator ==(const PrintJobDetails& other) const {
return (status == other.status) &&
(platform_status_flags == other.platform_status_flags) &&
(status_message == other.status_message) &&
(total_pages == other.total_pages) &&
(pages_printed == other.pages_printed);
}
bool operator !=(const PrintJobDetails& other) const {
return !(*this == other);
}
PrintJobStatus status;
int platform_status_flags;
std::string status_message;
int total_pages;
int pages_printed;
};
// PrintSystem class will provide interface for different printing systems
// (Windows, CUPS) to implement. User will call CreateInstance() to
// obtain available printing system.
// Please note, that PrintSystem is not platform specific, but rather
// print system specific. For example, CUPS is available on both Linux and Mac,
// but not available on ChromeOS, etc. This design allows us to add more
// functionality on some platforms, while reusing core (CUPS) functions.
class PrintSystem : public base::RefCountedThreadSafe<PrintSystem> {
public:
class PrintServerWatcher
: public base::RefCountedThreadSafe<PrintServerWatcher> {
public:
// Callback interface for new printer notifications.
class Delegate {
public:
virtual void OnPrinterAdded() = 0;
// TODO(gene): Do we need OnPrinterDeleted notification here?
protected:
virtual ~Delegate() {}
};
virtual bool StartWatching(PrintServerWatcher::Delegate* delegate) = 0;
virtual bool StopWatching() = 0;
protected:
friend class base::RefCountedThreadSafe<PrintServerWatcher>;
virtual ~PrintServerWatcher();
};
class PrinterWatcher : public base::RefCountedThreadSafe<PrinterWatcher> {
public:
// Callback interface for printer updates notifications.
class Delegate {
public:
virtual void OnPrinterDeleted() = 0;
virtual void OnPrinterChanged() = 0;
virtual void OnJobChanged() = 0;
protected:
virtual ~Delegate() {}
};
virtual bool StartWatching(PrinterWatcher::Delegate* delegate) = 0;
virtual bool StopWatching() = 0;
virtual bool GetCurrentPrinterInfo(
printing::PrinterBasicInfo* printer_info) = 0;
protected:
friend class base::RefCountedThreadSafe<PrinterWatcher>;
virtual ~PrinterWatcher();
};
class JobSpooler : public base::RefCountedThreadSafe<JobSpooler> {
public:
// Callback interface for JobSpooler notifications.
class Delegate {
public:
virtual void OnJobSpoolSucceeded(const PlatformJobId& job_id) = 0;
virtual void OnJobSpoolFailed() = 0;
protected:
virtual ~Delegate() {}
};
// Spool job to the printer asynchronously. Caller will be notified via
// |delegate|. Note that only one print job can be in progress at any given
// time. Subsequent calls to Spool (before the Delegate::OnJobSpoolSucceeded
// or Delegate::OnJobSpoolFailed methods are called) can fail.
virtual bool Spool(const std::string& print_ticket,
const std::string& print_ticket_mime_type,
const base::FilePath& print_data_file_path,
const std::string& print_data_mime_type,
const std::string& printer_name,
const std::string& job_title,
const std::vector<std::string>& tags,
JobSpooler::Delegate* delegate) = 0;
protected:
friend class base::RefCountedThreadSafe<JobSpooler>;
virtual ~JobSpooler();
};
class PrintSystemResult {
public:
PrintSystemResult(bool succeeded, const std::string& message)
: succeeded_(succeeded), message_(message) { }
bool succeeded() const { return succeeded_; }
std::string message() const { return message_; }
private:
PrintSystemResult() {}
bool succeeded_;
std::string message_;
};
typedef base::Callback<void(bool,
const std::string&,
const printing::PrinterCapsAndDefaults&)>
PrinterCapsAndDefaultsCallback;
// Initialize print system. This need to be called before any other function
// of PrintSystem.
virtual PrintSystemResult Init() = 0;
// Enumerates the list of installed local and network printers.
virtual PrintSystemResult EnumeratePrinters(
printing::PrinterList* printer_list) = 0;
// Gets the capabilities and defaults for a specific printer asynchronously.
virtual void GetPrinterCapsAndDefaults(
const std::string& printer_name,
const PrinterCapsAndDefaultsCallback& callback) = 0;
// Returns true if printer_name points to a valid printer.
virtual bool IsValidPrinter(const std::string& printer_name) = 0;
// Returns true if ticket is valid.
virtual bool ValidatePrintTicket(
const std::string& printer_name,
const std::string& print_ticket_data,
const std::string& print_ticket_mime_type) = 0;
// Get details for already spooled job.
virtual bool GetJobDetails(const std::string& printer_name,
PlatformJobId job_id,
PrintJobDetails* job_details) = 0;
// Factory methods to create corresponding watcher. Callee is responsible
// for deleting objects. Return NULL if failed.
virtual PrintServerWatcher* CreatePrintServerWatcher() = 0;
virtual PrinterWatcher* CreatePrinterWatcher(
const std::string& printer_name) = 0;
virtual JobSpooler* CreateJobSpooler() = 0;
// Returns a true if connector should use CDD for capabilities and CJT as
// print ticket.
virtual bool UseCddAndCjt() = 0;
// Returns a comma separated list of mimetypes for print data that are
// supported by this print system. The format of this string is the same as
// that used for the HTTP Accept: header.
virtual std::string GetSupportedMimeTypes() = 0;
// Generate unique for proxy.
static std::string GenerateProxyId();
// Call this function to obtain printing system for specified print server.
// If print settings are NULL, default settings will be used.
// Return NULL if no print system available.
static scoped_refptr<PrintSystem> CreateInstance(
const base::DictionaryValue* print_system_settings);
protected:
friend class base::RefCountedThreadSafe<PrintSystem>;
virtual ~PrintSystem();
};
} // namespace cloud_print
#endif // CHROME_SERVICE_CLOUD_PRINT_PRINT_SYSTEM_H_