Index: chrome/service/cloud_print/print_system_cups.cc |
=================================================================== |
--- chrome/service/cloud_print/print_system_cups.cc (revision 53070) |
+++ chrome/service/cloud_print/print_system_cups.cc (working copy) |
@@ -124,6 +124,7 @@ |
public: |
explicit PrintSystemCUPS(const GURL& print_server_url); |
+ // PrintSystem implementation. |
virtual void EnumeratePrinters(PrinterList* printer_list); |
virtual bool GetPrinterCapsAndDefaults(const std::string& printer_name, |
@@ -132,19 +133,13 @@ |
virtual bool ValidatePrintTicket(const std::string& printer_name, |
const std::string& print_ticket_data); |
- virtual bool SpoolPrintJob(const std::string& print_ticket, |
- const FilePath& print_data_file_path, |
- const std::string& print_data_mime_type, |
- const std::string& printer_name, |
- const std::string& job_title, |
- PlatformJobId* job_id_ret); |
- |
virtual bool GetJobDetails(const std::string& printer_name, |
PlatformJobId job_id, |
PrintJobDetails *job_details); |
virtual bool IsValidPrinter(const std::string& printer_name); |
+ |
// TODO(gene): Add implementation for CUPS print server watcher. |
class PrintServerWatcherCUPS |
: public PrintSystem::PrintServerWatcher { |
@@ -212,11 +207,53 @@ |
DISALLOW_COPY_AND_ASSIGN(PrinterWatcherCUPS); |
}; |
+ class JobSpoolerCUPS : public PrintSystem::JobSpooler { |
+ public: |
+ explicit JobSpoolerCUPS(PrintSystemCUPS* print_system) |
+ : print_system_(print_system) { |
+ DCHECK(print_system_.get()); |
+ } |
+ // PrintSystem::JobSpooler implementation. |
+ virtual bool Spool(const std::string& print_ticket, |
+ const FilePath& print_data_file_path, |
+ const std::string& print_data_mime_type, |
+ const std::string& printer_name, |
+ const std::string& job_title, |
+ JobSpooler::Delegate* delegate) { |
+ DCHECK(delegate); |
+ int job_id = print_system_->SpoolPrintJob( |
+ print_ticket, print_data_file_path, print_data_mime_type, |
+ printer_name, job_title); |
+ MessageLoop::current()->PostTask(FROM_HERE, |
+ NewRunnableFunction( |
+ &JobSpoolerCUPS::NotifyDelegate, |
+ delegate, |
+ job_id)); |
+ return true; |
+ } |
+ |
+ static void NotifyDelegate(JobSpooler::Delegate* delegate, int job_id) { |
+ if (job_id) |
+ delegate->OnJobSpoolSucceeded(job_id); |
+ else |
+ delegate->OnJobSpoolFailed(); |
+ } |
+ private: |
+ scoped_refptr<PrintSystemCUPS> print_system_; |
+ DISALLOW_COPY_AND_ASSIGN(JobSpoolerCUPS); |
+ }; |
+ |
virtual PrintSystem::PrintServerWatcher* CreatePrintServerWatcher(); |
virtual PrintSystem::PrinterWatcher* CreatePrinterWatcher( |
const std::string& printer_name); |
+ virtual PrintSystem::JobSpooler* CreateJobSpooler(); |
// Helper functions. |
+ PlatformJobId SpoolPrintJob(const std::string& print_ticket, |
+ const FilePath& print_data_file_path, |
+ const std::string& print_data_mime_type, |
+ const std::string& printer_name, |
+ const std::string& job_title); |
bool GetPrinterInfo(const std::string& printer_name, PrinterBasicInfo* info); |
bool ParsePrintTicket(const std::string& print_ticket, |
std::map<std::string, std::string>* options); |
@@ -228,10 +265,10 @@ |
// in the <functions>2(), it does not work in CUPS prior to 1.4. |
int GetDests(cups_dest_t** dests); |
FilePath GetPPD(const char* name); |
+ int GetJobs(cups_job_t** jobs, const char* name, |
+ int myjobs, int whichjobs); |
int PrintFile(const char* name, const char* filename, const char* title, |
int num_options, cups_option_t* options); |
- int GetJobs(cups_job_t** jobs, const char* name, |
- int myjobs, int whichjobs); |
GURL print_server_url_; |
}; |
@@ -336,47 +373,6 @@ |
return true; |
} |
-bool PrintSystemCUPS::SpoolPrintJob(const std::string& print_ticket, |
- const FilePath& print_data_file_path, |
- const std::string& print_data_mime_type, |
- const std::string& printer_name, |
- const std::string& job_title, |
- PlatformJobId* job_id_ret) { |
- DCHECK(job_id_ret); |
- |
- LOG(INFO) << "CP_CUPS: Spooling print job for: " << printer_name; |
- |
- // We need to store options as char* string for the duration of the |
- // cupsPrintFile2 call. We'll use map here to store options, since |
- // Dictionary value from JSON parser returns wchat_t. |
- std::map<std::string, std::string> options; |
- bool res = ParsePrintTicket(print_ticket, &options); |
- DCHECK(res); // If print ticket is invalid we still print using defaults. |
- |
- std::vector<cups_option_t> cups_options; |
- std::map<std::string, std::string>::iterator it; |
- for (it = options.begin(); it != options.end(); ++it) { |
- cups_option_t opt; |
- opt.name = const_cast<char*>(it->first.c_str()); |
- opt.value = const_cast<char*>(it->second.c_str()); |
- cups_options.push_back(opt); |
- } |
- |
- int job_id = PrintFile(printer_name.c_str(), |
- print_data_file_path.value().c_str(), |
- job_title.c_str(), |
- cups_options.size(), |
- &(cups_options[0])); |
- |
- LOG(INFO) << "CP_CUPS: Job spooled, id: " << job_id; |
- |
- if (job_id == 0) |
- return false; |
- |
- *job_id_ret = job_id; |
- return true; |
-} |
- |
bool PrintSystemCUPS::GetJobDetails(const std::string& printer_name, |
PlatformJobId job_id, |
PrintJobDetails *job_details) { |
@@ -462,6 +458,10 @@ |
return new PrinterWatcherCUPS(this, printer_name); |
} |
+PrintSystem::JobSpooler* PrintSystemCUPS::CreateJobSpooler() { |
+ return new JobSpoolerCUPS(this); |
+} |
+ |
std::string PrintSystem::GenerateProxyId() { |
// TODO(gene): This code should generate a unique id for proxy. ID should be |
// unique for this user. Rand may return the same number. We'll need to change |
@@ -534,4 +534,39 @@ |
} |
} |
+PlatformJobId PrintSystemCUPS::SpoolPrintJob( |
+ const std::string& print_ticket, |
+ const FilePath& print_data_file_path, |
+ const std::string& print_data_mime_type, |
+ const std::string& printer_name, |
+ const std::string& job_title) { |
+ LOG(INFO) << "CP_CUPS: Spooling print job for: " << printer_name; |
+ |
+ // We need to store options as char* string for the duration of the |
+ // cupsPrintFile2 call. We'll use map here to store options, since |
+ // Dictionary value from JSON parser returns wchat_t. |
+ std::map<std::string, std::string> options; |
+ bool res = ParsePrintTicket(print_ticket, &options); |
+ DCHECK(res); // If print ticket is invalid we still print using defaults. |
+ |
+ std::vector<cups_option_t> cups_options; |
+ std::map<std::string, std::string>::iterator it; |
+ for (it = options.begin(); it != options.end(); ++it) { |
+ cups_option_t opt; |
+ opt.name = const_cast<char*>(it->first.c_str()); |
+ opt.value = const_cast<char*>(it->second.c_str()); |
+ cups_options.push_back(opt); |
+ } |
+ |
+ int job_id = PrintFile(printer_name.c_str(), |
+ print_data_file_path.value().c_str(), |
+ job_title.c_str(), |
+ cups_options.size(), |
+ &(cups_options[0])); |
+ |
+ LOG(INFO) << "CP_CUPS: Job spooled, id: " << job_id; |
+ |
+ return job_id; |
+} |
+ |
} // namespace cloud_print |