blob: 7330bfa5921c462232e653b564dbd8eae1487deb [file] [log] [blame]
// Copyright 2020 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/soda/constants.h"
#include <string>
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/notreached.h"
#include "base/path_service.h"
#include "base/strings/strcat.h"
#include "build/build_config.h"
#include "components/component_updater/component_updater_paths.h"
#include "components/crx_file/id_util.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace speech {
const char kUsEnglishLocale[] = "en-US";
const char kSodaBinaryInstallationResult[] =
"SodaInstaller.BinaryInstallationResult";
const char kSodaBinaryInstallationSuccessTimeTaken[] =
"SodaInstaller.BinaryInstallationSuccessTime";
const char kSodaBinaryInstallationFailureTimeTaken[] =
"SodaInstaller.BinaryInstallationFailureTime";
#if BUILDFLAG(IS_WIN)
constexpr base::FilePath::CharType kSodaBinaryRelativePath[] =
FILE_PATH_LITERAL("SODAFiles/SODA.dll");
#else
constexpr base::FilePath::CharType kSodaBinaryRelativePath[] =
FILE_PATH_LITERAL("SODAFiles/libsoda.so");
#endif
constexpr base::FilePath::CharType kSodaTestBinaryRelativePath[] =
FILE_PATH_LITERAL("libsoda.so");
constexpr base::FilePath::CharType kSodaTestResourcesRelativePath[] =
FILE_PATH_LITERAL("third_party/soda/resources/");
constexpr base::FilePath::CharType kSodaInstallationRelativePath[] =
FILE_PATH_LITERAL("SODA");
constexpr base::FilePath::CharType kSodaLanguagePacksRelativePath[] =
FILE_PATH_LITERAL("SODALanguagePacks");
constexpr base::FilePath::CharType kSodaLanguagePackDirectoryRelativePath[] =
FILE_PATH_LITERAL("SODAModels");
const base::FilePath GetSodaDirectory() {
base::FilePath components_dir;
base::PathService::Get(component_updater::DIR_COMPONENT_USER,
&components_dir);
return components_dir.empty()
? base::FilePath()
: components_dir.Append(kSodaInstallationRelativePath);
}
const base::FilePath GetSodaLanguagePacksDirectory() {
base::FilePath components_dir;
base::PathService::Get(component_updater::DIR_COMPONENT_USER,
&components_dir);
return components_dir.empty()
? base::FilePath()
: components_dir.Append(kSodaLanguagePacksRelativePath);
}
const base::FilePath GetSodaTestResourcesDirectory() {
base::FilePath test_data_root;
base::PathService::Get(base::DIR_SRC_TEST_DATA_ROOT, &test_data_root);
DCHECK(!test_data_root.empty());
return test_data_root.empty()
? base::FilePath()
: test_data_root.Append(kSodaTestResourcesRelativePath);
}
const base::FilePath GetLatestSodaLanguagePackDirectory(
const std::string& language) {
base::FileEnumerator enumerator(
GetSodaLanguagePacksDirectory().AppendASCII(language), false,
base::FileEnumerator::DIRECTORIES);
// Use the lexographical order of the directory names to determine the latest
// version. This mirrors the logic in the component updater.
base::FilePath latest_version_dir;
for (base::FilePath version_dir = enumerator.Next(); !version_dir.empty();
version_dir = enumerator.Next()) {
latest_version_dir =
latest_version_dir < version_dir ? version_dir : latest_version_dir;
}
return latest_version_dir.Append(kSodaLanguagePackDirectoryRelativePath);
}
const base::FilePath GetLatestSodaDirectory() {
base::FileEnumerator enumerator(GetSodaDirectory(), false,
base::FileEnumerator::DIRECTORIES);
base::FilePath latest_version_dir;
for (base::FilePath version_dir = enumerator.Next(); !version_dir.empty();
version_dir = enumerator.Next()) {
latest_version_dir =
latest_version_dir < version_dir ? version_dir : latest_version_dir;
}
return latest_version_dir;
}
const base::FilePath GetSodaBinaryPath() {
base::FilePath soda_dir = GetLatestSodaDirectory();
return soda_dir.empty() ? base::FilePath()
: soda_dir.Append(kSodaBinaryRelativePath);
}
const base::FilePath GetSodaTestBinaryPath() {
base::FilePath test_dir = GetSodaTestResourcesDirectory();
return test_dir.empty() ? base::FilePath()
: test_dir.Append(kSodaTestBinaryRelativePath);
}
absl::optional<SodaLanguagePackComponentConfig> GetLanguageComponentConfig(
LanguageCode language_code) {
for (const SodaLanguagePackComponentConfig& config :
kLanguageComponentConfigs) {
if (config.language_code == language_code) {
return config;
}
}
return absl::nullopt;
}
absl::optional<SodaLanguagePackComponentConfig> GetLanguageComponentConfig(
const std::string& language_name) {
for (const SodaLanguagePackComponentConfig& config :
kLanguageComponentConfigs) {
if (config.language_name == language_name) {
return config;
}
}
return absl::nullopt;
}
LanguageCode GetLanguageCodeByComponentId(const std::string& component_id) {
for (const SodaLanguagePackComponentConfig& config :
kLanguageComponentConfigs) {
if (crx_file::id_util::GenerateIdFromHash(config.public_key_sha,
sizeof(config.public_key_sha)) ==
component_id) {
return config.language_code;
}
}
return LanguageCode::kNone;
}
std::string GetLanguageName(LanguageCode language_code) {
std::string language_name;
if (language_code != LanguageCode::kNone) {
absl::optional<SodaLanguagePackComponentConfig> language_config =
GetLanguageComponentConfig(language_code);
if (language_config.has_value()) {
language_name = language_config.value().language_name;
}
}
return language_name;
}
LanguageCode GetLanguageCode(const std::string& language_name) {
absl::optional<SodaLanguagePackComponentConfig> language_config =
GetLanguageComponentConfig(language_name);
if (language_config.has_value()) {
return language_config.value().language_code;
}
return LanguageCode::kNone;
}
int GetLanguageDisplayName(const std::string& language_name) {
absl::optional<SodaLanguagePackComponentConfig> language_config =
GetLanguageComponentConfig(language_name);
if (language_config.has_value()) {
return language_config.value().display_name;
}
return 0;
}
const std::string GetInstallationSuccessTimeMetricForLanguagePack(
const LanguageCode& language_code) {
auto config = GetLanguageComponentConfig(language_code);
DCHECK(config && config->language_name);
return base::StrCat({"SodaInstaller.Language.", config->language_name,
".InstallationSuccessTime"});
}
const std::string GetInstallationFailureTimeMetricForLanguagePack(
const LanguageCode& language_code) {
auto config = GetLanguageComponentConfig(language_code);
DCHECK(config && config->language_name);
return base::StrCat({"SodaInstaller.Language.", config->language_name,
".InstallationFailureTime"});
}
const std::string GetInstallationResultMetricForLanguagePack(
const LanguageCode& language_code) {
auto config = GetLanguageComponentConfig(language_code);
DCHECK(config && config->language_name);
return base::StrCat({"SodaInstaller.Language.", config->language_name,
".InstallationResult"});
}
} // namespace speech