blob: b270fb2296adf6dce022c2648f6107f543b870df [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.
#ifndef OCR_DAEMON_H_
#define OCR_DAEMON_H_
#include <memory>
#include <string>
#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/dbus/async_event_sequencer.h>
#include <brillo/dbus/dbus_object.h>
#include <mojo/core/embedder/scoped_ipc_support.h>
#include "ocr/ocr_service_impl.h"
namespace ocr {
// Optical Character Recognition daemon with D-Bus support.
// The primary function of the D-Bus interface is to receive Mojo
// bootstrap requests from clients.
class OcrDaemon : public brillo::DBusServiceDaemon {
~OcrDaemon() override;
OcrDaemon(const OcrDaemon&) = delete;
OcrDaemon& operator=(const OcrDaemon&) = delete;
// brillo:DBusServiceDaemon:
int OnInit() override;
void RegisterDBusObjectsAsync(
brillo::dbus_utils::AsyncEventSequencer* sequencer) override;
// Implementation of org.chromium.OpticalCharacterRecognition interface:
// Bootstraps a Mojo connection to the OCR service. The client
// passes a file descriptor |mojo_fd|, representing a Unix socket.
// We only accept invitations from Chrome and send invitations to other
// processes.
std::string BootstrapMojoConnection(const base::ScopedFD& mojo_fd,
bool should_accept_invitation);
// Responds to Mojo connection errors with Chrome by quitting the daemon.
// Ignores disconnection errors from other clients.
void OnDisconnect(bool should_quit);
// As long as this object is alive, all Mojo API surfaces relevant to IPC
// connections are usable and message pipes which span a process boundary
// will continue to function.
std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
// D-Bus object that supports the OpticalCharacterRecognition interface.
std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_;
// Maintains the Mojo connection with OCR service clients.
std::unique_ptr<OcrServiceImpl> ocr_service_impl_;
// Whether binding of the Mojo service was attempted. This flag is needed for
// detecting repeated Mojo bootstrapping attempts.
bool mojo_service_bind_attempted_ = false;
// Member variables should appear before the WeakPtrFactory to ensure
// that any WeakPtrs to OcrDaemon are invalidated before its member
// variables' destructors are executed, rendering them invalid.
// Members are destructed in reverse-order that they appear in the
// class definition, so this must be the last class member.
base::WeakPtrFactory<OcrDaemon> weak_ptr_factory_{this};
} // namespace ocr
#endif // OCR_DAEMON_H_