blob: 11421b561aab199c1f148335e7c7562790a86b4b [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
Ben Chand496e612017-09-29 00:20:50 -07009#include <memory>
Prashant Malani112cc7a2017-07-28 18:48:54 -070010#include <utility>
11
Prashant Malani6789d662017-07-28 15:03:40 -070012#include <base/bind.h>
Qijiang Fan713061e2021-03-08 15:45:12 +090013#include <base/check.h>
Prashant Malani112cc7a2017-07-28 18:48:54 -070014#include <base/files/file_util.h>
Prashant Malani06558552017-08-21 13:45:38 -070015#include <chromeos/dbus/service_constants.h>
Prashant Malani6789d662017-07-28 15:03:40 -070016#include <dbus/bus.h>
17#include <dbus/message.h>
Prashant Malanid91f4892017-03-22 14:06:44 -070018
Prashant Malani112cc7a2017-07-28 18:48:54 -070019#include "midis/client_tracker.h"
20#include "midis/device_tracker.h"
Prashant Malani6789d662017-07-28 15:03:40 -070021
Prashant Malani224d3ca2017-03-14 12:44:11 -070022namespace midis {
23
Prashant Malanif07c9522017-04-11 14:54:29 -070024Daemon::Daemon()
Ben Chand496e612017-09-29 00:20:50 -070025 : device_tracker_(std::make_unique<DeviceTracker>()),
26 client_tracker_(std::make_unique<ClientTracker>()),
Prashant Malani6789d662017-07-28 15:03:40 -070027 weak_factory_(this) {}
Prashant Malani224d3ca2017-03-14 12:44:11 -070028
29Daemon::~Daemon() {}
30
31int Daemon::OnInit() {
32 if (!device_tracker_->InitDeviceTracker()) {
33 return -1;
34 }
35
Prashant Malani9f15b9e2017-09-19 18:15:39 -070036 // It's OK to set |device_tracker_| here because the D-Bus connection
37 // has not yet been initialized, so it is impossible for clients to be
38 // registered.
39 client_tracker_->SetDeviceTracker(device_tracker_.get());
40 client_tracker_->InitClientTracker();
Prashant Malani6789d662017-07-28 15:03:40 -070041 InitDBus();
Prashant Malani224d3ca2017-03-14 12:44:11 -070042 return 0;
43}
44
Prashant Malani6789d662017-07-28 15:03:40 -070045void Daemon::InitDBus() {
46 dbus::Bus::Options options;
47 options.bus_type = dbus::Bus::SYSTEM;
48 scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
49 CHECK(bus->Connect());
50 dbus::ExportedObject* exported_object =
51 bus->GetExportedObject(dbus::ObjectPath(kMidisServicePath));
52
53 CHECK(exported_object);
54 CHECK(exported_object->ExportMethodAndBlock(
Tom Hughesaebcdce2020-08-27 15:18:39 -070055 kMidisInterfaceName, kBootstrapMojoConnectionMethod,
Prashant Malani6789d662017-07-28 15:03:40 -070056 base::Bind(&Daemon::BootstrapMojoConnection,
57 weak_factory_.GetWeakPtr())));
58 CHECK(bus->RequestOwnershipAndBlock(kMidisServiceName,
59 dbus::Bus::REQUIRE_PRIMARY));
Prashant Malani112cc7a2017-07-28 18:48:54 -070060 VLOG(1) << "D-Bus Registration succeeded";
Prashant Malani6789d662017-07-28 15:03:40 -070061}
62
63void Daemon::BootstrapMojoConnection(
64 dbus::MethodCall* method_call,
65 dbus::ExportedObject::ResponseSender response_sender) {
Prashant Malani112cc7a2017-07-28 18:48:54 -070066 LOG(INFO) << "Successfully received call from D-Bus client.";
67 if (client_tracker_->IsProxyConnected()) {
68 LOG(WARNING) << "Midis can only instantiate one Mojo Proxy instance.";
69 return;
70 }
71
Eric Caruso92f668e2018-03-30 15:12:41 -070072 base::ScopedFD file_handle;
Prashant Malani112cc7a2017-07-28 18:48:54 -070073 dbus::MessageReader reader(method_call);
74
75 if (!reader.PopFileDescriptor(&file_handle)) {
76 LOG(ERROR) << "Couldn't extract Mojo IPC handle.";
77 return;
78 }
Prashant Malani112cc7a2017-07-28 18:48:54 -070079
Eric Caruso92f668e2018-03-30 15:12:41 -070080 if (!file_handle.is_valid()) {
81 LOG(ERROR) << "Couldn't get file handle sent over D-Bus.";
Prashant Malani112cc7a2017-07-28 18:48:54 -070082 return;
83 }
84
Eric Caruso92f668e2018-03-30 15:12:41 -070085 if (!base::SetCloseOnExec(file_handle.get())) {
Prashant Malani112cc7a2017-07-28 18:48:54 -070086 PLOG(ERROR) << "Failed setting FD_CLOEXEC on fd.";
87 return;
88 }
89
Eric Caruso92f668e2018-03-30 15:12:41 -070090 client_tracker_->AcceptProxyConnection(std::move(file_handle));
Prashant Malani112cc7a2017-07-28 18:48:54 -070091 LOG(INFO) << "MojoBridger connection established.";
Prashant Malani73c1ea12017-09-06 13:28:53 -070092 std::unique_ptr<dbus::Response> response =
93 dbus::Response::FromMethodCall(method_call);
Qijiang Fanaffa5802020-08-03 13:57:01 +090094 std::move(response_sender).Run(std::move(response));
Prashant Malani6789d662017-07-28 15:03:40 -070095}
96
Prashant Malani224d3ca2017-03-14 12:44:11 -070097} // namespace midis