// Copyright 2017 The Chromium 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 "components/variations/client_filterable_state.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" namespace variations { // static Study::Platform ClientFilterableState::GetCurrentPlatform() { #if BUILDFLAG(IS_WIN) return Study::PLATFORM_WINDOWS; #elif BUILDFLAG(IS_IOS) return Study::PLATFORM_IOS; #elif BUILDFLAG(IS_MAC) return Study::PLATFORM_MAC; #elif BUILDFLAG(IS_CHROMEOS_ASH) return Study::PLATFORM_CHROMEOS; #elif BUILDFLAG(IS_CHROMEOS_LACROS) return Study::PLATFORM_CHROMEOS_LACROS; #elif BUILDFLAG(IS_ANDROID) return Study::PLATFORM_ANDROID; #elif BUILDFLAG(IS_FUCHSIA) return Study::PLATFORM_FUCHSIA; #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD) || BUILDFLAG(IS_SOLARIS) // Default BSD and SOLARIS to Linux to not break those builds, although these // platforms are not officially supported by Chrome. return Study::PLATFORM_LINUX; #else #error Unknown platform #endif } // TODO(b/957197): Improve how we handle OS versions. // Add os_version.h and os_version_.cc that handle retrieving and // parsing OS versions. Then get rid of all the platform-dependent code here. // // static base::Version ClientFilterableState::GetOSVersion() { base::Version ret; #if BUILDFLAG(IS_WIN) std::string win_version = base::SysInfo::OperatingSystemVersion(); base::ReplaceSubstringsAfterOffset(&win_version, 0, " SP", "."); ret = base::Version(win_version); DCHECK(ret.IsValid()) << win_version; #else // Every other OS is supported by OperatingSystemVersionNumbers int major, minor, build; base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &build); ret = base::Version(base::StringPrintf("%d.%d.%d", major, minor, build)); DCHECK(ret.IsValid()); #endif return ret; } ClientFilterableState::ClientFilterableState( IsEnterpriseFunction is_enterprise_function) : is_enterprise_function_(std::move(is_enterprise_function)) { // The callback is only used when processing a study that uses the // is_enterprise filter. If you're building a client that isn't expecting that // filter, you should use a callback that always returns false. DCHECK(is_enterprise_function_); } ClientFilterableState::~ClientFilterableState() = default; bool ClientFilterableState::IsEnterprise() const { if (!is_enterprise_.has_value()) is_enterprise_ = std::move(is_enterprise_function_).Run(); return is_enterprise_.value(); } } // namespace variations