Chromium Code Reviews| 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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 public: | 70 public: |
| 71 LazyEmf(const scoped_refptr<RefCountedTempDir>& temp_dir, ScopedTempFile file) | 71 LazyEmf(const scoped_refptr<RefCountedTempDir>& temp_dir, ScopedTempFile file) |
| 72 : temp_dir_(temp_dir), file_(std::move(file)) { | 72 : temp_dir_(temp_dir), file_(std::move(file)) { |
| 73 CHECK(file_); | 73 CHECK(file_); |
| 74 } | 74 } |
| 75 ~LazyEmf() override { Close(); } | 75 ~LazyEmf() override { Close(); } |
| 76 | 76 |
| 77 protected: | 77 protected: |
| 78 // MetafilePlayer: | 78 // MetafilePlayer: |
| 79 bool SafePlayback(HDC hdc) const override; | 79 bool SafePlayback(HDC hdc) const override; |
| 80 | |
| 81 void Close() const; | 80 void Close() const; |
| 82 bool LoadEmf(Emf* emf) const; | 81 bool LoadEmf(Emf* emf) const; |
| 83 | 82 |
| 84 private: | 83 private: |
| 85 mutable scoped_refptr<RefCountedTempDir> temp_dir_; | 84 mutable scoped_refptr<RefCountedTempDir> temp_dir_; |
| 86 mutable ScopedTempFile file_; // Mutable because of consts in base class. | 85 mutable ScopedTempFile file_; // Mutable because of consts in base class. |
| 87 | 86 |
| 88 bool GetDataAsVector(std::vector<char>* buffer) const override; | 87 bool GetDataAsVector(std::vector<char>* buffer) const override; |
| 89 bool SaveTo(base::File* file) const override; | 88 bool SaveTo(base::File* file) const override; |
| 90 | 89 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 105 // All these steps work sequentially, so no data should be accessed | 104 // All these steps work sequentially, so no data should be accessed |
| 106 // simultaneously by several threads. | 105 // simultaneously by several threads. |
| 107 class PdfConverterUtilityProcessHostClient | 106 class PdfConverterUtilityProcessHostClient |
| 108 : public content::UtilityProcessHostClient { | 107 : public content::UtilityProcessHostClient { |
| 109 public: | 108 public: |
| 110 PdfConverterUtilityProcessHostClient( | 109 PdfConverterUtilityProcessHostClient( |
| 111 base::WeakPtr<PdfConverterImpl> converter, | 110 base::WeakPtr<PdfConverterImpl> converter, |
| 112 const PdfRenderSettings& settings); | 111 const PdfRenderSettings& settings); |
| 113 | 112 |
| 114 void Start(const scoped_refptr<base::RefCountedMemory>& data, | 113 void Start(const scoped_refptr<base::RefCountedMemory>& data, |
| 115 bool print_text_with_gdi, | |
| 116 const PdfConverter::StartCallback& start_callback); | 114 const PdfConverter::StartCallback& start_callback); |
| 117 | 115 |
| 118 void GetPage(int page_number, | 116 void GetPage(int page_number, |
| 119 const PdfConverter::GetPageCallback& get_page_callback); | 117 const PdfConverter::GetPageCallback& get_page_callback); |
| 120 | 118 |
| 121 void Stop(); | 119 void Stop(); |
| 122 | 120 |
| 123 // UtilityProcessHostClient implementation. | 121 // UtilityProcessHostClient implementation. |
| 124 void OnProcessCrashed(int exit_code) override; | 122 void OnProcessCrashed(int exit_code) override; |
| 125 void OnProcessLaunchFailed(int exit_code) override; | 123 void OnProcessLaunchFailed(int exit_code) override; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 145 return *this; | 143 return *this; |
| 146 } | 144 } |
| 147 | 145 |
| 148 int page_number() const { return page_number_; } | 146 int page_number() const { return page_number_; } |
| 149 const PdfConverter::GetPageCallback& callback() const { return callback_; } | 147 const PdfConverter::GetPageCallback& callback() const { return callback_; } |
| 150 ScopedTempFile TakeFile() { return std::move(file_); } | 148 ScopedTempFile TakeFile() { return std::move(file_); } |
| 151 void set_file(ScopedTempFile file) { file_ = std::move(file); } | 149 void set_file(ScopedTempFile file) { file_ = std::move(file); } |
| 152 | 150 |
| 153 private: | 151 private: |
| 154 int page_number_; | 152 int page_number_; |
| 155 | |
| 156 PdfConverter::GetPageCallback callback_; | 153 PdfConverter::GetPageCallback callback_; |
| 157 ScopedTempFile file_; | 154 ScopedTempFile file_; |
| 158 | 155 |
| 159 DISALLOW_COPY_AND_ASSIGN(GetPageCallbackData); | 156 DISALLOW_COPY_AND_ASSIGN(GetPageCallbackData); |
| 160 }; | 157 }; |
| 161 | 158 |
| 162 ~PdfConverterUtilityProcessHostClient() override; | 159 ~PdfConverterUtilityProcessHostClient() override; |
| 163 | 160 |
| 164 // Helper functions: must be overridden by subclasses | 161 // Helper functions: must be overridden by subclasses |
| 165 // Set the process name | 162 // Set the process name |
| 166 virtual base::string16 GetName() const = 0; | 163 virtual base::string16 GetName() const = 0; |
| 167 // Create a metafileplayer subclass file from a temporary file. | 164 // Create a metafileplayer subclass file from a temporary file. |
| 168 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp( | 165 virtual std::unique_ptr<MetafilePlayer> GetFileFromTemp( |
| 169 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | 166 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> |
| 170 temp_file) = 0; | 167 temp_file) = 0; |
| 171 // Send the messages to Start, GetPage, and Stop. | 168 // Send the messages to Start, GetPage, and Stop. |
| 172 virtual void SendStartMessage(IPC::PlatformFileForTransit transit, | 169 virtual void SendStartMessage(IPC::PlatformFileForTransit transit) = 0; |
| 173 bool print_text_with_gdi) = 0; | |
| 174 virtual void SendGetPageMessage(int page_number, | 170 virtual void SendGetPageMessage(int page_number, |
| 175 IPC::PlatformFileForTransit transit) = 0; | 171 IPC::PlatformFileForTransit transit) = 0; |
| 176 virtual void SendStopMessage() = 0; | 172 virtual void SendStopMessage() = 0; |
| 177 | 173 |
| 178 // Message handlers: | 174 // Message handlers: |
| 179 void OnPageCount(int page_count); | 175 void OnPageCount(int page_count); |
| 180 void OnPageDone(bool success, float scale_factor); | 176 void OnPageDone(bool success, float scale_factor); |
| 181 | 177 |
| 182 void OnFailed(); | 178 void OnFailed(); |
| 183 void OnTempPdfReady(bool print_text_with_gdi, ScopedTempFile pdf); | 179 void OnTempPdfReady(ScopedTempFile pdf); |
| 184 void OnTempFileReady(GetPageCallbackData* callback_data, | 180 void OnTempFileReady(GetPageCallbackData* callback_data, |
| 185 ScopedTempFile temp_file); | 181 ScopedTempFile temp_file); |
| 186 | |
| 187 scoped_refptr<RefCountedTempDir> temp_dir_; | 182 scoped_refptr<RefCountedTempDir> temp_dir_; |
| 188 | 183 |
| 189 // Used to suppress callbacks after PdfConverter is deleted. | 184 // Used to suppress callbacks after PdfConverter is deleted. |
| 190 base::WeakPtr<PdfConverterImpl> converter_; | 185 base::WeakPtr<PdfConverterImpl> converter_; |
| 191 PdfRenderSettings settings_; | 186 PdfRenderSettings settings_; |
| 192 | 187 |
| 193 // Document loaded callback. | 188 // Document loaded callback. |
| 194 PdfConverter::StartCallback start_callback_; | 189 PdfConverter::StartCallback start_callback_; |
| 195 | 190 |
| 196 // Process host for IPC. | 191 // Process host for IPC. |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 213 | 208 |
| 214 bool OnMessageReceived(const IPC::Message& message) override; | 209 bool OnMessageReceived(const IPC::Message& message) override; |
| 215 | 210 |
| 216 private: | 211 private: |
| 217 ~PdfToEmfUtilityProcessHostClient() override; | 212 ~PdfToEmfUtilityProcessHostClient() override; |
| 218 // Helpers to send messages and set process name | 213 // Helpers to send messages and set process name |
| 219 base::string16 GetName() const override; | 214 base::string16 GetName() const override; |
| 220 std::unique_ptr<MetafilePlayer> GetFileFromTemp( | 215 std::unique_ptr<MetafilePlayer> GetFileFromTemp( |
| 221 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | 216 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> |
| 222 temp_file) override; | 217 temp_file) override; |
| 223 void SendStartMessage(IPC::PlatformFileForTransit transit, | 218 void SendStartMessage(IPC::PlatformFileForTransit transit) override; |
| 224 bool print_text_with_gdi) override; | |
| 225 void SendGetPageMessage(int page_number, | 219 void SendGetPageMessage(int page_number, |
| 226 IPC::PlatformFileForTransit transit) override; | 220 IPC::PlatformFileForTransit transit) override; |
| 227 void SendStopMessage() override; | 221 void SendStopMessage() override; |
| 228 | 222 |
| 229 // Additional message handler needed for Pdf to Emf | 223 // Additional message handler needed for Pdf to Emf |
| 230 void OnPreCacheFontCharacters(const LOGFONT& log_font, | 224 void OnPreCacheFontCharacters(const LOGFONT& log_font, |
| 231 const base::string16& characters); | 225 const base::string16& characters); |
| 232 | 226 |
| 233 DISALLOW_COPY_AND_ASSIGN(PdfToEmfUtilityProcessHostClient); | 227 DISALLOW_COPY_AND_ASSIGN(PdfToEmfUtilityProcessHostClient); |
| 234 }; | 228 }; |
| 235 | 229 |
| 230 // Converts PDF into PostScript. | |
| 231 class PdfToPostScriptUtilityProcessHostClient | |
| 232 : public PdfConverterUtilityProcessHostClient { | |
| 233 public: | |
| 234 PdfToPostScriptUtilityProcessHostClient( | |
| 235 base::WeakPtr<PdfConverterImpl> converter, | |
| 236 const PdfRenderSettings& settings) | |
| 237 : PdfConverterUtilityProcessHostClient(converter, settings) {} | |
| 238 | |
| 239 // UtilityProcessHostClient implementation. | |
| 240 bool OnMessageReceived(const IPC::Message& message) override; | |
| 241 | |
| 242 private: | |
| 243 // Helpers to send messages and set process name | |
| 244 base::string16 GetName() const override; | |
| 245 std::unique_ptr<MetafilePlayer> GetFileFromTemp( | |
| 246 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | |
| 247 temp_file) override; | |
| 248 void SendStartMessage(IPC::PlatformFileForTransit transit) override; | |
| 249 void SendGetPageMessage(int page_number, | |
| 250 IPC::PlatformFileForTransit transit) override; | |
| 251 void SendStopMessage() override; | |
| 252 | |
| 253 // Additional message handler needed for Pdf to PostScript | |
| 254 void OnPageDone(bool success); | |
| 255 | |
| 256 DISALLOW_COPY_AND_ASSIGN(PdfToPostScriptUtilityProcessHostClient); | |
| 257 }; | |
| 258 | |
| 236 class PdfConverterImpl : public PdfConverter { | 259 class PdfConverterImpl : public PdfConverter { |
| 237 public: | 260 public: |
| 238 PdfConverterImpl(); | 261 PdfConverterImpl(); |
| 239 | 262 |
| 240 ~PdfConverterImpl() override; | 263 ~PdfConverterImpl() override; |
| 241 | 264 |
| 242 void Start(const scoped_refptr<base::RefCountedMemory>& data, | 265 void Start(const scoped_refptr<base::RefCountedMemory>& data, |
| 243 const PdfRenderSettings& conversion_settings, | 266 const PdfRenderSettings& conversion_settings, |
| 244 bool print_text_with_gdi, | |
| 245 const StartCallback& start_callback) override; | 267 const StartCallback& start_callback) override; |
| 246 | 268 |
| 247 void GetPage(int page_number, | 269 void GetPage(int page_number, |
| 248 const GetPageCallback& get_page_callback) override; | 270 const GetPageCallback& get_page_callback) override; |
| 249 | 271 |
| 250 // Helps to cancel callbacks if this object is destroyed. | 272 // Helps to cancel callbacks if this object is destroyed. |
| 251 void RunCallback(const base::Closure& callback); | 273 void RunCallback(const base::Closure& callback); |
| 252 | 274 |
| 253 protected: | 275 protected: |
| 254 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_; | 276 scoped_refptr<PdfConverterUtilityProcessHostClient> utility_client_; |
| 255 | 277 |
| 256 private: | 278 private: |
| 257 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl); | 279 DISALLOW_COPY_AND_ASSIGN(PdfConverterImpl); |
| 258 }; | 280 }; |
| 259 | 281 |
| 260 class PdfToEmfConverterImpl : public PdfConverterImpl { | 282 class PdfToEmfConverterImpl : public PdfConverterImpl { |
| 261 public: | 283 public: |
| 262 PdfToEmfConverterImpl(); | 284 PdfToEmfConverterImpl(); |
| 263 | 285 |
| 264 ~PdfToEmfConverterImpl() override; | 286 ~PdfToEmfConverterImpl() override; |
| 265 | 287 |
| 266 void Start(const scoped_refptr<base::RefCountedMemory>& data, | 288 void Start(const scoped_refptr<base::RefCountedMemory>& data, |
| 267 const PdfRenderSettings& conversion_settings, | 289 const PdfRenderSettings& conversion_settings, |
| 268 bool print_text_with_gdi, | |
| 269 const StartCallback& start_callback) override; | 290 const StartCallback& start_callback) override; |
| 270 | 291 |
| 271 private: | 292 private: |
| 272 base::WeakPtrFactory<PdfToEmfConverterImpl> weak_ptr_factory_; | 293 base::WeakPtrFactory<PdfToEmfConverterImpl> weak_ptr_factory_; |
| 294 DISALLOW_COPY_AND_ASSIGN(PdfToEmfConverterImpl); | |
| 295 }; | |
| 273 | 296 |
| 274 DISALLOW_COPY_AND_ASSIGN(PdfToEmfConverterImpl); | 297 class PdfToPostScriptConverterImpl : public PdfConverterImpl { |
| 298 public: | |
| 299 PdfToPostScriptConverterImpl(); | |
| 300 ~PdfToPostScriptConverterImpl() {} | |
| 301 | |
| 302 void Start(const scoped_refptr<base::RefCountedMemory>& data, | |
| 303 const PdfRenderSettings& conversion_settings, | |
| 304 const StartCallback& start_callback) override; | |
| 305 | |
| 306 private: | |
| 307 base::WeakPtrFactory<PdfToPostScriptConverterImpl> weak_ptr_factory_; | |
| 308 DISALLOW_COPY_AND_ASSIGN(PdfToPostScriptConverterImpl); | |
| 275 }; | 309 }; |
| 276 | 310 |
| 277 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) { | 311 ScopedTempFile CreateTempFile(scoped_refptr<RefCountedTempDir>* temp_dir) { |
| 278 if (!temp_dir->get()) | 312 if (!temp_dir->get()) |
| 279 *temp_dir = new RefCountedTempDir(); | 313 *temp_dir = new RefCountedTempDir(); |
| 280 ScopedTempFile file; | 314 ScopedTempFile file; |
| 281 if (!(*temp_dir)->IsValid()) | 315 if (!(*temp_dir)->IsValid()) |
| 282 return file; | 316 return file; |
| 283 base::FilePath path; | 317 base::FilePath path; |
| 284 if (!base::CreateTemporaryFileInDir((*temp_dir)->GetPath(), &path)) { | 318 if (!base::CreateTemporaryFileInDir((*temp_dir)->GetPath(), &path)) { |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 345 file_->Seek(base::File::FROM_BEGIN, 0); | 379 file_->Seek(base::File::FROM_BEGIN, 0); |
| 346 int64_t size = file_->GetLength(); | 380 int64_t size = file_->GetLength(); |
| 347 if (size <= 0) | 381 if (size <= 0) |
| 348 return false; | 382 return false; |
| 349 std::vector<char> data(size); | 383 std::vector<char> data(size); |
| 350 if (file_->ReadAtCurrentPos(data.data(), data.size()) != size) | 384 if (file_->ReadAtCurrentPos(data.data(), data.size()) != size) |
| 351 return false; | 385 return false; |
| 352 return emf->InitFromData(data.data(), data.size()); | 386 return emf->InitFromData(data.data(), data.size()); |
| 353 } | 387 } |
| 354 | 388 |
| 389 // Postscript metafile subclass to override SafePlayback. | |
| 390 class PostScriptMetaFile : public LazyEmf { | |
| 391 public: | |
| 392 PostScriptMetaFile(const scoped_refptr<RefCountedTempDir>& temp_dir, | |
| 393 ScopedTempFile file) | |
| 394 : LazyEmf(temp_dir, std::move(file)) {} | |
| 395 ~PostScriptMetaFile() {} | |
| 396 | |
| 397 protected: | |
| 398 // MetafilePlayer: | |
| 399 bool SafePlayback(HDC hdc) const override; | |
| 400 | |
| 401 DISALLOW_COPY_AND_ASSIGN(PostScriptMetaFile); | |
| 402 }; | |
| 403 | |
| 404 bool PostScriptMetaFile::SafePlayback(HDC hdc) const { | |
| 405 // TODO(thestig): Fix destruction of metafiles. For some reasons | |
| 406 // instances of Emf are not deleted. https://crbug.com/260806 | |
| 407 // It's known that the Emf going to be played just once to a printer. So just | |
| 408 // release |file_| before returning. | |
| 409 Emf emf; | |
| 410 if (!LoadEmf(&emf)) { | |
| 411 Close(); | |
| 412 return false; | |
| 413 } | |
| 414 | |
| 415 { | |
| 416 // Ensure enumerator destruction before calling Close() below. | |
| 417 Emf::Enumerator emf_enum(emf, nullptr, nullptr); | |
|
Vitaly Buka (NO REVIEWS)
2017/01/27 00:38:49
Why postscript is encoded as GDI comment into EMF?
rbpotter
2017/01/27 16:37:21
This was originally done by thestig@, so I am not
| |
| 418 for (const Emf::Record& record : emf_enum) { | |
| 419 auto* emf_record = record.record(); | |
| 420 if (emf_record->iType != EMR_GDICOMMENT) | |
| 421 continue; | |
| 422 | |
| 423 const EMRGDICOMMENT* comment = | |
| 424 reinterpret_cast<const EMRGDICOMMENT*>(emf_record); | |
| 425 const char* data = reinterpret_cast<const char*>(comment->Data); | |
| 426 const uint16_t* ptr = reinterpret_cast<const uint16_t*>(data); | |
| 427 int ret = ExtEscape(hdc, PASSTHROUGH, 2 + *ptr, data, 0, nullptr); | |
| 428 DCHECK_EQ(*ptr, ret); | |
| 429 } | |
| 430 } | |
| 431 Close(); | |
| 432 return true; | |
| 433 } | |
| 434 | |
| 355 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient( | 435 PdfConverterUtilityProcessHostClient::PdfConverterUtilityProcessHostClient( |
| 356 base::WeakPtr<PdfConverterImpl> converter, | 436 base::WeakPtr<PdfConverterImpl> converter, |
| 357 const PdfRenderSettings& settings) | 437 const PdfRenderSettings& settings) |
| 358 : converter_(converter), settings_(settings) {} | 438 : converter_(converter), settings_(settings) {} |
| 359 | 439 |
| 360 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {} | 440 PdfConverterUtilityProcessHostClient::~PdfConverterUtilityProcessHostClient() {} |
| 361 | 441 |
| 362 void PdfConverterUtilityProcessHostClient::Start( | 442 void PdfConverterUtilityProcessHostClient::Start( |
| 363 const scoped_refptr<base::RefCountedMemory>& data, | 443 const scoped_refptr<base::RefCountedMemory>& data, |
| 364 bool print_text_with_gdi, | |
| 365 const PdfConverter::StartCallback& start_callback) { | 444 const PdfConverter::StartCallback& start_callback) { |
| 366 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 445 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { |
| 367 BrowserThread::PostTask( | 446 BrowserThread::PostTask( |
| 368 BrowserThread::IO, FROM_HERE, | 447 BrowserThread::IO, FROM_HERE, |
| 369 base::Bind(&PdfConverterUtilityProcessHostClient::Start, this, data, | 448 base::Bind(&PdfConverterUtilityProcessHostClient::Start, this, data, |
| 370 print_text_with_gdi, start_callback)); | 449 start_callback)); |
| 371 return; | 450 return; |
| 372 } | 451 } |
| 373 | 452 |
| 374 // Store callback before any OnFailed() call to make it called on failure. | 453 // Store callback before any OnFailed() call to make it called on failure. |
| 375 start_callback_ = start_callback; | 454 start_callback_ = start_callback; |
| 376 | 455 |
| 377 // NOTE: This process _must_ be sandboxed, otherwise the pdf dll will load | 456 // NOTE: This process _must_ be sandboxed, otherwise the pdf dll will load |
| 378 // gdiplus.dll, change how rendering happens, and not be able to correctly | 457 // gdiplus.dll, change how rendering happens, and not be able to correctly |
| 379 // generate when sent to a metafile DC. | 458 // generate when sent to a metafile DC. |
| 380 utility_process_host_ = content::UtilityProcessHost::Create( | 459 utility_process_host_ = content::UtilityProcessHost::Create( |
| 381 this, base::ThreadTaskRunnerHandle::Get()) | 460 this, base::ThreadTaskRunnerHandle::Get()) |
| 382 ->AsWeakPtr(); | 461 ->AsWeakPtr(); |
| 383 utility_process_host_->SetName(GetName()); | 462 utility_process_host_->SetName(GetName()); |
| 384 | 463 |
| 385 BrowserThread::PostTaskAndReplyWithResult( | 464 BrowserThread::PostTaskAndReplyWithResult( |
| 386 BrowserThread::FILE, FROM_HERE, | 465 BrowserThread::FILE, FROM_HERE, |
| 387 base::Bind(&CreateTempPdfFile, data, &temp_dir_), | 466 base::Bind(&CreateTempPdfFile, data, &temp_dir_), |
| 388 base::Bind(&PdfConverterUtilityProcessHostClient::OnTempPdfReady, this, | 467 base::Bind(&PdfConverterUtilityProcessHostClient::OnTempPdfReady, this)); |
| 389 print_text_with_gdi)); | |
| 390 } | 468 } |
| 391 | 469 |
| 392 void PdfConverterUtilityProcessHostClient::OnTempPdfReady( | 470 void PdfConverterUtilityProcessHostClient::OnTempPdfReady(ScopedTempFile pdf) { |
| 393 bool print_text_with_gdi, | |
| 394 ScopedTempFile pdf) { | |
| 395 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 471 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 396 if (!utility_process_host_ || !pdf) | 472 if (!utility_process_host_ || !pdf) |
| 397 return OnFailed(); | 473 return OnFailed(); |
| 398 // Should reply with OnPageCount(). | 474 // Should reply with OnPageCount(). |
| 399 SendStartMessage( | 475 SendStartMessage( |
| 400 IPC::GetPlatformFileForTransit(pdf->GetPlatformFile(), false), | 476 IPC::GetPlatformFileForTransit(pdf->GetPlatformFile(), false)); |
| 401 print_text_with_gdi); | |
| 402 } | 477 } |
| 403 | 478 |
| 404 void PdfConverterUtilityProcessHostClient::OnPageCount(int page_count) { | 479 void PdfConverterUtilityProcessHostClient::OnPageCount(int page_count) { |
| 405 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 480 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 406 if (start_callback_.is_null()) | 481 if (start_callback_.is_null()) |
| 407 return OnFailed(); | 482 return OnFailed(); |
| 408 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 483 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 409 base::Bind(&PdfConverterImpl::RunCallback, converter_, | 484 base::Bind(&PdfConverterImpl::RunCallback, converter_, |
| 410 base::Bind(start_callback_, page_count))); | 485 base::Bind(start_callback_, page_count))); |
| 411 start_callback_.Reset(); | 486 start_callback_.Reset(); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 567 } | 642 } |
| 568 | 643 |
| 569 void PdfToEmfUtilityProcessHostClient::SendGetPageMessage( | 644 void PdfToEmfUtilityProcessHostClient::SendGetPageMessage( |
| 570 int page_number, | 645 int page_number, |
| 571 IPC::PlatformFileForTransit transit) { | 646 IPC::PlatformFileForTransit transit) { |
| 572 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number, | 647 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage(page_number, |
| 573 transit)); | 648 transit)); |
| 574 } | 649 } |
| 575 | 650 |
| 576 void PdfToEmfUtilityProcessHostClient::SendStartMessage( | 651 void PdfToEmfUtilityProcessHostClient::SendStartMessage( |
| 577 IPC::PlatformFileForTransit transit, | 652 IPC::PlatformFileForTransit transit) { |
| 578 bool print_text_with_gdi) { | 653 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_)); |
| 579 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles(transit, settings_, | |
| 580 print_text_with_gdi)); | |
| 581 } | 654 } |
| 582 | 655 |
| 583 void PdfToEmfUtilityProcessHostClient::SendStopMessage() { | 656 void PdfToEmfUtilityProcessHostClient::SendStopMessage() { |
| 584 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop()); | 657 Send(new ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop()); |
| 585 } | 658 } |
| 586 | 659 |
| 660 // Pdf to PostScript | |
| 661 bool PdfToPostScriptUtilityProcessHostClient::OnMessageReceived( | |
| 662 const IPC::Message& message) { | |
| 663 bool handled = true; | |
| 664 IPC_BEGIN_MESSAGE_MAP(PdfToPostScriptUtilityProcessHostClient, message) | |
| 665 IPC_MESSAGE_HANDLER( | |
| 666 ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageCount, OnPageCount) | |
| 667 IPC_MESSAGE_HANDLER( | |
| 668 ChromeUtilityHostMsg_RenderPDFPagesToPostScript_PageDone, OnPageDone) | |
| 669 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 670 IPC_END_MESSAGE_MAP() | |
| 671 return handled; | |
| 672 } | |
| 673 | |
| 674 base::string16 PdfToPostScriptUtilityProcessHostClient::GetName() const { | |
| 675 return l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_PS_CONVERTOR_NAME); | |
| 676 } | |
| 677 | |
| 678 std::unique_ptr<MetafilePlayer> | |
| 679 PdfToPostScriptUtilityProcessHostClient::GetFileFromTemp( | |
| 680 std::unique_ptr<base::File, content::BrowserThread::DeleteOnFileThread> | |
| 681 temp_file) { | |
| 682 return base::MakeUnique<PostScriptMetaFile>(temp_dir_, std::move(temp_file)); | |
| 683 } | |
| 684 | |
| 685 void PdfToPostScriptUtilityProcessHostClient::SendGetPageMessage( | |
| 686 int page_number, | |
| 687 IPC::PlatformFileForTransit transit) { | |
| 688 Send(new ChromeUtilityMsg_RenderPDFPagesToPostScript_GetPage(page_number, | |
| 689 transit)); | |
| 690 } | |
| 691 | |
| 692 void PdfToPostScriptUtilityProcessHostClient::SendStartMessage( | |
| 693 IPC::PlatformFileForTransit transit) { | |
| 694 Send(new ChromeUtilityMsg_RenderPDFPagesToPostScript_Start(transit, | |
| 695 settings_)); | |
| 696 } | |
| 697 | |
| 698 void PdfToPostScriptUtilityProcessHostClient::SendStopMessage() { | |
| 699 Send(new ChromeUtilityMsg_RenderPDFPagesToPostScript_Stop()); | |
| 700 } | |
| 701 | |
| 702 void PdfToPostScriptUtilityProcessHostClient::OnPageDone(bool success) { | |
|
Vitaly Buka (NO REVIEWS)
2017/01/27 00:38:49
Maybe we can have single PdfConverterUtilityProces
rbpotter
2017/01/27 16:37:21
Sorry, I am not sure what you mean exactly. Do you
| |
| 703 PdfConverterUtilityProcessHostClient::OnPageDone(success, 0.0f); | |
| 704 } | |
| 705 | |
| 587 // Pdf Converter Impl and subclasses | 706 // Pdf Converter Impl and subclasses |
| 588 PdfConverterImpl::PdfConverterImpl() {} | 707 PdfConverterImpl::PdfConverterImpl() {} |
| 589 | 708 |
| 590 PdfConverterImpl::~PdfConverterImpl() {} | 709 PdfConverterImpl::~PdfConverterImpl() {} |
| 591 | 710 |
| 592 void PdfConverterImpl::Start(const scoped_refptr<base::RefCountedMemory>& data, | 711 void PdfConverterImpl::Start(const scoped_refptr<base::RefCountedMemory>& data, |
| 593 const PdfRenderSettings& conversion_settings, | 712 const PdfRenderSettings& conversion_settings, |
| 594 bool print_text_with_gdi, | |
| 595 const StartCallback& start_callback) { | 713 const StartCallback& start_callback) { |
| 596 DCHECK(!utility_client_.get()); | 714 DCHECK(!utility_client_.get()); |
| 597 } | 715 } |
| 598 | 716 |
| 599 void PdfConverterImpl::GetPage(int page_number, | 717 void PdfConverterImpl::GetPage(int page_number, |
| 600 const GetPageCallback& get_page_callback) { | 718 const GetPageCallback& get_page_callback) { |
| 601 utility_client_->GetPage(page_number, get_page_callback); | 719 utility_client_->GetPage(page_number, get_page_callback); |
| 602 } | 720 } |
| 603 | 721 |
| 604 void PdfConverterImpl::RunCallback(const base::Closure& callback) { | 722 void PdfConverterImpl::RunCallback(const base::Closure& callback) { |
| 605 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 723 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 606 callback.Run(); | 724 callback.Run(); |
| 607 } | 725 } |
| 608 | 726 |
| 609 PdfToEmfConverterImpl::PdfToEmfConverterImpl() : weak_ptr_factory_(this) {} | 727 PdfToEmfConverterImpl::PdfToEmfConverterImpl() : weak_ptr_factory_(this) {} |
| 610 | 728 |
| 611 PdfToEmfConverterImpl::~PdfToEmfConverterImpl() { | 729 PdfToEmfConverterImpl::~PdfToEmfConverterImpl() { |
| 612 if (utility_client_.get()) | 730 if (utility_client_.get()) |
| 613 utility_client_->Stop(); | 731 utility_client_->Stop(); |
| 614 } | 732 } |
| 615 | 733 |
| 616 void PdfToEmfConverterImpl::Start( | 734 void PdfToEmfConverterImpl::Start( |
| 617 const scoped_refptr<base::RefCountedMemory>& data, | 735 const scoped_refptr<base::RefCountedMemory>& data, |
| 618 const PdfRenderSettings& conversion_settings, | 736 const PdfRenderSettings& conversion_settings, |
| 619 bool print_text_with_gdi, | |
| 620 const StartCallback& start_callback) { | 737 const StartCallback& start_callback) { |
| 621 DCHECK(!utility_client_.get()); | 738 DCHECK(!utility_client_.get()); |
| 622 utility_client_ = new PdfToEmfUtilityProcessHostClient( | 739 utility_client_ = new PdfToEmfUtilityProcessHostClient( |
| 623 weak_ptr_factory_.GetWeakPtr(), conversion_settings); | 740 weak_ptr_factory_.GetWeakPtr(), conversion_settings); |
| 624 utility_client_->Start(data, print_text_with_gdi, start_callback); | 741 utility_client_->Start(data, start_callback); |
| 742 } | |
| 743 | |
| 744 PdfToPostScriptConverterImpl::PdfToPostScriptConverterImpl() | |
| 745 : weak_ptr_factory_(this) {} | |
| 746 | |
| 747 void PdfToPostScriptConverterImpl::Start( | |
| 748 const scoped_refptr<base::RefCountedMemory>& data, | |
| 749 const PdfRenderSettings& conversion_settings, | |
| 750 const StartCallback& start_callback) { | |
| 751 DCHECK(!utility_client_.get()); | |
|
Vitaly Buka (NO REVIEWS)
2017/01/27 00:38:49
There is also https://cs.chromium.org/chromium/src
rbpotter
2017/01/27 16:37:21
Should we add postscript printing there now or in
| |
| 752 utility_client_ = new PdfToPostScriptUtilityProcessHostClient( | |
| 753 weak_ptr_factory_.GetWeakPtr(), conversion_settings); | |
| 754 utility_client_->Start(data, start_callback); | |
| 625 } | 755 } |
| 626 | 756 |
| 627 } // namespace | 757 } // namespace |
| 628 | 758 |
| 629 PdfConverter::~PdfConverter() {} | 759 PdfConverter::~PdfConverter() {} |
| 630 | 760 |
| 631 // static | 761 // static |
| 632 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToEmfConverter() { | 762 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToEmfConverter() { |
| 633 return base::MakeUnique<PdfToEmfConverterImpl>(); | 763 return base::MakeUnique<PdfToEmfConverterImpl>(); |
| 634 } | 764 } |
| 635 | 765 |
| 766 // static | |
| 767 std::unique_ptr<PdfConverter> PdfConverter::CreatePdfToPostScriptConverter() { | |
| 768 return base::MakeUnique<PdfToPostScriptConverterImpl>(); | |
| 769 } | |
| 770 | |
| 636 } // namespace printing | 771 } // namespace printing |
| OLD | NEW |