Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: chrome/browser/printing/printing_message_filter.cc

Issue 23116003: Adds PrintingContext implementation stub for Android. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addresses code review issues. Solves infinite recursion bug. Improves the interface between Java an… Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
325 params.Reset(); 366 params.Reset();
326 } else { 367 } else {
327 RenderParamsFromPrintSettings(printer_query->settings(), &params.params); 368 RenderParamsFromPrintSettings(printer_query->settings(), &params.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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698