From d69251faba2743cb52163f4bdc1132e8e0886dc9 Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 11 Jul 2019 04:22:17 +0300 Subject: [PATCH] Get info about the chosen language pack if needed. GitOrigin-RevId: 8a522ac1eabcb66d1e5fe2d85a617ae4c823f8bb --- td/telegram/LanguagePackManager.cpp | 44 ++++++++++++++++++++++++----- td/telegram/LanguagePackManager.h | 4 ++- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/td/telegram/LanguagePackManager.cpp b/td/telegram/LanguagePackManager.cpp index 3fd320fd6..db848a001 100644 --- a/td/telegram/LanguagePackManager.cpp +++ b/td/telegram/LanguagePackManager.cpp @@ -207,6 +207,7 @@ void LanguagePackManager::start_up() { if (language->version_ == -1) { load_empty_language_pack(language_code_); } + repair_chosen_language_info(); std::lock_guard language_lock(language->mutex_); base_language_code_ = language->base_language_code_; @@ -237,7 +238,7 @@ void LanguagePackManager::tear_down() { } } -vector LanguagePackManager::get_used_language_codes() const { +vector LanguagePackManager::get_used_language_codes() { if (language_pack_.empty() || language_code_.empty()) { return {}; } @@ -261,17 +262,23 @@ vector LanguagePackManager::get_used_language_codes() const { } } } - CHECK(info != nullptr); vector result; if (language_code_.size() <= 2) { result.push_back(language_code_); } - if (!info->base_language_code_.empty()) { - result.push_back(info->base_language_code_); - } - if (!info->plural_code_.empty()) { - result.push_back(info->plural_code_); + if (info == nullptr) { + LOG(ERROR) << "Failed to find information about chosen language " << language_code_; + if (!is_custom_language_code(language_code_)) { + search_language_info(language_code_, Auto()); + } + } else { + if (!info->base_language_code_.empty()) { + result.push_back(info->base_language_code_); + } + if (!info->plural_code_.empty()) { + result.push_back(info->plural_code_); + } } return result; } @@ -436,6 +443,7 @@ void LanguagePackManager::inc_generation() { CHECK(check_language_code_name(language_code_)); auto language = add_language(database_, language_pack_, language_code_); on_language_pack_version_changed(false, std::numeric_limits::max()); + repair_chosen_language_info(); { std::lock_guard lock(language->mutex_); @@ -817,6 +825,28 @@ void LanguagePackManager::search_language_info(string language_code, std::move(request_promise)); } +void LanguagePackManager::repair_chosen_language_info() { + CHECK(!language_pack_.empty() && !language_code_.empty()); + if (is_custom_language_code(language_code_)) { + return; + } + + std::lock_guard packs_lock(database_->mutex_); + auto pack_it = database_->language_packs_.find(language_pack_); + CHECK(pack_it != database_->language_packs_.end()); + + LanguagePack *pack = pack_it->second.get(); + std::lock_guard languages_lock(pack->mutex_); + for (auto &server_info : pack->server_language_pack_infos_) { + if (server_info.first == language_code_) { + return; + } + } + + LOG(INFO) << "Repair info about language " << language_code_; + search_language_info(language_code_, Auto()); +} + td_api::object_ptr LanguagePackManager::get_language_pack_info_object( const string &language_code, const LanguageInfo &info) { return td_api::make_object(language_code, info.base_language_code_, info.name_, diff --git a/td/telegram/LanguagePackManager.h b/td/telegram/LanguagePackManager.h index 8219feeba..182fbe198 100644 --- a/td/telegram/LanguagePackManager.h +++ b/td/telegram/LanguagePackManager.h @@ -43,7 +43,7 @@ class LanguagePackManager : public NetQueryCallback { static bool is_custom_language_code(Slice language_code); - vector get_used_language_codes() const; + vector get_used_language_codes(); void on_language_pack_changed(); @@ -153,6 +153,8 @@ class LanguagePackManager : public NetQueryCallback { void inc_generation(); + void repair_chosen_language_info(); + static bool is_valid_key(Slice key); void save_strings_to_database(SqliteKeyValue *kv, int32 new_version, bool new_is_full, int32 new_key_count,