chromium/ash/webui/camera_app_ui/document_scanner_service_host.cc

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ash/webui/camera_app_ui/document_scanner_service_host.h"

#include "chromeos/ash/components/mojo_service_manager/connection.h"
#include "third_party/cros_system_api/mojo/service_constants.h"

namespace ash {

DocumentScannerServiceHost::DocumentScannerServiceHost() {
  DETACH_FROM_SEQUENCE(sequence_checker_);
}

DocumentScannerServiceHost::~DocumentScannerServiceHost() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
}

// static
DocumentScannerServiceHost* DocumentScannerServiceHost::GetInstance() {
  return base::Singleton<DocumentScannerServiceHost>::get();
}

void DocumentScannerServiceHost::Start() {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  if (document_scanner_service_) {
    return;
  }
  document_scanner_service_ = DocumentScannerServiceClient::Create();
  if (ash::mojo_service_manager::IsServiceManagerBound()) {
    auto* proxy = ash::mojo_service_manager::GetServiceManagerProxy();
    proxy->Register(
        /*service_name=*/chromeos::mojo_services::kCrosDocumentScanner,
        provider_receiver_.BindNewPipeAndPassRemote());
  }
}

void DocumentScannerServiceHost::DetectCornersFromNV12Image(
    base::ReadOnlySharedMemoryRegion nv12_image,
    DetectCornersFromNV12ImageCallback callback) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  if (!document_scanner_service_->IsLoaded()) {
    auto detect_result = cros::mojom::DetectCornersResult::New();
    detect_result->success = false;
    detect_result->corners = {};
    std::move(callback).Run(std::move(detect_result));
    return;
  }
  document_scanner_service_->DetectCornersFromNV12Image(
      std::move(nv12_image),
      base::BindOnce(
          [](DetectCornersFromNV12ImageCallback callback, bool success,
             const std::vector<gfx::PointF>& corners) {
            auto detect_result = cros::mojom::DetectCornersResult::New();
            detect_result->success = success;
            detect_result->corners = corners;
            std::move(callback).Run(std::move(detect_result));
          },
          std::move(callback)));
}

void DocumentScannerServiceHost::Request(
    chromeos::mojo_service_manager::mojom::ProcessIdentityPtr identity,
    mojo::ScopedMessagePipeHandle receiver) {
  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  receiver_set_.Add(this,
                    mojo::PendingReceiver<cros::mojom::CrosDocumentScanner>(
                        std::move(receiver)));
}

}  // namespace ash