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(&params, 0, sizeof(params));
206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RenderParamsFromPrintSettings(printer_query->settings(), &params);
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(&params, 0, sizeof(params));
258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RenderParamsFromPrintSettings(printer_query->settings(), &params.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(&params, 0, sizeof(params));
294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    RenderParamsFromPrintSettings(printer_query->settings(), &params.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