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