1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/printing/printing_message_filter.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/process_util.h" 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/browser_process.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/printing/printer_query.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/printing/print_job_manager.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/print_messages.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/view_messages.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <fcntl.h> 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/file_util.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/lazy_instance.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/printing/print_dialog_cloud.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/command_line.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/chrome_switches.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace { 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsentypedef std::map<int, FilePath> SequenceToPathMap; 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstruct PrintingSequencePathMap { 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SequenceToPathMap map; 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int sequence; 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// No locking, only access on the FILE thread. 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstatic base::LazyInstance<PrintingSequencePathMap> 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen g_printing_file_descriptor_map(base::LINKER_INITIALIZED); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid RenderParamsFromPrintSettings(const printing::PrintSettings& settings, 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintMsg_Print_Params* params) { 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->page_size = settings.page_setup_device_units().physical_size(); 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->printable_size.SetSize( 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen settings.page_setup_device_units().content_area().width(), 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen settings.page_setup_device_units().content_area().height()); 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->margin_top = settings.page_setup_device_units().content_area().x(); 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->margin_left = settings.page_setup_device_units().content_area().y(); 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->dpi = settings.dpi(); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Currently hardcoded at 1.25. See PrintSettings' constructor. 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->min_shrink = settings.min_shrink; 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Currently hardcoded at 2.0. See PrintSettings' constructor. 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->max_shrink = settings.max_shrink; 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Currently hardcoded at 72dpi. See PrintSettings' constructor. 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->desired_dpi = settings.desired_dpi; 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Always use an invalid cookie. 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->document_cookie = 0; 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->selection_only = settings.selection_only; 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params->supports_alpha_blend = settings.supports_alpha_blend(); 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 63dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenPrintingMessageFilter::PrintingMessageFilter() 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : print_job_manager_(g_browser_process->print_job_manager()) { 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cloud_print_enabled_ = true; 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cloud_print_enabled_ = CommandLine::ForCurrentProcess()->HasSwitch( 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen switches::kEnableCloudPrint); 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 73dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenPrintingMessageFilter::~PrintingMessageFilter() { 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OverrideThreadForMessage( 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const IPC::Message& message, BrowserThread::ID* thread) { 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID || 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *thread = BrowserThread::FILE; 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message, 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool* message_was_ok) { 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool handled = true; 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC_BEGIN_MESSAGE_MAP_EX(PrintingMessageFilter, message, *message_was_ok) 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN) 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(PrintHostMsg_DuplicateSection, OnDuplicateSection) 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting, 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnAllocateTempFileForPrinting) 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnTempFileForPrintingWritten) 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_GetDefaultPrintSettings, 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnGetDefaultPrintSettings) 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrint, OnScriptedPrint) 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_UpdatePrintSettings, 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnUpdatePrintSettings) 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC_MESSAGE_UNHANDLED(handled = false) 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC_END_MESSAGE_MAP() 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return handled; 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_WIN) 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnDuplicateSection( 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::SharedMemoryHandle renderer_handle, 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::SharedMemoryHandle* browser_handle) { 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Duplicate the handle in this process right now so the memory is kept alive 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // (even if it is not mapped) 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::SharedMemory shared_buf(renderer_handle, true, peer_handle()); 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), browser_handle); 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnAllocateTempFileForPrinting( 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::FileDescriptor* temp_file_fd, int* sequence_number) { 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen temp_file_fd->fd = *sequence_number = -1; 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen temp_file_fd->auto_close = false; 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *sequence_number = g_printing_file_descriptor_map.Get().sequence++; 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen FilePath path; 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (file_util::CreateTemporaryFile(&path)) { 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int fd = open(path.value().c_str(), O_WRONLY); 133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (fd >= 0) { 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SequenceToPathMap::iterator it = map->find(*sequence_number); 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (it != map->end()) { 136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED() << "Sequence number already in use. seq=" << 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *sequence_number; 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen (*map)[*sequence_number] = path; 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen temp_file_fd->fd = fd; 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen temp_file_fd->auto_close = true; 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnTempFileForPrintingWritten(int sequence_number) { 148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SequenceToPathMap::iterator it = map->find(sequence_number); 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (it == map->end()) { 152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED() << "Got a sequence that we didn't pass to the " 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "renderer: " << sequence_number; 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (cloud_print_enabled_) 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen print_dialog_cloud::CreatePrintDialogForFile( 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen it->second, 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16(), 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string("application/pdf"), 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen true); 163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen else 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTIMPLEMENTED(); 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Erase the entry in the map. 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen map->erase(it); 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // defined(OS_CHROMEOS) 170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) { 172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query; 173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!print_job_manager_->printing_enabled()) { 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Reply with NULL query. 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen OnGetDefaultPrintSettingsReply(printer_query, reply_msg); 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen print_job_manager_->PopPrinterQuery(0, &printer_query); 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!printer_query.get()) { 181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query = new printing::PrinterQuery; 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CancelableTask* task = NewRunnableMethod( 185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &PrintingMessageFilter::OnGetDefaultPrintSettingsReply, 187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query, 188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen reply_msg); 189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Loads default settings. This is asynchronous, only the IPC message sender 190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // will hang until the settings are retrieved. 191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->GetSettings(printing::PrinterQuery::DEFAULTS, 192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NULL, 193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 0, 194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen false, 195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen true, 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen task); 197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnGetDefaultPrintSettingsReply( 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query, 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message* reply_msg) { 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintMsg_Print_Params params; 203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!printer_query.get() || 204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->last_status() != printing::PrintingContext::OK) { 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen memset(¶ms, 0, sizeof(params)); 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RenderParamsFromPrintSettings(printer_query->settings(), ¶ms); 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.document_cookie = printer_query->cookie(); 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintHostMsg_GetDefaultPrintSettings::WriteReplyParams(reply_msg, params); 211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Send(reply_msg); 212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // If printing was enabled. 213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (printer_query.get()) { 214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // If user hasn't cancelled. 215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (printer_query->cookie() && printer_query->settings().dpi()) { 216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen print_job_manager_->QueuePrinterQuery(printer_query.get()); 217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->StopWorker(); 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnScriptedPrint( 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const PrintHostMsg_ScriptedPrint_Params& params, 225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message* reply_msg) { 226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::NativeView host_view = 227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen gfx::NativeViewFromIdInBrowser(params.host_window_id); 228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query; 230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen print_job_manager_->PopPrinterQuery(params.cookie, &printer_query); 231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!printer_query.get()) { 232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query = new printing::PrinterQuery; 233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CancelableTask* task = NewRunnableMethod( 236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, 237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &PrintingMessageFilter::OnScriptedPrintReply, 238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query, 239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.routing_id, 240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen reply_msg); 241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->GetSettings(printing::PrinterQuery::ASK_USER, 243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen host_view, 244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.expected_pages_count, 245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.has_selection, 246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.use_overlays, 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen task); 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnScriptedPrintReply( 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query, 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int routing_id, 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message* reply_msg) { 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintMsg_PrintPages_Params params; 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (printer_query->last_status() != printing::PrintingContext::OK || 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen !printer_query->settings().dpi()) { 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen memset(¶ms, 0, sizeof(params)); 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); 260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.params.document_cookie = printer_query->cookie(); 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen params.pages = 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printing::PageRange::GetPages(printer_query->settings().ranges); 263dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params); 265dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Send(reply_msg); 266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (params.params.dpi && params.params.document_cookie) { 267dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen print_job_manager_->QueuePrinterQuery(printer_query.get()); 268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->StopWorker(); 270dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 271dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 272dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnUpdatePrintSettings( 274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int document_cookie, const DictionaryValue& job_settings, 275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message* reply_msg) { 276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query; 277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen print_job_manager_->PopPrinterQuery(document_cookie, &printer_query); 278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (printer_query.get()) { 279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CancelableTask* task = NewRunnableMethod( 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, 281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &PrintingMessageFilter::OnUpdatePrintSettingsReply, 282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query, 283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen reply_msg); 284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen printer_query->SetSettings(job_settings, task); 285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid PrintingMessageFilter::OnUpdatePrintSettingsReply( 289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_refptr<printing::PrinterQuery> printer_query, 290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IPC::Message* reply_msg) { 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintMsg_PrintPages_Params params; 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (printer_query->last_status() != printing::PrintingContext::OK) { 293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen memset(¶ms, 0, sizeof(params)); 294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.params.document_cookie = printer_query->cookie(); 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen params.pages = 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printing::PageRange::GetPages(printer_query->settings().ranges); 299dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params); 301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Send(reply_msg); 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If user hasn't cancelled. 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (printer_query->cookie() && printer_query->settings().dpi()) 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen print_job_manager_->QueuePrinterQuery(printer_query.get()); 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen else 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen printer_query->StopWorker(); 307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 308