blob: eade4beb587cec4fd59eea733f8d7c1db73f1203 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/metrics/tpm_metrics_provider_win.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "chrome/browser/win/util_win_service.h"
TPMMetricsProvider::TPMMetricsProvider() = default;
TPMMetricsProvider::~TPMMetricsProvider() = default;
void TPMMetricsProvider::ProvideSystemProfileMetrics(
metrics::SystemProfileProto* system_profile_proto) {
// If the `tpm_identifier_` manufacturer id is not set, the ID is unknown.
// Metrics will not be reported to the system proto.
if (!tpm_identifier_.has_value()) {
return;
}
metrics::SystemProfileProto_TpmIdentifier* identifier =
system_profile_proto->mutable_tpm_identifier();
*identifier = tpm_identifier_.value();
}
void TPMMetricsProvider::AsyncInit(base::OnceClosure done_callback) {
if (!remote_util_win_) {
remote_util_win_ = LaunchUtilWinServiceInstance();
remote_util_win_.reset_on_idle_timeout(base::Seconds(5));
}
// Intentionally don't handle connection errors as not reporting this metric
// is acceptable in the rare cases it'll happen. The usage of
// base::Unretained(this) is safe here because `remote_util_win_`, which owns
// the callback, will be destroyed once this instance goes away.
remote_util_win_->GetTpmIdentifier(
base::BindOnce(&TPMMetricsProvider::GotTPMProduct, base::Unretained(this),
std::move(done_callback)));
}
void TPMMetricsProvider::GotTPMProduct(
base::OnceClosure done_callback,
const std::optional<metrics::SystemProfileProto::TpmIdentifier>& result) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
remote_util_win_.reset();
if (result.has_value()) {
tpm_identifier_ = std::move(result);
}
std::move(done_callback).Run();
}