| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/service/cloud_print/print_system.h" | 5 #include "chrome/service/cloud_print/print_system.h" |
| 6 | 6 |
| 7 #include <cups/cups.h> | 7 #include <cups/cups.h> |
| 8 #include <dlfcn.h> | 8 #include <dlfcn.h> |
| 9 #include <errno.h> | 9 #include <errno.h> |
| 10 #include <pthread.h> | 10 #include <pthread.h> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 // the number of requests. | 69 // the number of requests. |
| 70 typedef std::map<std::string, printing::PrinterCapsAndDefaults> CapsMap; | 70 typedef std::map<std::string, printing::PrinterCapsAndDefaults> CapsMap; |
| 71 CapsMap caps_cache; | 71 CapsMap caps_cache; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 class PrintSystemCUPS : public PrintSystem { | 74 class PrintSystemCUPS : public PrintSystem { |
| 75 public: | 75 public: |
| 76 explicit PrintSystemCUPS(const base::DictionaryValue* print_system_settings); | 76 explicit PrintSystemCUPS(const base::DictionaryValue* print_system_settings); |
| 77 | 77 |
| 78 // PrintSystem implementation. | 78 // PrintSystem implementation. |
| 79 virtual PrintSystemResult Init() override; | 79 PrintSystemResult Init() override; |
| 80 virtual PrintSystem::PrintSystemResult EnumeratePrinters( | 80 PrintSystem::PrintSystemResult EnumeratePrinters( |
| 81 printing::PrinterList* printer_list) override; | 81 printing::PrinterList* printer_list) override; |
| 82 virtual void GetPrinterCapsAndDefaults( | 82 void GetPrinterCapsAndDefaults( |
| 83 const std::string& printer_name, | 83 const std::string& printer_name, |
| 84 const PrinterCapsAndDefaultsCallback& callback) override; | 84 const PrinterCapsAndDefaultsCallback& callback) override; |
| 85 virtual bool IsValidPrinter(const std::string& printer_name) override; | 85 bool IsValidPrinter(const std::string& printer_name) override; |
| 86 virtual bool ValidatePrintTicket( | 86 bool ValidatePrintTicket(const std::string& printer_name, |
| 87 const std::string& printer_name, | 87 const std::string& print_ticket_data, |
| 88 const std::string& print_ticket_data, | 88 const std::string& print_ticket_mime_type) override; |
| 89 const std::string& print_ticket_mime_type) override; | 89 bool GetJobDetails(const std::string& printer_name, |
| 90 virtual bool GetJobDetails(const std::string& printer_name, | 90 PlatformJobId job_id, |
| 91 PlatformJobId job_id, | 91 PrintJobDetails* job_details) override; |
| 92 PrintJobDetails *job_details) override; | 92 PrintSystem::PrintServerWatcher* CreatePrintServerWatcher() override; |
| 93 virtual PrintSystem::PrintServerWatcher* CreatePrintServerWatcher() override; | 93 PrintSystem::PrinterWatcher* CreatePrinterWatcher( |
| 94 virtual PrintSystem::PrinterWatcher* CreatePrinterWatcher( | |
| 95 const std::string& printer_name) override; | 94 const std::string& printer_name) override; |
| 96 virtual PrintSystem::JobSpooler* CreateJobSpooler() override; | 95 PrintSystem::JobSpooler* CreateJobSpooler() override; |
| 97 virtual bool UseCddAndCjt() override; | 96 bool UseCddAndCjt() override; |
| 98 virtual std::string GetSupportedMimeTypes() override; | 97 std::string GetSupportedMimeTypes() override; |
| 99 | 98 |
| 100 // Helper functions. | 99 // Helper functions. |
| 101 PlatformJobId SpoolPrintJob(const std::string& print_ticket, | 100 PlatformJobId SpoolPrintJob(const std::string& print_ticket, |
| 102 const base::FilePath& print_data_file_path, | 101 const base::FilePath& print_data_file_path, |
| 103 const std::string& print_data_mime_type, | 102 const std::string& print_data_mime_type, |
| 104 const std::string& printer_name, | 103 const std::string& printer_name, |
| 105 const std::string& job_title, | 104 const std::string& job_title, |
| 106 const std::vector<std::string>& tags, | 105 const std::vector<std::string>& tags, |
| 107 bool* dry_run); | 106 bool* dry_run); |
| 108 bool GetPrinterInfo(const std::string& printer_name, | 107 bool GetPrinterInfo(const std::string& printer_name, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 119 return update_timeout_; | 118 return update_timeout_; |
| 120 } | 119 } |
| 121 | 120 |
| 122 bool NotifyDelete() const { | 121 bool NotifyDelete() const { |
| 123 // Notify about deleted printers only when we | 122 // Notify about deleted printers only when we |
| 124 // fetched printers list without errors. | 123 // fetched printers list without errors. |
| 125 return notify_delete_ && printer_enum_succeeded_; | 124 return notify_delete_ && printer_enum_succeeded_; |
| 126 } | 125 } |
| 127 | 126 |
| 128 private: | 127 private: |
| 129 virtual ~PrintSystemCUPS() {} | 128 ~PrintSystemCUPS() override {} |
| 130 | 129 |
| 131 // Following functions are wrappers around corresponding CUPS functions. | 130 // Following functions are wrappers around corresponding CUPS functions. |
| 132 // <functions>2() are called when print server is specified, and plain | 131 // <functions>2() are called when print server is specified, and plain |
| 133 // version in another case. There is an issue specifing CUPS_HTTP_DEFAULT | 132 // version in another case. There is an issue specifing CUPS_HTTP_DEFAULT |
| 134 // in the <functions>2(), it does not work in CUPS prior to 1.4. | 133 // in the <functions>2(), it does not work in CUPS prior to 1.4. |
| 135 int GetJobs(cups_job_t** jobs, const GURL& url, | 134 int GetJobs(cups_job_t** jobs, const GURL& url, |
| 136 http_encryption_t encryption, const char* name, | 135 http_encryption_t encryption, const char* name, |
| 137 int myjobs, int whichjobs); | 136 int myjobs, int whichjobs); |
| 138 int PrintFile(const GURL& url, http_encryption_t encryption, | 137 int PrintFile(const GURL& url, http_encryption_t encryption, |
| 139 const char* name, const char* filename, | 138 const char* name, const char* filename, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 | 172 |
| 174 class PrintServerWatcherCUPS | 173 class PrintServerWatcherCUPS |
| 175 : public PrintSystem::PrintServerWatcher { | 174 : public PrintSystem::PrintServerWatcher { |
| 176 public: | 175 public: |
| 177 explicit PrintServerWatcherCUPS(PrintSystemCUPS* print_system) | 176 explicit PrintServerWatcherCUPS(PrintSystemCUPS* print_system) |
| 178 : print_system_(print_system), | 177 : print_system_(print_system), |
| 179 delegate_(NULL) { | 178 delegate_(NULL) { |
| 180 } | 179 } |
| 181 | 180 |
| 182 // PrintSystem::PrintServerWatcher implementation. | 181 // PrintSystem::PrintServerWatcher implementation. |
| 183 virtual bool StartWatching( | 182 bool StartWatching( |
| 184 PrintSystem::PrintServerWatcher::Delegate* delegate) override { | 183 PrintSystem::PrintServerWatcher::Delegate* delegate) override { |
| 185 delegate_ = delegate; | 184 delegate_ = delegate; |
| 186 printers_hash_ = GetPrintersHash(); | 185 printers_hash_ = GetPrintersHash(); |
| 187 base::MessageLoop::current()->PostDelayedTask( | 186 base::MessageLoop::current()->PostDelayedTask( |
| 188 FROM_HERE, | 187 FROM_HERE, |
| 189 base::Bind(&PrintServerWatcherCUPS::CheckForUpdates, this), | 188 base::Bind(&PrintServerWatcherCUPS::CheckForUpdates, this), |
| 190 print_system_->GetUpdateTimeout()); | 189 print_system_->GetUpdateTimeout()); |
| 191 return true; | 190 return true; |
| 192 } | 191 } |
| 193 | 192 |
| 194 virtual bool StopWatching() override { | 193 bool StopWatching() override { |
| 195 delegate_ = NULL; | 194 delegate_ = NULL; |
| 196 return true; | 195 return true; |
| 197 } | 196 } |
| 198 | 197 |
| 199 void CheckForUpdates() { | 198 void CheckForUpdates() { |
| 200 if (delegate_ == NULL) | 199 if (delegate_ == NULL) |
| 201 return; // Orphan call. We have been stopped already. | 200 return; // Orphan call. We have been stopped already. |
| 202 VLOG(1) << "CP_CUPS: Checking for new printers"; | 201 VLOG(1) << "CP_CUPS: Checking for new printers"; |
| 203 std::string new_hash = GetPrintersHash(); | 202 std::string new_hash = GetPrintersHash(); |
| 204 if (printers_hash_ != new_hash) { | 203 if (printers_hash_ != new_hash) { |
| 205 printers_hash_ = new_hash; | 204 printers_hash_ = new_hash; |
| 206 delegate_->OnPrinterAdded(); | 205 delegate_->OnPrinterAdded(); |
| 207 } | 206 } |
| 208 base::MessageLoop::current()->PostDelayedTask( | 207 base::MessageLoop::current()->PostDelayedTask( |
| 209 FROM_HERE, | 208 FROM_HERE, |
| 210 base::Bind(&PrintServerWatcherCUPS::CheckForUpdates, this), | 209 base::Bind(&PrintServerWatcherCUPS::CheckForUpdates, this), |
| 211 print_system_->GetUpdateTimeout()); | 210 print_system_->GetUpdateTimeout()); |
| 212 } | 211 } |
| 213 | 212 |
| 214 protected: | 213 protected: |
| 215 virtual ~PrintServerWatcherCUPS() { | 214 ~PrintServerWatcherCUPS() override { StopWatching(); } |
| 216 StopWatching(); | |
| 217 } | |
| 218 | 215 |
| 219 private: | 216 private: |
| 220 std::string GetPrintersHash() { | 217 std::string GetPrintersHash() { |
| 221 printing::PrinterList printer_list; | 218 printing::PrinterList printer_list; |
| 222 print_system_->EnumeratePrinters(&printer_list); | 219 print_system_->EnumeratePrinters(&printer_list); |
| 223 | 220 |
| 224 // Sort printer names. | 221 // Sort printer names. |
| 225 std::vector<std::string> printers; | 222 std::vector<std::string> printers; |
| 226 printing::PrinterList::iterator it; | 223 printing::PrinterList::iterator it; |
| 227 for (it = printer_list.begin(); it != printer_list.end(); ++it) | 224 for (it = printer_list.begin(); it != printer_list.end(); ++it) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 246 : public PrintSystem::PrinterWatcher { | 243 : public PrintSystem::PrinterWatcher { |
| 247 public: | 244 public: |
| 248 PrinterWatcherCUPS(PrintSystemCUPS* print_system, | 245 PrinterWatcherCUPS(PrintSystemCUPS* print_system, |
| 249 const std::string& printer_name) | 246 const std::string& printer_name) |
| 250 : printer_name_(printer_name), | 247 : printer_name_(printer_name), |
| 251 delegate_(NULL), | 248 delegate_(NULL), |
| 252 print_system_(print_system) { | 249 print_system_(print_system) { |
| 253 } | 250 } |
| 254 | 251 |
| 255 // PrintSystem::PrinterWatcher implementation. | 252 // PrintSystem::PrinterWatcher implementation. |
| 256 virtual bool StartWatching( | 253 bool StartWatching(PrintSystem::PrinterWatcher::Delegate* delegate) override { |
| 257 PrintSystem::PrinterWatcher::Delegate* delegate) override{ | |
| 258 scoped_refptr<printing::PrintBackend> print_backend( | 254 scoped_refptr<printing::PrintBackend> print_backend( |
| 259 printing::PrintBackend::CreateInstance(NULL)); | 255 printing::PrintBackend::CreateInstance(NULL)); |
| 260 crash_keys::ScopedPrinterInfo crash_key( | 256 crash_keys::ScopedPrinterInfo crash_key( |
| 261 print_backend->GetPrinterDriverInfo(printer_name_)); | 257 print_backend->GetPrinterDriverInfo(printer_name_)); |
| 262 if (delegate_ != NULL) | 258 if (delegate_ != NULL) |
| 263 StopWatching(); | 259 StopWatching(); |
| 264 delegate_ = delegate; | 260 delegate_ = delegate; |
| 265 settings_hash_ = GetSettingsHash(); | 261 settings_hash_ = GetSettingsHash(); |
| 266 // Schedule next job status update. | 262 // Schedule next job status update. |
| 267 base::MessageLoop::current()->PostDelayedTask( | 263 base::MessageLoop::current()->PostDelayedTask( |
| 268 FROM_HERE, | 264 FROM_HERE, |
| 269 base::Bind(&PrinterWatcherCUPS::JobStatusUpdate, this), | 265 base::Bind(&PrinterWatcherCUPS::JobStatusUpdate, this), |
| 270 base::TimeDelta::FromSeconds(kJobUpdateTimeoutSeconds)); | 266 base::TimeDelta::FromSeconds(kJobUpdateTimeoutSeconds)); |
| 271 // Schedule next printer check. | 267 // Schedule next printer check. |
| 272 // TODO(gene): Randomize time for the next printer update. | 268 // TODO(gene): Randomize time for the next printer update. |
| 273 base::MessageLoop::current()->PostDelayedTask( | 269 base::MessageLoop::current()->PostDelayedTask( |
| 274 FROM_HERE, | 270 FROM_HERE, |
| 275 base::Bind(&PrinterWatcherCUPS::PrinterUpdate, this), | 271 base::Bind(&PrinterWatcherCUPS::PrinterUpdate, this), |
| 276 print_system_->GetUpdateTimeout()); | 272 print_system_->GetUpdateTimeout()); |
| 277 return true; | 273 return true; |
| 278 } | 274 } |
| 279 | 275 |
| 280 virtual bool StopWatching() override{ | 276 bool StopWatching() override { |
| 281 delegate_ = NULL; | 277 delegate_ = NULL; |
| 282 return true; | 278 return true; |
| 283 } | 279 } |
| 284 | 280 |
| 285 virtual bool GetCurrentPrinterInfo( | 281 bool GetCurrentPrinterInfo( |
| 286 printing::PrinterBasicInfo* printer_info) override { | 282 printing::PrinterBasicInfo* printer_info) override { |
| 287 DCHECK(printer_info); | 283 DCHECK(printer_info); |
| 288 return print_system_->GetPrinterInfo(printer_name_, printer_info); | 284 return print_system_->GetPrinterInfo(printer_name_, printer_info); |
| 289 } | 285 } |
| 290 | 286 |
| 291 void JobStatusUpdate() { | 287 void JobStatusUpdate() { |
| 292 if (delegate_ == NULL) | 288 if (delegate_ == NULL) |
| 293 return; // Orphan call. We have been stopped already. | 289 return; // Orphan call. We have been stopped already. |
| 294 // For CUPS proxy, we are going to fire OnJobChanged notification | 290 // For CUPS proxy, we are going to fire OnJobChanged notification |
| 295 // periodically. Higher level will check if there are any outstanding | 291 // periodically. Higher level will check if there are any outstanding |
| (...skipping 25 matching lines...) Expand all Loading... |
| 321 << ", printer name: " << printer_name_; | 317 << ", printer name: " << printer_name_; |
| 322 } | 318 } |
| 323 } | 319 } |
| 324 base::MessageLoop::current()->PostDelayedTask( | 320 base::MessageLoop::current()->PostDelayedTask( |
| 325 FROM_HERE, | 321 FROM_HERE, |
| 326 base::Bind(&PrinterWatcherCUPS::PrinterUpdate, this), | 322 base::Bind(&PrinterWatcherCUPS::PrinterUpdate, this), |
| 327 print_system_->GetUpdateTimeout()); | 323 print_system_->GetUpdateTimeout()); |
| 328 } | 324 } |
| 329 | 325 |
| 330 protected: | 326 protected: |
| 331 virtual ~PrinterWatcherCUPS() { | 327 ~PrinterWatcherCUPS() override { StopWatching(); } |
| 332 StopWatching(); | |
| 333 } | |
| 334 | 328 |
| 335 private: | 329 private: |
| 336 std::string GetSettingsHash() { | 330 std::string GetSettingsHash() { |
| 337 printing::PrinterBasicInfo info; | 331 printing::PrinterBasicInfo info; |
| 338 if (!print_system_->GetPrinterInfo(printer_name_, &info)) | 332 if (!print_system_->GetPrinterInfo(printer_name_, &info)) |
| 339 return std::string(); | 333 return std::string(); |
| 340 | 334 |
| 341 printing::PrinterCapsAndDefaults caps; | 335 printing::PrinterCapsAndDefaults caps; |
| 342 if (!print_system_->GetPrinterCapsAndDefaults(printer_name_, &caps)) | 336 if (!print_system_->GetPrinterCapsAndDefaults(printer_name_, &caps)) |
| 343 return std::string(); | 337 return std::string(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 366 }; | 360 }; |
| 367 | 361 |
| 368 class JobSpoolerCUPS : public PrintSystem::JobSpooler { | 362 class JobSpoolerCUPS : public PrintSystem::JobSpooler { |
| 369 public: | 363 public: |
| 370 explicit JobSpoolerCUPS(PrintSystemCUPS* print_system) | 364 explicit JobSpoolerCUPS(PrintSystemCUPS* print_system) |
| 371 : print_system_(print_system) { | 365 : print_system_(print_system) { |
| 372 DCHECK(print_system_.get()); | 366 DCHECK(print_system_.get()); |
| 373 } | 367 } |
| 374 | 368 |
| 375 // PrintSystem::JobSpooler implementation. | 369 // PrintSystem::JobSpooler implementation. |
| 376 virtual bool Spool(const std::string& print_ticket, | 370 bool Spool(const std::string& print_ticket, |
| 377 const std::string& print_ticket_mime_type, | 371 const std::string& print_ticket_mime_type, |
| 378 const base::FilePath& print_data_file_path, | 372 const base::FilePath& print_data_file_path, |
| 379 const std::string& print_data_mime_type, | 373 const std::string& print_data_mime_type, |
| 380 const std::string& printer_name, | 374 const std::string& printer_name, |
| 381 const std::string& job_title, | 375 const std::string& job_title, |
| 382 const std::vector<std::string>& tags, | 376 const std::vector<std::string>& tags, |
| 383 JobSpooler::Delegate* delegate) override{ | 377 JobSpooler::Delegate* delegate) override { |
| 384 DCHECK(delegate); | 378 DCHECK(delegate); |
| 385 bool dry_run = false; | 379 bool dry_run = false; |
| 386 int job_id = print_system_->SpoolPrintJob( | 380 int job_id = print_system_->SpoolPrintJob( |
| 387 print_ticket, print_data_file_path, print_data_mime_type, | 381 print_ticket, print_data_file_path, print_data_mime_type, |
| 388 printer_name, job_title, tags, &dry_run); | 382 printer_name, job_title, tags, &dry_run); |
| 389 base::MessageLoop::current()->PostTask( | 383 base::MessageLoop::current()->PostTask( |
| 390 FROM_HERE, | 384 FROM_HERE, |
| 391 base::Bind(&JobSpoolerCUPS::NotifyDelegate, delegate, job_id, dry_run)); | 385 base::Bind(&JobSpoolerCUPS::NotifyDelegate, delegate, job_id, dry_run)); |
| 392 return true; | 386 return true; |
| 393 } | 387 } |
| 394 | 388 |
| 395 static void NotifyDelegate(JobSpooler::Delegate* delegate, | 389 static void NotifyDelegate(JobSpooler::Delegate* delegate, |
| 396 int job_id, bool dry_run) { | 390 int job_id, bool dry_run) { |
| 397 if (dry_run || job_id) | 391 if (dry_run || job_id) |
| 398 delegate->OnJobSpoolSucceeded(job_id); | 392 delegate->OnJobSpoolSucceeded(job_id); |
| 399 else | 393 else |
| 400 delegate->OnJobSpoolFailed(); | 394 delegate->OnJobSpoolFailed(); |
| 401 } | 395 } |
| 402 | 396 |
| 403 protected: | 397 protected: |
| 404 virtual ~JobSpoolerCUPS() {} | 398 ~JobSpoolerCUPS() override {} |
| 405 | 399 |
| 406 private: | 400 private: |
| 407 scoped_refptr<PrintSystemCUPS> print_system_; | 401 scoped_refptr<PrintSystemCUPS> print_system_; |
| 408 | 402 |
| 409 DISALLOW_COPY_AND_ASSIGN(JobSpoolerCUPS); | 403 DISALLOW_COPY_AND_ASSIGN(JobSpoolerCUPS); |
| 410 }; | 404 }; |
| 411 | 405 |
| 412 PrintSystemCUPS::PrintSystemCUPS( | 406 PrintSystemCUPS::PrintSystemCUPS( |
| 413 const base::DictionaryValue* print_system_settings) | 407 const base::DictionaryValue* print_system_settings) |
| 414 : update_timeout_(base::TimeDelta::FromMinutes( | 408 : update_timeout_(base::TimeDelta::FromMinutes( |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 | 866 |
| 873 void PrintSystemCUPS::RunCapsCallback( | 867 void PrintSystemCUPS::RunCapsCallback( |
| 874 const PrinterCapsAndDefaultsCallback& callback, | 868 const PrinterCapsAndDefaultsCallback& callback, |
| 875 bool succeeded, | 869 bool succeeded, |
| 876 const std::string& printer_name, | 870 const std::string& printer_name, |
| 877 const printing::PrinterCapsAndDefaults& printer_info) { | 871 const printing::PrinterCapsAndDefaults& printer_info) { |
| 878 callback.Run(succeeded, printer_name, printer_info); | 872 callback.Run(succeeded, printer_name, printer_info); |
| 879 } | 873 } |
| 880 | 874 |
| 881 } // namespace cloud_print | 875 } // namespace cloud_print |
| OLD | NEW |