Index: chrome/browser/local_discovery/pwg_raster_converter.cc |
diff --git a/chrome/browser/local_discovery/pwg_raster_converter.cc b/chrome/browser/local_discovery/pwg_raster_converter.cc |
deleted file mode 100644 |
index 4c5b7a7abeefc9c34365439742312f61e076fe79..0000000000000000000000000000000000000000 |
--- a/chrome/browser/local_discovery/pwg_raster_converter.cc |
+++ /dev/null |
@@ -1,366 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/local_discovery/pwg_raster_converter.h" |
- |
-#include <algorithm> |
-#include <utility> |
- |
-#include "base/bind_helpers.h" |
-#include "base/cancelable_callback.h" |
-#include "base/files/file.h" |
-#include "base/files/file_util.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/single_thread_task_runner.h" |
-#include "chrome/common/chrome_utility_messages.h" |
-#include "chrome/common/chrome_utility_printing_messages.h" |
-#include "chrome/grit/generated_resources.h" |
-#include "components/cloud_devices/common/cloud_device_description.h" |
-#include "components/cloud_devices/common/printer_description.h" |
-#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/child_process_data.h" |
-#include "content/public/browser/utility_process_host.h" |
-#include "content/public/browser/utility_process_host_client.h" |
-#include "printing/pdf_render_settings.h" |
-#include "printing/pwg_raster_settings.h" |
-#include "printing/units.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/gfx/geometry/rect.h" |
-#include "ui/gfx/geometry/size.h" |
- |
-namespace local_discovery { |
- |
-namespace { |
- |
-using content::BrowserThread; |
- |
-class FileHandlers { |
- public: |
- FileHandlers() {} |
- |
- ~FileHandlers() { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- } |
- |
- void Init(base::RefCountedMemory* data); |
- bool IsValid(); |
- |
- base::FilePath GetPwgPath() const { |
- return temp_dir_.path().AppendASCII("output.pwg"); |
- } |
- |
- base::FilePath GetPdfPath() const { |
- return temp_dir_.path().AppendASCII("input.pdf"); |
- } |
- |
- IPC::PlatformFileForTransit GetPdfForProcess(base::ProcessHandle process) { |
- DCHECK(pdf_file_.IsValid()); |
- IPC::PlatformFileForTransit transit = |
- IPC::TakeFileHandleForProcess(std::move(pdf_file_), process); |
- return transit; |
- } |
- |
- IPC::PlatformFileForTransit GetPwgForProcess(base::ProcessHandle process) { |
- DCHECK(pwg_file_.IsValid()); |
- IPC::PlatformFileForTransit transit = |
- IPC::TakeFileHandleForProcess(std::move(pwg_file_), process); |
- return transit; |
- } |
- |
- private: |
- base::ScopedTempDir temp_dir_; |
- base::File pdf_file_; |
- base::File pwg_file_; |
-}; |
- |
-void FileHandlers::Init(base::RefCountedMemory* data) { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
- |
- if (!temp_dir_.CreateUniqueTempDir()) { |
- return; |
- } |
- |
- if (static_cast<int>(data->size()) != |
- base::WriteFile(GetPdfPath(), data->front_as<char>(), data->size())) { |
- return; |
- } |
- |
- // Reopen in read only mode. |
- pdf_file_.Initialize(GetPdfPath(), |
- base::File::FLAG_OPEN | base::File::FLAG_READ); |
- pwg_file_.Initialize(GetPwgPath(), |
- base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); |
-} |
- |
-bool FileHandlers::IsValid() { |
- return pdf_file_.IsValid() && pwg_file_.IsValid(); |
-} |
- |
-// Converts PDF into PWG raster. |
-// Class uses 3 threads: UI, IO and FILE. |
-// Internal workflow is following: |
-// 1. Create instance on the UI thread. (files_, settings_,) |
-// 2. Create file on the FILE thread. |
-// 3. Start utility process and start conversion on the IO thread. |
-// 4. Run result callback on the UI thread. |
-// 5. Instance is destroyed from any thread that has the last reference. |
-// 6. FileHandlers destroyed on the FILE thread. |
-// This step posts |FileHandlers| to be destroyed on the FILE thread. |
-// All these steps work sequentially, so no data should be accessed |
-// simultaneously by several threads. |
-class PwgUtilityProcessHostClient : public content::UtilityProcessHostClient { |
- public: |
- explicit PwgUtilityProcessHostClient( |
- const printing::PdfRenderSettings& settings, |
- const printing::PwgRasterSettings& bitmap_settings); |
- |
- void Convert(base::RefCountedMemory* data, |
- const PWGRasterConverter::ResultCallback& callback); |
- |
- // UtilityProcessHostClient implementation. |
- void OnProcessCrashed(int exit_code) override; |
- bool OnMessageReceived(const IPC::Message& message) override; |
- |
- private: |
- ~PwgUtilityProcessHostClient() override; |
- |
- // Message handlers. |
- void OnProcessStarted(); |
- void OnSucceeded(); |
- void OnFailed(); |
- |
- void RunCallback(bool success); |
- |
- void StartProcessOnIOThread(); |
- |
- void RunCallbackOnUIThread(bool success); |
- void OnFilesReadyOnUIThread(); |
- |
- scoped_ptr<FileHandlers, BrowserThread::DeleteOnFileThread> files_; |
- printing::PdfRenderSettings settings_; |
- printing::PwgRasterSettings bitmap_settings_; |
- PWGRasterConverter::ResultCallback callback_; |
- base::WeakPtr<content::UtilityProcessHost> utility_process_host_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PwgUtilityProcessHostClient); |
-}; |
- |
-PwgUtilityProcessHostClient::PwgUtilityProcessHostClient( |
- const printing::PdfRenderSettings& settings, |
- const printing::PwgRasterSettings& bitmap_settings) |
- : settings_(settings), bitmap_settings_(bitmap_settings) {} |
- |
-PwgUtilityProcessHostClient::~PwgUtilityProcessHostClient() { |
-} |
- |
-void PwgUtilityProcessHostClient::Convert( |
- base::RefCountedMemory* data, |
- const PWGRasterConverter::ResultCallback& callback) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- callback_ = callback; |
- CHECK(!files_); |
- files_.reset(new FileHandlers()); |
- BrowserThread::PostTaskAndReply( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&FileHandlers::Init, base::Unretained(files_.get()), |
- make_scoped_refptr(data)), |
- base::Bind(&PwgUtilityProcessHostClient::OnFilesReadyOnUIThread, this)); |
-} |
- |
-void PwgUtilityProcessHostClient::OnProcessCrashed(int exit_code) { |
- OnFailed(); |
-} |
- |
-bool PwgUtilityProcessHostClient::OnMessageReceived( |
- const IPC::Message& message) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(PwgUtilityProcessHostClient, message) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ProcessStarted, OnProcessStarted) |
- IPC_MESSAGE_HANDLER( |
- ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded, OnSucceeded) |
- IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed, |
- OnFailed) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- return handled; |
-} |
- |
-void PwgUtilityProcessHostClient::OnProcessStarted() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!utility_process_host_) { |
- RunCallbackOnUIThread(false); |
- return; |
- } |
- |
- base::ProcessHandle process = utility_process_host_->GetData().handle; |
- utility_process_host_->Send(new ChromeUtilityMsg_RenderPDFPagesToPWGRaster( |
- files_->GetPdfForProcess(process), |
- settings_, |
- bitmap_settings_, |
- files_->GetPwgForProcess(process))); |
- utility_process_host_.reset(); |
-} |
- |
-void PwgUtilityProcessHostClient::OnSucceeded() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- RunCallback(true); |
-} |
- |
-void PwgUtilityProcessHostClient::OnFailed() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- RunCallback(false); |
-} |
- |
-void PwgUtilityProcessHostClient::OnFilesReadyOnUIThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (!files_->IsValid()) { |
- RunCallbackOnUIThread(false); |
- return; |
- } |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(&PwgUtilityProcessHostClient::StartProcessOnIOThread, this)); |
-} |
- |
-void PwgUtilityProcessHostClient::StartProcessOnIOThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- utility_process_host_ = |
- content::UtilityProcessHost::Create( |
- this, base::MessageLoop::current()->task_runner())->AsWeakPtr(); |
- utility_process_host_->SetName(l10n_util::GetStringUTF16( |
- IDS_UTILITY_PROCESS_PWG_RASTER_CONVERTOR_NAME)); |
- utility_process_host_->Send(new ChromeUtilityMsg_StartupPing); |
-} |
- |
-void PwgUtilityProcessHostClient::RunCallback(bool success) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&PwgUtilityProcessHostClient::RunCallbackOnUIThread, this, |
- success)); |
-} |
- |
-void PwgUtilityProcessHostClient::RunCallbackOnUIThread(bool success) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (!callback_.is_null()) { |
- BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
- base::Bind(callback_, success, |
- files_->GetPwgPath())); |
- callback_.Reset(); |
- } |
-} |
- |
-class PWGRasterConverterImpl : public PWGRasterConverter { |
- public: |
- PWGRasterConverterImpl(); |
- |
- ~PWGRasterConverterImpl() override; |
- |
- void Start(base::RefCountedMemory* data, |
- const printing::PdfRenderSettings& conversion_settings, |
- const printing::PwgRasterSettings& bitmap_settings, |
- const ResultCallback& callback) override; |
- |
- private: |
- scoped_refptr<PwgUtilityProcessHostClient> utility_client_; |
- base::CancelableCallback<ResultCallback::RunType> callback_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PWGRasterConverterImpl); |
-}; |
- |
-PWGRasterConverterImpl::PWGRasterConverterImpl() { |
-} |
- |
-PWGRasterConverterImpl::~PWGRasterConverterImpl() { |
-} |
- |
-void PWGRasterConverterImpl::Start( |
- base::RefCountedMemory* data, |
- const printing::PdfRenderSettings& conversion_settings, |
- const printing::PwgRasterSettings& bitmap_settings, |
- const ResultCallback& callback) { |
- // Rebind cancelable callback to avoid calling callback if |
- // PWGRasterConverterImpl is destroyed. |
- callback_.Reset(callback); |
- utility_client_ = |
- new PwgUtilityProcessHostClient(conversion_settings, bitmap_settings); |
- utility_client_->Convert(data, callback_.callback()); |
-} |
- |
-} // namespace |
- |
-// static |
-scoped_ptr<PWGRasterConverter> PWGRasterConverter::CreateDefault() { |
- return scoped_ptr<PWGRasterConverter>(new PWGRasterConverterImpl()); |
-} |
- |
-// static |
-printing::PdfRenderSettings PWGRasterConverter::GetConversionSettings( |
- const cloud_devices::CloudDeviceDescription& printer_capabilities, |
- const gfx::Size& page_size) { |
- int dpi = printing::kDefaultPdfDpi; |
- cloud_devices::printer::DpiCapability dpis; |
- if (dpis.LoadFrom(printer_capabilities)) |
- dpi = std::max(dpis.GetDefault().horizontal, dpis.GetDefault().vertical); |
- |
- double scale = dpi; |
- scale /= printing::kPointsPerInch; |
- |
- // Make vertical rectangle to optimize streaming to printer. Fix orientation |
- // by autorotate. |
- gfx::Rect area(std::min(page_size.width(), page_size.height()) * scale, |
- std::max(page_size.width(), page_size.height()) * scale); |
- return printing::PdfRenderSettings(area, dpi, true /* autorotate */); |
-} |
- |
-// static |
-printing::PwgRasterSettings PWGRasterConverter::GetBitmapSettings( |
- const cloud_devices::CloudDeviceDescription& printer_capabilities, |
- const cloud_devices::CloudDeviceDescription& ticket) { |
- printing::PwgRasterSettings result; |
- cloud_devices::printer::PwgRasterConfigCapability raster_capability; |
- // If the raster capability fails to load, raster_capability will contain |
- // the default value. |
- raster_capability.LoadFrom(printer_capabilities); |
- |
- cloud_devices::printer::DuplexTicketItem duplex_item; |
- cloud_devices::printer::DuplexType duplex_value = |
- cloud_devices::printer::NO_DUPLEX; |
- |
- cloud_devices::printer::DocumentSheetBack document_sheet_back = |
- raster_capability.value().document_sheet_back; |
- |
- if (duplex_item.LoadFrom(ticket)) { |
- duplex_value = duplex_item.value(); |
- } |
- |
- result.odd_page_transform = printing::TRANSFORM_NORMAL; |
- switch (duplex_value) { |
- case cloud_devices::printer::NO_DUPLEX: |
- result.odd_page_transform = printing::TRANSFORM_NORMAL; |
- break; |
- case cloud_devices::printer::LONG_EDGE: |
- if (document_sheet_back == cloud_devices::printer::ROTATED) { |
- result.odd_page_transform = printing::TRANSFORM_ROTATE_180; |
- } else if (document_sheet_back == cloud_devices::printer::FLIPPED) { |
- result.odd_page_transform = printing::TRANSFORM_FLIP_VERTICAL; |
- } |
- break; |
- case cloud_devices::printer::SHORT_EDGE: |
- if (document_sheet_back == cloud_devices::printer::MANUAL_TUMBLE) { |
- result.odd_page_transform = printing::TRANSFORM_ROTATE_180; |
- } else if (document_sheet_back == cloud_devices::printer::FLIPPED) { |
- result.odd_page_transform = printing::TRANSFORM_FLIP_HORIZONTAL; |
- } |
- } |
- |
- result.rotate_all_pages = raster_capability.value().rotate_all_pages; |
- |
- result.reverse_page_order = raster_capability.value().reverse_order_streaming; |
- return result; |
-} |
- |
-} // namespace local_discovery |