Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/printing/printing_message_filter.h" | 5 #include "chrome/browser/printing/printing_message_filter.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "chrome/browser/browser_process.h" | 10 #include "chrome/browser/browser_process.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 #if defined(OS_CHROMEOS) | 25 #if defined(OS_CHROMEOS) |
| 26 #include <fcntl.h> | 26 #include <fcntl.h> |
| 27 | 27 |
| 28 #include <map> | 28 #include <map> |
| 29 | 29 |
| 30 #include "base/file_util.h" | 30 #include "base/file_util.h" |
| 31 #include "base/lazy_instance.h" | 31 #include "base/lazy_instance.h" |
| 32 #include "chrome/browser/printing/print_dialog_cloud.h" | 32 #include "chrome/browser/printing/print_dialog_cloud.h" |
| 33 #endif | 33 #endif |
| 34 | 34 |
| 35 #if defined(OS_ANDROID) | |
| 36 #include "base/strings/string_number_conversions.h" | |
| 37 #include "chrome/browser/printing/print_view_manager_basic.h" | |
| 38 #include "printing/printing_context_android.h" | |
| 39 #endif | |
| 40 | |
| 35 using content::BrowserThread; | 41 using content::BrowserThread; |
| 36 | 42 |
| 37 namespace { | 43 namespace { |
| 38 | 44 |
| 39 #if defined(OS_CHROMEOS) | 45 #if defined(OS_CHROMEOS) |
| 40 typedef std::map<int, base::FilePath> SequenceToPathMap; | 46 typedef std::map<int, base::FilePath> SequenceToPathMap; |
| 41 | 47 |
| 42 struct PrintingSequencePathMap { | 48 struct PrintingSequencePathMap { |
| 43 SequenceToPathMap map; | 49 SequenceToPathMap map; |
| 44 int sequence; | 50 int sequence; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 PrintingMessageFilter::~PrintingMessageFilter() { | 99 PrintingMessageFilter::~PrintingMessageFilter() { |
| 94 } | 100 } |
| 95 | 101 |
| 96 void PrintingMessageFilter::OverrideThreadForMessage( | 102 void PrintingMessageFilter::OverrideThreadForMessage( |
| 97 const IPC::Message& message, BrowserThread::ID* thread) { | 103 const IPC::Message& message, BrowserThread::ID* thread) { |
| 98 #if defined(OS_CHROMEOS) | 104 #if defined(OS_CHROMEOS) |
| 99 if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID || | 105 if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID || |
| 100 message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { | 106 message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { |
| 101 *thread = BrowserThread::FILE; | 107 *thread = BrowserThread::FILE; |
| 102 } | 108 } |
| 109 #elif defined(OS_ANDROID) | |
| 110 if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID || | |
| 111 message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { | |
| 112 *thread = BrowserThread::UI; | |
| 113 } | |
| 103 #endif | 114 #endif |
| 104 } | 115 } |
| 105 | 116 |
| 106 bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message, | 117 bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message, |
| 107 bool* message_was_ok) { | 118 bool* message_was_ok) { |
| 108 bool handled = true; | 119 bool handled = true; |
| 109 IPC_BEGIN_MESSAGE_MAP_EX(PrintingMessageFilter, message, *message_was_ok) | 120 IPC_BEGIN_MESSAGE_MAP_EX(PrintingMessageFilter, message, *message_was_ok) |
| 110 #if defined(OS_WIN) | 121 #if defined(OS_WIN) |
| 111 IPC_MESSAGE_HANDLER(PrintHostMsg_DuplicateSection, OnDuplicateSection) | 122 IPC_MESSAGE_HANDLER(PrintHostMsg_DuplicateSection, OnDuplicateSection) |
| 112 #endif | 123 #endif |
| 113 #if defined(OS_CHROMEOS) | 124 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) |
| 114 IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting, | 125 IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting, |
| 115 OnAllocateTempFileForPrinting) | 126 OnAllocateTempFileForPrinting) |
| 116 IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, | 127 IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, |
| 117 OnTempFileForPrintingWritten) | 128 OnTempFileForPrintingWritten) |
| 118 #endif | 129 #endif |
| 119 IPC_MESSAGE_HANDLER(PrintHostMsg_IsPrintingEnabled, OnIsPrintingEnabled) | 130 IPC_MESSAGE_HANDLER(PrintHostMsg_IsPrintingEnabled, OnIsPrintingEnabled) |
| 120 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_GetDefaultPrintSettings, | 131 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_GetDefaultPrintSettings, |
| 121 OnGetDefaultPrintSettings) | 132 OnGetDefaultPrintSettings) |
| 122 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrint, OnScriptedPrint) | 133 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_ScriptedPrint, OnScriptedPrint) |
| 123 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_UpdatePrintSettings, | 134 IPC_MESSAGE_HANDLER_DELAY_REPLY(PrintHostMsg_UpdatePrintSettings, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 134 void PrintingMessageFilter::OnDuplicateSection( | 145 void PrintingMessageFilter::OnDuplicateSection( |
| 135 base::SharedMemoryHandle renderer_handle, | 146 base::SharedMemoryHandle renderer_handle, |
| 136 base::SharedMemoryHandle* browser_handle) { | 147 base::SharedMemoryHandle* browser_handle) { |
| 137 // Duplicate the handle in this process right now so the memory is kept alive | 148 // Duplicate the handle in this process right now so the memory is kept alive |
| 138 // (even if it is not mapped) | 149 // (even if it is not mapped) |
| 139 base::SharedMemory shared_buf(renderer_handle, true, PeerHandle()); | 150 base::SharedMemory shared_buf(renderer_handle, true, PeerHandle()); |
| 140 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), browser_handle); | 151 shared_buf.GiveToProcess(base::GetCurrentProcessHandle(), browser_handle); |
| 141 } | 152 } |
| 142 #endif | 153 #endif |
| 143 | 154 |
| 155 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) | |
| 156 void PrintingMessageFilter::OnAllocateTempFileForPrinting( | |
| 157 int render_view_id, | |
| 158 base::FileDescriptor* temp_file_fd, | |
| 159 int* sequence_number) { | |
| 144 #if defined(OS_CHROMEOS) | 160 #if defined(OS_CHROMEOS) |
| 145 void PrintingMessageFilter::OnAllocateTempFileForPrinting( | 161 // TODO(thestig): Use |render_view_id| for Chrome OS. |
| 146 base::FileDescriptor* temp_file_fd, int* sequence_number) { | |
| 147 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 148 temp_file_fd->fd = *sequence_number = -1; | 163 temp_file_fd->fd = *sequence_number = -1; |
| 149 temp_file_fd->auto_close = false; | 164 temp_file_fd->auto_close = false; |
| 150 | 165 |
| 151 SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; | 166 SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; |
| 152 *sequence_number = g_printing_file_descriptor_map.Get().sequence++; | 167 *sequence_number = g_printing_file_descriptor_map.Get().sequence++; |
| 153 | 168 |
| 154 base::FilePath path; | 169 base::FilePath path; |
| 155 if (file_util::CreateTemporaryFile(&path)) { | 170 if (file_util::CreateTemporaryFile(&path)) { |
| 156 int fd = open(path.value().c_str(), O_WRONLY); | 171 int fd = open(path.value().c_str(), O_WRONLY); |
| 157 if (fd >= 0) { | 172 if (fd >= 0) { |
| 158 SequenceToPathMap::iterator it = map->find(*sequence_number); | 173 SequenceToPathMap::iterator it = map->find(*sequence_number); |
| 159 if (it != map->end()) { | 174 if (it != map->end()) { |
| 160 NOTREACHED() << "Sequence number already in use. seq=" << | 175 NOTREACHED() << "Sequence number already in use. seq=" << |
| 161 *sequence_number; | 176 *sequence_number; |
| 162 } else { | 177 } else { |
| 163 (*map)[*sequence_number] = path; | 178 (*map)[*sequence_number] = path; |
| 164 temp_file_fd->fd = fd; | 179 temp_file_fd->fd = fd; |
| 165 temp_file_fd->auto_close = true; | 180 temp_file_fd->auto_close = true; |
| 166 } | 181 } |
| 167 } | 182 } |
| 168 } | 183 } |
| 184 #elif defined(OS_ANDROID) | |
| 185 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 186 content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | |
| 187 printing::PrintViewManagerBasic* print_view_manager = | |
| 188 printing::PrintViewManagerBasic::FromWebContents(wc); | |
| 189 // The file descriptor is originally created in & passed from the Android | |
| 190 // side, and it will handle the closing. | |
| 191 const base::FileDescriptor& file_descriptor = | |
| 192 print_view_manager->get_file_descriptor(); | |
| 193 temp_file_fd->auto_close = false; | |
| 194 temp_file_fd->fd = file_descriptor.fd; | |
|
Lei Zhang
2013/08/18 09:56:26
nit: initialize |temp_file_fd->fd| before auto_clo
cimamoglu1
2013/08/19 13:47:26
Done.
| |
| 195 #endif | |
| 169 } | 196 } |
| 170 | 197 |
| 171 void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, | 198 void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, |
| 172 int sequence_number) { | 199 int sequence_number) { |
| 200 #if defined(OS_CHROMEOS) | |
| 173 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 201 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 174 SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; | 202 SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; |
| 175 SequenceToPathMap::iterator it = map->find(sequence_number); | 203 SequenceToPathMap::iterator it = map->find(sequence_number); |
| 176 if (it == map->end()) { | 204 if (it == map->end()) { |
| 177 NOTREACHED() << "Got a sequence that we didn't pass to the " | 205 NOTREACHED() << "Got a sequence that we didn't pass to the " |
| 178 "renderer: " << sequence_number; | 206 "renderer: " << sequence_number; |
| 179 return; | 207 return; |
| 180 } | 208 } |
| 181 BrowserThread::PostTask( | 209 BrowserThread::PostTask( |
| 182 BrowserThread::UI, FROM_HERE, | 210 BrowserThread::UI, FROM_HERE, |
| 183 base::Bind(&PrintingMessageFilter::CreatePrintDialogForFile, | 211 base::Bind(&PrintingMessageFilter::CreatePrintDialogForFile, |
| 184 this, render_view_id, it->second)); | 212 this, render_view_id, it->second)); |
| 185 | 213 |
| 186 // Erase the entry in the map. | 214 // Erase the entry in the map. |
| 187 map->erase(it); | 215 map->erase(it); |
| 216 #elif defined(OS_ANDROID) | |
| 217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 218 content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | |
| 219 printing::PrintViewManagerBasic* print_view_manager = | |
| 220 printing::PrintViewManagerBasic::FromWebContents(wc); | |
| 221 const base::FileDescriptor& file_descriptor = | |
| 222 print_view_manager->get_file_descriptor(); | |
| 223 printing::PrintingContextAndroid::PdfWritingDone(file_descriptor.fd, true); | |
| 224 // Invalidate the file descriptor so it doesn't accidentally get reused. | |
| 225 print_view_manager->set_file_descriptor(base::FileDescriptor(-1, false)); | |
| 226 #endif | |
| 188 } | 227 } |
| 228 #endif // defined(OS_CHROMEOS) || defined(OS_ANDROID) | |
| 189 | 229 |
| 230 #if defined(OS_CHROMEOS) | |
| 190 void PrintingMessageFilter::CreatePrintDialogForFile( | 231 void PrintingMessageFilter::CreatePrintDialogForFile( |
| 191 int render_view_id, | 232 int render_view_id, |
| 192 const base::FilePath& path) { | 233 const base::FilePath& path) { |
| 193 content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | 234 content::WebContents* wc = GetWebContentsForRenderView(render_view_id); |
| 194 print_dialog_cloud::CreatePrintDialogForFile( | 235 print_dialog_cloud::CreatePrintDialogForFile( |
| 195 wc->GetBrowserContext(), | 236 wc->GetBrowserContext(), |
| 196 wc->GetView()->GetTopLevelNativeWindow(), | 237 wc->GetView()->GetTopLevelNativeWindow(), |
| 197 path, | 238 path, |
| 198 wc->GetTitle(), | 239 wc->GetTitle(), |
| 199 string16(), | 240 string16(), |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 params.Reset(); | 366 params.Reset(); |
| 326 } else { | 367 } else { |
| 327 RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); | 368 RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); |
| 328 params.params.document_cookie = printer_query->cookie(); | 369 params.params.document_cookie = printer_query->cookie(); |
| 329 params.pages = | 370 params.pages = |
| 330 printing::PageRange::GetPages(printer_query->settings().ranges); | 371 printing::PageRange::GetPages(printer_query->settings().ranges); |
| 331 } | 372 } |
| 332 PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params); | 373 PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params); |
| 333 Send(reply_msg); | 374 Send(reply_msg); |
| 334 if (params.params.dpi && params.params.document_cookie) { | 375 if (params.params.dpi && params.params.document_cookie) { |
| 376 #if defined(OS_ANDROID) | |
| 377 int file_descriptor; | |
| 378 const string16& device_name = printer_query->settings().device_name(); | |
| 379 if (base::StringToInt(device_name, &file_descriptor)) { | |
| 380 BrowserThread::PostTask( | |
| 381 BrowserThread::UI, FROM_HERE, | |
| 382 base::Bind(&PrintingMessageFilter::UpdateFileDescriptor, this, | |
| 383 reply_msg->routing_id(), file_descriptor)); | |
| 384 } | |
| 385 #endif | |
| 335 print_job_manager_->QueuePrinterQuery(printer_query.get()); | 386 print_job_manager_->QueuePrinterQuery(printer_query.get()); |
| 336 } else { | 387 } else { |
| 337 printer_query->StopWorker(); | 388 printer_query->StopWorker(); |
| 338 } | 389 } |
| 339 } | 390 } |
| 340 | 391 |
| 392 #if defined(OS_ANDROID) | |
| 393 void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { | |
| 394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 395 content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | |
| 396 printing::PrintViewManagerBasic* print_view_manager = | |
| 397 printing::PrintViewManagerBasic::FromWebContents(wc); | |
| 398 print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false)); | |
| 399 } | |
| 400 #endif | |
| 401 | |
| 341 void PrintingMessageFilter::OnUpdatePrintSettings( | 402 void PrintingMessageFilter::OnUpdatePrintSettings( |
| 342 int document_cookie, const DictionaryValue& job_settings, | 403 int document_cookie, const DictionaryValue& job_settings, |
| 343 IPC::Message* reply_msg) { | 404 IPC::Message* reply_msg) { |
| 344 scoped_refptr<printing::PrinterQuery> printer_query; | 405 scoped_refptr<printing::PrinterQuery> printer_query; |
| 345 if (!profile_io_data_->printing_enabled()->GetValue()) { | 406 if (!profile_io_data_->printing_enabled()->GetValue()) { |
| 346 // Reply with NULL query. | 407 // Reply with NULL query. |
| 347 OnUpdatePrintSettingsReply(printer_query, reply_msg); | 408 OnUpdatePrintSettingsReply(printer_query, reply_msg); |
| 348 return; | 409 return; |
| 349 } | 410 } |
| 350 | 411 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 | 446 |
| 386 #if defined(ENABLE_FULL_PRINTING) | 447 #if defined(ENABLE_FULL_PRINTING) |
| 387 void PrintingMessageFilter::OnCheckForCancel(int32 preview_ui_id, | 448 void PrintingMessageFilter::OnCheckForCancel(int32 preview_ui_id, |
| 388 int preview_request_id, | 449 int preview_request_id, |
| 389 bool* cancel) { | 450 bool* cancel) { |
| 390 PrintPreviewUI::GetCurrentPrintPreviewStatus(preview_ui_id, | 451 PrintPreviewUI::GetCurrentPrintPreviewStatus(preview_ui_id, |
| 391 preview_request_id, | 452 preview_request_id, |
| 392 cancel); | 453 cancel); |
| 393 } | 454 } |
| 394 #endif | 455 #endif |
| OLD | NEW |