| Index: chrome/service/cloud_print/print_system_win.cc
|
| diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc
|
| index 36891b89cfdf378ccf0c2cdc42e50b31a98848af..765ea0fc8074600fc3601f9d1ba2dc91abd15959 100644
|
| --- a/chrome/service/cloud_print/print_system_win.cc
|
| +++ b/chrome/service/cloud_print/print_system_win.cc
|
| @@ -77,18 +77,14 @@ scoped_ptr<DEVMODE[]> XpsTicketToDevMode(const base::string16& printer_name,
|
| if (SUCCEEDED(hr)) {
|
| // Correct DEVMODE using DocumentProperties. See documentation for
|
| // PTConvertPrintTicketToDevMode.
|
| - LONG buffer_size =
|
| - DocumentProperties(NULL, printer,
|
| - const_cast<LPWSTR>(printer_name.c_str()), NULL, dm,
|
| - DM_IN_BUFFER);
|
| + wchar_t* mutable_name = const_cast<wchar_t*>(printer_name.c_str());
|
| + LONG buffer_size = DocumentProperties(NULL, printer, mutable_name, NULL,
|
| + dm, DM_IN_BUFFER);
|
| if (buffer_size <= 0)
|
| return scoped_ptr<DEVMODE[]>();
|
| -
|
| scoped_dev_mode.reset(reinterpret_cast<DEVMODE*>(new uint8[buffer_size]));
|
| - if (DocumentProperties(NULL, printer,
|
| - const_cast<LPWSTR>(printer_name.c_str()),
|
| - scoped_dev_mode.get(), dm,
|
| - DM_OUT_BUFFER | DM_IN_BUFFER) != IDOK) {
|
| + if (DocumentProperties(NULL, printer, mutable_name, scoped_dev_mode.get(),
|
| + dm, DM_OUT_BUFFER | DM_IN_BUFFER) != IDOK) {
|
| scoped_dev_mode.reset();
|
| }
|
| printing::XPSModule::ReleaseMemory(dm);
|
| @@ -338,9 +334,14 @@ class JobSpoolerWin : public PrintSystem::JobSpooler {
|
| last_page_printed_ = -1;
|
| // We only support PDF and XPS documents for now.
|
| if (print_data_mime_type == kContentTypePDF) {
|
| - DCHECK(print_ticket_mime_type == kContentTypeXML);
|
| - scoped_ptr<DEVMODE[]> dev_mode =
|
| - XpsTicketToDevMode(base::UTF8ToWide(printer_name), print_ticket);
|
| + scoped_ptr<DEVMODE[]> dev_mode;
|
| + if (print_ticket_mime_type == kContentTypeJSON) {
|
| + dev_mode = CjtToDevMode(base::UTF8ToWide(printer_name), print_ticket);
|
| + } else {
|
| + DCHECK(print_ticket_mime_type == kContentTypeXML);
|
| + dev_mode = XpsTicketToDevMode(base::UTF8ToWide(printer_name),
|
| + print_ticket);
|
| + }
|
|
|
| if (!dev_mode) {
|
| NOTREACHED();
|
| @@ -368,6 +369,7 @@ class JobSpoolerWin : public PrintSystem::JobSpooler {
|
| delegate_ = delegate;
|
| RenderNextPDFPages();
|
| } else if (print_data_mime_type == kContentTypeXPS) {
|
| + DCHECK(print_ticket_mime_type == kContentTypeXML);
|
| bool ret = PrintXPSDocument(printer_name,
|
| job_title,
|
| print_data_file_path,
|
| @@ -627,7 +629,7 @@ class PrinterCapsHandler : public ServiceUtilityProcessHost::Client {
|
| const printing::PrinterSemanticCapsAndDefaults& semantic_info) OVERRIDE {
|
| printing::PrinterCapsAndDefaults printer_info;
|
| if (succeeded) {
|
| - printer_info.caps_mime_type = kContentTypeCDD;
|
| + printer_info.caps_mime_type = kContentTypeJSON;
|
| printer_info.printer_capabilities = CapabilitiesToCdd(semantic_info);
|
| }
|
| callback_.Run(succeeded, printer_name, printer_info);
|
| @@ -711,6 +713,7 @@ class PrintSystemWin : public PrintSystem {
|
| virtual PrintSystem::PrinterWatcher* CreatePrinterWatcher(
|
| const std::string& printer_name) OVERRIDE;
|
| virtual PrintSystem::JobSpooler* CreateJobSpooler() OVERRIDE;
|
| + virtual bool UseCddAndCjt() OVERRIDE;
|
| virtual std::string GetSupportedMimeTypes() OVERRIDE;
|
|
|
| private:
|
| @@ -718,22 +721,16 @@ class PrintSystemWin : public PrintSystem {
|
| const std::string& printer_name) const;
|
|
|
| scoped_refptr<printing::PrintBackend> print_backend_;
|
| - bool use_xps_;
|
| + bool use_cdd_;
|
| DISALLOW_COPY_AND_ASSIGN(PrintSystemWin);
|
| };
|
|
|
| -PrintSystemWin::PrintSystemWin() : use_xps_(false) {
|
| +PrintSystemWin::PrintSystemWin() : use_cdd_(false) {
|
| print_backend_ = printing::PrintBackend::CreateInstance(NULL);
|
| }
|
|
|
| PrintSystem::PrintSystemResult PrintSystemWin::Init() {
|
| - use_xps_ = printing::XPSModule::Init();
|
| - if (!use_xps_) {
|
| - std::string message = l10n_util::GetStringFUTF8(
|
| - IDS_CLOUD_PRINT_XPS_UNAVAILABLE,
|
| - l10n_util::GetStringUTF16(IDS_GOOGLE_CLOUD_PRINT));
|
| - return PrintSystemResult(false, message);
|
| - }
|
| + use_cdd_ = !printing::XPSModule::Init();
|
| return PrintSystemResult(true, std::string());
|
| }
|
|
|
| @@ -752,7 +749,10 @@ void PrintSystemWin::GetPrinterCapsAndDefaults(
|
| PrinterCapsHandler* handler =
|
| new PrinterCapsHandler(printer_name, callback);
|
| handler->AddRef();
|
| - handler->StartGetPrinterCapsAndDefaults();
|
| + if (use_cdd_)
|
| + handler->StartGetPrinterSemanticCapsAndDefaults();
|
| + else
|
| + handler->StartGetPrinterCapsAndDefaults();
|
| }
|
|
|
| bool PrintSystemWin::IsValidPrinter(const std::string& printer_name) {
|
| @@ -764,6 +764,11 @@ bool PrintSystemWin::ValidatePrintTicket(
|
| const std::string& print_ticket_data,
|
| const std::string& print_ticket_data_mime_type) {
|
| crash_keys::ScopedPrinterInfo crash_key(GetPrinterDriverInfo(printer_name));
|
| +
|
| + if (use_cdd_) {
|
| + return print_ticket_data_mime_type == kContentTypeJSON &&
|
| + IsValidCjt(print_ticket_data);
|
| + }
|
| DCHECK(print_ticket_data_mime_type == kContentTypeXML);
|
|
|
| printing::ScopedXPSInitializer xps_initializer;
|
| @@ -862,9 +867,13 @@ PrintSystem::JobSpooler* PrintSystemWin::CreateJobSpooler() {
|
| return new JobSpoolerWin();
|
| }
|
|
|
| +bool PrintSystemWin::UseCddAndCjt() {
|
| + return use_cdd_;
|
| +}
|
| +
|
| std::string PrintSystemWin::GetSupportedMimeTypes() {
|
| std::string result;
|
| - if (use_xps_) {
|
| + if (!use_cdd_) {
|
| result = kContentTypeXPS;
|
| result += ",";
|
| }
|
|
|