1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/system_info.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker #include <fidl/fuchsia.buildinfo/cpp/fidl.h> 8*6777b538SAndroid Build Coastguard Worker #include <fidl/fuchsia.hwinfo/cpp/fidl.h> 9*6777b538SAndroid Build Coastguard Worker #include <lib/sys/cpp/component_context.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_component_connect.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/fuchsia_logging.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/location.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/logging.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/threading/scoped_blocking_call.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker namespace base { 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker namespace { 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker // Returns this process's cached object for `BuildInfo`. CachedBuildInfo()24*6777b538SAndroid Build Coastguard Workerfuchsia_buildinfo::BuildInfo& CachedBuildInfo() { 25*6777b538SAndroid Build Coastguard Worker static NoDestructor<fuchsia_buildinfo::BuildInfo> build_info; 26*6777b538SAndroid Build Coastguard Worker return *build_info; 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Synchronously fetches BuildInfo from the system and caches it for use in this 30*6777b538SAndroid Build Coastguard Worker // process. 31*6777b538SAndroid Build Coastguard Worker // Returns whether the system info was successfully cached. FetchAndCacheBuildInfo()32*6777b538SAndroid Build Coastguard Workerbool FetchAndCacheBuildInfo() { 33*6777b538SAndroid Build Coastguard Worker DCHECK(CachedBuildInfo().IsEmpty()) << "Only call once per process"; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker auto provider_client_end = 36*6777b538SAndroid Build Coastguard Worker fuchsia_component::Connect<fuchsia_buildinfo::Provider>(); 37*6777b538SAndroid Build Coastguard Worker if (provider_client_end.is_error()) { 38*6777b538SAndroid Build Coastguard Worker DLOG(ERROR) << base::FidlConnectionErrorMessage(provider_client_end); 39*6777b538SAndroid Build Coastguard Worker return false; 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker fidl::SyncClient provider_sync(std::move(provider_client_end.value())); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker auto build_info_result = provider_sync->GetBuildInfo(); 44*6777b538SAndroid Build Coastguard Worker if (build_info_result.is_error()) { 45*6777b538SAndroid Build Coastguard Worker ZX_DLOG(ERROR, build_info_result.error_value().status()); 46*6777b538SAndroid Build Coastguard Worker return false; 47*6777b538SAndroid Build Coastguard Worker } 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker if (build_info_result->build_info().IsEmpty()) { 50*6777b538SAndroid Build Coastguard Worker DLOG(ERROR) << "Received empty BuildInfo"; 51*6777b538SAndroid Build Coastguard Worker return false; 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker CachedBuildInfo() = std::move(build_info_result->build_info()); 55*6777b538SAndroid Build Coastguard Worker return true; 56*6777b538SAndroid Build Coastguard Worker } 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker } // namespace 59*6777b538SAndroid Build Coastguard Worker FetchAndCacheSystemInfo()60*6777b538SAndroid Build Coastguard Workerbool FetchAndCacheSystemInfo() { 61*6777b538SAndroid Build Coastguard Worker ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::WILL_BLOCK); 62*6777b538SAndroid Build Coastguard Worker return FetchAndCacheBuildInfo(); 63*6777b538SAndroid Build Coastguard Worker } 64*6777b538SAndroid Build Coastguard Worker GetCachedBuildInfo()65*6777b538SAndroid Build Coastguard Workerconst fuchsia_buildinfo::BuildInfo& GetCachedBuildInfo() { 66*6777b538SAndroid Build Coastguard Worker DCHECK(!CachedBuildInfo().IsEmpty()) 67*6777b538SAndroid Build Coastguard Worker << "FetchAndCacheSystemInfo() has not been called in this process"; 68*6777b538SAndroid Build Coastguard Worker return CachedBuildInfo(); 69*6777b538SAndroid Build Coastguard Worker } 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker // Synchronously fetches ProductInfo from the system GetProductInfo()72*6777b538SAndroid Build Coastguard Workerfuchsia_hwinfo::ProductInfo GetProductInfo() { 73*6777b538SAndroid Build Coastguard Worker ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::WILL_BLOCK); 74*6777b538SAndroid Build Coastguard Worker auto product_client_end = 75*6777b538SAndroid Build Coastguard Worker fuchsia_component::Connect<fuchsia_hwinfo::Product>(); 76*6777b538SAndroid Build Coastguard Worker if (product_client_end.is_error()) { 77*6777b538SAndroid Build Coastguard Worker DLOG(ERROR) << base::FidlConnectionErrorMessage(product_client_end); 78*6777b538SAndroid Build Coastguard Worker return {}; 79*6777b538SAndroid Build Coastguard Worker } 80*6777b538SAndroid Build Coastguard Worker fidl::SyncClient provider_sync(std::move(product_client_end.value())); 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker auto product_info_result = provider_sync->GetInfo(); 83*6777b538SAndroid Build Coastguard Worker if (product_info_result.is_error()) { 84*6777b538SAndroid Build Coastguard Worker ZX_DLOG(ERROR, product_info_result.error_value().status()); 85*6777b538SAndroid Build Coastguard Worker return {}; 86*6777b538SAndroid Build Coastguard Worker } 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker return product_info_result->info(); 89*6777b538SAndroid Build Coastguard Worker } 90*6777b538SAndroid Build Coastguard Worker ClearCachedSystemInfoForTesting()91*6777b538SAndroid Build Coastguard Workervoid ClearCachedSystemInfoForTesting() { 92*6777b538SAndroid Build Coastguard Worker CachedBuildInfo() = {}; 93*6777b538SAndroid Build Coastguard Worker } 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker } // namespace base 96