blob: 8d5a336d4448f0b696498fc6d9a8ee5991703ff8 [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 "diagnostics/wilco_dtc_supportd/probe_service_impl.h"
#include <iterator>
namespace diagnostics {
namespace mojo_ipc = ::chromeos::cros_healthd::mojom;
ProbeServiceImpl::ProbeServiceImpl(Delegate* delegate) : delegate_(delegate) {
DCHECK(delegate_);
}
ProbeServiceImpl::~ProbeServiceImpl() {
RunInFlightCallbacks();
}
void ProbeServiceImpl::ProbeTelemetryInfo(
std::vector<chromeos::cros_healthd::mojom::ProbeCategoryEnum> categories,
ProbeTelemetryInfoCallback callback) {
if (!BindCrosHealthdProbeServiceIfNeeded()) {
LOG(WARNING) << "ProbeTelemetryInfo called before mojo was bootstrapped.";
std::move(callback).Run(nullptr);
return;
}
const size_t callback_key = next_callback_key_;
next_callback_key_++;
DCHECK_EQ(callbacks_.count(callback_key), 0);
callbacks_.insert({callback_key, std::move(callback)});
service_ptr_->ProbeTelemetryInfo(
std::move(categories),
base::Bind(&ProbeServiceImpl::ForwardProbeTelemetryInfoResponse,
weak_ptr_factory_.GetWeakPtr(), callback_key));
}
void ProbeServiceImpl::ForwardProbeTelemetryInfoResponse(
size_t callback_key,
chromeos::cros_healthd::mojom::TelemetryInfoPtr telemetry_info) {
auto it = callbacks_.find(callback_key);
if (it == callbacks_.end()) {
LOG(ERROR) << "Unknown callback_key for received mojo ProbeTelemetryInfo "
"response: "
<< callback_key;
return;
}
std::move(it->second).Run(std::move(telemetry_info));
callbacks_.erase(it);
}
bool ProbeServiceImpl::BindCrosHealthdProbeServiceIfNeeded() {
if (service_ptr_.is_bound())
return true;
auto request = mojo::MakeRequest(&service_ptr_);
service_ptr_.set_connection_error_handler(base::Bind(
&ProbeServiceImpl::OnDisconnect, weak_ptr_factory_.GetWeakPtr()));
return delegate_->BindCrosHealthdProbeService(std::move(request));
}
void ProbeServiceImpl::OnDisconnect() {
VLOG(1) << "Mojo connection to cros_healthd probe service is closed.";
RunInFlightCallbacks();
service_ptr_.reset();
}
void ProbeServiceImpl::RunInFlightCallbacks() {
for (auto& it : callbacks_) {
std::move(it.second).Run(nullptr);
}
callbacks_.clear();
}
} // namespace diagnostics