• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except", "in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef OHOS_GLOBAL_I18N_TIMEZONE_H
16 #define OHOS_GLOBAL_I18N_TIMEZONE_H
17 
18 #include <cstdint>
19 #include <map>
20 #include <mutex>
21 #include <png.h>
22 #include <set>
23 #include <string>
24 #include "i18n_types.h"
25 #include "memory"
26 #include "unicode/timezone.h"
27 #include <unordered_set>
28 #include <vector>
29 #include <tuple>
30 
31 namespace OHOS {
32 namespace Global {
33 namespace I18n {
34 using GetReplacedTimezoneDisplayName = void (*)(const char*, const char*, char*);
35 
36 class I18nTimeZone {
37 public:
38     I18nTimeZone(std::string &id, bool isZoneID);
39     virtual ~I18nTimeZone();
40     int32_t GetOffset(double date);
41     int32_t GetRawOffset();
42     std::string GetID();
43     std::string GetDisplayName();
44     std::string GetDisplayName(bool isDST);
45     std::string GetDisplayName(std::string localeStr);
46     std::string GetDisplayName(std::string localeStr, bool isDST);
47     virtual std::string GetDisplayNameByTaboo(const std::string& localeStr, const std::string& result);
48     static std::unique_ptr<I18nTimeZone> CreateInstance(std::string &id, bool isZoneID);
49     static std::set<std::string> GetAvailableIDs(I18nErrorCode &errorCode);
50     static std::unordered_set<std::string> GetAvailableZoneCityIDs();
51     static std::string GetCityDisplayName(std::string &cityID, std::string &locale);
52     static std::vector<std::string> GetTimezoneIdByLocation(const double x, const double y);
53     static std::map<std::string, std::string> FindCityDisplayNameMap(std::string &locale);
54     static std::string GetLocaleBaseName(std::string &locale);
55     static std::string GetTimezoneIdByCityId(const std::string &cityId);
56 
57 private:
58     static const char *TIMEZONE_KEY;
59     static const char *DEFAULT_TIMEZONE;
60     static const char *CITY_TIMEZONE_DATA_PATH;
61     static const char *DEVICE_CITY_TIMEZONE_DATA_PATH;
62     static const char *DISTRO_DEVICE_CITY_TIMEZONE_DATA_PATH;
63     static const char *TZ_PIXEL_PATH;
64     static const char *DISTRO_TZ_PIXEL_PATH;
65     static const char *DEFAULT_LOCALE;
66     static const char *CITY_DISPLAYNAME_PATH;
67     static const char *BASE_DEVICE_CITY_DISPLAYNAME_PATH;
68     static const char *DISTRO_DEVICE_CITY_DISPLAYNAME_PATH;
69     static const char *DISTRO_ROOT_DISPLAYNAME_PATH;
70     static const char *SUPPORTED_LOCALES_PATH;
71     static const char *TIMEZONE_ROOT_TAG;
72     static const char *TIMEZONE_SECOND_ROOT_TAG;
73     static const char *CITY_DISPLAYNAME_ROOT_TAG;
74     static const char *CITY_DISPLAYNAME_SECOND_ROOT_TAG;
75     static const uint32_t ELEMENT_NUM = 2;
76     static const uint32_t TZ_X_PLUS = 180;
77     static const uint32_t TZ_HALF_OF_SIZE = 2;
78     static const uint32_t TZ_MAX_PIXEL_VALUE = 255;
79     static constexpr double NUM_PRECISION = 0.1;
80     static std::set<std::string> supportedLocales;
81     static std::unordered_set<std::string> availableZoneCityIDs;
82     static std::unordered_map<std::string, std::string> city2TimeZoneID;
83     static std::unordered_map<std::string, std::string> cityDisplayNameCache;
84     static std::map<int, std::string> categoryNum2TimezoneWN;
85     static std::map<int, std::string> categoryNum2TimezoneEN;
86     static std::map<int, std::string> categoryNum2TimezoneWS;
87     static std::map<int, std::string> categoryNum2TimezoneES;
88     static std::map<std::string, std::string> BEST_MATCH_LOCALE;
89     static constexpr int SYS_PARAM_LEN = 128;
90     icu::TimeZone *timezone = nullptr;
91     static std::mutex matchLocaleMutex;
92     static std::mutex initZoneInfoMutex;
93     static std::mutex initSupportedLocalesMutex;
94     static std::mutex cityDisplayNameMutex;
95     static std::string cityDisplayNameCacheLocale;
96     static bool initAvailableZoneInfo;
97     static bool initSupportedLocales;
98     static bool ReadTimeZoneData(const char *xmlPath);
99     static std::string ComputeLocale(std::string &locale);
100     icu::TimeZone* GetTimeZone();
101     static std::string FindCityDisplayNameFromXml(std::string &cityID, std::string &locale);
102     static std::string FindCityDisplayNameFromXmlInner(std::string &cityID, std::string &locale);
103     static void AddCityDisplayNameCache(const char* xmlCityId, const char* xmlValue);
104     static std::string ResetCityDisplayNameCache(std::string &cityID, std::string &locale);
105     static std::string GetCityDisplayNameFromCache(std::string &cityID);
106     static std::string GetCityDisplayNameXmlPath(const std::string &locale);
107     static bool GetSupportedLocales();
108     static std::string GetFallBack(std::string &localeStr);
109     static void GetTimezoneIDFromZoneInfo(std::set<std::string> &availableIDs, std::string &parentPath,
110         std::string &parentName);
111     static std::vector<int> GetColorData(const uint16_t x, const uint16_t y,
112                                          uint16_t actualHeight, std::string preferredPath);
113     static int InitPngptr(png_structp &png_ptr, png_infop &info_ptr, FILE **fp, std::string preferredPath);
114     static std::vector<std::string> FindTzData();
115     static bool ParamExceedScope(const int x, const int y, int fixedX, int fixedY);
116     static std::string GetPreferredPath(const double x, const std::vector<std::string> &filePaths);
117     static void SetVersionPathMap(std::string verison, std::string path,
118             std::map<std::string, std::vector<std::string>> *pathMap);
119     static std::tuple<uint32_t, uint32_t> GetTzDataWidth(std::vector<std::string> filePaths);
120     static void CloseFile(FILE *fp);
121     static bool ValidateDataIntegrity(const std::vector<std::string> &pathList);
122     static bool CheckLatitudeAndLongitude(const double x, const double y);
123     static std::map<int, std::string> GetTimeZoneCategoryMap(const double x, const double y);
124     static void SetBestMatchLocale(const std::string& key, const std::string& value);
125     static const char *GetDeviceCityDisplayNamePath();
126 };
127 } // namespace I18n
128 } // namespace Global
129 } // namespace OHOS
130 #endif