| // Copyright 2022 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "components/metrics/motherboard_metrics_provider.h" | 
 |  | 
 | #include <memory> | 
 | #include <utility> | 
 |  | 
 | #include "base/functional/callback.h" | 
 | #include "base/task/thread_pool.h" | 
 | #include "components/metrics/motherboard.h" | 
 | #include "third_party/metrics_proto/system_profile.pb.h" | 
 |  | 
 | namespace metrics { | 
 |  | 
 | namespace { | 
 | // Constructs the Motherboard data on the blocking pool. | 
 | std::unique_ptr<Motherboard> GetMotherboard() { | 
 |   return std::make_unique<Motherboard>(); | 
 | } | 
 | }  // namespace | 
 |  | 
 | MotherboardMetricsProvider::MotherboardMetricsProvider() = default; | 
 | MotherboardMetricsProvider::~MotherboardMetricsProvider() = default; | 
 |  | 
 | void MotherboardMetricsProvider::ProvideSystemProfileMetrics( | 
 |     SystemProfileProto* system_profile) { | 
 |   // If motherboard_info_ has not yet been initialized, skip metrics. | 
 |   if (!motherboard_info_) { | 
 |     return; | 
 |   } | 
 |   SystemProfileProto::Hardware::Motherboard* motherboard = | 
 |       system_profile->mutable_hardware()->mutable_motherboard(); | 
 |   if (motherboard_info_->manufacturer().has_value()) { | 
 |     motherboard->set_manufacturer(*motherboard_info_->manufacturer()); | 
 |   } | 
 |   if (motherboard_info_->model().has_value()) { | 
 |     motherboard->set_model(*motherboard_info_->model()); | 
 |   } | 
 |   if (motherboard_info_->bios_manufacturer().has_value()) { | 
 |     motherboard->set_bios_manufacturer(*motherboard_info_->bios_manufacturer()); | 
 |   } | 
 |   if (motherboard_info_->bios_version().has_value()) { | 
 |     motherboard->set_bios_version(*motherboard_info_->bios_version()); | 
 |   } | 
 |   if (motherboard_info_->bios_type().has_value()) { | 
 |     if (*motherboard_info_->bios_type() == Motherboard::BiosType::kLegacy) { | 
 |       motherboard->set_bios_type(SystemProfileProto::Hardware::BIOS_TYPE_LEGACY); | 
 |     } else if (*motherboard_info_->bios_type() == | 
 |                Motherboard::BiosType::kUefi) { | 
 |       motherboard->set_bios_type(SystemProfileProto::Hardware::BIOS_TYPE_UEFI); | 
 |     } | 
 |   } else { | 
 |     motherboard->set_bios_type(SystemProfileProto::Hardware::BIOS_TYPE_UNKNOWN); | 
 |   } | 
 | } | 
 |  | 
 | void MotherboardMetricsProvider::AsyncInit(base::OnceClosure done_callback) { | 
 |   base::ThreadPool::PostTaskAndReplyWithResult( | 
 |       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, | 
 |       base::BindOnce(&GetMotherboard), | 
 |       base::BindOnce(&MotherboardMetricsProvider::InitializeMotherboard, | 
 |                      weak_ptr_factory_.GetWeakPtr(), std::move(done_callback))); | 
 | } | 
 |  | 
 | void MotherboardMetricsProvider::InitializeMotherboard( | 
 |     base::OnceClosure done_callback, | 
 |     std::unique_ptr<Motherboard> motherboard_info) { | 
 |   motherboard_info_ = std::move(motherboard_info); | 
 |   std::move(done_callback).Run(); | 
 | } | 
 |  | 
 | }  // namespace metrics |