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

Side by Side Diff: chrome/service/service_utility_process_host.cc

Issue 2477283002: Convert printing IPCs to Mojo
Patch Set: git cl format Created 4 years 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/service/service_utility_process_host.h" 5 #include "chrome/service/service_utility_process_host.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <queue> 9 #include <queue>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/files/file.h" 14 #include "base/files/file.h"
15 #include "base/files/file_path.h" 15 #include "base/files/file_path.h"
16 #include "base/files/file_util.h" 16 #include "base/files/file_util.h"
17 #include "base/files/scoped_temp_dir.h" 17 #include "base/files/scoped_temp_dir.h"
18 #include "base/logging.h" 18 #include "base/logging.h"
19 #include "base/macros.h" 19 #include "base/macros.h"
20 #include "base/metrics/histogram.h" 20 #include "base/metrics/histogram.h"
21 #include "base/process/launch.h" 21 #include "base/process/launch.h"
22 #include "base/single_thread_task_runner.h" 22 #include "base/single_thread_task_runner.h"
23 #include "base/strings/string_number_conversions.h" 23 #include "base/strings/string_number_conversions.h"
24 #include "base/task_runner_util.h" 24 #include "base/task_runner_util.h"
25 #include "base/threading/thread_task_runner_handle.h" 25 #include "base/threading/thread_task_runner_handle.h"
26 #include "base/win/win_util.h" 26 #include "base/win/win_util.h"
27 #include "build/build_config.h" 27 #include "build/build_config.h"
28 #include "chrome/common/chrome_switches.h" 28 #include "chrome/common/chrome_switches.h"
29 #include "chrome/common/chrome_utility_printing_messages.h"
30 #include "content/public/common/child_process_host.h" 29 #include "content/public/common/child_process_host.h"
31 #include "content/public/common/content_switches.h" 30 #include "content/public/common/content_switches.h"
32 #include "content/public/common/mojo_channel_switches.h" 31 #include "content/public/common/mojo_channel_switches.h"
33 #include "content/public/common/result_codes.h" 32 #include "content/public/common/result_codes.h"
34 #include "content/public/common/sandbox_init.h" 33 #include "content/public/common/sandbox_init.h"
35 #include "content/public/common/sandboxed_process_launcher_delegate.h" 34 #include "content/public/common/sandboxed_process_launcher_delegate.h"
36 #include "mojo/edk/embedder/embedder.h" 35 #include "mojo/edk/embedder/embedder.h"
37 #include "mojo/edk/embedder/named_platform_channel_pair.h" 36 #include "mojo/edk/embedder/named_platform_channel_pair.h"
38 #include "mojo/edk/embedder/platform_channel_pair.h" 37 #include "mojo/edk/embedder/platform_channel_pair.h"
39 #include "mojo/edk/embedder/scoped_platform_handle.h" 38 #include "mojo/edk/embedder/scoped_platform_handle.h"
39 #include "mojo/public/cpp/system/platform_handle.h"
40 #include "printing/emf_win.h" 40 #include "printing/emf_win.h"
41 #include "sandbox/win/src/sandbox_policy.h" 41 #include "sandbox/win/src/sandbox_policy.h"
42 #include "sandbox/win/src/sandbox_types.h" 42 #include "sandbox/win/src/sandbox_types.h"
43 #include "services/service_manager/public/cpp/interface_provider.h"
43 #include "ui/base/ui_base_switches.h" 44 #include "ui/base/ui_base_switches.h"
44 45
45 namespace { 46 namespace {
46 47
47 using content::ChildProcessHost; 48 using content::ChildProcessHost;
48 49
49 enum ServiceUtilityProcessHostEvent { 50 enum ServiceUtilityProcessHostEvent {
50 SERVICE_UTILITY_STARTED, 51 SERVICE_UTILITY_STARTED,
51 SERVICE_UTILITY_DISCONNECTED, 52 SERVICE_UTILITY_DISCONNECTED,
52 SERVICE_UTILITY_METAFILE_REQUEST, 53 SERVICE_UTILITY_METAFILE_REQUEST,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 class ServiceUtilityProcessHost::PdfToEmfState { 91 class ServiceUtilityProcessHost::PdfToEmfState {
91 public: 92 public:
92 explicit PdfToEmfState(ServiceUtilityProcessHost* host) 93 explicit PdfToEmfState(ServiceUtilityProcessHost* host)
93 : host_(host), page_count_(0), current_page_(0), pages_in_progress_(0) {} 94 : host_(host), page_count_(0), current_page_(0), pages_in_progress_(0) {}
94 ~PdfToEmfState() { Stop(); } 95 ~PdfToEmfState() { Stop(); }
95 96
96 bool Start(base::File pdf_file, 97 bool Start(base::File pdf_file,
97 const printing::PdfRenderSettings& conversion_settings) { 98 const printing::PdfRenderSettings& conversion_settings) {
98 if (!temp_dir_.CreateUniqueTempDir()) 99 if (!temp_dir_.CreateUniqueTempDir())
99 return false; 100 return false;
100 return host_->Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles( 101 host_->printing()->RenderPDFPagesToMetafiles(
101 IPC::TakePlatformFileForTransit(std::move(pdf_file)), 102 mojo::WrapPlatformFile(pdf_file.TakePlatformFile()),
102 conversion_settings, false /* print_text_with_gdi */)); 103 conversion_settings, false /* print_text_with_gdi */,
104 base::Bind(
105 &ServiceUtilityProcessHost::OnRenderPDFPagesToMetafilesPageCount,
106 base::Unretained(host_)));
107 return true;
103 } 108 }
104 109
105 void GetMorePages() { 110 void GetMorePages() {
106 const int kMaxNumberOfTempFilesPerDocument = 3; 111 const int kMaxNumberOfTempFilesPerDocument = 3;
107 while (pages_in_progress_ < kMaxNumberOfTempFilesPerDocument && 112 while (pages_in_progress_ < kMaxNumberOfTempFilesPerDocument &&
108 current_page_ < page_count_) { 113 current_page_ < page_count_) {
109 ++pages_in_progress_; 114 ++pages_in_progress_;
110 emf_files_.push(CreateTempFile()); 115 emf_files_.push(CreateTempFile());
111 host_->Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage( 116 host_->printing()->RenderPDFPagesToMetafilesGetPage(
112 current_page_++, 117 current_page_++,
113 IPC::GetPlatformFileForTransit( 118 mojo::WrapPlatformFile(emf_files_.back().GetPlatformFile()),
114 emf_files_.back().GetPlatformFile(), false))); 119 base::Bind(
120 &ServiceUtilityProcessHost::OnRenderPDFPagesToMetafilesPageDone,
121 base::Unretained(host_)));
115 } 122 }
116 } 123 }
117 124
118 // Returns true if all pages processed and client should not expect more 125 // Returns true if all pages processed and client should not expect more
119 // results. 126 // results.
120 bool OnPageProcessed() { 127 bool OnPageProcessed() {
121 --pages_in_progress_; 128 --pages_in_progress_;
122 GetMorePages(); 129 GetMorePages();
123 if (pages_in_progress_ || current_page_ < page_count_) 130 if (pages_in_progress_ || current_page_ < page_count_)
124 return false; 131 return false;
125 Stop(); 132 Stop();
126 return true; 133 return true;
127 } 134 }
128 135
129 base::File TakeNextFile() { 136 base::File TakeNextFile() {
130 DCHECK(!emf_files_.empty()); 137 DCHECK(!emf_files_.empty());
131 base::File file; 138 base::File file;
132 if (!emf_files_.empty()) 139 if (!emf_files_.empty())
133 file = std::move(emf_files_.front()); 140 file = std::move(emf_files_.front());
134 emf_files_.pop(); 141 emf_files_.pop();
135 return file; 142 return file;
136 } 143 }
137 144
138 void set_page_count(int page_count) { page_count_ = page_count; } 145 void set_page_count(int page_count) { page_count_ = page_count; }
139 bool has_page_count() { return page_count_ > 0; } 146 bool has_page_count() { return page_count_ > 0; }
140 147
141 private: 148 private:
142 void Stop() { 149 void Stop() { host_->printing()->RenderPDFPagesToMetafilesStop(); }
143 host_->Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop());
144 }
145 150
146 base::File CreateTempFile() { 151 base::File CreateTempFile() {
147 base::FilePath path; 152 base::FilePath path;
148 if (!base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &path)) 153 if (!base::CreateTemporaryFileInDir(temp_dir_.GetPath(), &path))
149 return base::File(); 154 return base::File();
150 return base::File(path, 155 return base::File(path,
151 base::File::FLAG_CREATE_ALWAYS | 156 base::File::FLAG_CREATE_ALWAYS |
152 base::File::FLAG_WRITE | 157 base::File::FLAG_WRITE |
153 base::File::FLAG_READ | 158 base::File::FLAG_READ |
154 base::File::FLAG_DELETE_ON_CLOSE | 159 base::File::FLAG_DELETE_ON_CLOSE |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 } 202 }
198 203
199 bool ServiceUtilityProcessHost::StartGetPrinterCapsAndDefaults( 204 bool ServiceUtilityProcessHost::StartGetPrinterCapsAndDefaults(
200 const std::string& printer_name) { 205 const std::string& printer_name) {
201 ReportUmaEvent(SERVICE_UTILITY_CAPS_REQUEST); 206 ReportUmaEvent(SERVICE_UTILITY_CAPS_REQUEST);
202 start_time_ = base::Time::Now(); 207 start_time_ = base::Time::Now();
203 if (!StartProcess(true)) 208 if (!StartProcess(true))
204 return false; 209 return false;
205 DCHECK(!waiting_for_reply_); 210 DCHECK(!waiting_for_reply_);
206 waiting_for_reply_ = true; 211 waiting_for_reply_ = true;
207 return Send(new ChromeUtilityMsg_GetPrinterCapsAndDefaults(printer_name)); 212 printing()->GetPrinterCapsAndDefaults(
213 printer_name,
214 base::Bind(&ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaults,
215 base::Unretained(this), printer_name));
216 return true;
208 } 217 }
209 218
210 bool ServiceUtilityProcessHost::StartGetPrinterSemanticCapsAndDefaults( 219 bool ServiceUtilityProcessHost::StartGetPrinterSemanticCapsAndDefaults(
211 const std::string& printer_name) { 220 const std::string& printer_name) {
212 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_REQUEST); 221 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_REQUEST);
213 start_time_ = base::Time::Now(); 222 start_time_ = base::Time::Now();
214 if (!StartProcess(true)) 223 if (!StartProcess(true))
215 return false; 224 return false;
216 DCHECK(!waiting_for_reply_); 225 DCHECK(!waiting_for_reply_);
217 waiting_for_reply_ = true; 226 waiting_for_reply_ = true;
218 return Send( 227 printing()->GetPrinterSemanticCapsAndDefaults(
219 new ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults(printer_name)); 228 printer_name,
229 base::Bind(
230 &ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaults,
231 base::Unretained(this), printer_name));
232 return true;
220 } 233 }
221 234
222 bool ServiceUtilityProcessHost::StartProcess(bool no_sandbox) { 235 bool ServiceUtilityProcessHost::StartProcess(bool no_sandbox) {
223 std::string mojo_channel_token = 236 std::string mojo_channel_token =
224 child_process_host_->CreateChannelMojo(mojo_child_token_); 237 child_process_host_->CreateChannelMojo(mojo_child_token_);
225 if (mojo_channel_token.empty()) 238 if (mojo_channel_token.empty())
226 return false; 239 return false;
227 240
228 base::FilePath exe_path = GetUtilityProcessCmd(); 241 base::FilePath exe_path = GetUtilityProcessCmd();
229 if (exe_path.empty()) { 242 if (exe_path.empty()) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 if (success) { 294 if (success) {
282 mojo::edk::ChildProcessLaunched(process_.Handle(), 295 mojo::edk::ChildProcessLaunched(process_.Handle(),
283 std::move(parent_handle), 296 std::move(parent_handle),
284 mojo_child_token_); 297 mojo_child_token_);
285 } else { 298 } else {
286 mojo::edk::ChildProcessLaunchFailed(mojo_child_token_); 299 mojo::edk::ChildProcessLaunchFailed(mojo_child_token_);
287 } 300 }
288 return success; 301 return success;
289 } 302 }
290 303
291 bool ServiceUtilityProcessHost::Send(IPC::Message* msg) {
292 if (child_process_host_)
293 return child_process_host_->Send(msg);
294 delete msg;
295 return false;
296 }
297
298 base::FilePath ServiceUtilityProcessHost::GetUtilityProcessCmd() { 304 base::FilePath ServiceUtilityProcessHost::GetUtilityProcessCmd() {
299 return ChildProcessHost::GetChildPath(ChildProcessHost::CHILD_NORMAL); 305 return ChildProcessHost::GetChildPath(ChildProcessHost::CHILD_NORMAL);
300 } 306 }
301 307
302 void ServiceUtilityProcessHost::OnChildDisconnected() { 308 void ServiceUtilityProcessHost::OnChildDisconnected() {
303 if (waiting_for_reply_) { 309 if (waiting_for_reply_) {
304 // If we are yet to receive a reply then notify the client that the 310 // If we are yet to receive a reply then notify the client that the
305 // child died. 311 // child died.
306 client_task_runner_->PostTask( 312 client_task_runner_->PostTask(
307 FROM_HERE, base::Bind(&Client::OnChildDied, client_.get())); 313 FROM_HERE, base::Bind(&Client::OnChildDied, client_.get()));
308 ReportUmaEvent(SERVICE_UTILITY_DISCONNECTED); 314 ReportUmaEvent(SERVICE_UTILITY_DISCONNECTED);
309 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityDisconnectTime", 315 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityDisconnectTime",
310 base::Time::Now() - start_time_); 316 base::Time::Now() - start_time_);
311 } 317 }
312 delete this; 318 delete this;
313 } 319 }
314 320
315 bool ServiceUtilityProcessHost::OnMessageReceived(const IPC::Message& message) { 321 bool ServiceUtilityProcessHost::OnMessageReceived(const IPC::Message& message) {
316 bool handled = true; 322 return false;
317 IPC_BEGIN_MESSAGE_MAP(ServiceUtilityProcessHost, message)
318 IPC_MESSAGE_HANDLER(
319 ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount,
320 OnRenderPDFPagesToMetafilesPageCount)
321 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone,
322 OnRenderPDFPagesToMetafilesPageDone)
323 IPC_MESSAGE_HANDLER(
324 ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Succeeded,
325 OnGetPrinterCapsAndDefaultsSucceeded)
326 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_GetPrinterCapsAndDefaults_Failed,
327 OnGetPrinterCapsAndDefaultsFailed)
328 IPC_MESSAGE_HANDLER(
329 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded,
330 OnGetPrinterSemanticCapsAndDefaultsSucceeded)
331 IPC_MESSAGE_HANDLER(
332 ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed,
333 OnGetPrinterSemanticCapsAndDefaultsFailed)
334 IPC_MESSAGE_UNHANDLED(handled = false)
335 IPC_END_MESSAGE_MAP()
336 return handled;
337 } 323 }
338 324
339 const base::Process& ServiceUtilityProcessHost::GetProcess() const { 325 const base::Process& ServiceUtilityProcessHost::GetProcess() const {
340 return process_; 326 return process_;
341 } 327 }
342 328
343 void ServiceUtilityProcessHost::OnMetafileSpooled(bool success) { 329 void ServiceUtilityProcessHost::OnMetafileSpooled(bool success) {
344 if (!success || pdf_to_emf_state_->OnPageProcessed()) 330 if (!success || pdf_to_emf_state_->OnPageProcessed())
345 OnPDFToEmfFinished(success); 331 OnPDFToEmfFinished(success);
346 } 332 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 ReportUmaEvent(SERVICE_UTILITY_METAFILE_FAILED); 369 ReportUmaEvent(SERVICE_UTILITY_METAFILE_FAILED);
384 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityMetafileFailTime", 370 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityMetafileFailTime",
385 base::Time::Now() - start_time_); 371 base::Time::Now() - start_time_);
386 } 372 }
387 client_task_runner_->PostTask( 373 client_task_runner_->PostTask(
388 FROM_HERE, base::Bind(&Client::OnRenderPDFPagesToMetafileDone, 374 FROM_HERE, base::Bind(&Client::OnRenderPDFPagesToMetafileDone,
389 client_.get(), success)); 375 client_.get(), success));
390 pdf_to_emf_state_.reset(); 376 pdf_to_emf_state_.reset();
391 } 377 }
392 378
393 void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaultsSucceeded( 379 void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaults(
394 const std::string& printer_name, 380 const std::string& printer_name,
395 const printing::PrinterCapsAndDefaults& caps_and_defaults) { 381 const base::Optional<printing::PrinterCapsAndDefaults>& caps_and_defaults) {
396 DCHECK(waiting_for_reply_); 382 DCHECK(waiting_for_reply_);
397 ReportUmaEvent(SERVICE_UTILITY_CAPS_SUCCEEDED);
398 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityCapsTime",
399 base::Time::Now() - start_time_);
400 waiting_for_reply_ = false; 383 waiting_for_reply_ = false;
401 client_task_runner_->PostTask( 384 if (caps_and_defaults) {
402 FROM_HERE, base::Bind(&Client::OnGetPrinterCapsAndDefaults, client_.get(), 385 ReportUmaEvent(SERVICE_UTILITY_CAPS_SUCCEEDED);
403 true, printer_name, caps_and_defaults)); 386 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityCapsTime",
387 base::Time::Now() - start_time_);
388 client_task_runner_->PostTask(
389 FROM_HERE,
390 base::Bind(&Client::OnGetPrinterCapsAndDefaults, client_.get(), true,
391 printer_name, caps_and_defaults.value()));
392 } else {
393 ReportUmaEvent(SERVICE_UTILITY_CAPS_FAILED);
394 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityCapsFailTime",
395 base::Time::Now() - start_time_);
396 client_task_runner_->PostTask(
397 FROM_HERE,
398 base::Bind(&Client::OnGetPrinterCapsAndDefaults, client_.get(), false,
399 printer_name, printing::PrinterCapsAndDefaults()));
400 }
404 } 401 }
405 402
406 void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaultsSucceeded( 403 void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaults(
407 const std::string& printer_name, 404 const std::string& printer_name,
408 const printing::PrinterSemanticCapsAndDefaults& caps_and_defaults) { 405 const base::Optional<printing::PrinterSemanticCapsAndDefaults>&
406 caps_and_defaults) {
409 DCHECK(waiting_for_reply_); 407 DCHECK(waiting_for_reply_);
410 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_SUCCEEDED);
411 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilitySemanticCapsTime",
412 base::Time::Now() - start_time_);
413 waiting_for_reply_ = false; 408 waiting_for_reply_ = false;
414 client_task_runner_->PostTask( 409 if (caps_and_defaults) {
415 FROM_HERE, 410 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_SUCCEEDED);
416 base::Bind(&Client::OnGetPrinterSemanticCapsAndDefaults, client_.get(), 411 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilitySemanticCapsTime",
417 true, printer_name, caps_and_defaults)); 412 base::Time::Now() - start_time_);
418 } 413 client_task_runner_->PostTask(
419 414 FROM_HERE,
420 void ServiceUtilityProcessHost::OnGetPrinterCapsAndDefaultsFailed( 415 base::Bind(&Client::OnGetPrinterSemanticCapsAndDefaults, client_.get(),
421 const std::string& printer_name) { 416 true, printer_name, caps_and_defaults.value()));
422 DCHECK(waiting_for_reply_); 417 } else {
423 ReportUmaEvent(SERVICE_UTILITY_CAPS_FAILED); 418 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_FAILED);
424 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilityCapsFailTime", 419 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilitySemanticCapsFailTime",
425 base::Time::Now() - start_time_); 420 base::Time::Now() - start_time_);
426 waiting_for_reply_ = false; 421 client_task_runner_->PostTask(
427 client_task_runner_->PostTask( 422 FROM_HERE, base::Bind(&Client::OnGetPrinterSemanticCapsAndDefaults,
428 FROM_HERE, 423 client_.get(), false, printer_name,
429 base::Bind(&Client::OnGetPrinterCapsAndDefaults, client_.get(), false, 424 printing::PrinterSemanticCapsAndDefaults()));
430 printer_name, printing::PrinterCapsAndDefaults())); 425 }
431 }
432
433 void ServiceUtilityProcessHost::OnGetPrinterSemanticCapsAndDefaultsFailed(
434 const std::string& printer_name) {
435 DCHECK(waiting_for_reply_);
436 ReportUmaEvent(SERVICE_UTILITY_SEMANTIC_CAPS_FAILED);
437 UMA_HISTOGRAM_TIMES("CloudPrint.ServiceUtilitySemanticCapsFailTime",
438 base::Time::Now() - start_time_);
439 waiting_for_reply_ = false;
440 client_task_runner_->PostTask(
441 FROM_HERE, base::Bind(&Client::OnGetPrinterSemanticCapsAndDefaults,
442 client_.get(), false, printer_name,
443 printing::PrinterSemanticCapsAndDefaults()));
444 } 426 }
445 427
446 bool ServiceUtilityProcessHost::Client::MetafileAvailable(float scale_factor, 428 bool ServiceUtilityProcessHost::Client::MetafileAvailable(float scale_factor,
447 base::File file) { 429 base::File file) {
448 file.Seek(base::File::FROM_BEGIN, 0); 430 file.Seek(base::File::FROM_BEGIN, 0);
449 int64_t size = file.GetLength(); 431 int64_t size = file.GetLength();
450 if (size <= 0) { 432 if (size <= 0) {
451 OnRenderPDFPagesToMetafileDone(false); 433 OnRenderPDFPagesToMetafileDone(false);
452 return false; 434 return false;
453 } 435 }
454 std::vector<char> data(size); 436 std::vector<char> data(size);
455 if (file.ReadAtCurrentPos(data.data(), data.size()) != size) { 437 if (file.ReadAtCurrentPos(data.data(), data.size()) != size) {
456 OnRenderPDFPagesToMetafileDone(false); 438 OnRenderPDFPagesToMetafileDone(false);
457 return false; 439 return false;
458 } 440 }
459 printing::Emf emf; 441 printing::Emf emf;
460 if (!emf.InitFromData(data.data(), data.size())) { 442 if (!emf.InitFromData(data.data(), data.size())) {
461 OnRenderPDFPagesToMetafileDone(false); 443 OnRenderPDFPagesToMetafileDone(false);
462 return false; 444 return false;
463 } 445 }
464 OnRenderPDFPagesToMetafilePageDone(scale_factor, emf); 446 OnRenderPDFPagesToMetafilePageDone(scale_factor, emf);
465 return true; 447 return true;
466 } 448 }
449
450 printing::mojom::Printing* ServiceUtilityProcessHost::printing() {
451 if (!printing_) {
452 printing::mojom::PrintingFactoryPtr printing_factory;
453 child_process_host_->GetRemoteInterfaces()->GetInterface(&printing_factory);
454 // We don't care about calls to FontPreCaching so we pass a null pointer for
455 // the second argument.
456 printing_factory->MakePrinting(mojo::GetProxy(&printing_),
457 printing::mojom::FontPreCachingPtr());
458 }
459 return printing_.get();
460 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698