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