11767c5feSopenharmony_ci/* 21767c5feSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 31767c5feSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41767c5feSopenharmony_ci * you may not use this file except in compliance with the License. 51767c5feSopenharmony_ci * You may obtain a copy of the License at 61767c5feSopenharmony_ci * 71767c5feSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81767c5feSopenharmony_ci * 91767c5feSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101767c5feSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111767c5feSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121767c5feSopenharmony_ci * See the License for the specific language governing permissions and 131767c5feSopenharmony_ci * limitations under the License. 141767c5feSopenharmony_ci */ 151767c5feSopenharmony_ci 161767c5feSopenharmony_ci#include <dirent.h> 171767c5feSopenharmony_ci#include <fcntl.h> 181767c5feSopenharmony_ci#include <stdlib.h> 191767c5feSopenharmony_ci#include <unistd.h> 201767c5feSopenharmony_ci#include "update_metadata.h" 211767c5feSopenharmony_ci 221767c5feSopenharmony_cinamespace i18n { 231767c5feSopenharmony_cinamespace phonenumbers { 241767c5feSopenharmony_ci 251767c5feSopenharmony_ciconst std::string UpdateMetadata::METADATA_NAME = "/system/etc/icu_tzdata/i18n/MetadataInfo"; 261767c5feSopenharmony_ciconst std::string UpdateMetadata::SHORT_METADATA_TYPE = "short"; 271767c5feSopenharmony_ciconst std::string UpdateMetadata::PHONE_METADATA_TYPE = "phone"; 281767c5feSopenharmony_ciconst std::string UpdateMetadata::ALTERNATE_METADATA_TYPE = "alter"; 291767c5feSopenharmony_ciconst std::string UpdateMetadata::REGION_CODE_NONGEO = "001"; 301767c5feSopenharmony_ciPhoneMetadataCollection* UpdateMetadata::phoneMetadataCollection = nullptr; 311767c5feSopenharmony_cistd::map<std::string, PhoneMetadata>* UpdateMetadata::shortMetadata = new std::map<std::string, PhoneMetadata>(); 321767c5feSopenharmony_cistd::map<std::string, PhoneMetadata>* UpdateMetadata::regionMetadata = new std::map<std::string, PhoneMetadata>(); 331767c5feSopenharmony_cistd::map<int, PhoneMetadata>* UpdateMetadata::countryMetadata = new std::map<int, PhoneMetadata>(); 341767c5feSopenharmony_cistd::map<int, PhoneMetadata>* UpdateMetadata::alterMetadata = new std::map<int, PhoneMetadata>(); 351767c5feSopenharmony_ci 361767c5feSopenharmony_civoid UpdateMetadata::UpdateShortNumber(scoped_ptr<std::map<std::string, PhoneMetadata>>& metadataMap) 371767c5feSopenharmony_ci{ 381767c5feSopenharmony_ci for (auto it = shortMetadata->begin(); it != shortMetadata->end(); it++) { 391767c5feSopenharmony_ci std::string code = it->first; 401767c5feSopenharmony_ci PhoneMetadata phoneMetadata = it->second; 411767c5feSopenharmony_ci if (metadataMap->find(code) != metadataMap->end()) { 421767c5feSopenharmony_ci metadataMap->at(code) = phoneMetadata; 431767c5feSopenharmony_ci } else { 441767c5feSopenharmony_ci metadataMap->insert(std::make_pair(code, phoneMetadata)); 451767c5feSopenharmony_ci } 461767c5feSopenharmony_ci } 471767c5feSopenharmony_ci} 481767c5feSopenharmony_ci 491767c5feSopenharmony_civoid UpdateMetadata::UpdatePhoneNumber(scoped_ptr<std::map<int, PhoneMetadata>>& countryMetadataMap, 501767c5feSopenharmony_ci scoped_ptr<std::map<std::string, PhoneMetadata>>& regionMetadataMap) 511767c5feSopenharmony_ci{ 521767c5feSopenharmony_ci for (auto it = regionMetadata->begin(); it != regionMetadata->end(); it++) { 531767c5feSopenharmony_ci std::string code = it->first; 541767c5feSopenharmony_ci PhoneMetadata phoneMetadata = it->second; 551767c5feSopenharmony_ci if (regionMetadataMap->find(code) != regionMetadataMap->end()) { 561767c5feSopenharmony_ci regionMetadataMap->at(code) = phoneMetadata; 571767c5feSopenharmony_ci } else { 581767c5feSopenharmony_ci regionMetadataMap->insert(std::make_pair(code, phoneMetadata)); 591767c5feSopenharmony_ci } 601767c5feSopenharmony_ci } 611767c5feSopenharmony_ci for (auto it = countryMetadata->begin(); it != countryMetadata->end(); it++) { 621767c5feSopenharmony_ci int code = it->first; 631767c5feSopenharmony_ci PhoneMetadata phoneMetadata = it->second; 641767c5feSopenharmony_ci if (countryMetadataMap->find(code) != countryMetadataMap->end()) { 651767c5feSopenharmony_ci countryMetadataMap->at(code) = phoneMetadata; 661767c5feSopenharmony_ci } else { 671767c5feSopenharmony_ci countryMetadataMap->insert(std::make_pair(code, phoneMetadata)); 681767c5feSopenharmony_ci } 691767c5feSopenharmony_ci } 701767c5feSopenharmony_ci} 711767c5feSopenharmony_ci 721767c5feSopenharmony_civoid UpdateMetadata::UpdateAlternateFormat(std::map<int, const PhoneMetadata*>& metadataMap) 731767c5feSopenharmony_ci{ 741767c5feSopenharmony_ci for (auto it = alterMetadata->begin(); it != alterMetadata->end(); it++) { 751767c5feSopenharmony_ci int code = it->first; 761767c5feSopenharmony_ci if (metadataMap.find(code) != metadataMap.end()) { 771767c5feSopenharmony_ci metadataMap.at(code) = &(it->second); 781767c5feSopenharmony_ci } else { 791767c5feSopenharmony_ci metadataMap.insert(std::make_pair(code, &(it->second))); 801767c5feSopenharmony_ci } 811767c5feSopenharmony_ci 821767c5feSopenharmony_ci } 831767c5feSopenharmony_ci} 841767c5feSopenharmony_ci 851767c5feSopenharmony_civoid UpdateMetadata::LoadUpdatedMetadata(int fd) 861767c5feSopenharmony_ci{ 871767c5feSopenharmony_ci if (phoneMetadataCollection != nullptr) { 881767c5feSopenharmony_ci return; 891767c5feSopenharmony_ci } 901767c5feSopenharmony_ci if (fd == -1) { 911767c5feSopenharmony_ci return; 921767c5feSopenharmony_ci } 931767c5feSopenharmony_ci phoneMetadataCollection = new PhoneMetadataCollection(); 941767c5feSopenharmony_ci phoneMetadataCollection->ParseFromFileDescriptor(fd); 951767c5feSopenharmony_ci for (google::protobuf::RepeatedPtrField<PhoneMetadata>::const_iterator it = phoneMetadataCollection->metadata().begin(); 961767c5feSopenharmony_ci it != phoneMetadataCollection->metadata().end(); ++it) { 971767c5feSopenharmony_ci 981767c5feSopenharmony_ci std::string mdyRegionCode = it->id(); 991767c5feSopenharmony_ci std::string type = mdyRegionCode.substr(0, PHONE_METADATA_TYPE.length()); 1001767c5feSopenharmony_ci std::string regionCode = mdyRegionCode.substr(PHONE_METADATA_TYPE.length()); 1011767c5feSopenharmony_ci int countryCode = it->country_code(); 1021767c5feSopenharmony_ci PhoneMetadata phoneMetadata = *it; 1031767c5feSopenharmony_ci phoneMetadata.set_id(regionCode); 1041767c5feSopenharmony_ci if (type == SHORT_METADATA_TYPE) { 1051767c5feSopenharmony_ci shortMetadata->insert(std::make_pair(regionCode, phoneMetadata)); 1061767c5feSopenharmony_ci } else if (type == PHONE_METADATA_TYPE) { 1071767c5feSopenharmony_ci if (regionCode != REGION_CODE_NONGEO) { 1081767c5feSopenharmony_ci regionMetadata->insert(std::make_pair(regionCode, phoneMetadata)); 1091767c5feSopenharmony_ci } else { 1101767c5feSopenharmony_ci countryMetadata->insert(std::make_pair(countryCode, phoneMetadata)); 1111767c5feSopenharmony_ci } 1121767c5feSopenharmony_ci } else if (type == ALTERNATE_METADATA_TYPE) { 1131767c5feSopenharmony_ci alterMetadata->insert(std::make_pair(countryCode, phoneMetadata)); 1141767c5feSopenharmony_ci } 1151767c5feSopenharmony_ci } 1161767c5feSopenharmony_ci} 1171767c5feSopenharmony_ci} // namespace phonenumbers 1181767c5feSopenharmony_ci} // namespace i18n 119