blob: 66198d4c124bbf7e5739fb113002bb21579740bf [file] [log] [blame]
Prashant Malani224d3ca2017-03-14 12:44:11 -07001// Copyright 2017 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Prashant Malani06558552017-08-21 13:45:38 -07005#include "midis/daemon.h"
6
Prashant Malani112cc7a2017-07-28 18:48:54 -07007#include <fcntl.h>
8
9#include <utility>
10
Prashant Malani6789d662017-07-28 15:03:40 -070011#include <base/bind.h>
Prashant Malani112cc7a2017-07-28 18:48:54 -070012#include <base/files/file_util.h>
Prashant Malanid91f4892017-03-22 14:06:44 -070013#include <base/memory/ptr_util.h>
Prashant Malani06558552017-08-21 13:45:38 -070014#include <chromeos/dbus/service_constants.h>
Prashant Malani6789d662017-07-28 15:03:40 -070015#include <dbus/bus.h>
16#include <dbus/message.h>
Prashant Malanid91f4892017-03-22 14:06:44 -070017
Prashant Malani112cc7a2017-07-28 18:48:54 -070018#include "midis/client_tracker.h"
19#include "midis/device_tracker.h"
Prashant Malani6789d662017-07-28 15:03:40 -070020
Prashant Malani224d3ca2017-03-14 12:44:11 -070021namespace midis {
22
Prashant Malanif07c9522017-04-11 14:54:29 -070023Daemon::Daemon()
24 : device_tracker_(base::MakeUnique<DeviceTracker>()),
Prashant Malani6789d662017-07-28 15:03:40 -070025 client_tracker_(base::MakeUnique<ClientTracker>()),
26 weak_factory_(this) {}
Prashant Malani224d3ca2017-03-14 12:44:11 -070027
28Daemon::~Daemon() {}
29
30int Daemon::OnInit() {
31 if (!device_tracker_->InitDeviceTracker()) {
32 return -1;
33 }
34
Prashant Malani3de29872017-04-28 16:01:56 -070035 if (!client_tracker_->InitClientTracker(device_tracker_.get())) {
Prashant Malanif07c9522017-04-11 14:54:29 -070036 return -1;
37 }
38
Prashant Malani6789d662017-07-28 15:03:40 -070039 InitDBus();
Prashant Malani224d3ca2017-03-14 12:44:11 -070040 return 0;
41}
42
Prashant Malani6789d662017-07-28 15:03:40 -070043void Daemon::InitDBus() {
44 dbus::Bus::Options options;
45 options.bus_type = dbus::Bus::SYSTEM;
46 scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
47 CHECK(bus->Connect());
48 dbus::ExportedObject* exported_object =
49 bus->GetExportedObject(dbus::ObjectPath(kMidisServicePath));
50
51 CHECK(exported_object);
52 CHECK(exported_object->ExportMethodAndBlock(
53 kMidisInterfaceName,
54 kBootstrapMojoConnectionMethod,
55 base::Bind(&Daemon::BootstrapMojoConnection,
56 weak_factory_.GetWeakPtr())));
57 CHECK(bus->RequestOwnershipAndBlock(kMidisServiceName,
58 dbus::Bus::REQUIRE_PRIMARY));
Prashant Malani112cc7a2017-07-28 18:48:54 -070059 VLOG(1) << "D-Bus Registration succeeded";
Prashant Malani6789d662017-07-28 15:03:40 -070060}
61
62void Daemon::BootstrapMojoConnection(
63 dbus::MethodCall* method_call,
64 dbus::ExportedObject::ResponseSender response_sender) {
Prashant Malani112cc7a2017-07-28 18:48:54 -070065 LOG(INFO) << "Successfully received call from D-Bus client.";
66 if (client_tracker_->IsProxyConnected()) {
67 LOG(WARNING) << "Midis can only instantiate one Mojo Proxy instance.";
68 return;
69 }
70
71 dbus::FileDescriptor file_handle;
72 dbus::MessageReader reader(method_call);
73
74 if (!reader.PopFileDescriptor(&file_handle)) {
75 LOG(ERROR) << "Couldn't extract Mojo IPC handle.";
76 return;
77 }
78 file_handle.CheckValidity();
79 base::ScopedFD fd(file_handle.TakeValue());
80
81 if (!fd.is_valid()) {
82 LOG(ERROR) << "Couldn't copy file handle sent over D-Bus.";
83 return;
84 }
85
86 if (!base::SetCloseOnExec(fd.get())) {
87 PLOG(ERROR) << "Failed setting FD_CLOEXEC on fd.";
88 return;
89 }
90
91 client_tracker_->AcceptProxyConnection(std::move(fd));
92 LOG(INFO) << "MojoBridger connection established.";
Prashant Malani6789d662017-07-28 15:03:40 -070093}
94
Prashant Malani224d3ca2017-03-14 12:44:11 -070095} // namespace midis