print_preview_message_handler.cc revision dc0f95d653279beabeb9817299e2902918ba123e
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
3// found in the LICENSE file.
4
5#include "chrome/browser/printing/print_preview_message_handler.h"
6
7#include "chrome/browser/browser_process.h"
8#include "chrome/browser/printing/print_job_manager.h"
9#include "chrome/browser/printing/print_preview_tab_controller.h"
10#include "chrome/browser/printing/printer_query.h"
11#include "chrome/browser/ui/webui/print_preview_handler.h"
12#include "chrome/browser/ui/webui/print_preview_ui.h"
13#include "chrome/browser/ui/webui/print_preview_ui_html_source.h"
14#include "chrome/common/render_messages.h"
15#include "chrome/common/render_messages_params.h"
16#include "content/browser/browser_thread.h"
17#include "content/browser/renderer_host/render_view_host.h"
18#include "content/browser/tab_contents/tab_contents.h"
19
20namespace printing {
21
22PrintPreviewMessageHandler::PrintPreviewMessageHandler(
23    TabContents* tab_contents)
24    : TabContentsObserver(tab_contents) {
25  DCHECK(tab_contents);
26}
27
28PrintPreviewMessageHandler::~PrintPreviewMessageHandler() {
29}
30
31TabContents* PrintPreviewMessageHandler::GetPrintPreviewTab() {
32  // Get/Create preview tab for initiator tab.
33  printing::PrintPreviewTabController* tab_controller =
34      printing::PrintPreviewTabController::GetInstance();
35  if (!tab_controller)
36    return NULL;
37  return tab_controller->GetPrintPreviewForTab(tab_contents());
38}
39
40void PrintPreviewMessageHandler::OnPagesReadyForPreview(
41    const ViewHostMsg_DidPreviewDocument_Params& params) {
42  // Always need to stop the worker and send ViewMsg_PrintingDone.
43  PrintJobManager* print_job_manager = g_browser_process->print_job_manager();
44  scoped_refptr<printing::PrinterQuery> printer_query;
45  print_job_manager->PopPrinterQuery(params.document_cookie, &printer_query);
46  if (printer_query.get()) {
47    BrowserThread::PostTask(
48        BrowserThread::IO, FROM_HERE,
49        NewRunnableMethod(printer_query.get(),
50                          &printing::PrinterQuery::StopWorker));
51  }
52
53  RenderViewHost* rvh = tab_contents()->render_view_host();
54  rvh->Send(new ViewMsg_PrintingDone(rvh->routing_id(),
55                                     params.document_cookie,
56                                     true));
57
58  // Get the print preview tab.
59  TabContents* print_preview_tab = GetPrintPreviewTab();
60  // User might have closed it already.
61  if (!print_preview_tab)
62    return;
63
64#if defined(OS_POSIX)
65  base::SharedMemory* shared_buf =
66      new base::SharedMemory(params.metafile_data_handle, true);
67  if (!shared_buf->Map(params.data_size)) {
68    NOTREACHED();
69    return;
70  }
71
72  PrintPreviewUI* print_preview_ui =
73      static_cast<PrintPreviewUI*>(print_preview_tab->web_ui());
74  PrintPreviewUIHTMLSource* html_source = print_preview_ui->html_source();
75  html_source->SetPrintPreviewData(
76      std::make_pair(shared_buf, params.data_size));
77  print_preview_ui->PreviewDataIsAvailable(params.expected_pages_count);
78#endif  // defined(OS_POSIX)
79}
80
81bool PrintPreviewMessageHandler::OnMessageReceived(
82    const IPC::Message& message) {
83  bool handled = true;
84  IPC_BEGIN_MESSAGE_MAP(PrintPreviewMessageHandler, message)
85    IPC_MESSAGE_HANDLER(ViewHostMsg_PagesReadyForPreview,
86                        OnPagesReadyForPreview)
87    IPC_MESSAGE_UNHANDLED(handled = false)
88  IPC_END_MESSAGE_MAP()
89  return handled;
90}
91
92}  // namespace printing
93