OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <objidl.h> | 7 #include <objidl.h> |
8 #include <winspool.h> | 8 #include <winspool.h> |
9 #if defined(_WIN32_WINNT) | 9 #if defined(_WIN32_WINNT) |
10 #undef _WIN32_WINNT | 10 #undef _WIN32_WINNT |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "chrome/service/service_utility_process_host.h" | 24 #include "chrome/service/service_utility_process_host.h" |
25 #include "grit/generated_resources.h" | 25 #include "grit/generated_resources.h" |
26 #include "printing/backend/print_backend.h" | 26 #include "printing/backend/print_backend.h" |
27 #include "printing/backend/print_backend_consts.h" | 27 #include "printing/backend/print_backend_consts.h" |
28 #include "printing/backend/win_helper.h" | 28 #include "printing/backend/win_helper.h" |
29 #include "printing/emf_win.h" | 29 #include "printing/emf_win.h" |
30 #include "printing/page_range.h" | 30 #include "printing/page_range.h" |
31 #include "ui/base/l10n/l10n_util.h" | 31 #include "ui/base/l10n/l10n_util.h" |
32 #include "ui/gfx/rect.h" | 32 #include "ui/gfx/rect.h" |
33 | 33 |
34 using base::win::ScopedBstr; | |
35 using base::win::ScopedComPtr; | |
36 | |
37 namespace { | 34 namespace { |
38 | 35 |
39 class DevMode { | 36 class DevMode { |
40 public: | 37 public: |
41 DevMode() : dm_(NULL) {} | 38 DevMode() : dm_(NULL) {} |
42 ~DevMode() { Free(); } | 39 ~DevMode() { Free(); } |
43 | 40 |
44 void Allocate(int size) { | 41 void Allocate(int size) { |
45 Free(); | 42 Free(); |
46 dm_ = reinterpret_cast<DEVMODE*>(new char[size]); | 43 dm_ = reinterpret_cast<DEVMODE*>(new char[size]); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 HRESULT PrintTicketToDevMode(const std::string& printer_name, | 79 HRESULT PrintTicketToDevMode(const std::string& printer_name, |
83 const std::string& print_ticket, | 80 const std::string& print_ticket, |
84 DevMode* dev_mode) { | 81 DevMode* dev_mode) { |
85 DCHECK(dev_mode); | 82 DCHECK(dev_mode); |
86 printing::ScopedXPSInitializer xps_initializer; | 83 printing::ScopedXPSInitializer xps_initializer; |
87 if (!xps_initializer.initialized()) { | 84 if (!xps_initializer.initialized()) { |
88 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) | 85 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) |
89 return E_FAIL; | 86 return E_FAIL; |
90 } | 87 } |
91 | 88 |
92 ScopedComPtr<IStream> pt_stream; | 89 base::win::ScopedComPtr<IStream> pt_stream; |
93 HRESULT hr = StreamFromPrintTicket(print_ticket, pt_stream.Receive()); | 90 HRESULT hr = StreamFromPrintTicket(print_ticket, pt_stream.Receive()); |
94 if (FAILED(hr)) | 91 if (FAILED(hr)) |
95 return hr; | 92 return hr; |
96 | 93 |
97 HPTPROVIDER provider = NULL; | 94 HPTPROVIDER provider = NULL; |
98 hr = printing::XPSModule::OpenProvider(UTF8ToWide(printer_name), | 95 hr = printing::XPSModule::OpenProvider(UTF8ToWide(printer_name), |
99 1, | 96 1, |
100 &provider); | 97 &provider); |
101 if (SUCCEEDED(hr)) { | 98 if (SUCCEEDED(hr)) { |
102 ULONG size = 0; | 99 ULONG size = 0; |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 const std::string& job_title, | 553 const std::string& job_title, |
557 const FilePath& print_data_file_path, | 554 const FilePath& print_data_file_path, |
558 const std::string& print_ticket) { | 555 const std::string& print_ticket) { |
559 if (!printing::XPSPrintModule::Init()) | 556 if (!printing::XPSPrintModule::Init()) |
560 return false; | 557 return false; |
561 job_progress_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL)); | 558 job_progress_event_.Set(CreateEvent(NULL, TRUE, FALSE, NULL)); |
562 if (!job_progress_event_.Get()) | 559 if (!job_progress_event_.Get()) |
563 return false; | 560 return false; |
564 should_couninit_ = SUCCEEDED(CoInitializeEx(NULL, | 561 should_couninit_ = SUCCEEDED(CoInitializeEx(NULL, |
565 COINIT_MULTITHREADED)); | 562 COINIT_MULTITHREADED)); |
566 ScopedComPtr<IXpsPrintJobStream> doc_stream; | 563 base::win::ScopedComPtr<IXpsPrintJobStream> doc_stream; |
567 ScopedComPtr<IXpsPrintJobStream> print_ticket_stream; | 564 base::win::ScopedComPtr<IXpsPrintJobStream> print_ticket_stream; |
568 bool ret = false; | 565 bool ret = false; |
569 // Use nested SUCCEEDED checks because we want a common return point. | 566 // Use nested SUCCEEDED checks because we want a common return point. |
570 if (SUCCEEDED(printing::XPSPrintModule::StartXpsPrintJob( | 567 if (SUCCEEDED(printing::XPSPrintModule::StartXpsPrintJob( |
571 UTF8ToWide(printer_name).c_str(), | 568 UTF8ToWide(printer_name).c_str(), |
572 UTF8ToWide(job_title).c_str(), | 569 UTF8ToWide(job_title).c_str(), |
573 NULL, | 570 NULL, |
574 job_progress_event_.Get(), | 571 job_progress_event_.Get(), |
575 NULL, | 572 NULL, |
576 NULL, | 573 NULL, |
577 NULL, | 574 NULL, |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 // http://code.google.com/p/chromium/issues/detail?id=57350. | 617 // http://code.google.com/p/chromium/issues/detail?id=57350. |
621 static const int kPageCountPerBatch = 1; | 618 static const int kPageCountPerBatch = 1; |
622 int last_page_printed_; | 619 int last_page_printed_; |
623 PlatformJobId job_id_; | 620 PlatformJobId job_id_; |
624 PrintSystem::JobSpooler::Delegate* delegate_; | 621 PrintSystem::JobSpooler::Delegate* delegate_; |
625 int saved_dc_; | 622 int saved_dc_; |
626 base::win::ScopedHDC printer_dc_; | 623 base::win::ScopedHDC printer_dc_; |
627 FilePath print_data_file_path_; | 624 FilePath print_data_file_path_; |
628 base::win::ScopedHandle job_progress_event_; | 625 base::win::ScopedHandle job_progress_event_; |
629 base::win::ObjectWatcher job_progress_watcher_; | 626 base::win::ObjectWatcher job_progress_watcher_; |
630 ScopedComPtr<IXpsPrintJob> xps_print_job_; | 627 base::win::ScopedComPtr<IXpsPrintJob> xps_print_job_; |
631 bool should_couninit_; | 628 bool should_couninit_; |
632 DISALLOW_COPY_AND_ASSIGN(JobSpoolerWin::Core); | 629 DISALLOW_COPY_AND_ASSIGN(JobSpoolerWin::Core); |
633 }; | 630 }; |
634 scoped_refptr<Core> core_; | 631 scoped_refptr<Core> core_; |
635 DISALLOW_COPY_AND_ASSIGN(JobSpoolerWin); | 632 DISALLOW_COPY_AND_ASSIGN(JobSpoolerWin); |
636 }; | 633 }; |
637 | 634 |
638 // A helper class to handle the response from the utility process to the | 635 // A helper class to handle the response from the utility process to the |
639 // request to fetch printer capabilities and defaults. | 636 // request to fetch printer capabilities and defaults. |
640 class PrinterCapsHandler : public ServiceUtilityProcessHost::Client { | 637 class PrinterCapsHandler : public ServiceUtilityProcessHost::Client { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 if (!xps_initializer.initialized()) { | 748 if (!xps_initializer.initialized()) { |
752 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) | 749 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) |
753 return false; | 750 return false; |
754 } | 751 } |
755 bool ret = false; | 752 bool ret = false; |
756 HPTPROVIDER provider = NULL; | 753 HPTPROVIDER provider = NULL; |
757 printing::XPSModule::OpenProvider(UTF8ToWide(printer_name.c_str()), | 754 printing::XPSModule::OpenProvider(UTF8ToWide(printer_name.c_str()), |
758 1, | 755 1, |
759 &provider); | 756 &provider); |
760 if (provider) { | 757 if (provider) { |
761 ScopedComPtr<IStream> print_ticket_stream; | 758 base::win::ScopedComPtr<IStream> print_ticket_stream; |
762 CreateStreamOnHGlobal(NULL, TRUE, print_ticket_stream.Receive()); | 759 CreateStreamOnHGlobal(NULL, TRUE, print_ticket_stream.Receive()); |
763 ULONG bytes_written = 0; | 760 ULONG bytes_written = 0; |
764 print_ticket_stream->Write(print_ticket_data.c_str(), | 761 print_ticket_stream->Write(print_ticket_data.c_str(), |
765 print_ticket_data.length(), | 762 print_ticket_data.length(), |
766 &bytes_written); | 763 &bytes_written); |
767 DCHECK(bytes_written == print_ticket_data.length()); | 764 DCHECK(bytes_written == print_ticket_data.length()); |
768 LARGE_INTEGER pos = {0}; | 765 LARGE_INTEGER pos = {0}; |
769 ULARGE_INTEGER new_pos = {0}; | 766 ULARGE_INTEGER new_pos = {0}; |
770 print_ticket_stream->Seek(pos, STREAM_SEEK_SET, &new_pos); | 767 print_ticket_stream->Seek(pos, STREAM_SEEK_SET, &new_pos); |
771 ScopedBstr error; | 768 base::win::ScopedBstr error; |
772 ScopedComPtr<IStream> result_ticket_stream; | 769 base::win::ScopedComPtr<IStream> result_ticket_stream; |
773 CreateStreamOnHGlobal(NULL, TRUE, result_ticket_stream.Receive()); | 770 CreateStreamOnHGlobal(NULL, TRUE, result_ticket_stream.Receive()); |
774 ret = SUCCEEDED(printing::XPSModule::MergeAndValidatePrintTicket( | 771 ret = SUCCEEDED(printing::XPSModule::MergeAndValidatePrintTicket( |
775 provider, | 772 provider, |
776 print_ticket_stream.get(), | 773 print_ticket_stream.get(), |
777 NULL, | 774 NULL, |
778 kPTJobScope, | 775 kPTJobScope, |
779 result_ticket_stream.get(), | 776 result_ticket_stream.get(), |
780 error.Receive())); | 777 error.Receive())); |
781 printing::XPSModule::CloseProvider(provider); | 778 printing::XPSModule::CloseProvider(provider); |
782 } | 779 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 RpcStringFree(reinterpret_cast<RPC_WSTR *>(&proxy_id_as_string)); | 860 RpcStringFree(reinterpret_cast<RPC_WSTR *>(&proxy_id_as_string)); |
864 return ret; | 861 return ret; |
865 } | 862 } |
866 | 863 |
867 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( | 864 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( |
868 const DictionaryValue* print_system_settings) { | 865 const DictionaryValue* print_system_settings) { |
869 return new PrintSystemWin; | 866 return new PrintSystemWin; |
870 } | 867 } |
871 | 868 |
872 } // namespace cloud_print | 869 } // namespace cloud_print |
OLD | NEW |