| 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 <objidl.h> | 7 #include <objidl.h> |
| 8 #include <winspool.h> | 8 #include <winspool.h> |
| 9 #include <xpsprint.h> | 9 #include <xpsprint.h> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 16 #include "base/win/object_watcher.h" | 16 #include "base/win/object_watcher.h" |
| 17 #include "base/win/scoped_bstr.h" | 17 #include "base/win/scoped_bstr.h" |
| 18 #include "base/win/scoped_com_initializer.h" | 18 #include "base/win/scoped_com_initializer.h" |
| 19 #include "base/win/scoped_comptr.h" | 19 #include "base/win/scoped_comptr.h" |
| 20 #include "base/win/scoped_hdc.h" | 20 #include "base/win/scoped_hdc.h" |
| 21 #include "chrome/common/child_process_logging.h" | 21 #include "chrome/common/crash_keys.h" |
| 22 #include "chrome/service/service_process.h" | 22 #include "chrome/service/service_process.h" |
| 23 #include "chrome/service/service_utility_process_host.h" | 23 #include "chrome/service/service_utility_process_host.h" |
| 24 #include "grit/generated_resources.h" | 24 #include "grit/generated_resources.h" |
| 25 #include "printing/backend/print_backend.h" | 25 #include "printing/backend/print_backend.h" |
| 26 #include "printing/backend/print_backend_consts.h" | 26 #include "printing/backend/print_backend_consts.h" |
| 27 #include "printing/backend/win_helper.h" | 27 #include "printing/backend/win_helper.h" |
| 28 #include "printing/emf_win.h" | 28 #include "printing/emf_win.h" |
| 29 #include "printing/page_range.h" | 29 #include "printing/page_range.h" |
| 30 #include "printing/pdf_render_settings.h" | 30 #include "printing/pdf_render_settings.h" |
| 31 #include "ui/base/l10n/l10n_util.h" | 31 #include "ui/base/l10n/l10n_util.h" |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 virtual void OnPrinterAdded() = 0; | 163 virtual void OnPrinterAdded() = 0; |
| 164 virtual void OnPrinterDeleted() = 0; | 164 virtual void OnPrinterDeleted() = 0; |
| 165 virtual void OnPrinterChanged() = 0; | 165 virtual void OnPrinterChanged() = 0; |
| 166 virtual void OnJobChanged() = 0; | 166 virtual void OnJobChanged() = 0; |
| 167 }; | 167 }; |
| 168 | 168 |
| 169 bool Start(const std::string& printer_name, Delegate* delegate) { | 169 bool Start(const std::string& printer_name, Delegate* delegate) { |
| 170 scoped_refptr<printing::PrintBackend> print_backend( | 170 scoped_refptr<printing::PrintBackend> print_backend( |
| 171 printing::PrintBackend::CreateInstance(NULL)); | 171 printing::PrintBackend::CreateInstance(NULL)); |
| 172 printer_info_ = print_backend->GetPrinterDriverInfo(printer_name); | 172 printer_info_ = print_backend->GetPrinterDriverInfo(printer_name); |
| 173 child_process_logging::ScopedPrinterInfoSetter prn_info(printer_info_); | 173 crash_keys::ScopedPrinterInfo crash_key(printer_info_); |
| 174 | 174 |
| 175 delegate_ = delegate; | 175 delegate_ = delegate; |
| 176 // An empty printer name means watch the current server, we need to pass | 176 // An empty printer name means watch the current server, we need to pass |
| 177 // NULL to OpenPrinter. | 177 // NULL to OpenPrinter. |
| 178 LPTSTR printer_name_to_use = NULL; | 178 LPTSTR printer_name_to_use = NULL; |
| 179 std::wstring printer_name_wide; | 179 std::wstring printer_name_wide; |
| 180 if (!printer_name.empty()) { | 180 if (!printer_name.empty()) { |
| 181 printer_name_wide = UTF8ToWide(printer_name); | 181 printer_name_wide = UTF8ToWide(printer_name); |
| 182 printer_name_to_use = const_cast<LPTSTR>(printer_name_wide.c_str()); | 182 printer_name_to_use = const_cast<LPTSTR>(printer_name_wide.c_str()); |
| 183 } | 183 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 196 } | 196 } |
| 197 bool Stop() { | 197 bool Stop() { |
| 198 watcher_.StopWatching(); | 198 watcher_.StopWatching(); |
| 199 printer_.Close(); | 199 printer_.Close(); |
| 200 printer_change_.Close(); | 200 printer_change_.Close(); |
| 201 return true; | 201 return true; |
| 202 } | 202 } |
| 203 | 203 |
| 204 // base::ObjectWatcher::Delegate method | 204 // base::ObjectWatcher::Delegate method |
| 205 virtual void OnObjectSignaled(HANDLE object) { | 205 virtual void OnObjectSignaled(HANDLE object) { |
| 206 child_process_logging::ScopedPrinterInfoSetter prn_info(printer_info_); | 206 crash_keys::ScopedPrinterInfo crash_key(printer_info_); |
| 207 DWORD change = 0; | 207 DWORD change = 0; |
| 208 FindNextPrinterChangeNotification(object, &change, NULL, NULL); | 208 FindNextPrinterChangeNotification(object, &change, NULL, NULL); |
| 209 | 209 |
| 210 if (change != ((PRINTER_CHANGE_PRINTER|PRINTER_CHANGE_JOB) & | 210 if (change != ((PRINTER_CHANGE_PRINTER|PRINTER_CHANGE_JOB) & |
| 211 (~PRINTER_CHANGE_FAILED_CONNECTION_PRINTER))) { | 211 (~PRINTER_CHANGE_FAILED_CONNECTION_PRINTER))) { |
| 212 // For printer connections, we get spurious change notifications with | 212 // For printer connections, we get spurious change notifications with |
| 213 // all flags set except PRINTER_CHANGE_FAILED_CONNECTION_PRINTER. | 213 // all flags set except PRINTER_CHANGE_FAILED_CONNECTION_PRINTER. |
| 214 // Ignore these. | 214 // Ignore these. |
| 215 if (change & PRINTER_CHANGE_ADD_PRINTER) { | 215 if (change & PRINTER_CHANGE_ADD_PRINTER) { |
| 216 delegate_->OnPrinterAdded(); | 216 delegate_->OnPrinterAdded(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 virtual bool Spool(const std::string& print_ticket, | 363 virtual bool Spool(const std::string& print_ticket, |
| 364 const base::FilePath& print_data_file_path, | 364 const base::FilePath& print_data_file_path, |
| 365 const std::string& print_data_mime_type, | 365 const std::string& print_data_mime_type, |
| 366 const std::string& printer_name, | 366 const std::string& printer_name, |
| 367 const std::string& job_title, | 367 const std::string& job_title, |
| 368 const std::vector<std::string>& tags, | 368 const std::vector<std::string>& tags, |
| 369 JobSpooler::Delegate* delegate) OVERRIDE { | 369 JobSpooler::Delegate* delegate) OVERRIDE { |
| 370 // TODO(gene): add tags handling. | 370 // TODO(gene): add tags handling. |
| 371 scoped_refptr<printing::PrintBackend> print_backend( | 371 scoped_refptr<printing::PrintBackend> print_backend( |
| 372 printing::PrintBackend::CreateInstance(NULL)); | 372 printing::PrintBackend::CreateInstance(NULL)); |
| 373 child_process_logging::ScopedPrinterInfoSetter prn_info( | 373 crash_keys::ScopedPrinterInfo crash_key( |
| 374 print_backend->GetPrinterDriverInfo(printer_name)); | 374 print_backend->GetPrinterDriverInfo(printer_name)); |
| 375 return core_->Spool(print_ticket, print_data_file_path, | 375 return core_->Spool(print_ticket, print_data_file_path, |
| 376 print_data_mime_type, printer_name, job_title, | 376 print_data_mime_type, printer_name, job_title, |
| 377 delegate); | 377 delegate); |
| 378 } | 378 } |
| 379 | 379 |
| 380 protected: | 380 protected: |
| 381 virtual ~JobSpoolerWin() {} | 381 virtual ~JobSpoolerWin() {} |
| 382 | 382 |
| 383 private: | 383 private: |
| (...skipping 12 matching lines...) Expand all Loading... |
| 396 ~Core() {} | 396 ~Core() {} |
| 397 | 397 |
| 398 bool Spool(const std::string& print_ticket, | 398 bool Spool(const std::string& print_ticket, |
| 399 const base::FilePath& print_data_file_path, | 399 const base::FilePath& print_data_file_path, |
| 400 const std::string& print_data_mime_type, | 400 const std::string& print_data_mime_type, |
| 401 const std::string& printer_name, | 401 const std::string& printer_name, |
| 402 const std::string& job_title, | 402 const std::string& job_title, |
| 403 JobSpooler::Delegate* delegate) { | 403 JobSpooler::Delegate* delegate) { |
| 404 scoped_refptr<printing::PrintBackend> print_backend( | 404 scoped_refptr<printing::PrintBackend> print_backend( |
| 405 printing::PrintBackend::CreateInstance(NULL)); | 405 printing::PrintBackend::CreateInstance(NULL)); |
| 406 child_process_logging::ScopedPrinterInfoSetter prn_info( | 406 crash_keys::ScopedPrinterInfo crash_key( |
| 407 print_backend->GetPrinterDriverInfo(printer_name)); | 407 print_backend->GetPrinterDriverInfo(printer_name)); |
| 408 if (delegate_) { | 408 if (delegate_) { |
| 409 // We are already in the process of printing. | 409 // We are already in the process of printing. |
| 410 NOTREACHED(); | 410 NOTREACHED(); |
| 411 return false; | 411 return false; |
| 412 } | 412 } |
| 413 last_page_printed_ = -1; | 413 last_page_printed_ = -1; |
| 414 // We only support PDF and XPS documents for now. | 414 // We only support PDF and XPS documents for now. |
| 415 if (print_data_mime_type == "application/pdf") { | 415 if (print_data_mime_type == "application/pdf") { |
| 416 DevMode pt_dev_mode; | 416 DevMode pt_dev_mode; |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 handler->Start(); | 785 handler->Start(); |
| 786 } | 786 } |
| 787 | 787 |
| 788 bool PrintSystemWin::IsValidPrinter(const std::string& printer_name) { | 788 bool PrintSystemWin::IsValidPrinter(const std::string& printer_name) { |
| 789 return print_backend_->IsValidPrinter(printer_name); | 789 return print_backend_->IsValidPrinter(printer_name); |
| 790 } | 790 } |
| 791 | 791 |
| 792 bool PrintSystemWin::ValidatePrintTicket( | 792 bool PrintSystemWin::ValidatePrintTicket( |
| 793 const std::string& printer_name, | 793 const std::string& printer_name, |
| 794 const std::string& print_ticket_data) { | 794 const std::string& print_ticket_data) { |
| 795 child_process_logging::ScopedPrinterInfoSetter prn_info( | 795 crash_keys::ScopedPrinterInfo crash_key( |
| 796 print_backend_->GetPrinterDriverInfo(printer_name)); | 796 print_backend_->GetPrinterDriverInfo(printer_name)); |
| 797 printing::ScopedXPSInitializer xps_initializer; | 797 printing::ScopedXPSInitializer xps_initializer; |
| 798 if (!xps_initializer.initialized()) { | 798 if (!xps_initializer.initialized()) { |
| 799 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) | 799 // TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) |
| 800 return false; | 800 return false; |
| 801 } | 801 } |
| 802 bool ret = false; | 802 bool ret = false; |
| 803 HPTPROVIDER provider = NULL; | 803 HPTPROVIDER provider = NULL; |
| 804 printing::XPSModule::OpenProvider(UTF8ToWide(printer_name.c_str()), | 804 printing::XPSModule::OpenProvider(UTF8ToWide(printer_name.c_str()), |
| 805 1, | 805 1, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 826 result_ticket_stream.get(), | 826 result_ticket_stream.get(), |
| 827 error.Receive())); | 827 error.Receive())); |
| 828 printing::XPSModule::CloseProvider(provider); | 828 printing::XPSModule::CloseProvider(provider); |
| 829 } | 829 } |
| 830 return ret; | 830 return ret; |
| 831 } | 831 } |
| 832 | 832 |
| 833 bool PrintSystemWin::GetJobDetails(const std::string& printer_name, | 833 bool PrintSystemWin::GetJobDetails(const std::string& printer_name, |
| 834 PlatformJobId job_id, | 834 PlatformJobId job_id, |
| 835 PrintJobDetails *job_details) { | 835 PrintJobDetails *job_details) { |
| 836 child_process_logging::ScopedPrinterInfoSetter prn_info( | 836 crash_keys::ScopedPrinterInfo crash_key( |
| 837 print_backend_->GetPrinterDriverInfo(printer_name)); | 837 print_backend_->GetPrinterDriverInfo(printer_name)); |
| 838 DCHECK(job_details); | 838 DCHECK(job_details); |
| 839 printing::ScopedPrinterHandle printer_handle; | 839 printing::ScopedPrinterHandle printer_handle; |
| 840 std::wstring printer_name_wide = UTF8ToWide(printer_name); | 840 std::wstring printer_name_wide = UTF8ToWide(printer_name); |
| 841 printer_handle.OpenPrinter(printer_name_wide.c_str()); | 841 printer_handle.OpenPrinter(printer_name_wide.c_str()); |
| 842 DCHECK(printer_handle.IsValid()); | 842 DCHECK(printer_handle.IsValid()); |
| 843 bool ret = false; | 843 bool ret = false; |
| 844 if (printer_handle.IsValid()) { | 844 if (printer_handle.IsValid()) { |
| 845 DWORD bytes_needed = 0; | 845 DWORD bytes_needed = 0; |
| 846 GetJob(printer_handle, job_id, 1, NULL, 0, &bytes_needed); | 846 GetJob(printer_handle, job_id, 1, NULL, 0, &bytes_needed); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 return "application/pdf"; | 897 return "application/pdf"; |
| 898 } | 898 } |
| 899 | 899 |
| 900 | 900 |
| 901 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( | 901 scoped_refptr<PrintSystem> PrintSystem::CreateInstance( |
| 902 const base::DictionaryValue* print_system_settings) { | 902 const base::DictionaryValue* print_system_settings) { |
| 903 return new PrintSystemWin; | 903 return new PrintSystemWin; |
| 904 } | 904 } |
| 905 | 905 |
| 906 } // namespace cloud_print | 906 } // namespace cloud_print |
| OLD | NEW |