blob: 6384a84e25dff1bbad89b5d43e50e02fc9c25f7d [file] [log] [blame]
// Copyright 2020 The Chromium OS 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 "ocr/mojo_adapter/ocr_service_mojo_adapter.h"
#include <memory>
#include <utility>
#include <base/bind.h>
#include <base/run_loop.h>
#include <mojo/public/cpp/bindings/remote.h>
#include <mojo/public/cpp/system/handle.h>
#include "ocr/mojo/ocr_service.mojom.h"
#include "ocr/mojo_adapter/ocr_service_mojo_adapter_delegate.h"
#include "ocr/mojo_adapter/ocr_service_mojo_adapter_delegate_impl.h"
namespace ocr {
namespace {
namespace mojo_ipc = chromeos::ocr::mojom;
class OcrServiceMojoAdapterImpl final : public OcrServiceMojoAdapter {
public:
// Override |delegate| for testing only.
explicit OcrServiceMojoAdapterImpl(
OcrServiceMojoAdapterDelegate* delegate = nullptr);
~OcrServiceMojoAdapterImpl() override = default;
OcrServiceMojoAdapterImpl(const OcrServiceMojoAdapterImpl&) = delete;
OcrServiceMojoAdapterImpl& operator=(const OcrServiceMojoAdapterImpl&) =
delete;
// OcrServiceMojoAdapter:
mojo_ipc::OpticalCharacterRecognitionServiceResponsePtr
GenerateSearchablePdfFromImage(
mojo::ScopedHandle input_fd_handle,
mojo::ScopedHandle output_fd_handle,
mojo_ipc::OcrConfigPtr ocr_config,
mojo_ipc::PdfRendererConfigPtr pdf_renderer_config) override;
private:
// Binds our remote endpoint |ocr_service_| to the implementation
// provided by the OCR service.
void Connect();
// Default delegate implementation.
std::unique_ptr<OcrServiceMojoAdapterDelegateImpl> delegate_impl_;
// Unowned. Must outlive this instance. Used to bootstrap a Mojo connection
// with the OCR service.
OcrServiceMojoAdapterDelegate* delegate_;
mojo::Remote<mojo_ipc::OpticalCharacterRecognitionService> ocr_service_;
};
// Saves |response| to |response_destination|.
template <class T>
void OnMojoResponseReceived(T* response_destination,
base::Closure quit_closure,
T response) {
*response_destination = std::move(response);
quit_closure.Run();
}
OcrServiceMojoAdapterImpl::OcrServiceMojoAdapterImpl(
OcrServiceMojoAdapterDelegate* delegate) {
if (delegate) {
delegate_ = delegate;
} else {
delegate_impl_ = std::make_unique<OcrServiceMojoAdapterDelegateImpl>();
delegate_ = delegate_impl_.get();
}
DCHECK(delegate_);
}
mojo_ipc::OpticalCharacterRecognitionServiceResponsePtr
OcrServiceMojoAdapterImpl::GenerateSearchablePdfFromImage(
mojo::ScopedHandle input_fd_handle,
mojo::ScopedHandle output_fd_handle,
mojo_ipc::OcrConfigPtr ocr_config,
mojo_ipc::PdfRendererConfigPtr pdf_renderer_config) {
if (!ocr_service_.is_bound())
Connect();
mojo_ipc::OpticalCharacterRecognitionServiceResponsePtr response;
base::RunLoop run_loop;
ocr_service_->GenerateSearchablePdfFromImage(
std::move(input_fd_handle), std::move(output_fd_handle),
std::move(ocr_config), std::move(pdf_renderer_config),
base::Bind(&OnMojoResponseReceived<
mojo_ipc::OpticalCharacterRecognitionServiceResponsePtr>,
&response, run_loop.QuitClosure()));
run_loop.Run();
return response;
}
void OcrServiceMojoAdapterImpl::Connect() {
ocr_service_ = delegate_->GetOcrService();
}
} // namespace
std::unique_ptr<OcrServiceMojoAdapter> OcrServiceMojoAdapter::Create() {
return std::make_unique<OcrServiceMojoAdapterImpl>();
}
} // namespace ocr