| // Copyright 2021 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <memory> | |
| #include "runtime_probe/system/context.h" | |
| #include <base/logging.h> | |
| #include <base/no_destructor.h> | |
| #include <debugd/dbus-proxies.h> | |
| #include <diagnostics/mojom/public/cros_healthd.mojom.h> | |
| #include <diagnostics/mojom/public/cros_healthd_probe.mojom.h> | |
| #include <mojo/public/cpp/bindings/remote.h> | |
| #include <mojo_service_manager/lib/connect.h> | |
| #include <mojo_service_manager/lib/mojom/service_manager.mojom.h> | |
| #include "runtime_probe/system/context_impl.h" | |
| namespace runtime_probe { | |
| namespace { | |
| constexpr char kCrosHealthdProbeServiceName[] = "CrosHealthdProbe"; | |
| chromeos::mojo_service_manager::mojom::ServiceManager* | |
| GetServiceManagerProxy() { | |
| static const base::NoDestructor< | |
| mojo::Remote<chromeos::mojo_service_manager::mojom::ServiceManager>> | |
| remote(chromeos::mojo_service_manager::ConnectToMojoServiceManager()); | |
| CHECK(remote->is_bound()) << "Failed to connect to mojo service manager."; | |
| return remote->get(); | |
| } | |
| } // namespace | |
| // Define the constructor here instead of the header to allow us using forward | |
| // declaration in headers. This can reduce the dependencies to external | |
| // libraries like debugd-client for the components which don't use them. | |
| ContextImpl::ContextImpl() = default; | |
| ContextImpl::~ContextImpl() = default; | |
| bool ContextImpl::SetupDBusServices() { | |
| dbus_bus_ = connection_.Connect(); | |
| if (!dbus_bus_) { | |
| LOG(ERROR) << "Cannot connect to dbus."; | |
| return false; | |
| } | |
| debugd_proxy_ = std::make_unique<org::chromium::debugdProxy>(dbus_bus_); | |
| shill_manager_proxy_ = | |
| std::make_unique<org::chromium::flimflam::ManagerProxy>(dbus_bus_); | |
| return true; | |
| } | |
| cros_healthd_mojom::CrosHealthdProbeService* | |
| ContextImpl::GetCrosHealthdProbeServiceProxy() { | |
| if (!cros_healthd_service_.is_bound()) { | |
| GetServiceManagerProxy()->Request( | |
| kCrosHealthdProbeServiceName, std::nullopt, | |
| cros_healthd_service_.BindNewPipeAndPassReceiver().PassPipe()); | |
| cros_healthd_service_.set_disconnect_handler(base::BindOnce( | |
| []() { VLOG(2) << "Disconnect from the cros_healthd service."; })); | |
| cros_healthd_service_.reset_on_disconnect(); | |
| } | |
| return cros_healthd_service_.get(); | |
| } | |
| } // namespace runtime_probe |