2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Apache License, Version 2.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file FLclLocaleData.cpp
19 * @brief This is the implementation file for _LocaleData class.
28 #include <runtime_info.h>
29 #include <unique_ptr.h>
30 #include <FBaseSysLog.h>
31 #include <FSysSettingInfo.h>
32 #include <FLclNumberSymbols.h>
33 #include <FApp_AppInfo.h>
34 #include "FBase_StringConverter.h"
35 #include "FLcl_DateTimeSymbolsImpl.h"
36 #include "FLcl_CalendarImpl.h"
37 #include "FLcl_IcuCalendarImpl.h"
38 #include "FLcl_LocaleData.h"
39 #include "FLcl_LocaleImpl.h"
43 #define LOCALE_DATA_NUM_OF_MILLISEC_IN_HOUR 3600000LL // number of mili second in a hour
44 #define LOCALE_DATA_NUM_OF_MILLISEC_IN_MINUTE 60000LL // number of mili second in a minute
46 using namespace Tizen::Base;
47 using namespace Tizen::Base::Collection;
48 using namespace Tizen::Base::Utility;
50 namespace Tizen { namespace Locales
53 /////////////////////////////////////////////////////////////////////////////////////////////////////
56 // this function is to convert ICU FieldPosition from OSP _FieldPosition
58 _LocaleData::GetIcuFieldPosition(_FieldPosition pos)
60 IcuFieldPosition icuPos(pos.GetField()); // Create IcuFieldPosition with field value in pos
61 icuPos.setBeginIndex(pos.GetBeginIndex()); // Set Beginning index
62 icuPos.setEndIndex(pos.GetEndIndex()); // Set End index
66 U_ICU_NAMESPACE::UnicodeString
67 _LocaleData::GetIcuString(const String& ospStr)
69 IcuUnicodeString icuStr;
71 if (!ospStr.IsEmpty()) // if ospStr is not empty
73 ByteBuffer* pBuff = null;
74 pBuff = StringUtil::StringToUtf8N(ospStr); // Convert unicode value to UTF8
77 icuStr = IcuUnicodeString((const char*) pBuff->GetPointer()); // Create ICU string using UTF8 array
78 icuStr.setCharAt(0, icuStr.charAt(0)); // This is to handle ICU copy on write design
79 delete pBuff; // delete temporary buffer
86 // This function convert ICU string to OSP string
88 _LocaleData::GetOspString(const IcuUnicodeString& icuStr)
90 int len = icuStr.length(); // get length
91 if (len > 0) // if icuStr is not empty
93 wchar_t wstr[len + 1];
94 IcuUnicodeString tmpIcuStr(icuStr);
95 for (int i = 0; i < len ; i++)
98 icuChar = tmpIcuStr.charAt(i);
99 wstr[i] = (wchar_t)icuChar;
107 // This convert OSP string to ICU strings
109 _LocaleData::GetIcuString(const String& ospStr, IcuUnicodeString& icuStr)
111 if (!ospStr.IsEmpty()) // if ospStr is not empty
113 ByteBuffer* pBuff = null;
114 pBuff = StringUtil::StringToUtf8N(ospStr); // Convert unicode value to UTF8
117 icuStr = IcuUnicodeString((const char*) pBuff->GetPointer()); // Create ICU string using UTF8 array
118 icuStr.setCharAt(0, icuStr.charAt(0)); // This is to handle ICU copy on write design
119 delete pBuff; // delete temporary buffer
126 // This function return OSP array list of OSP string from ICU string list
128 _LocaleData::ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count)
130 result r = E_SUCCESS;
131 ArrayList* pTempArrayList = null;
132 if (pIcuStrList && count > 0) // validating inputs
134 pTempArrayList = new (std::nothrow) ArrayList();
135 if (pTempArrayList) // If allocation is successful
137 r = pTempArrayList->Construct(count);
138 if (!IsFailed(r)) // If ArrayList::Construct() is successful
140 for (int i = 0; i < count; i++)
142 String* pString = new (std::nothrow) String();
145 *pString = _LocaleData::GetOspString(pIcuStrList[i]); // Get OSP string from ICU string
147 if (!pString->IsEmpty())
149 pTempArrayList->Add(*pString); // Add OSP string to arraylist if it is not empty
161 SetLastResult(r); // Setting last result value
162 return pTempArrayList; // Return array list
165 // this function convert OSP string array list to ICU string array list
167 _LocaleData::ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::IList* pIcuStrList, int& count)
169 count = 0; // Setting count [Out param] to 0
170 SysTryReturn(NID_LCL, pIcuStrList, null, E_INVALID_ARG, "[%s] Invalid argument is used. pIcuStrList is null.", GetErrorMessage(E_INVALID_ARG));
172 count = pIcuStrList->GetCount();
173 if (count > 0) // if pIcuStrList is not empty
175 IcuUnicodeString* pIcuStrArray = new IcuUnicodeString[count];
176 if (pIcuStrArray) // if allocation is successful
178 IEnumerator* pEnum = pIcuStrList->GetEnumeratorN();
179 if (pEnum) // if pEnum is non null
183 while (pEnum->MoveNext() == E_SUCCESS) // if enum has more value
185 pObj = static_cast< String* >(pEnum->GetCurrent()); // Get object and cast it to String
186 if (pObj) // if String is non null
188 GetIcuString(*pObj, pIcuStrArray[i]); // Convert it to ICU string and set to array
193 delete pEnum; // Delete enumerator
194 return pIcuStrArray; // return ICU Array
196 delete[] pIcuStrArray;
200 return null; // return null in case of failure
205 _LocaleData::GetIcuLocale(const Locale& ospLocale)
208 String language = ospLocale.GetLanguageCodeString();
209 String country = ospLocale.GetCountryCodeString();
210 String variant = ospLocale.GetVariantCodeString();
212 const char* pLangStr = _StringConverter::CopyToCharArrayN(language);
213 const char* pCountryStr = _StringConverter::CopyToCharArrayN(country);
214 const char* pVariantStr = null;
216 if (!variant.IsEmpty())
218 pVariantStr = _StringConverter::CopyToCharArrayN(variant);
221 IcuLocale icuLocale = IcuLocale(pLangStr, pCountryStr, pVariantStr);
224 delete[] pCountryStr;
225 delete[] pVariantStr;
227 if (icuLocale.isBogus())
229 SetLastResult(E_SYSTEM);
237 _LocaleData::GetIcuLocale(void)
243 _LocaleData::IsLocaleSupported(void)
245 return !__icuLocale.isBogus();
249 _LocaleData::SetLocale(const Locale& ospLocale)
251 if (_LocaleImpl::IsSupported(ospLocale))
253 __icuLocale = GetIcuLocale(ospLocale);
257 __icuLocale.setToBogus();
258 return (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG;
262 _LocaleData::GetNumberSymbols(const Locale& locale, String symbols[])
264 UErrorCode status = U_ZERO_ERROR;
268 SysTryReturnResult(NID_LCL, IsLocaleSupported(), E_SYSTEM, "A System error has been occurred. Locale is not supported");
270 IcuDecimalFormatSymbols sym(__icuLocale, status);
271 SysTryReturnResult(NID_LCL, U_SUCCESS(status), E_SYSTEM, "A System error has been occurred. Unable to get ICU Decimal Format Symbols");
273 symbols[NUMBER_SYMBOL_DECIMAL_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kDecimalSeparatorSymbol));
274 symbols[NUMBER_SYMBOL_GROUPING_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kGroupingSeparatorSymbol));
275 symbols[NUMBER_SYMBOL_PATTERN_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPatternSeparatorSymbol));
276 symbols[NUMBER_SYMBOL_PERCENT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPercentSymbol));
277 symbols[NUMBER_SYMBOL_ZERO_DIGIT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kZeroDigitSymbol));
278 symbols[NUMBER_SYMBOL_DIGIT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kDigitSymbol));
279 symbols[NUMBER_SYMBOL_CURRENCY] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kCurrencySymbol));
280 symbols[NUMBER_SYMBOL_INTL_CURRENCY] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kIntlCurrencySymbol));
281 symbols[NUMBER_SYMBOL_MONETARY_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kMonetarySeparatorSymbol));
282 symbols[NUMBER_SYMBOL_PER_MILL] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPerMillSymbol));
283 symbols[NUMBER_SYMBOL_EXPONENTIAL] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kExponentialSymbol));
284 symbols[NUMBER_SYMBOL_PLUS_SIGN] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPlusSignSymbol));
285 symbols[NUMBER_SYMBOL_MINUS_SIGN] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kMinusSignSymbol));
291 _LocaleData::SetNumberFormatter(const Locale& locale, NumberFormatterStyle style)
293 if (__pIcuNumberFormatter)
295 delete __pIcuNumberFormatter;
296 __pIcuNumberFormatter = null;
299 IcuNumberFormat* pNumFmt = null;
300 UErrorCode ec = U_ZERO_ERROR;
301 result r = SetLocale(locale);
307 case NUM_FORMATTER_STYLE_NUMBER:
309 pNumFmt = IcuNumberFormat::createInstance(__icuLocale, ec);
313 case NUM_FORMATTER_STYLE_CURRENCY:
315 pNumFmt = IcuNumberFormat::createCurrencyInstance(__icuLocale, ec);
319 case NUM_FORMATTER_STYLE_PERCENT:
321 pNumFmt = IcuNumberFormat::createPercentInstance(__icuLocale, ec);
327 r = E_UNSUPPORTED_OPERATION;
339 if (pNumFmt && (pNumFmt->getDynamicClassID() == IcuDecimalFormat::getStaticClassID()))
341 __pIcuNumberFormatter = dynamic_cast< IcuDecimalFormat* >(pNumFmt);
342 if (__pIcuNumberFormatter)
350 return E_UNSUPPORTED_OPERATION;
354 _LocaleData::FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str)
358 if (__pIcuNumberFormatter)
360 IcuUnicodeString icuStr;
361 IcuFieldPosition icuPos = GetIcuFieldPosition(pos);
362 icuStr = __pIcuNumberFormatter->format(static_cast< int32_t >(number), icuStr, icuPos);
364 str = _LocaleData::GetOspString(icuStr);
372 _LocaleData::FormatNumber(double number, _FieldPosition& pos, Tizen::Base::String& str)
376 if (__pIcuNumberFormatter)
378 IcuUnicodeString icuStr;
379 IcuFieldPosition icuPos = GetIcuFieldPosition(pos);
380 icuStr = __pIcuNumberFormatter->format(number, icuStr, icuPos);
382 str = _LocaleData::GetOspString(icuStr);
390 _LocaleData::ApplyNumberPattern(const Tizen::Base::String& pattern, bool localized)
392 if (__pIcuNumberFormatter)
394 IcuUnicodeString icuPattern;
395 icuPattern = __pIcuNumberFormatter->toPattern(icuPattern);
397 UErrorCode ec = U_ZERO_ERROR;
398 IcuUParseError parseError = {0};
399 IcuUnicodeString icuNewPatter;
400 GetIcuString(pattern, icuNewPatter);
404 __pIcuNumberFormatter->applyLocalizedPattern(icuNewPatter, parseError, ec);
408 __pIcuNumberFormatter->applyPattern(icuNewPatter, parseError, ec);
417 SysLog(NID_LCL, "Error [%d -> %s] in setting pattern to %ls at %d:%d",
418 ec, u_errorName(ec), pattern.GetPointer(), parseError.line, parseError.offset);
420 __pIcuNumberFormatter->applyPattern(icuPattern, ec);
424 return E_INVALID_ARG;
428 _LocaleData::GetNumberFormatterStringAttributes(NumberFormatterAttributes attrName)
430 IcuUnicodeString icuRetValue;
432 if (__pIcuNumberFormatter)
436 case NUM_FORMATTER_FIELD_CURRENCY:
438 icuRetValue = __pIcuNumberFormatter->getCurrency();
442 case NUM_FORMATTER_FIELD_POSITIVE_PREFIX:
444 icuRetValue = __pIcuNumberFormatter->getPositivePrefix(icuRetValue);
448 case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX:
450 icuRetValue = __pIcuNumberFormatter->getNegativePrefix(icuRetValue);
454 case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX:
456 icuRetValue = __pIcuNumberFormatter->getPositiveSuffix(icuRetValue);
460 case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX:
462 icuRetValue = __pIcuNumberFormatter->getNegativeSuffix(icuRetValue);
466 case NUM_FORMATTER_FIELD_PATTERN:
468 icuRetValue = __pIcuNumberFormatter->toPattern(icuRetValue);
472 case NUM_FORMATTER_FIELD_LOCALIZED_PATTERN:
474 icuRetValue = __pIcuNumberFormatter->toLocalizedPattern(icuRetValue);
484 return _LocaleData::GetOspString(icuRetValue);
487 return Tizen::Base::String("");
491 _LocaleData::SetNumberFormatterAttributes(const String& newValue, NumberFormatterAttributes attrName)
493 if (__pIcuNumberFormatter)
495 IcuUnicodeString icuNewValue;
496 GetIcuString(newValue, icuNewValue);
500 case NUM_FORMATTER_FIELD_CURRENCY:
502 __pIcuNumberFormatter->setCurrency(icuNewValue.getTerminatedBuffer());
506 case NUM_FORMATTER_FIELD_POSITIVE_PREFIX:
508 __pIcuNumberFormatter->setPositivePrefix(icuNewValue);
512 case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX:
514 __pIcuNumberFormatter->setNegativePrefix(icuNewValue);
518 case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX:
520 __pIcuNumberFormatter->setPositiveSuffix(icuNewValue);
524 case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX:
526 __pIcuNumberFormatter->setNegativeSuffix(icuNewValue);
539 _LocaleData::GetNumberFormatterIntAttributes(NumberFormatterAttributes attrName)
542 if (__pIcuNumberFormatter)
546 case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS:
548 res = __pIcuNumberFormatter->getMaximumIntegerDigits();
552 case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS:
554 res = __pIcuNumberFormatter->getMinimumIntegerDigits();
558 case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS:
560 res = __pIcuNumberFormatter->getMaximumFractionDigits();
564 case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS:
566 res = __pIcuNumberFormatter->getMinimumFractionDigits();
570 case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS:
572 res = __pIcuNumberFormatter->getMinimumExponentDigits();
576 case NUM_FORMATTER_FIELD_MULTIPLIER:
578 res = __pIcuNumberFormatter->getMultiplier();
582 case NUM_FORMATTER_FIELD_GROUPING_SIZE:
584 res = __pIcuNumberFormatter->getGroupingSize();
600 _LocaleData::SetNumberFormatterAttributes(const int newValue, NumberFormatterAttributes attrName)
602 if (__pIcuNumberFormatter)
606 case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS:
608 __pIcuNumberFormatter->setMaximumIntegerDigits(newValue);
612 case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS:
614 __pIcuNumberFormatter->setMinimumIntegerDigits(newValue);
618 case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS:
620 __pIcuNumberFormatter->setMaximumFractionDigits(newValue);
624 case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS:
626 __pIcuNumberFormatter->setMinimumFractionDigits(newValue);
630 case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS:
632 __pIcuNumberFormatter->setMinimumExponentDigits(newValue);
636 case NUM_FORMATTER_FIELD_MULTIPLIER:
638 __pIcuNumberFormatter->setMultiplier(newValue);
642 case NUM_FORMATTER_FIELD_GROUPING_SIZE:
644 __pIcuNumberFormatter->setGroupingSize(newValue);
657 _LocaleData::GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName)
660 if (__pIcuNumberFormatter)
664 case NUM_FORMATTER_FIELD_IS_GROUPING_USED:
666 res = __pIcuNumberFormatter->isGroupingUsed();
670 case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN:
672 res = __pIcuNumberFormatter->isDecimalSeparatorAlwaysShown();
676 case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN:
678 IcuUnicodeString ps("+");
680 pp = __pIcuNumberFormatter->getPositivePrefix(pp);
698 _LocaleData::SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName)
700 if (__pIcuNumberFormatter)
704 case NUM_FORMATTER_FIELD_IS_GROUPING_USED:
706 __pIcuNumberFormatter->setGroupingUsed(newValue);
710 case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN:
712 __pIcuNumberFormatter->setDecimalSeparatorAlwaysShown(newValue);
716 case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN:
718 IcuUnicodeString ps("+");
720 pp = __pIcuNumberFormatter->getPositivePrefix(pp);
724 __pIcuNumberFormatter->setPositivePrefix(ps);
730 __pIcuNumberFormatter->setPositivePrefix("");
745 _LocaleData::SetDateFormatSymbols(const Locale& locale)
747 if (__pIcuDateFormatSymbols)
749 delete __pIcuDateFormatSymbols;
750 __pIcuDateFormatSymbols = null;
753 UErrorCode ec = U_ZERO_ERROR;
754 result r = SetLocale(locale);
758 __pIcuDateFormatSymbols = new IcuDateFormatSymbols(__icuLocale, ec);
760 if (__pIcuDateFormatSymbols && U_SUCCESS(ec))
766 delete __pIcuDateFormatSymbols;
767 __pIcuDateFormatSymbols = null;
773 _LocaleData::GetDateFormatSymbolAttrArrayN(DateFormatSymbolsAttributes attrName)
775 if (__pIcuDateFormatSymbols)
779 const IcuUnicodeString* pIcuList = null;
783 case DATE_FORMAT_SYM_ERA_LIST:
785 pIcuList = __pIcuDateFormatSymbols->getEras(count);
789 case DATE_FORMAT_SYM_MONTH_LIST:
791 pIcuList = __pIcuDateFormatSymbols->getMonths(count);
795 case DATE_FORMAT_SYM_SHORT_MONTH_LIST:
797 pIcuList = __pIcuDateFormatSymbols->getShortMonths(count);
801 case DATE_FORMAT_SYM_WEEKDAY_LIST:
803 pIcuList = __pIcuDateFormatSymbols->getWeekdays(count);
807 case DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST:
809 pIcuList = __pIcuDateFormatSymbols->getShortWeekdays(count);
813 case DATE_FORMAT_SYM_AM_PM_LIST:
815 pIcuList = __pIcuDateFormatSymbols->getAmPmStrings(count);
821 SetLastResult(E_UNSUPPORTED_OPERATION);
828 return ConvertIcuStringArrayToOspArrayN(pIcuList, count);
832 SetLastResult(E_INVALID_STATE);
838 _LocaleData::GetIcuDate(DateTime date)
840 DateTime icuBaseTime;
841 icuBaseTime.SetValue(1970, 1, 1);
842 DateTime ospBaseTime = DateTime::GetMinValue();
844 result r = icuBaseTime.Subtract(ospBaseTime.GetTime());
847 SysLogException(NID_LCL, r, "[%s] Propagated.", GetErrorMessage(r));
850 TimeSpan tsIcu = icuBaseTime.GetTime();
851 TimeSpan tsOsp = date.GetTime();
852 TimeSpan diff = tsOsp - tsIcu;
854 IcuUDate icuDate = diff.GetTicks();
859 _LocaleData::SetDateTimeFormatter(DateTimeStyle dateStyle, DateTimeStyle timeStyle, const Locale& locale)
861 IcuDateFormat* pIcuDateFormat = null;
863 result r = SetLocale(locale);
864 SysTryReturnResult(NID_LCL, !IsFailed(r), E_INVALID_ARG, "Locale setting failed.");
866 U_ICU_NAMESPACE::DateFormat::EStyle icuDateStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) dateStyle;
867 U_ICU_NAMESPACE::DateFormat::EStyle icuTimeStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) timeStyle;
869 if (dateStyle == DATE_TIME_STYLE_NONE)
871 if (timeStyle != DATE_TIME_STYLE_NONE)
873 pIcuDateFormat = IcuDateFormat::createTimeInstance(icuTimeStyle, __icuLocale);
878 if (timeStyle == DATE_TIME_STYLE_NONE)
880 pIcuDateFormat = IcuDateFormat::createDateInstance(icuDateStyle, __icuLocale);
884 pIcuDateFormat = IcuDateFormat::createDateTimeInstance(icuDateStyle, icuTimeStyle, __icuLocale);
890 if (__pIcuDateFormat)
892 delete __pIcuDateFormat;
893 __pIcuDateFormat = null;
895 __pIcuDateFormat = dynamic_cast< IcuSimpleDateFormat* >(pIcuDateFormat);
897 if (__pIcuDateFormat)
899 if (__pIcuDateFormatSymbols)
901 delete __pIcuDateFormatSymbols;
902 __pIcuDateFormatSymbols = null;
905 const IcuDateFormatSymbols* pDateTimeFormatSym = __pIcuDateFormat->getDateFormatSymbols();
907 if (pDateTimeFormatSym)
909 __pIcuDateFormatSymbols = new IcuDateFormatSymbols(*pDateTimeFormatSym);
916 delete pIcuDateFormat;
917 return E_INVALID_ARG;
921 _LocaleData::SetStartTimeRule(IcuSimpleTimeZone& zone, const TimeRule* pOspTimeRule)
925 UErrorCode status = U_ZERO_ERROR;
926 IcuDateTimeRule::TimeRuleType icuTimeRuleType;
928 DstRuleMode ospRuleMode = static_cast< DstRuleMode >(pOspTimeRule->GetRuleMode());
929 Tizen::System::TimeMode ospTimeMode = pOspTimeRule->GetTimeMode();
933 case Tizen::System::UTC_TIME:
935 icuTimeRuleType = IcuDateTimeRule::UTC_TIME;
939 case Tizen::System::STANDARD_TIME:
941 icuTimeRuleType = IcuDateTimeRule::STANDARD_TIME;
945 case Tizen::System::WALL_TIME:
948 icuTimeRuleType = IcuDateTimeRule::WALL_TIME;
953 int time = ((pOspTimeRule->GetHour() * 60) + pOspTimeRule->GetMinute()) * 60 * 1000;
960 pOspTimeRule->GetMonth(),
961 pOspTimeRule->GetDay(),
968 case DAY_OF_WEEK_IN_MONTH:
971 pOspTimeRule->GetMonth(),
972 pOspTimeRule->GetWeek(),
973 pOspTimeRule->GetDayOfWeek(),
980 case AFTER_THE_SPECIFIED_DAY:
983 pOspTimeRule->GetMonth(),
984 pOspTimeRule->GetDay(),
985 pOspTimeRule->GetDayOfWeek(),
992 case BEFORE_THE_SPECIFIED_DAY:
995 pOspTimeRule->GetMonth(),
996 pOspTimeRule->GetDay(),
997 -pOspTimeRule->GetDayOfWeek(),
1004 case BACKWARD_FROM_END_OF_MONTH:
1007 pOspTimeRule->GetMonth(),
1008 pOspTimeRule->GetWeek() * -1,
1016 return U_SUCCESS(status) ? E_SUCCESS : E_SYSTEM;
1018 return E_INVALID_ARG;
1022 _LocaleData::SetEndTimeRule(IcuSimpleTimeZone& zone, const TimeRule* pOspTimeRule)
1026 UErrorCode status = U_ZERO_ERROR;
1027 IcuDateTimeRule::TimeRuleType icuTimeRuleType;
1029 DstRuleMode ospRuleMode = static_cast< DstRuleMode >(pOspTimeRule->GetRuleMode());
1030 Tizen::System::TimeMode ospTimeMode = pOspTimeRule->GetTimeMode();
1032 switch (ospTimeMode)
1034 case Tizen::System::UTC_TIME:
1036 icuTimeRuleType = IcuDateTimeRule::UTC_TIME;
1040 case Tizen::System::STANDARD_TIME:
1042 icuTimeRuleType = IcuDateTimeRule::STANDARD_TIME;
1046 case Tizen::System::WALL_TIME:
1049 icuTimeRuleType = IcuDateTimeRule::WALL_TIME;
1054 int time = ((pOspTimeRule->GetHour() * 60) + pOspTimeRule->GetMinute()) * 60 * 1000;
1056 switch (ospRuleMode)
1061 pOspTimeRule->GetMonth(),
1062 pOspTimeRule->GetDay(),
1069 case DAY_OF_WEEK_IN_MONTH:
1072 pOspTimeRule->GetMonth(),
1073 pOspTimeRule->GetWeek(),
1074 pOspTimeRule->GetDayOfWeek(),
1081 case AFTER_THE_SPECIFIED_DAY:
1084 pOspTimeRule->GetMonth(),
1085 pOspTimeRule->GetDay(),
1086 pOspTimeRule->GetDayOfWeek(),
1093 case BEFORE_THE_SPECIFIED_DAY:
1096 pOspTimeRule->GetMonth(),
1097 pOspTimeRule->GetDay(),
1098 -pOspTimeRule->GetDayOfWeek(),
1105 case BACKWARD_FROM_END_OF_MONTH:
1108 pOspTimeRule->GetMonth(),
1109 pOspTimeRule->GetWeek() * -1,
1117 return U_SUCCESS(status) ? E_SUCCESS : E_SYSTEM;
1119 return E_INVALID_ARG;
1123 _LocaleData::FormatDateTime(const DateTime& date, String& str)
1125 std::auto_ptr <Calendar> pCal(Calendar::CreateInstanceN());
1126 SysTryReturnResult(NID_LCL, pCal.get(), E_OUT_OF_MEMORY, "Memory allocation failed");
1128 result r = pCal->SetTime(date);
1129 SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar");
1131 r = pCal->Clear(TIME_FIELD_MILLISECOND);
1132 SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar");
1134 return FormatDateTime(*pCal, str);
1138 _LocaleData::FormatDateTime(const Calendar& calendar, Tizen::Base::String& str)
1140 SysTryReturnResult(NID_LCL, __pIcuDateFormat, E_INVALID_STATE, "This instance is not constructed");
1143 const _IcuCalendarImpl* _pIcuCalendarImpl = _CalendarImpl::GetImpl(calendar);
1144 if (_pIcuCalendarImpl)
1146 IcuCalendar* pIcuCal = _pIcuCalendarImpl->GetIcuCalendarCloneN();
1149 IcuFieldPosition icuFp;
1150 IcuUnicodeString icuStr;
1152 GetIcuString(str,icuStr);
1153 icuStr = __pIcuDateFormat->format(*pIcuCal, icuStr, icuFp);
1154 str = _LocaleData::GetOspString(icuStr);
1157 return GetLastResult();
1165 _LocaleData::GetDateTimePattern()
1167 SysTryReturn(NID_LCL, __pIcuDateFormat, String(""), E_INVALID_STATE, "This instance is not constructed");
1168 IcuUnicodeString icuPattern;
1170 icuPattern = __pIcuDateFormat->toPattern(icuPattern);
1171 return _LocaleData::GetOspString(icuPattern);
1175 _LocaleData::SetDateTimePattern(const String& pattern)
1177 SysTryReturnResult(NID_LCL, __pIcuDateFormat, E_INVALID_STATE, "This instance is not constructed");
1178 IcuUnicodeString icuStr;
1180 GetIcuString(pattern, icuStr);
1182 __pIcuDateFormat->applyPattern(icuStr);
1187 _LocaleData::GetDateTimeSymbolsN(DateTimeSymbols* pDateTimeSymbols)
1189 SysTryReturn(NID_LCL, __pIcuDateFormatSymbols, null, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed");
1190 SysTryReturn(NID_LCL, pDateTimeSymbols, null, E_INVALID_ARG, "[%s] Invalid argument is used. pDateTimeSymbols is null.", GetErrorMessage(E_INVALID_ARG));
1192 _DateTimeSymbolsImpl* pDateTimeSymbolsImpl = _DateTimeSymbolsImpl::GetDateTimeSymbolsImpl(pDateTimeSymbols);
1194 if (pDateTimeSymbolsImpl)
1196 pDateTimeSymbolsImpl->ReleaseAll();
1198 pDateTimeSymbolsImpl->__pErasList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_ERA_LIST);
1199 pDateTimeSymbolsImpl->__pMonthsList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_MONTH_LIST);
1200 pDateTimeSymbolsImpl->__pShortMonthsList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_MONTH_LIST);
1201 pDateTimeSymbolsImpl->__pWeekdaysList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_WEEKDAY_LIST);
1202 pDateTimeSymbolsImpl->__pShortWeekdaysList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST);
1203 pDateTimeSymbolsImpl->__pAmPmList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_AM_PM_LIST);
1205 return pDateTimeSymbols;
1211 // This function convert and set ICU DateTime symbols from OSP DateTimeSymbols
1213 _LocaleData::SetDateTimeSymbols(const DateTimeSymbols& newValue)
1215 UErrorCode ec = U_ZERO_ERROR;
1217 if (!__pIcuDateFormatSymbols)
1219 __pIcuDateFormatSymbols = new IcuDateFormatSymbols(ec);
1222 IcuUnicodeString* pIcuArray = null;
1225 if (U_SUCCESS(ec) && __pIcuDateFormatSymbols != null)
1227 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetEras(), count);
1228 __pIcuDateFormatSymbols->setEras(pIcuArray, count);
1231 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetMonths(), count);
1232 __pIcuDateFormatSymbols->setMonths(pIcuArray, count);
1235 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetShortMonths(), count);
1236 __pIcuDateFormatSymbols->setShortMonths(pIcuArray, count);
1239 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetWeekdays(), count);
1240 __pIcuDateFormatSymbols->setWeekdays(pIcuArray, count);
1243 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetShortWeekdays(), count);
1244 __pIcuDateFormatSymbols->setShortWeekdays(pIcuArray, count);
1247 pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetAmPm(), count);
1248 __pIcuDateFormatSymbols->setAmPmStrings(pIcuArray, count);
1251 // From ICU Docs: SimpleDateFormat no longer use the zone strings stored in a DateFormatSymbols. Therefore, the time zone strings
1252 // set by this method have no effects in an instance of SimpleDateFormat for formatting time zones.
1253 // __pIcuDateFormatSymbols->setZoneStrings();
1255 __pIcuDateFormat->setDateFormatSymbols(*__pIcuDateFormatSymbols);
1259 return E_UNSUPPORTED_OPERATION;
1263 _LocaleData::SetGregorianWeekCountData(const Locale& ospLocale, DayOfWeek& firstDayOfWeek, short& minDaysInFirstWeek)
1265 UErrorCode success = U_ZERO_ERROR;
1266 IcuLocale icuLocale;
1268 icuLocale = GetIcuLocale(ospLocale);
1269 result r = GetLastResult();
1270 SysAssert(r == E_SUCCESS);
1272 GregorianCalendar gc(icuLocale, success);
1273 SysAssert(U_SUCCESS(success));
1275 firstDayOfWeek = (DayOfWeek) gc.getFirstDayOfWeek(); // Set __firstDayOfWeek from ICU data
1276 minDaysInFirstWeek = 1; // To align with 2.0 version
1277 // minDaysInFirstWeek = (short) gc.getMinimalDaysInFirstWeek(); // Set __minDaysInFirstWeek from ICU data
1280 _LocaleData::_LocaleData(void)
1282 , // default ICU locale
1283 __pIcuNumberFormatter(null)
1284 , __pIcuDateFormatSymbols(null)
1285 , __pIcuDateFormat(null)
1290 _LocaleData::~_LocaleData(void)
1292 if (__pIcuNumberFormatter) // Delete __pIcuNumberFormatter and set to null
1294 delete __pIcuNumberFormatter;
1295 __pIcuNumberFormatter = null;
1298 if (__pIcuDateFormatSymbols) // Delete __pIcuDateFormatSymbols and set to null
1300 delete __pIcuDateFormatSymbols;
1301 __pIcuDateFormatSymbols = null;
1304 if (__pIcuDateFormat) // Delete __pIcuDateFormat and set to null
1306 delete __pIcuDateFormat;
1307 __pIcuDateFormat = null;
1313 }; // Tizen::Locales