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 <vector>
28 #include <tuple>
29 
30 namespace OHOS {
31 namespace Global {
32 namespace I18n {
33 using GetReplacedTimezoneDisplayName = void (*)(const char*, const char*, char*);
34 
35 class I18nTimeZone {
36 public:
37     I18nTimeZone(std::string &id, bool isZoneID);
38     virtual ~I18nTimeZone();
39     int32_t GetOffset(double date);
40     int32_t GetRawOffset();
41     std::string GetID();
42     std::string GetDisplayName();
43     std::string GetDisplayName(bool isDST);
44     std::string GetDisplayName(std::string localeStr);
45     std::string GetDisplayName(std::string localeStr, bool isDST);
46     virtual std::string GetDisplayNameByTaboo(const std::string& localeStr, std::string result);
47     static std::unique_ptr<I18nTimeZone> CreateInstance(std::string &id, bool isZoneID);
48     static std::set<std::string> GetAvailableIDs(I18nErrorCode &errorCode);
49     static std::set<std::string> GetAvailableZoneCityIDs();
50     static std::string GetCityDisplayName(std::string &cityID, std::string &locale);
51     static std::vector<std::string> GetTimezoneIdByLocation(const double x, const double y);
52     static std::map<std::string, std::string> FindCityDisplayNameMap(std::string &locale);
53     static std::string GetLocaleBaseName(std::string &locale);
54     static std::string GetTimezoneIdByCityId(const std::string &cityId);
55 
56 private:
57     static const char *TIMEZONE_KEY;
58     static const char *DEFAULT_TIMEZONE;
59     static const char *CITY_TIMEZONE_DATA_PATH;
60     static const char *DEVICE_CITY_TIMEZONE_DATA_PATH;
61     static const char *DISTRO_DEVICE_CITY_TIMEZONE_DATA_PATH;
62     static const char *TZ_PIXEL_PATH;
63     static const char *DISTRO_TZ_PIXEL_PATH;
64     static const char *DEFAULT_LOCALE;
65     static const char *CITY_DISPLAYNAME_PATH;
66     static const char *BASE_DEVICE_CITY_DISPLAYNAME_PATH;
67     static const char *DISTRO_DEVICE_CITY_DISPLAYNAME_PATH;
68     static const char *DISTRO_ROOT_DISPLAYNAME_PATH;
69     static const char *SUPPORTED_LOCALES_PATH;
70     static const char *TIMEZONE_ROOT_TAG;
71     static const char *TIMEZONE_SECOND_ROOT_TAG;
72     static const char *CITY_DISPLAYNAME_ROOT_TAG;
73     static const char *CITY_DISPLAYNAME_SECOND_ROOT_TAG;
74     static const uint32_t ELEMENT_NUM = 2;
75     static const uint32_t TZ_X_PLUS = 180;
76     static const uint32_t TZ_HALF_OF_SIZE = 2;
77     static const uint32_t TZ_MAX_PIXEL_VALUE = 255;
78     static constexpr double NUM_PRECISION = 0.1;
79     static std::set<std::string> supportedLocales;
80     static std::set<std::string> availableZoneCityIDs;
81     static std::map<std::string, std::string> city2TimeZoneID;
82     static std::map<int, std::string> categoryNum2TimezoneWN;
83     static std::map<int, std::string> categoryNum2TimezoneEN;
84     static std::map<int, std::string> categoryNum2TimezoneWS;
85     static std::map<int, std::string> categoryNum2TimezoneES;
86     static std::map<std::string, std::string> BEST_MATCH_LOCALE;
87     static constexpr int SYS_PARAM_LEN = 128;
88     icu::TimeZone *timezone = nullptr;
89     static std::mutex cityTimeZoneMutex;
90     static std::mutex matchLocaleMutex;
91 
92     static bool ReadTimeZoneData(const char *xmlPath);
93     static std::string ComputeLocale(std::string &locale);
94     icu::TimeZone* GetTimeZone();
95     static std::string FindCityDisplayNameFromXml(std::string &cityID, std::string &locale);
96     static std::string GetCityDisplayNameXmlPath(const std::string &locale);
97     static bool GetSupportedLocales();
98     static std::string GetFallBack(std::string &localeStr);
99     static void GetTimezoneIDFromZoneInfo(std::set<std::string> &availableIDs, std::string &parentPath,
100         std::string &parentName);
101     static std::vector<int> GetColorData(const uint16_t x, const uint16_t y,
102                                          uint16_t actualHeight, std::string preferredPath);
103     static int InitPngptr(png_structp &png_ptr, png_infop &info_ptr, FILE **fp, std::string preferredPath);
104     static std::vector<std::string> FindTzData();
105     static bool ParamExceedScope(const int x, const int y, int fixedX, int fixedY);
106     static std::string GetPreferredPath(const double x, const std::vector<std::string> &filePaths);
107     static void SetVersionPathMap(std::string verison, std::string path,
108             std::map<std::string, std::vector<std::string>> *pathMap);
109     static void GetTzDataWidth(std::vector<std::string> filePaths, uint32_t *width, uint32_t *height);
110     static void CloseFile(FILE *fp);
111     static bool ValidateDataIntegrity(const std::vector<std::string> &pathList);
112     static bool CheckLatitudeAndLongitude(const double x, const double y);
113     static std::map<int, std::string> GetTimeZoneCategoryMap(const double x, const double y);
114     static void SetCity2TimeZoneID(const char* key, const char* value);
115     static void SetBestMatchLocale(const std::string& key, const std::string& value);
116     static const char *GetDeviceCityDisplayNamePath();
117 };
118 } // namespace I18n
119 } // namespace Global
120 } // namespace OHOS
121 #endif