OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/pdf_to_emf_converter.h" | 5 #include "chrome/browser/printing/pdf_to_emf_converter.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <windows.h> | 8 #include <windows.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 private: | 84 private: |
85 mutable scoped_refptr<RefCountedTempDir> temp_dir_; | 85 mutable scoped_refptr<RefCountedTempDir> temp_dir_; |
86 mutable ScopedTempFile file_; // Mutable because of consts in base class. | 86 mutable ScopedTempFile file_; // Mutable because of consts in base class. |
87 | 87 |
88 bool GetDataAsVector(std::vector<char>* buffer) const override; | 88 bool GetDataAsVector(std::vector<char>* buffer) const override; |
89 bool SaveTo(base::File* file) const override; | 89 bool SaveTo(base::File* file) const override; |
90 | 90 |
91 DISALLOW_COPY_AND_ASSIGN(LazyEmf); | 91 DISALLOW_COPY_AND_ASSIGN(LazyEmf); |
92 }; | 92 }; |
93 | 93 |
| 94 // Postscript metafile subclass to override SafePlayback. |
| 95 class PostScriptMetaFile : public LazyEmf { |
| 96 public: |
| 97 PostScriptMetaFile(const scoped_refptr<RefCountedTempDir>& temp_dir, |
| 98 ScopedTempFile file) |
| 99 : LazyEmf(temp_dir, std::move(file)) {} |
| 100 ~PostScriptMetaFile() override; |
| 101 |
| 102 protected: |
| 103 // MetafilePlayer: |
| 104 bool SafePlayback(HDC hdc) const override; |
| 105 |
| 106 DISALLOW_COPY_AND_ASSIGN(PostScriptMetaFile); |
| 107 }; |
| 108 |
94 // Class for converting PDF to another format for printing (Emf, Postscript). | 109 // Class for converting PDF to another format for printing (Emf, Postscript). |
95 // Class uses 3 threads: UI, IO and FILE. | 110 // Class uses 3 threads: UI, IO and FILE. |
96 // Internal workflow is following: | 111 // Internal workflow is following: |
97 // 1. Create instance on the UI thread. (files_, settings_,) | 112 // 1. Create instance on the UI thread. (files_, settings_,) |
98 // 2. Create pdf file on the FILE thread. | 113 // 2. Create pdf file on the FILE thread. |
99 // 3. Start utility process and start conversion on the IO thread. | 114 // 3. Start utility process and start conversion on the IO thread. |
100 // 4. Utility process returns page count. | 115 // 4. Utility process returns page count. |
101 // 5. For each page: | 116 // 5. For each page: |
102 // 1. Clients requests page with file handle to a temp file. | 117 // 1. Clients requests page with file handle to a temp file. |
103 // 2. Utility converts the page, save it to the file and reply. | 118 // 2. Utility converts the page, save it to the file and reply. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 int page_number_; | 168 int page_number_; |
154 | 169 |
155 PdfConverter::GetPageCallback callback_; | 170 PdfConverter::GetPageCallback callback_; |
156 ScopedTempFile file_; | 171 ScopedTempFile file_; |
157 | 172 |
158 DISALLOW_COPY_AND_ASSIGN(GetPageCallbackData); | 173 DISALLOW_COPY_AND_ASSIGN(GetPageCallbackData); |
159 }; | 174 }; |
160 | 175 |
161 ~PdfConverterUtilityProcessHostClient() override; | 176 ~PdfConverterUtilityProcessHostClient() override; |
162 | 177 |
| 178 bool OnMessageReceived(const IPC::Message& message) override; |
| 179 |
163 // Helper functions: must be overridden by subclasses | 180 // Helper functions: must be overridden by subclasses |
164 // Set the process name | 181 // Set the process name |
165 virtual base::string16 GetName() const = 0; | 182 virtual base::string16 GetName() const; |
166 // Create a metafileplayer subclass file from a temporary file. | 183 // Create a metafileplayer subclass file from a temporary file. |
167 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp( | 184 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp( |
168 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | 185 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> |
169 temp_file) = 0; | 186 temp_file); |
170 // Send the messages to Start, GetPage, and Stop. | 187 // Send the messages to Start, GetPage, and Stop. |
171 virtual void SendStartMessage(IPC::PlatformFileForTransit transit) = 0; | 188 virtual void SendStartMessage(IPC::PlatformFileForTransit transit); |
172 virtual void SendGetPageMessage(int page_number, | 189 virtual void SendGetPageMessage(int page_number, |
173 IPC::PlatformFileForTransit transit) = 0; | 190 IPC::PlatformFileForTransit transit); |
174 virtual void SendStopMessage() = 0; | 191 virtual void SendStopMessage(); |
175 | 192 |
176 // Message handlers: | 193 // Message handlers: |
177 void OnPageCount(int page_count); | 194 void OnPageCount(int page_count); |
178 void OnPageDone(bool success, float scale_factor); | 195 void OnPageDone(bool success, float scale_factor); |
179 | 196 |
180 void OnFailed(); | 197 void OnFailed(); |
181 void OnTempPdfReady(ScopedTempFile pdf); | 198 void OnTempPdfReady(ScopedTempFile pdf); |
182 void OnTempFileReady(GetPageCallbackData* callback_data, | 199 void OnTempFileReady(GetPageCallbackData* callback_data, |
183 ScopedTempFile temp_file); | 200 ScopedTempFile temp_file); |
184 | 201 |
| 202 // Additional message handler needed for Pdf to Emf |
| 203 void OnPreCacheFontCharacters(const LOGFONT& log_font, |
| 204 const base::string16& characters); |
| 205 |
185 scoped_refptr<RefCountedTempDir> temp_dir_; | 206 scoped_refptr<RefCountedTempDir> temp_dir_; |
186 | 207 |
187 // Used to suppress callbacks after PdfConverter is deleted. | 208 // Used to suppress callbacks after PdfConverter is deleted. |
188 base::WeakPtr<PdfConverterImpl> converter_; | 209 base::WeakPtr<PdfConverterImpl> converter_; |
189 PdfRenderSettings settings_; | 210 PdfRenderSettings settings_; |
190 | 211 |
191 // Document loaded callback. | 212 // Document loaded callback. |
192 PdfConverter::StartCallback start_callback_; | 213 PdfConverter::StartCallback start_callback_; |
193 | 214 |
194 // Process host for IPC. | 215 // Process host for IPC. |
195 base::WeakPtr<content::UtilityProcessHost> utility_process_host_; | 216 base::WeakPtr<content::UtilityProcessHost> utility_process_host_; |
196 | 217 |
197 // Queue of callbacks for GetPage() requests. Utility process should reply | 218 // Queue of callbacks for GetPage() requests. Utility process should reply |
198 // with PageDone in the same order as requests were received. | 219 // with PageDone in the same order as requests were received. |
199 // Use containers that keeps element pointers valid after push() and pop(). | 220 // Use containers that keeps element pointers valid after push() and pop(). |
200 using GetPageCallbacks = std::queue<GetPageCallbackData>; | 221 using GetPageCallbacks = std::queue<GetPageCallbackData>; |
201 GetPageCallbacks get_page_callbacks_; | 222 GetPageCallbacks get_page_callbacks_; |
| 223 |
| 224 DISALLOW_COPY_AND_ASSIGN(PdfConverterUtilityProcessHostClient); |
202 }; | 225 }; |
203 | 226 |
204 // Converts PDF into Emf. | 227 std::unique_ptr<MetafilePlayer> |
205 class PdfToEmfUtilityProcessHostClient | 228 PdfConverterUtilityProcessHostClient::GetFileFromTemp( |
206 : public PdfConverterUtilityProcessHostClient { | 229 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> |
207 public: | 230 temp_file) { |
208 PdfToEmfUtilityProcessHostClient(base::WeakPtr<PdfConverterImpl> converter, | 231 if (settings_.mode == PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2 || |
209 const PdfRenderSettings& settings) | 232 settings_.mode == PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) { |
210 : PdfConverterUtilityProcessHostClient(converter, settings) {} | 233 return base::MakeUnique<PostScriptMetaFile>(temp_dir_, |
211 | 234 std::move(temp_file)); |
212 bool OnMessageReceived(const IPC::Message& message) override; | 235 } |
213 | 236 return base::MakeUnique<LazyEmf>(temp_dir_, std::move(temp_file)); |
214 private: | 237 } |
215 ~PdfToEmfUtilityProcessHostClient() override; | |
216 // Helpers to send messages and set process name | |
217 base::string16 GetName() const override; | |
218 std::unique_ptr<MetafilePlayer> GetFileFromTemp( | |
219 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | |
220 temp_file) override; | |
221 void SendStartMessage(IPC::PlatformFileForTransit transit) override; | |
222 void SendGetPageMessage(int page_number, | |
223 IPC::PlatformFileForTransit transit) override; | |
224 void SendStopMessage() override; | |
225 | |
226 // Additional message handler needed for Pdf to Emf | |
227 void OnPreCacheFontCharacters(const LOGFONT& log_font, | |
228 const base::string16& characters); | |
229 | |
230 DISALLOW_COPY_AND_ASSIGN(PdfToEmfUtilityProcessHostClient); | |
231 }; | |
232 | 238 |
233 class PdfConverterImpl : public PdfConverter { | 239 class PdfConverterImpl : public PdfConverter { |
234 public: | 240 public: |
235 PdfConverterImpl(); | 241 PdfConverterImpl(); |
236 | 242 |
237 ~PdfConverterImpl() override; | 243 ~PdfConverterImpl() override; |
238 | 244 |
| 245 base::WeakPtr<PdfConverterImpl> GetWeakPtr() { |
| 246 return weak_ptr_factory_.GetWeakPtr(); |
| 247 } |
| 248 |
239 void Start(const scoped_refptr<base::RefCountedMemory>& data, | 249 void Start(const scoped_refptr<base::RefCountedMemory>& data, |
240 const PdfRenderSettings& conversion_settings, | 250 const PdfRenderSettings& conversion_settings, |
241 const StartCallback& start_callback) override; | 251 const StartCallback& start_callback); |
242 | 252 |
243 void GetPage(int page_number, | 253 void GetPage(int page_number, |
244 const GetPageCallback& get_page_callback) override; | 254 const GetPageCallback& get_page_callback) override; |
245 | 255 |
246 // Helps to cancel callbacks if this object is destroyed. | 256 // Helps to cancel callbacks if this object is destroyed. |
247 void RunCallback(const base::Closure& callback); | 257 void RunCallback(const base::Closure& callback); |
248 | 258 |
249 protected: | 259 void Start( |
| 260 const scoped_refptr<PdfConverterUtilityProcessHostClient>& utility_client, |
| 261 const scoped_refptr<base::RefCountedMemory>& data, |
| 262 const StartCallback& start_callback); |
| 263 |
| 264 private: |
250 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_; | 265 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_; |
251 | 266 |
252 private: | 267 base::WeakPtrFactory<PdfConverterImpl> weak_ptr_factory_; |
| 268 |
253 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl); | 269 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl); |
254 }; | 270 }; |
255 | 271 |
256 class PdfToEmfConverterImpl : public PdfConverterImpl { | |
257 public: | |
258 PdfToEmfConverterImpl(); | |
259 | |
260 ~PdfToEmfConverterImpl() override; | |
261 | |
262 void Start(const scoped_refptr<base::RefCountedMemory>& data, | |
263 const PdfRenderSettings& conversion_settings, | |
264 const StartCallback& start_callback) override; | |
265 | |
266 private: | |
267 base::WeakPtrFactory<PdfToEmfConverterImpl> weak_ptr_factory_; | |
268 | |
269 DISALLOW_COPY_AND_ASSIGN(PdfToEmfConverterImpl); | |
270 }; | |
271 | |
272 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) { | 272 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) { |
273 if (!temp_dir->get()) | 273 if (!temp_dir->get()) |
274 *temp_dir = new RefCountedTempDir(); | 274 *temp_dir = new RefCountedTempDir(); |
275 ScopedTempFile file; | 275 ScopedTempFile file; |
276 if (!(*temp_dir)->IsValid()) | 276 if (!(*temp_dir)->IsValid()) |
277 return file; | 277 return file; |
278 base::FilePath path; | 278 base::FilePath path; |
279 if (!base::CreateTemporaryFileInDir((*temp_dir)->GetPath(), &path)) { | 279 if (!base::CreateTemporaryFileInDir((*temp_dir)->GetPath(), &path)) { |
280 PLOG(ERROR) << "Failed to create file in " | 280 PLOG(ERROR) << "Failed to create file in " |
281 << (*temp_dir)->GetPath().value(); | 281 << (*temp_dir)->GetPath().value(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 file_->Seek(base::File::FROM_BEGIN, 0); | 340 file_->Seek(base::File::FROM_BEGIN, 0); |
341 int64_t size = file_->GetLength(); | 341 int64_t size = file_->GetLength(); |
342 if (size <= 0) | 342 if (size <= 0) |
343 return false; | 343 return false; |
344 std::vector<char> data(size); | 344 std::vector<char> data(size); |
345 if (file_->ReadAtCurrentPos(data.data(), data.size()) != size) | 345 if (file_->ReadAtCurrentPos(data.data(), data.size()) != size) |
346 return false; | 346 return false; |
347 return emf->InitFromData(data.data(), data.size()); | 347 return emf->InitFromData(data.data(), data.size()); |
348 } | 348 } |
349 | 349 |
| 350 PostScriptMetaFile::~PostScriptMetaFile() { |
| 351 } |
| 352 |
| 353 bool PostScriptMetaFile::SafePlayback(HDC hdc) const { |
| 354 // TODO(thestig): Fix destruction of metafiles. For some reasons |
| 355 // instances of Emf are not deleted. https://crbug.com/260806 |
| 356 // It's known that the Emf going to be played just once to a printer. So just |
| 357 // release |file_| before returning. |
| 358 Emf emf; |
| 359 if (!LoadEmf(&emf)) { |
| 360 Close(); |
| 361 return false; |
| 362 } |
| 363 |
| 364 { |
| 365 // Ensure enumerator destruction before calling Close() below. |
| 366 Emf::Enumerator emf_enum(emf, nullptr, nullptr); |
| 367 for (const Emf::Record& record : emf_enum) { |
| 368 auto* emf_record = record.record(); |
| 369 if (emf_record->iType != EMR_GDICOMMENT) |
| 370 continue; |
| 371 |
| 372 const EMRGDICOMMENT* comment = |
| 373 reinterpret_cast<const EMRGDICOMMENT*>(emf_record); |
| 374 const char* data = reinterpret_cast<const char*>(comment->Data); |
| 375 const uint16_t* ptr = reinterpret_cast<const uint16_t*>(data); |
| 376 int ret = ExtEscape(hdc, PASSTHROUGH, 2 + *ptr, data, 0, nullptr); |
| 377 DCHECK_EQ(*ptr, ret); |
| 378 } |
| 379 } |
| 380 Close(); |
| 381 return true; |
| 382 } |
| 383 |
350 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient( | 384 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient( |
351 base::WeakPtr<PdfConverterImpl> converter, | 385 base::WeakPtr<PdfConverterImpl> converter, |
352 const PdfRenderSettings& settings) | 386 const PdfRenderSettings& settings) |
353 : converter_(converter), settings_(settings) {} | 387 : converter_(converter), settings_(settings) {} |
354 | 388 |
355 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {} | 389 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {} |
356 | 390 |
357 void PdfConverterUtilityProcessHostClient::Start( | 391 void PdfConverterUtilityProcessHostClient::Start( |
358 const scoped_refptr<base::RefCountedMemory>& data, | 392 const scoped_refptr<base::RefCountedMemory>& data, |
359 const PdfConverter::StartCallback& start_callback) { | 393 const PdfConverter::StartCallback& start_callback) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 base::Bind(&PdfConverterImpl::RunCallback, converter_, | 491 base::Bind(&PdfConverterImpl::RunCallback, converter_, |
458 base::Bind(data.callback(), data.page_number(), scale_factor, | 492 base::Bind(data.callback(), data.page_number(), scale_factor, |
459 base::Passed(&file)))); | 493 base::Passed(&file)))); |
460 get_page_callbacks_.pop(); | 494 get_page_callbacks_.pop(); |
461 } | 495 } |
462 | 496 |
463 void PdfConverterUtilityProcessHostClient::Stop() { | 497 void PdfConverterUtilityProcessHostClient::Stop() { |
464 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 498 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
465 BrowserThread::PostTask( | 499 BrowserThread::PostTask( |
466 BrowserThread::IO, FROM_HERE, | 500 BrowserThread::IO, FROM_HERE, |
467 base::Bind(&PdfToEmfUtilityProcessHostClient::Stop, this)); | 501 base::Bind(&PdfConverterUtilityProcessHostClient::Stop, this)); |
468 return; | 502 return; |
469 } | 503 } |
470 SendStopMessage(); | 504 SendStopMessage(); |
471 } | 505 } |
472 | 506 |
473 void PdfConverterUtilityProcessHostClient::OnProcessCrashed(int exit_code) { | 507 void PdfConverterUtilityProcessHostClient::OnProcessCrashed(int exit_code) { |
474 OnFailed(); | 508 OnFailed(); |
475 } | 509 } |
476 | 510 |
477 void PdfConverterUtilityProcessHostClient::OnProcessLaunchFailed( | 511 void PdfConverterUtilityProcessHostClient::OnProcessLaunchFailed( |
(...skipping 10 matching lines...) Expand all Loading... |
488 | 522 |
489 void PdfConverterUtilityProcessHostClient::OnFailed() { | 523 void PdfConverterUtilityProcessHostClient::OnFailed() { |
490 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 524 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
491 if (!start_callback_.is_null()) | 525 if (!start_callback_.is_null()) |
492 OnPageCount(0); | 526 OnPageCount(0); |
493 while (!get_page_callbacks_.empty()) | 527 while (!get_page_callbacks_.empty()) |
494 OnPageDone(false, 0.0f); | 528 OnPageDone(false, 0.0f); |
495 utility_process_host_.reset(); | 529 utility_process_host_.reset(); |
496 } | 530 } |
497 | 531 |
498 // PDF to Emf | |
499 PdfToEmfUtilityProcessHostClient::~PdfToEmfUtilityProcessHostClient() {} | |
500 | 532 |
501 void PdfToEmfUtilityProcessHostClient::OnPreCacheFontCharacters( | 533 void PdfConverterUtilityProcessHostClient::OnPreCacheFontCharacters( |
502 const LOGFONT& font, | 534 const LOGFONT& font, |
503 const base::string16& str) { | 535 const base::string16& str) { |
504 // TODO(scottmg): pdf/ppapi still require the renderer to be able to precache | 536 // TODO(scottmg): pdf/ppapi still require the renderer to be able to precache |
505 // GDI fonts (http://crbug.com/383227), even when using DirectWrite. | 537 // GDI fonts (http://crbug.com/383227), even when using DirectWrite. |
506 // Eventually this shouldn't be added and should be moved to | 538 // Eventually this shouldn't be added and should be moved to |
507 // FontCacheDispatcher too. http://crbug.com/356346. | 539 // FontCacheDispatcher too. http://crbug.com/356346. |
508 | 540 |
509 // First, comments from FontCacheDispatcher::OnPreCacheFont do apply here too. | 541 // First, comments from FontCacheDispatcher::OnPreCacheFont do apply here too. |
510 // Except that for True Type fonts, | 542 // Except that for True Type fonts, |
511 // GetTextMetrics will not load the font in memory. | 543 // GetTextMetrics will not load the font in memory. |
(...skipping 11 matching lines...) Expand all Loading... |
523 | 555 |
524 SelectObject(hdc, old_font); | 556 SelectObject(hdc, old_font); |
525 DeleteObject(font_handle); | 557 DeleteObject(font_handle); |
526 | 558 |
527 HENHMETAFILE metafile = CloseEnhMetaFile(hdc); | 559 HENHMETAFILE metafile = CloseEnhMetaFile(hdc); |
528 | 560 |
529 if (metafile) | 561 if (metafile) |
530 DeleteEnhMetaFile(metafile); | 562 DeleteEnhMetaFile(metafile); |
531 } | 563 } |
532 | 564 |
533 bool PdfToEmfUtilityProcessHostClient::OnMessageReceived( | 565 bool PdfConverterUtilityProcessHostClient::OnMessageReceived( |
534 const IPC::Message& message) { | 566 const IPC::Message& message) { |
535 bool handled = true; | 567 bool handled = true; |
536 IPC_BEGIN_MESSAGE_MAP(PdfToEmfUtilityProcessHostClient, message) | 568 IPC_BEGIN_MESSAGE_MAP(PdfConverterUtilityProcessHostClient, message) |
537 IPC_MESSAGE_HANDLER( | 569 IPC_MESSAGE_HANDLER( |
538 ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount, OnPageCount) | 570 ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount, OnPageCount) |
539 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone, | 571 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone, |
540 OnPageDone) | 572 OnPageDone) |
541 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_PreCacheFontCharacters, | 573 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_PreCacheFontCharacters, |
542 OnPreCacheFontCharacters) | 574 OnPreCacheFontCharacters) |
543 IPC_MESSAGE_UNHANDLED(handled = false) | 575 IPC_MESSAGE_UNHANDLED(handled = false) |
544 IPC_END_MESSAGE_MAP() | 576 IPC_END_MESSAGE_MAP() |
545 return handled; | 577 return handled; |
546 } | 578 } |
547 | 579 |
548 base::string16 PdfToEmfUtilityProcessHostClient::GetName() const { | 580 base::string16 PdfConverterUtilityProcessHostClient::GetName() const { |
549 return l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_EMF_CONVERTOR_NAME); | 581 return l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_PDF_CONVERTOR_NAME); |
550 } | 582 } |
551 | 583 |
552 std::unique_ptr<MetafilePlayer> | 584 void PdfConverterUtilityProcessHostClient::SendGetPageMessage( |
553 PdfToEmfUtilityProcessHostClient::GetFileFromTemp( | |
554 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | |
555 temp_file) { | |
556 return base::MakeUnique<LazyEmf>(temp_dir_, std::move(temp_file)); | |
557 } | |
558 | |
559 void PdfToEmfUtilityProcessHostClient::SendGetPageMessage( | |
560 int page_number, | 585 int page_number, |
561 IPC::PlatformFileForTransit transit) { | 586 IPC::PlatformFileForTransit transit) { |
562 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number, | 587 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number, |
563 transit)); | 588 transit)); |
564 } | 589 } |
565 | 590 |
566 void PdfToEmfUtilityProcessHostClient::SendStartMessage( | 591 void PdfConverterUtilityProcessHostClient::SendStartMessage( |
567 IPC::PlatformFileForTransit transit) { | 592 IPC::PlatformFileForTransit transit) { |
568 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_)); | 593 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_)); |
569 } | 594 } |
570 | 595 |
571 void PdfToEmfUtilityProcessHostClient::SendStopMessage() { | 596 void PdfConverterUtilityProcessHostClient::SendStopMessage() { |
572 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop()); | 597 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop()); |
573 } | 598 } |
| 599 /*void PdfToPostScriptUtilityProcessHostClient::OnPageDone(bool success) { |
| 600 PdfConverterUtilityProcessHostClient::OnPageDone(success, 0.0f); |
| 601 } |
| 602 */ |
| 603 // Pdf Converter Impl and subclasses |
| 604 PdfConverterImpl::PdfConverterImpl() : weak_ptr_factory_(this) {} |
574 | 605 |
575 // Pdf Converter Impl and subclasses | 606 PdfConverterImpl::~PdfConverterImpl() { |
576 PdfConverterImpl::PdfConverterImpl() {} | 607 if (utility_client_.get()) |
| 608 utility_client_->Stop(); |
| 609 } |
577 | 610 |
578 PdfConverterImpl::~PdfConverterImpl() {} | 611 void PdfConverterImpl::Start( |
579 | 612 const scoped_refptr<PdfConverterUtilityProcessHostClient>& utility_client, |
580 void PdfConverterImpl::Start(const scoped_refptr<base::RefCountedMemory>& data, | 613 const scoped_refptr<base::RefCountedMemory>& data, |
581 const PdfRenderSettings& conversion_settings, | 614 const StartCallback& start_callback) { |
582 const StartCallback& start_callback) { | 615 DCHECK(!utility_client_); |
583 DCHECK(!utility_client_.get()); | 616 utility_client_ = utility_client; |
| 617 utility_client_->Start(data, start_callback); |
584 } | 618 } |
585 | 619 |
586 void PdfConverterImpl::GetPage(int page_number, | 620 void PdfConverterImpl::GetPage(int page_number, |
587 const GetPageCallback& get_page_callback) { | 621 const GetPageCallback& get_page_callback) { |
588 utility_client_->GetPage(page_number, get_page_callback); | 622 utility_client_->GetPage(page_number, get_page_callback); |
589 } | 623 } |
590 | 624 |
591 void PdfConverterImpl::RunCallback(const base::Closure& callback) { | 625 void PdfConverterImpl::RunCallback(const base::Closure& callback) { |
592 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 626 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
593 callback.Run(); | 627 callback.Run(); |
594 } | 628 } |
595 | 629 |
596 PdfToEmfConverterImpl::PdfToEmfConverterImpl() : weak_ptr_factory_(this) {} | |
597 | |
598 PdfToEmfConverterImpl::~PdfToEmfConverterImpl() { | |
599 if (utility_client_.get()) | |
600 utility_client_->Stop(); | |
601 } | |
602 | |
603 void PdfToEmfConverterImpl::Start( | |
604 const scoped_refptr<base::RefCountedMemory>& data, | |
605 const PdfRenderSettings& conversion_settings, | |
606 const StartCallback& start_callback) { | |
607 DCHECK(!utility_client_.get()); | |
608 utility_client_ = new PdfToEmfUtilityProcessHostClient( | |
609 weak_ptr_factory_.GetWeakPtr(), conversion_settings); | |
610 utility_client_->Start(data, start_callback); | |
611 } | |
612 | |
613 } // namespace | 630 } // namespace |
614 | 631 |
615 PdfConverter::~PdfConverter() {} | 632 PdfConverter::~PdfConverter() {} |
616 | 633 |
617 // static | 634 // static |
618 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToEmfConverter() { | 635 std::unique_ptr<PdfConverter> PdfConverter::StartPdfConverter( |
619 return base::MakeUnique<PdfToEmfConverterImpl>(); | 636 const scoped_refptr<base::RefCountedMemory>& data, |
| 637 const PdfRenderSettings& conversion_settings, |
| 638 const StartCallback& start_callback) { |
| 639 std::unique_ptr<PdfConverterImpl> converter = |
| 640 base::MakeUnique<PdfConverterImpl>(); |
| 641 converter->Start( |
| 642 new PdfConverterUtilityProcessHostClient(converter->GetWeakPtr(), |
| 643 conversion_settings), |
| 644 data, start_callback); |
| 645 return std::move(converter); |
620 } | 646 } |
621 | 647 |
622 } // namespace printing | 648 } // namespace printing |
OLD | NEW |