blob: 4c5614c979d9b563b8802f09b711e236740e2923 [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 <memory>
#include <string>
#include <utility>
#include <base/command_line.h>
#include <base/logging.h>
#include <base/memory/ref_counted.h>
#include <base/threading/thread.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/syslog_logging.h>
#include <chromeos/dbus/service_constants.h>
#include <dbus/bus.h>
#include <mojo/core/embedder/embedder.h>
#include <mojo/core/embedder/scoped_ipc_support.h>
#include <mojo/public/cpp/system/invitation.h>
#include "arc/vm/sensor_service/dbus_adaptors/org.chromium.ArcSensorService.h"
#include "arc/vm/sensor_service/sensor_service_impl.h"
namespace {
class DBusAdaptor : public org::chromium::ArcSensorServiceAdaptor,
public org::chromium::ArcSensorServiceInterface {
public:
explicit DBusAdaptor(scoped_refptr<dbus::Bus> bus)
: org::chromium::ArcSensorServiceAdaptor(this),
dbus_object_(nullptr, bus, GetObjectPath()) {}
~DBusAdaptor() override = default;
DBusAdaptor(const DBusAdaptor&) = delete;
DBusAdaptor& operator=(const DBusAdaptor&) = delete;
void RegisterAsync(
const brillo::dbus_utils::AsyncEventSequencer::CompletionAction& cb) {
RegisterWithDBusObject(&dbus_object_);
dbus_object_.RegisterAsync(cb);
}
// org::chromium::ArcSensorServiceInterface overrides:
bool BootstrapMojoConnection(brillo::ErrorPtr* error,
const base::ScopedFD& in_handle,
const std::string& in_token) override {
mojo::IncomingInvitation invitation =
mojo::IncomingInvitation::Accept(mojo::PlatformChannelEndpoint(
mojo::PlatformHandle(base::ScopedFD(dup(in_handle.get())))));
mojo::ScopedMessagePipeHandle child_pipe =
invitation.ExtractMessagePipe(in_token);
service_ = std::make_unique<arc::SensorServiceImpl>();
if (!service_->Initialize(mojo::InterfaceRequest<arc::mojom::SensorService>(
std::move(child_pipe)))) {
LOG(ERROR) << "Failed to initialize SensorServiceImpl.";
return false;
}
return true;
}
private:
brillo::dbus_utils::DBusObject dbus_object_;
std::unique_ptr<arc::SensorServiceImpl> service_;
};
class Daemon : public brillo::DBusServiceDaemon {
public:
Daemon() : DBusServiceDaemon(arc::sensor::kArcSensorServiceServiceName) {}
~Daemon() override = default;
Daemon(const Daemon&) = delete;
Daemon& operator=(const Daemon&) = delete;
protected:
void RegisterDBusObjectsAsync(
brillo::dbus_utils::AsyncEventSequencer* sequencer) override {
adaptor_ = std::make_unique<DBusAdaptor>(bus_);
adaptor_->RegisterAsync(
sequencer->GetHandler("RegisterAsync() failed.", true));
}
private:
std::unique_ptr<DBusAdaptor> adaptor_;
};
} // namespace
int main(int argc, char** argv) {
base::CommandLine::Init(argc, argv);
brillo::InitLog(brillo::kLogToSyslog | brillo::kLogToStderrIfTty);
base::Thread mojo_ipc_thread("mojo IPC thread");
CHECK(mojo_ipc_thread.StartWithOptions(
base::Thread::Options(base::MessagePumpType::IO, 0)));
mojo::core::Init();
mojo::core::ScopedIPCSupport ipc_support(
mojo_ipc_thread.task_runner(),
mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
return Daemon().Run();
}