160916893Sopenharmony_ci/* 260916893Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 360916893Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 460916893Sopenharmony_ci * you may not use this file except in compliance with the License. 560916893Sopenharmony_ci * You may obtain a copy of the License at 660916893Sopenharmony_ci * 760916893Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 860916893Sopenharmony_ci * 960916893Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1060916893Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1160916893Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1260916893Sopenharmony_ci * See the License for the specific language governing permissions and 1360916893Sopenharmony_ci * limitations under the License. 1460916893Sopenharmony_ci */ 1560916893Sopenharmony_ci 1660916893Sopenharmony_ci#ifndef GLOBAL_I18N_PATTERN_H 1760916893Sopenharmony_ci#define GLOBAL_I18N_PATTERN_H 1860916893Sopenharmony_ci 1960916893Sopenharmony_ci#include <string> 2060916893Sopenharmony_ci#include "date_time_data.h" 2160916893Sopenharmony_ci#include "str_util.h" 2260916893Sopenharmony_ci 2360916893Sopenharmony_ci// this file should only be included by date_time_format_impl.cpp 2460916893Sopenharmony_ci#define HOUR12_MINUTE_INDEX 0x00000000 2560916893Sopenharmony_ci#define HOUR24_MINUTE_INDEX 0x00000001 2660916893Sopenharmony_ci#define HOUR_MINUTE_INDEX 0x00000002 2760916893Sopenharmony_ci#define ABBR_MONTH_WEEKDAY_DAY_INDEX 0x00010000 2860916893Sopenharmony_ci#define ABBR_MONTH_DAY_INDEX 0x00010001 2960916893Sopenharmony_ci#define YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY_INDEX 0x00010002 3060916893Sopenharmony_ci#define YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY_INDEX 0x00010003 3160916893Sopenharmony_ci#define YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY_INDEX 0x00010004 3260916893Sopenharmony_ci#define YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY_INDEX 0x00010005 3360916893Sopenharmony_ci#define YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY_INDEX 0x00010006 3460916893Sopenharmony_ci#define YEAR_WIDE_MONTH_DAY_INDEX 0x00010007 3560916893Sopenharmony_ci#define WEEK_DAY_INDEX 0x00010008 3660916893Sopenharmony_ci#define NUMBER_MONTH_ABBR_WEEK_DAY_INDEX 0x00010009 3760916893Sopenharmony_ci#define NUMBER_MONTH_DAY_INDEX 0x0001000A 3860916893Sopenharmony_ci#define HOUR12_MINUTE_SECOND_INDEX 0x00020000 3960916893Sopenharmony_ci#define HOUR24_MINUTE_SECOND_INDEX 0x00020001 4060916893Sopenharmony_ci#define HOUR_MINUTE_SECOND_INDEX 0x00020002 4160916893Sopenharmony_ci#define FULL_INDEX 0x00030000 4260916893Sopenharmony_ci#define MEDIUM_INDEX 0x00030001 4360916893Sopenharmony_ci#define SHORT_INDEX 0x00030002 4460916893Sopenharmony_ci#define ELAPSED_MINUTE_SECOND_INDEX 0x00040000 4560916893Sopenharmony_ci#define ELAPSED_MINUTE_SECOND_MILLISECOND_INDEX 0x00040001 4660916893Sopenharmony_ci 4760916893Sopenharmony_ci#define PATTERN_TYPE_SHIFT 16 4860916893Sopenharmony_ci#define PATTERN_INDEX_MASK 0x0000ffff 4960916893Sopenharmony_ci 5060916893Sopenharmony_cinamespace OHOS { 5160916893Sopenharmony_cinamespace I18N { 5260916893Sopenharmony_cienum PatternType { 5360916893Sopenharmony_ci PATTERN_TYPE_BEGIN = 0, 5460916893Sopenharmony_ci TIME_PATTERN = PATTERN_TYPE_BEGIN, 5560916893Sopenharmony_ci DATE_PATTERN, 5660916893Sopenharmony_ci HOUR_MINUTE_SECOND_PATTERN, 5760916893Sopenharmony_ci FULL_MEDIUM_SHORT_PATTERN, 5860916893Sopenharmony_ci ELAPSED_PATTERN, 5960916893Sopenharmony_ci PATTERN_TYPE_END, 6060916893Sopenharmony_ci}; 6160916893Sopenharmony_ci 6260916893Sopenharmony_cistd::string GetPatternFromIndex(uint32_t index, const DateTimeData * const data) 6360916893Sopenharmony_ci{ 6460916893Sopenharmony_ci uint32_t type = index >> PATTERN_TYPE_SHIFT; 6560916893Sopenharmony_ci if (type > PatternType::PATTERN_TYPE_END) { 6660916893Sopenharmony_ci return ""; 6760916893Sopenharmony_ci } 6860916893Sopenharmony_ci uint32_t ind = index & PATTERN_INDEX_MASK; 6960916893Sopenharmony_ci PatternType patternType = static_cast<PatternType>(type); 7060916893Sopenharmony_ci switch (patternType) { 7160916893Sopenharmony_ci case TIME_PATTERN: { 7260916893Sopenharmony_ci return Parse(data->timePatterns, ind); 7360916893Sopenharmony_ci } 7460916893Sopenharmony_ci case DATE_PATTERN: { 7560916893Sopenharmony_ci return Parse(data->datePatterns, ind); 7660916893Sopenharmony_ci } 7760916893Sopenharmony_ci case HOUR_MINUTE_SECOND_PATTERN: { 7860916893Sopenharmony_ci return Parse(data->hourMinuteSecondPatterns, ind); 7960916893Sopenharmony_ci } 8060916893Sopenharmony_ci case FULL_MEDIUM_SHORT_PATTERN: { 8160916893Sopenharmony_ci return Parse(data->fullMediumShortPatterns, ind); 8260916893Sopenharmony_ci } 8360916893Sopenharmony_ci default: { 8460916893Sopenharmony_ci return Parse(data->elapsedPatterns, ind); 8560916893Sopenharmony_ci } 8660916893Sopenharmony_ci } 8760916893Sopenharmony_ci} 8860916893Sopenharmony_ci 8960916893Sopenharmony_cistd::string GetStringFromPattern2(const AvailableDateTimeFormatPattern &requestPattern, const DateTimeData * const data) 9060916893Sopenharmony_ci{ 9160916893Sopenharmony_ci switch (requestPattern) { 9260916893Sopenharmony_ci case ABBR_MONTH_WEEKDAY_DAY: { 9360916893Sopenharmony_ci return GetPatternFromIndex(ABBR_MONTH_WEEKDAY_DAY_INDEX, data); 9460916893Sopenharmony_ci } 9560916893Sopenharmony_ci case FULL: { 9660916893Sopenharmony_ci return GetPatternFromIndex(FULL_INDEX, data); 9760916893Sopenharmony_ci } 9860916893Sopenharmony_ci case MEDIUM: { 9960916893Sopenharmony_ci return GetPatternFromIndex(MEDIUM_INDEX, data); 10060916893Sopenharmony_ci } 10160916893Sopenharmony_ci case SHORT: { 10260916893Sopenharmony_ci return GetPatternFromIndex(SHORT_INDEX, data); 10360916893Sopenharmony_ci } 10460916893Sopenharmony_ci case YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY: { 10560916893Sopenharmony_ci return GetPatternFromIndex(YEAR_ABBR_MONTH_ABBR_WEEKDAY_DAY_INDEX, data); 10660916893Sopenharmony_ci } 10760916893Sopenharmony_ci case YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY: { 10860916893Sopenharmony_ci return GetPatternFromIndex(YEAR_WIDE_MONTH_ABBR_WEEKDAY_DAY_INDEX, data); 10960916893Sopenharmony_ci } 11060916893Sopenharmony_ci case YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY: { 11160916893Sopenharmony_ci return GetPatternFromIndex(YEAR_SHORT_MONTH_WIDE_WEEKDAY_DAY_INDEX, data); 11260916893Sopenharmony_ci } 11360916893Sopenharmony_ci case YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY: { 11460916893Sopenharmony_ci return GetPatternFromIndex(YEAR_SHORT_MONTH_ABBR_WEEKDAY_DAY_INDEX, data); 11560916893Sopenharmony_ci } 11660916893Sopenharmony_ci case YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY: { 11760916893Sopenharmony_ci return GetPatternFromIndex(YEAR_ABBR_MONTH_WIDE_WEEKDAY_DAY_INDEX, data); 11860916893Sopenharmony_ci } 11960916893Sopenharmony_ci case YEAR_WIDE_MONTH_DAY: { 12060916893Sopenharmony_ci return GetPatternFromIndex(YEAR_WIDE_MONTH_DAY_INDEX, data); 12160916893Sopenharmony_ci } 12260916893Sopenharmony_ci case WEEK_DAY: { 12360916893Sopenharmony_ci return GetPatternFromIndex(WEEK_DAY_INDEX, data); 12460916893Sopenharmony_ci } 12560916893Sopenharmony_ci case NUMBER_MONTH_ABBR_WEEK_DAY: { 12660916893Sopenharmony_ci return GetPatternFromIndex(NUMBER_MONTH_ABBR_WEEK_DAY_INDEX, data); 12760916893Sopenharmony_ci } 12860916893Sopenharmony_ci case NUMBER_MONTH_DAY: { 12960916893Sopenharmony_ci return GetPatternFromIndex(NUMBER_MONTH_DAY_INDEX, data); 13060916893Sopenharmony_ci } 13160916893Sopenharmony_ci default: { 13260916893Sopenharmony_ci return ""; 13360916893Sopenharmony_ci } 13460916893Sopenharmony_ci } 13560916893Sopenharmony_ci} 13660916893Sopenharmony_ci 13760916893Sopenharmony_cistd::string GetStringFromPattern(const AvailableDateTimeFormatPattern &requestPattern, const DateTimeData * const data) 13860916893Sopenharmony_ci{ 13960916893Sopenharmony_ci if (data == nullptr) { 14060916893Sopenharmony_ci return ""; 14160916893Sopenharmony_ci } 14260916893Sopenharmony_ci switch (requestPattern) { 14360916893Sopenharmony_ci case HOUR12_MINUTE_SECOND: { 14460916893Sopenharmony_ci return GetPatternFromIndex(HOUR12_MINUTE_SECOND_INDEX, data); 14560916893Sopenharmony_ci } 14660916893Sopenharmony_ci case HOUR24_MINUTE_SECOND: { 14760916893Sopenharmony_ci return GetPatternFromIndex(HOUR24_MINUTE_SECOND_INDEX, data); 14860916893Sopenharmony_ci } 14960916893Sopenharmony_ci case HOUR_MINUTE_SECOND: { 15060916893Sopenharmony_ci return GetPatternFromIndex(HOUR_MINUTE_SECOND_INDEX, data); 15160916893Sopenharmony_ci } 15260916893Sopenharmony_ci case ABBR_MONTH_DAY: { 15360916893Sopenharmony_ci return GetPatternFromIndex(ABBR_MONTH_DAY_INDEX, data); 15460916893Sopenharmony_ci } 15560916893Sopenharmony_ci case HOUR12_MINUTE: { 15660916893Sopenharmony_ci return GetPatternFromIndex(HOUR12_MINUTE_INDEX, data); 15760916893Sopenharmony_ci } 15860916893Sopenharmony_ci case HOUR24_MINUTE: { 15960916893Sopenharmony_ci return GetPatternFromIndex(HOUR24_MINUTE_INDEX, data); 16060916893Sopenharmony_ci } 16160916893Sopenharmony_ci case HOUR_MINUTE: { 16260916893Sopenharmony_ci return GetPatternFromIndex(HOUR_MINUTE_INDEX, data); 16360916893Sopenharmony_ci } 16460916893Sopenharmony_ci default: { 16560916893Sopenharmony_ci return GetStringFromPattern2(requestPattern, data); 16660916893Sopenharmony_ci } 16760916893Sopenharmony_ci } 16860916893Sopenharmony_ci} 16960916893Sopenharmony_ci 17060916893Sopenharmony_cistd::string GetStringFromElapsedPattern(const ElapsedPatternType &type, const DateTimeData * const data) 17160916893Sopenharmony_ci{ 17260916893Sopenharmony_ci if (data == nullptr) { 17360916893Sopenharmony_ci return ""; 17460916893Sopenharmony_ci } 17560916893Sopenharmony_ci switch (type) { 17660916893Sopenharmony_ci case ELAPSED_MINUTE_SECOND: { 17760916893Sopenharmony_ci return GetPatternFromIndex(ELAPSED_MINUTE_SECOND_INDEX, data); 17860916893Sopenharmony_ci } 17960916893Sopenharmony_ci case ELAPSED_MINUTE_SECOND_MILLISECOND: { 18060916893Sopenharmony_ci return GetPatternFromIndex(ELAPSED_MINUTE_SECOND_MILLISECOND_INDEX, data); 18160916893Sopenharmony_ci } 18260916893Sopenharmony_ci case ELAPSED_HOUR_MINUTE: { 18360916893Sopenharmony_ci return GetPatternFromIndex(HOUR24_MINUTE_INDEX, data); 18460916893Sopenharmony_ci } 18560916893Sopenharmony_ci case ELAPSED_HOUR_MINUTE_SECOND: { 18660916893Sopenharmony_ci return GetPatternFromIndex(HOUR24_MINUTE_SECOND_INDEX, data); 18760916893Sopenharmony_ci } 18860916893Sopenharmony_ci default: { 18960916893Sopenharmony_ci return ""; 19060916893Sopenharmony_ci } 19160916893Sopenharmony_ci } 19260916893Sopenharmony_ci} 19360916893Sopenharmony_ci} // namespace I18N 19460916893Sopenharmony_ci} // namespace OHOS 19560916893Sopenharmony_ci#endif