Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Side by Side Diff: chrome/service/cloud_print/print_system_win.cc

Issue 147953009: Fallback to CDD/CJT if connector can't initialize XPS API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/service/cloud_print/print_system_cups.cc ('k') | chrome/service/cloud_print/printer_job_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698