blob: 60cbd7c1c48c1e063e4352aa9f9c7e68a6d2d4d2 [file] [log] [blame]
// Copyright 2018 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/printing/pdf_nup_converter_client.h"
#include <utility>
#include "base/bind.h"
#include "chrome/services/printing/public/mojom/constants.mojom.h"
#include "chrome/services/printing/public/mojom/pdf_nup_converter.mojom.h"
#include "content/public/common/service_manager_connection.h"
#include "services/service_manager/public/cpp/connector.h"
namespace printing {
PdfNupConverterClient::PdfNupConverterClient(content::WebContents* web_contents)
: web_contents_(web_contents) {}
PdfNupConverterClient::~PdfNupConverterClient() {}
void PdfNupConverterClient::DoNupPdfConvert(
int document_cookie,
uint32_t pages_per_sheet,
const gfx::Size& page_size,
const gfx::Rect& printable_area,
std::vector<base::ReadOnlySharedMemoryRegion> pdf_page_regions,
mojom::PdfNupConverter::NupPageConvertCallback callback) {
auto& nup_converter = GetPdfNupConverterRequest(document_cookie);
nup_converter->NupPageConvert(pages_per_sheet, page_size, printable_area,
std::move(pdf_page_regions),
std::move(callback));
}
void PdfNupConverterClient::DoNupPdfDocumentConvert(
int document_cookie,
uint32_t pages_per_sheet,
const gfx::Size& page_size,
const gfx::Rect& printable_area,
base::ReadOnlySharedMemoryRegion src_pdf_document,
mojom::PdfNupConverter::NupDocumentConvertCallback callback) {
auto& nup_converter = GetPdfNupConverterRequest(document_cookie);
nup_converter->NupDocumentConvert(
pages_per_sheet, page_size, printable_area, std::move(src_pdf_document),
base::BindOnce(&PdfNupConverterClient::OnDidNupPdfDocumentConvert,
base::Unretained(this), document_cookie,
std::move(callback)));
}
void PdfNupConverterClient::OnDidNupPdfDocumentConvert(
int document_cookie,
mojom::PdfNupConverter::NupDocumentConvertCallback callback,
mojom::PdfNupConverter::Status status,
base::ReadOnlySharedMemoryRegion region) {
RemovePdfNupConverterRequest(document_cookie);
std::move(callback).Run(status, std::move(region));
}
mojom::PdfNupConverterPtr& PdfNupConverterClient::GetPdfNupConverterRequest(
int cookie) {
auto iter = pdf_nup_converter_map_.find(cookie);
if (iter != pdf_nup_converter_map_.end()) {
DCHECK(iter->second.is_bound());
return iter->second;
}
auto iterator =
pdf_nup_converter_map_.emplace(cookie, CreatePdfNupConverterRequest())
.first;
return iterator->second;
}
void PdfNupConverterClient::RemovePdfNupConverterRequest(int cookie) {
size_t erased = pdf_nup_converter_map_.erase(cookie);
DCHECK_EQ(erased, 1u);
}
mojom::PdfNupConverterPtr
PdfNupConverterClient::CreatePdfNupConverterRequest() {
if (!connector_) {
service_manager::mojom::ConnectorRequest connector_request;
connector_ = service_manager::Connector::Create(&connector_request);
content::ServiceManagerConnection::GetForProcess()
->GetConnector()
->BindConnectorRequest(std::move(connector_request));
}
mojom::PdfNupConverterPtr pdf_nup_converter;
connector_->BindInterface(printing::mojom::kChromePrintingServiceName,
&pdf_nup_converter);
pdf_nup_converter->SetWebContentsURL(web_contents_->GetLastCommittedURL());
return pdf_nup_converter;
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(PdfNupConverterClient)
} // namespace printing