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()); |
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 |