Chromium Code Reviews| 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 "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "base/win/object_watcher.h" | 10 #include "base/win/object_watcher.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 hr = printing::XPSModule::ConvertPrintTicketToDevMode(provider, | 70 hr = printing::XPSModule::ConvertPrintTicketToDevMode(provider, |
| 71 pt_stream, | 71 pt_stream, |
| 72 kUserDefaultDevmode, | 72 kUserDefaultDevmode, |
| 73 kPTJobScope, | 73 kPTJobScope, |
| 74 &size, | 74 &size, |
| 75 &dm, | 75 &dm, |
| 76 NULL); | 76 NULL); |
| 77 if (SUCCEEDED(hr)) { | 77 if (SUCCEEDED(hr)) { |
| 78 // Correct DEVMODE using DocumentProperties. See documentation for | 78 // Correct DEVMODE using DocumentProperties. See documentation for |
| 79 // PTConvertPrintTicketToDevMode. | 79 // PTConvertPrintTicketToDevMode. |
| 80 LONG buffer_size = | 80 wchar_t* mutable_name = const_cast<wchar_t*>(printer_name.c_str()); |
|
Noam Samuel
2014/02/07 19:47:53
Is it kosher to mutate a .c_str()? It looks like i
| |
| 81 DocumentProperties(NULL, printer, | 81 LONG buffer_size = DocumentProperties(NULL, printer, mutable_name, NULL, |
| 82 const_cast<LPWSTR>(printer_name.c_str()), NULL, dm, | 82 dm, DM_IN_BUFFER); |
| 83 DM_IN_BUFFER); | |
| 84 if (buffer_size <= 0) | 83 if (buffer_size <= 0) |
| 85 return scoped_ptr<DEVMODE[]>(); | 84 return scoped_ptr<DEVMODE[]>(); |
| 86 | |
| 87 scoped_dev_mode.reset(reinterpret_cast<DEVMODE*>(new uint8[buffer_size])); | 85 scoped_dev_mode.reset(reinterpret_cast<DEVMODE*>(new uint8[buffer_size])); |
| 88 if (DocumentProperties(NULL, printer, | 86 if (DocumentProperties(NULL, printer, mutable_name, scoped_dev_mode.get(), |
| 89 const_cast<LPWSTR>(printer_name.c_str()), | 87 dm, DM_OUT_BUFFER | DM_IN_BUFFER) != IDOK) { |
| 90 scoped_dev_mode.get(), dm, | |
| 91 DM_OUT_BUFFER | DM_IN_BUFFER) != IDOK) { | |
| 92 scoped_dev_mode.reset(); | 88 scoped_dev_mode.reset(); |
| 93 } | 89 } |
| 94 printing::XPSModule::ReleaseMemory(dm); | 90 printing::XPSModule::ReleaseMemory(dm); |
| 95 } | 91 } |
| 96 printing::XPSModule::CloseProvider(provider); | 92 printing::XPSModule::CloseProvider(provider); |
| 97 } | 93 } |
| 98 return scoped_dev_mode.Pass(); | 94 return scoped_dev_mode.Pass(); |
| 99 } | 95 } |
| 100 | 96 |
| 101 class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { | 97 class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 331 const std::string& job_title, | 327 const std::string& job_title, |
| 332 JobSpooler::Delegate* delegate) { | 328 JobSpooler::Delegate* delegate) { |
| 333 if (delegate_) { | 329 if (delegate_) { |
| 334 // We are already in the process of printing. | 330 // We are already in the process of printing. |
| 335 NOTREACHED(); | 331 NOTREACHED(); |
| 336 return false; | 332 return false; |
| 337 } | 333 } |
| 338 last_page_printed_ = -1; | 334 last_page_printed_ = -1; |
| 339 // We only support PDF and XPS documents for now. | 335 // We only support PDF and XPS documents for now. |
| 340 if (print_data_mime_type == kContentTypePDF) { | 336 if (print_data_mime_type == kContentTypePDF) { |
| 341 DCHECK(print_ticket_mime_type == kContentTypeXML); | 337 scoped_ptr<DEVMODE[]> dev_mode; |
| 342 scoped_ptr<DEVMODE[]> dev_mode = | 338 if (print_ticket_mime_type == kContentTypeJSON) { |
| 343 XpsTicketToDevMode(base::UTF8ToWide(printer_name), print_ticket); | 339 dev_mode = CjtToDevMode(base::UTF8ToWide(printer_name), print_ticket); |
| 340 } else { | |
| 341 DCHECK(print_ticket_mime_type == kContentTypeXML); | |
| 342 dev_mode = XpsTicketToDevMode(base::UTF8ToWide(printer_name), | |
| 343 print_ticket); | |
| 344 } | |
| 344 | 345 |
| 345 if (!dev_mode) { | 346 if (!dev_mode) { |
| 346 NOTREACHED(); | 347 NOTREACHED(); |
| 347 return false; | 348 return false; |
| 348 } | 349 } |
| 349 | 350 |
| 350 HDC dc = CreateDC(L"WINSPOOL", base::UTF8ToWide(printer_name).c_str(), | 351 HDC dc = CreateDC(L"WINSPOOL", base::UTF8ToWide(printer_name).c_str(), |
| 351 NULL, dev_mode.get()); | 352 NULL, dev_mode.get()); |
| 352 if (!dc) { | 353 if (!dc) { |
| 353 NOTREACHED(); | 354 NOTREACHED(); |
| 354 return false; | 355 return false; |
| 355 } | 356 } |
| 356 DOCINFO di = {0}; | 357 DOCINFO di = {0}; |
| 357 di.cbSize = sizeof(DOCINFO); | 358 di.cbSize = sizeof(DOCINFO); |
| 358 base::string16 doc_name = base::UTF8ToUTF16(job_title); | 359 base::string16 doc_name = base::UTF8ToUTF16(job_title); |
| 359 DCHECK(printing::SimplifyDocumentTitle(doc_name) == doc_name); | 360 DCHECK(printing::SimplifyDocumentTitle(doc_name) == doc_name); |
| 360 di.lpszDocName = doc_name.c_str(); | 361 di.lpszDocName = doc_name.c_str(); |
| 361 job_id_ = StartDoc(dc, &di); | 362 job_id_ = StartDoc(dc, &di); |
| 362 if (job_id_ <= 0) | 363 if (job_id_ <= 0) |
| 363 return false; | 364 return false; |
| 364 | 365 |
| 365 printer_dc_.Set(dc); | 366 printer_dc_.Set(dc); |
| 366 saved_dc_ = SaveDC(printer_dc_.Get()); | 367 saved_dc_ = SaveDC(printer_dc_.Get()); |
| 367 print_data_file_path_ = print_data_file_path; | 368 print_data_file_path_ = print_data_file_path; |
| 368 delegate_ = delegate; | 369 delegate_ = delegate; |
| 369 RenderNextPDFPages(); | 370 RenderNextPDFPages(); |
| 370 } else if (print_data_mime_type == kContentTypeXPS) { | 371 } else if (print_data_mime_type == kContentTypeXPS) { |
| 372 DCHECK(print_ticket_mime_type == kContentTypeXML); | |
| 371 bool ret = PrintXPSDocument(printer_name, | 373 bool ret = PrintXPSDocument(printer_name, |
| 372 job_title, | 374 job_title, |
| 373 print_data_file_path, | 375 print_data_file_path, |
| 374 print_ticket); | 376 print_ticket); |
| 375 if (ret) | 377 if (ret) |
| 376 delegate_ = delegate; | 378 delegate_ = delegate; |
| 377 return ret; | 379 return ret; |
| 378 } else { | 380 } else { |
| 379 NOTREACHED(); | 381 NOTREACHED(); |
| 380 return false; | 382 return false; |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 620 callback_.Reset(); | 622 callback_.Reset(); |
| 621 Release(); | 623 Release(); |
| 622 } | 624 } |
| 623 | 625 |
| 624 virtual void OnGetPrinterSemanticCapsAndDefaults( | 626 virtual void OnGetPrinterSemanticCapsAndDefaults( |
| 625 bool succeeded, | 627 bool succeeded, |
| 626 const std::string& printer_name, | 628 const std::string& printer_name, |
| 627 const printing::PrinterSemanticCapsAndDefaults& semantic_info) OVERRIDE { | 629 const printing::PrinterSemanticCapsAndDefaults& semantic_info) OVERRIDE { |
| 628 printing::PrinterCapsAndDefaults printer_info; | 630 printing::PrinterCapsAndDefaults printer_info; |
| 629 if (succeeded) { | 631 if (succeeded) { |
| 630 printer_info.caps_mime_type = kContentTypeCDD; | 632 printer_info.caps_mime_type = kContentTypeJSON; |
| 631 printer_info.printer_capabilities = CapabilitiesToCdd(semantic_info); | 633 printer_info.printer_capabilities = CapabilitiesToCdd(semantic_info); |
| 632 } | 634 } |
| 633 callback_.Run(succeeded, printer_name, printer_info); | 635 callback_.Run(succeeded, printer_name, printer_info); |
| 634 callback_.Reset(); | 636 callback_.Reset(); |
| 635 Release(); | 637 Release(); |
| 636 } | 638 } |
| 637 | 639 |
| 638 void StartGetPrinterCapsAndDefaults() { | 640 void StartGetPrinterCapsAndDefaults() { |
| 639 g_service_process->io_thread()->message_loop_proxy()->PostTask( | 641 g_service_process->io_thread()->message_loop_proxy()->PostTask( |
| 640 FROM_HERE, | 642 FROM_HERE, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 const std::string& printer_name, | 706 const std::string& printer_name, |
| 705 const std::string& print_ticket_data, | 707 const std::string& print_ticket_data, |
| 706 const std::string& print_ticket_data_mime_type) OVERRIDE; | 708 const std::string& print_ticket_data_mime_type) OVERRIDE; |
| 707 virtual bool GetJobDetails(const std::string& printer_name, | 709 virtual bool GetJobDetails(const std::string& printer_name, |
| 708 PlatformJobId job_id, | 710 PlatformJobId job_id, |
| 709 PrintJobDetails *job_details) OVERRIDE; | 711 PrintJobDetails *job_details) OVERRIDE; |
| 710 virtual PrintSystem::PrintServerWatcher* CreatePrintServerWatcher() OVERRIDE; | 712 virtual PrintSystem::PrintServerWatcher* CreatePrintServerWatcher() OVERRIDE; |
| 711 virtual PrintSystem::PrinterWatcher* CreatePrinterWatcher( | 713 virtual PrintSystem::PrinterWatcher* CreatePrinterWatcher( |
| 712 const std::string& printer_name) OVERRIDE; | 714 const std::string& printer_name) OVERRIDE; |
| 713 virtual PrintSystem::JobSpooler* CreateJobSpooler() OVERRIDE; | 715 virtual PrintSystem::JobSpooler* CreateJobSpooler() OVERRIDE; |
| 716 virtual bool UseCddAndCjt() OVERRIDE; | |
| 714 virtual std::string GetSupportedMimeTypes() OVERRIDE; | 717 virtual std::string GetSupportedMimeTypes() OVERRIDE; |
| 715 | 718 |
| 716 private: | 719 private: |
| 717 std::string PrintSystemWin::GetPrinterDriverInfo( | 720 std::string PrintSystemWin::GetPrinterDriverInfo( |
| 718 const std::string& printer_name) const; | 721 const std::string& printer_name) const; |
| 719 | 722 |
| 720 scoped_refptr<printing::PrintBackend> print_backend_; | 723 scoped_refptr<printing::PrintBackend> print_backend_; |
| 721 bool use_xps_; | 724 bool use_cdd_; |
| 722 DISALLOW_COPY_AND_ASSIGN(PrintSystemWin); | 725 DISALLOW_COPY_AND_ASSIGN(PrintSystemWin); |
| 723 }; | 726 }; |
| 724 | 727 |
| 725 PrintSystemWin::PrintSystemWin() : use_xps_(false) { | 728 PrintSystemWin::PrintSystemWin() : use_cdd_(false) { |
| 726 print_backend_ = printing::PrintBackend::CreateInstance(NULL); | 729 print_backend_ = printing::PrintBackend::CreateInstance(NULL); |
| 727 } | 730 } |
| 728 | 731 |
| 729 PrintSystem::PrintSystemResult PrintSystemWin::Init() { | 732 PrintSystem::PrintSystemResult PrintSystemWin::Init() { |
| 730 use_xps_ = printing::XPSModule::Init(); | 733 use_cdd_ = !printing::XPSModule::Init(); |
| 731 if (!use_xps_) { | |
| 732 std::string message = l10n_util::GetStringFUTF8( | |
| 733 IDS_CLOUD_PRINT_XPS_UNAVAILABLE, | |
| 734 l10n_util::GetStringUTF16(IDS_GOOGLE_CLOUD_PRINT)); | |
| 735 return PrintSystemResult(false, message); | |
| 736 } | |
| 737 return PrintSystemResult(true, std::string()); | 734 return PrintSystemResult(true, std::string()); |
| 738 } | 735 } |
| 739 | 736 |
| 740 PrintSystem::PrintSystemResult PrintSystemWin::EnumeratePrinters( | 737 PrintSystem::PrintSystemResult PrintSystemWin::EnumeratePrinters( |
| 741 printing::PrinterList* printer_list) { | 738 printing::PrinterList* printer_list) { |
| 742 bool ret = print_backend_->EnumeratePrinters(printer_list); | 739 bool ret = print_backend_->EnumeratePrinters(printer_list); |
| 743 return PrintSystemResult(ret, std::string()); | 740 return PrintSystemResult(ret, std::string()); |
| 744 } | 741 } |
| 745 | 742 |
| 746 void PrintSystemWin::GetPrinterCapsAndDefaults( | 743 void PrintSystemWin::GetPrinterCapsAndDefaults( |
| 747 const std::string& printer_name, | 744 const std::string& printer_name, |
| 748 const PrinterCapsAndDefaultsCallback& callback) { | 745 const PrinterCapsAndDefaultsCallback& callback) { |
| 749 // Launch as child process to retrieve the capabilities and defaults because | 746 // Launch as child process to retrieve the capabilities and defaults because |
| 750 // this involves invoking a printer driver DLL and crashes have been known to | 747 // this involves invoking a printer driver DLL and crashes have been known to |
| 751 // occur. | 748 // occur. |
| 752 PrinterCapsHandler* handler = | 749 PrinterCapsHandler* handler = |
| 753 new PrinterCapsHandler(printer_name, callback); | 750 new PrinterCapsHandler(printer_name, callback); |
| 754 handler->AddRef(); | 751 handler->AddRef(); |
| 755 handler->StartGetPrinterCapsAndDefaults(); | 752 if (use_cdd_) |
| 753 handler->StartGetPrinterSemanticCapsAndDefaults(); | |
| 754 else | |
| 755 handler->StartGetPrinterCapsAndDefaults(); | |
| 756 } | 756 } |
| 757 | 757 |
| 758 bool PrintSystemWin::IsValidPrinter(const std::string& printer_name) { | 758 bool PrintSystemWin::IsValidPrinter(const std::string& printer_name) { |
| 759 return print_backend_->IsValidPrinter(printer_name); | 759 return print_backend_->IsValidPrinter(printer_name); |
| 760 } | 760 } |
| 761 | 761 |
| 762 bool PrintSystemWin::ValidatePrintTicket( | 762 bool PrintSystemWin::ValidatePrintTicket( |
| 763 const std::string& printer_name, | 763 const std::string& printer_name, |
| 764 const std::string& print_ticket_data, | 764 const std::string& print_ticket_data, |
| 765 const std::string& print_ticket_data_mime_type) { | 765 const std::string& print_ticket_data_mime_type) { |
| 766 crash_keys::ScopedPrinterInfo crash_key(GetPrinterDriverInfo(printer_name)); | 766 crash_keys::ScopedPrinterInfo crash_key(GetPrinterDriverInfo(printer_name)); |
| 767 | |
| 768 if (use_cdd_) { | |
| 769 return print_ticket_data_mime_type == kContentTypeJSON && | |
| 770 IsValidCjt(print_ticket_data); | |
| 771 } | |
| 767 DCHECK(print_ticket_data_mime_type == kContentTypeXML); | 772 DCHECK(print_ticket_data_mime_type == kContentTypeXML); |
| 768 | 773 |
| 769 printing::ScopedXPSInitializer xps_initializer; | 774 printing::ScopedXPSInitializer xps_initializer; |
| 770 if (!xps_initializer.initialized()) { | 775 if (!xps_initializer.initialized()) { |
| 771 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) | 776 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) |
| 772 return false; | 777 return false; |
| 773 } | 778 } |
| 774 bool ret = false; | 779 bool ret = false; |
| 775 HPTPROVIDER provider = NULL; | 780 HPTPROVIDER provider = NULL; |
| 776 printing::XPSModule::OpenProvider(base::UTF8ToWide(printer_name.c_str()), | 781 printing::XPSModule::OpenProvider(base::UTF8ToWide(printer_name.c_str()), |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 855 PrintSystem::PrinterWatcher* PrintSystemWin::CreatePrinterWatcher( | 860 PrintSystem::PrinterWatcher* PrintSystemWin::CreatePrinterWatcher( |
| 856 const std::string& printer_name) { | 861 const std::string& printer_name) { |
| 857 DCHECK(!printer_name.empty()); | 862 DCHECK(!printer_name.empty()); |
| 858 return new PrinterWatcherWin(printer_name); | 863 return new PrinterWatcherWin(printer_name); |
| 859 } | 864 } |
| 860 | 865 |
| 861 PrintSystem::JobSpooler* PrintSystemWin::CreateJobSpooler() { | 866 PrintSystem::JobSpooler* PrintSystemWin::CreateJobSpooler() { |
| 862 return new JobSpoolerWin(); | 867 return new JobSpoolerWin(); |
| 863 } | 868 } |
| 864 | 869 |
| 870 bool PrintSystemWin::UseCddAndCjt() { | |
| 871 return use_cdd_; | |
| 872 } | |
| 873 | |
| 865 std::string PrintSystemWin::GetSupportedMimeTypes() { | 874 std::string PrintSystemWin::GetSupportedMimeTypes() { |
| 866 std::string result; | 875 std::string result; |
| 867 if (use_xps_) { | 876 if (!use_cdd_) { |
| 868 result = kContentTypeXPS; | 877 result = kContentTypeXPS; |
| 869 result += ","; | 878 result += ","; |
| 870 } | 879 } |
| 871 result = kContentTypePDF; | 880 result = kContentTypePDF; |
| 872 return result; | 881 return result; |
| 873 } | 882 } |
| 874 | 883 |
| 875 std::string PrintSystemWin::GetPrinterDriverInfo( | 884 std::string PrintSystemWin::GetPrinterDriverInfo( |
| 876 const std::string& printer_name) const { | 885 const std::string& printer_name) const { |
| 877 return print_backend_->GetPrinterDriverInfo(printer_name); | 886 return print_backend_->GetPrinterDriverInfo(printer_name); |
| 878 } | 887 } |
| 879 | 888 |
| 880 } // namespace | 889 } // namespace |
| 881 | 890 |
| 882 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( | 891 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( |
| 883 const base::DictionaryValue* print_system_settings) { | 892 const base::DictionaryValue* print_system_settings) { |
| 884 return new PrintSystemWin; | 893 return new PrintSystemWin; |
| 885 } | 894 } |
| 886 | 895 |
| 887 } // namespace cloud_print | 896 } // namespace cloud_print |
| OLD | NEW |