From: Hokwon Song Date: Fri, 2 Aug 2013 06:49:48 +0000 (+0000) Subject: Merge "Refactoy Locales for DateTimeFormatter." into devel_3.0_main X-Git-Tag: accepted/tizen/20130912.081851^2~59 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=00264c6bd4fc728746cf903537cb4b6b8b357c53;hp=3b28adfedd58be1d63760eb4084a1929f6467bd2;p=platform%2Fframework%2Fnative%2Fappfw.git Merge "Refactoy Locales for DateTimeFormatter." into devel_3.0_main --- diff --git a/src/locales/FLcl_CurrencyImpl.cpp b/src/locales/FLcl_CurrencyImpl.cpp index 5f46d32..e09ea79 100644 --- a/src/locales/FLcl_CurrencyImpl.cpp +++ b/src/locales/FLcl_CurrencyImpl.cpp @@ -23,7 +23,8 @@ #include #include - +#include +#include #include "FLcl_LocaleData.h" #include "FLcl_LocaleImpl.h" #include "FLcl_CurrencyImpl.h" diff --git a/src/locales/FLcl_DateTimeFormatterImpl.cpp b/src/locales/FLcl_DateTimeFormatterImpl.cpp index 0c3f4cd..e3da25c 100644 --- a/src/locales/FLcl_DateTimeFormatterImpl.cpp +++ b/src/locales/FLcl_DateTimeFormatterImpl.cpp @@ -21,12 +21,19 @@ // Includes #include +#include +#include +#include + #include #include #include #include "FLcl_DateTimeFormatterImpl.h" #include "FLcl_LocaleData.h" #include "FLcl_LocaleManagerImpl.h" +#include "FLcl_CalendarImpl.h" +#include "FLcl_IcuCalendarImpl.h" +#include "FLcl_DateTimeSymbolsImpl.h" using namespace Tizen::Base; using namespace Tizen::Base::Collection; @@ -36,15 +43,17 @@ namespace Tizen { namespace Locales { _DateTimeFormatterImpl::_DateTimeFormatterImpl(void) - : __pLocaleData(null) - , __pSymbols(null) + : __pSymbols(null) + , __pIcuDateFormatter(null) + , __pLocale(null) { } _DateTimeFormatterImpl::~_DateTimeFormatterImpl(void) { - delete __pLocaleData; delete __pSymbols; + delete __pIcuDateFormatter; + delete __pLocale; } // The DateTimeFormatter always use System Locale if not provided by the user. @@ -77,93 +86,154 @@ _DateTimeFormatterImpl::CreateInstanceN(const Locale& locale, DateTimeStyle date { result r = (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG; + SysTryReturn(NID_LCL, locale.GetLanguageCode() != LANGUAGE_INVALID && locale.GetCountryCode() != COUNTRY_INVALID, null, r, "It is the invalid locale."); SysTryReturn(NID_LCL, ValidateDateTimeStyle(dateStyle), null, r, "[%s] Invalid argument is used. dateStyle is invalid", GetErrorMessage(r)); SysTryReturn(NID_LCL, ValidateDateTimeStyle(timeStyle), null, r, "[%s] Invalid argument is used. timeStyle is invalid", GetErrorMessage(r)); ClearLastResult(); - // Create a DateTimeFormatter of the desired style. std::unique_ptr pDateTimeFormatter(new (std::nothrow) DateTimeFormatter()); SysTryReturn(NID_LCL, pDateTimeFormatter, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); std::unique_ptr<_DateTimeFormatterImpl> pDateTimeFormatterImpl(new (std::nothrow) _DateTimeFormatterImpl); SysTryReturn(NID_LCL,pDateTimeFormatterImpl, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); - std::unique_ptr<_LocaleData> pLocaleData(new (std::nothrow) _LocaleData); - SysTryReturn(NID_LCL, pLocaleData, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); + std::unique_ptr< U_ICU_NAMESPACE::SimpleDateFormat> pIcuDateFormatter(pDateTimeFormatterImpl->GetIcuDateFormatterN(locale, dateStyle, timeStyle)); + SysTryReturn(NID_LCL, pIcuDateFormatter, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); + + pDateTimeFormatterImpl->__pLocale = new (std::nothrow) Locale(locale); + SysTryReturn(NID_LCL, pDateTimeFormatterImpl->__pLocale, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); + pDateTimeFormatterImpl->__pIcuDateFormatter = pIcuDateFormatter.release(); + pDateTimeFormatter->__pDateTimeFormatterImpl = pDateTimeFormatterImpl.release(); + return pDateTimeFormatter.release(); // Here as LastResult is already cleared, no need to set it to E_SUCCESS +} + +U_ICU_NAMESPACE::SimpleDateFormat* +_DateTimeFormatterImpl::GetIcuDateFormatterN(const Locale& locale, DateTimeStyle dateStyle, DateTimeStyle timeStyle) +{ + SysTryReturn(NID_LCL, dateStyle != DATE_TIME_STYLE_NONE || timeStyle != DATE_TIME_STYLE_NONE, null, E_INVALID_ARG, "It is an invalid argument."); - // This create and set ICU DateFormatter in _Locale data object for future use - r = pLocaleData->SetDateTimeFormatter(dateStyle, timeStyle, locale); - SysTryReturn(NID_LCL, !IsFailed(r), null, r, "[%s]",GetErrorMessage(r)); + U_ICU_NAMESPACE::DateFormat* pIcuDateFormat = null; + U_ICU_NAMESPACE::DateFormat::EStyle icuDateStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) dateStyle; + U_ICU_NAMESPACE::DateFormat::EStyle icuTimeStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) timeStyle; + U_ICU_NAMESPACE::Locale icuLocale = _LocaleData::GetIcuLocale(locale); - // Create DateTimeSymbols and construct using locale - pDateTimeFormatterImpl->__pSymbols = new (std::nothrow) DateTimeSymbols; - if (pDateTimeFormatterImpl->__pSymbols) + if (dateStyle != DATE_TIME_STYLE_NONE && timeStyle != DATE_TIME_STYLE_NONE) { - pDateTimeFormatterImpl->__pSymbols->Construct(locale); + pIcuDateFormat = U_ICU_NAMESPACE::DateFormat::createDateTimeInstance(icuDateStyle, icuTimeStyle, icuLocale); + } + else if (dateStyle != DATE_TIME_STYLE_NONE && timeStyle == DATE_TIME_STYLE_NONE) + { + pIcuDateFormat = U_ICU_NAMESPACE::DateFormat::createDateInstance(icuDateStyle, icuLocale); + } + else if (dateStyle == DATE_TIME_STYLE_NONE && timeStyle != DATE_TIME_STYLE_NONE) + { + pIcuDateFormat = U_ICU_NAMESPACE::DateFormat::createTimeInstance(icuTimeStyle, icuLocale); } - pDateTimeFormatter->__pDateTimeFormatterImpl = pDateTimeFormatterImpl.release(); - pDateTimeFormatter->__pDateTimeFormatterImpl->__pLocaleData = pLocaleData.release(); - return pDateTimeFormatter.release(); // Here as LastResult is already cleared, no need to set it to E_SUCCESS + return dynamic_cast< U_ICU_NAMESPACE::SimpleDateFormat* >(pIcuDateFormat); } + // This function will not have TimeZone informations and always print time zone as GMT+00:00 result _DateTimeFormatterImpl::Format(const DateTime& date, String& strBuf) const { - SysAssertf(__pLocaleData != null, "Not yet constructed! Construct() should be called before use."); - return __pLocaleData->FormatDateTime(date, strBuf); // Format date using ICU date formatter + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + + std::unique_ptr< Calendar > pCal(Calendar::CreateInstanceN()); + SysTryReturnResult(NID_LCL, pCal, E_OUT_OF_MEMORY, "Memory allocation failed"); + + result r = pCal->SetTime(date); + SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar", GetErrorMessage(r)); + + r = pCal->Clear(TIME_FIELD_MILLISECOND); + SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar", GetErrorMessage(r)); + + return Format(*(pCal.get()), strBuf); } result _DateTimeFormatterImpl::Format(const Calendar& calendar, String& strBuf) const { - SysAssertf(__pLocaleData != null, "Not yet constructed! Construct() should be called before use."); - return __pLocaleData->FormatDateTime(calendar, strBuf); // Format date using ICU date formatter + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + + const _IcuCalendarImpl* pIcuCalendarImpl = _CalendarImpl::GetImpl(calendar); + SysTryReturnResult(NID_LCL, pIcuCalendarImpl, E_SYSTEM, "It is failed to get icu calendar."); + + IcuCalendar* pIcuCal = pIcuCalendarImpl->GetIcuCalendarCloneN(); + SysTryReturnResult(NID_LCL, pIcuCal, E_SYSTEM, "It is failed to get icu calendar."); + + IcuFieldPosition icuFp; + IcuUnicodeString icuStr; + + _LocaleData::GetIcuString(strBuf,icuStr); + icuStr = __pIcuDateFormatter->format(*pIcuCal, icuStr, icuFp); + strBuf = _LocaleData::GetOspString(icuStr); + delete pIcuCal; + + return E_SUCCESS; } -// This function sets pattern used by DateTimeFormatter for formatting date. -// Please check http://icu-project.org/apiref/icu4c/classSimpleDateFormat.html for possible letter and -// their meaning in patter string. result _DateTimeFormatterImpl::ApplyPattern(const String& pattern) { - SysAssertf(__pLocaleData != null, "Not yet constructed! Construct() should be called before use."); - return __pLocaleData->SetDateTimePattern(pattern); // Set pattern to ICU date formatter + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + U_ICU_NAMESPACE::UnicodeString icuStr; + _LocaleData::GetIcuString(pattern, icuStr); + __pIcuDateFormatter->applyPattern(icuStr); + return E_SUCCESS; } String _DateTimeFormatterImpl::GetPattern(void) const { - return __pLocaleData->GetDateTimePattern(); + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + IcuUnicodeString icuPattern; + icuPattern = __pIcuDateFormatter->toPattern(icuPattern); + return _LocaleData::GetOspString(icuPattern); } const DateTimeSymbols* -_DateTimeFormatterImpl::GetDateTimeSymbols(void) const +_DateTimeFormatterImpl::GetDateTimeSymbols(void) { + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + if (__pSymbols == null) + { + std::unique_ptr< DateTimeSymbols > pSymbols(new (std::nothrow) DateTimeSymbols); + SysTryReturn(NID_LCL, pSymbols, null, E_OUT_OF_MEMORY, "It is not enough memory."); + pSymbols->Construct(*__pLocale); + __pSymbols = pSymbols.release(); + } return __pSymbols; } void _DateTimeFormatterImpl::SetDateTimeSymbols(const DateTimeSymbols& newSymbols) { - SysAssertf(__pLocaleData != null, "Not yet constructed! Construct() should be called before use."); + SysAssertf(__pIcuDateFormatter != null, "Not yet constructed! Construct() should be called before use."); + + std::unique_ptr< DateTimeSymbols > pSymbols(new (std::nothrow) DateTimeSymbols); + SysTryReturn(NID_LCL, pSymbols, , E_OUT_OF_MEMORY, "It is not enough memory."); + result r = pSymbols->Construct(newSymbols); + SysTryReturn(NID_LCL, r == E_SUCCESS, , r, "[%s] occured.", GetErrorMessage(r)); + + _DateTimeSymbolsImpl* pDateTimeSymbolsImpl = _DateTimeSymbolsImpl::GetDateTimeSymbolsImpl(pSymbols.get()); + const U_ICU_NAMESPACE::DateFormatSymbols* pIcuSymbols = pDateTimeSymbolsImpl->GetIcuSymbols(); + + __pIcuDateFormatter->setDateFormatSymbols(*pIcuSymbols); - result r = __pLocaleData->SetDateTimeSymbols(newSymbols); // Set symbols to ICU date formatter - if (!IsFailed(r)) + if (__pSymbols) { - if (__pSymbols) - { - __pSymbols = __pLocaleData->GetDateTimeSymbolsN(__pSymbols); // Set __pSymbols obtained from ICU date formatter - } + delete __pSymbols; } + __pSymbols = pSymbols.release(); } bool _DateTimeFormatterImpl::ValidateDateTimeStyle(DateTimeStyle dateTimeStyle) { - return (dateTimeStyle < DATE_TIME_STYLE_NONE || dateTimeStyle > DATE_TIME_STYLE_SHORT)? false : true; + return (dateTimeStyle < DATE_TIME_STYLE_NONE || dateTimeStyle > DATE_TIME_STYLE_SHORT) ? false : true; } }; diff --git a/src/locales/FLcl_DateTimeFormatterImpl.h b/src/locales/FLcl_DateTimeFormatterImpl.h index 91d53b2..c55af1c 100644 --- a/src/locales/FLcl_DateTimeFormatterImpl.h +++ b/src/locales/FLcl_DateTimeFormatterImpl.h @@ -38,6 +38,10 @@ class _LocaleData; }; }; +namespace U_ICU_NAMESPACE +{ + class SimpleDateFormat; +} namespace Tizen { namespace Locales { @@ -115,7 +119,7 @@ public: * @return A pointer to DateTimeSymbols for the formatter instance * @see SetDateTimeSymbols() */ - const DateTimeSymbols* GetDateTimeSymbols(void) const; + const DateTimeSymbols* GetDateTimeSymbols(void); /** @@ -159,10 +163,12 @@ private: _DateTimeFormatterImpl(const _DateTimeFormatterImpl& dateTimeFormatterImpl); _DateTimeFormatterImpl& operator =(const _DateTimeFormatterImpl& dateTimeFormatterImpl); -// Attribute - _LocaleData* __pLocaleData; - DateTimeSymbols* __pSymbols; + U_ICU_NAMESPACE::SimpleDateFormat* GetIcuDateFormatterN(const Locale& locale, DateTimeStyle dateStyle, DateTimeStyle timeStyle); +private: + DateTimeSymbols* __pSymbols; + U_ICU_NAMESPACE::SimpleDateFormat* __pIcuDateFormatter; + Locale* __pLocale; }; // _DateTimeFormatterImpl }; }; // Tizen::Locales diff --git a/src/locales/FLcl_DateTimeSymbolsImpl.cpp b/src/locales/FLcl_DateTimeSymbolsImpl.cpp index fe337ed..6216283 100644 --- a/src/locales/FLcl_DateTimeSymbolsImpl.cpp +++ b/src/locales/FLcl_DateTimeSymbolsImpl.cpp @@ -75,24 +75,19 @@ _DateTimeSymbolsImpl::Initialize(const Locale& locale, CalendarType calendarType { SysTryReturnResult(NID_LCL, _LocaleImpl::IsSupported(locale), E_INVALID_ARG, "Given locale is not supported"); - _LocaleData localeData; - result r = localeData.SetDateFormatSymbols(locale); // this will set ICU DateTimeSymbol in _LocaleData object for future use - - if (!IsFailed(r)) - { - __pErasList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_ERA_LIST); - __pMonthsList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_MONTH_LIST); - __pShortMonthsList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_MONTH_LIST); - __pWeekdaysList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_WEEKDAY_LIST); - __pShortWeekdaysList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST); - __pAmPmList = localeData.GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_AM_PM_LIST); - __CalendarType = calendarType; - - UErrorCode ec = U_ZERO_ERROR; - __pIcuDateFormatSymbols = new IcuDateFormatSymbols(ec); - } - - return r; + UErrorCode ec = U_ZERO_ERROR; + __pIcuDateFormatSymbols = new U_ICU_NAMESPACE::DateFormatSymbols(_LocaleData::GetIcuLocale(locale), ec); + SysTryReturnResult(NID_LCL, __pIcuDateFormatSymbols, E_OUT_OF_MEMORY, "It is not enough memory."); + + __pErasList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_ERA_LIST); + __pMonthsList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_MONTH_LIST); + __pShortMonthsList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_SHORT_MONTH_LIST); + __pWeekdaysList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_WEEKDAY_LIST); + __pShortWeekdaysList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST); + __pAmPmList = GetSymbolAttributeArrayN(DATE_FORMAT_SYM_AM_PM_LIST); + __CalendarType = calendarType; + + return E_SUCCESS; } void @@ -100,18 +95,28 @@ _DateTimeSymbolsImpl::Set(const _DateTimeSymbolsImpl* pOther) { SysTryReturnVoidResult(NID_LCL, pOther != null, E_INVALID_ARG, "[%s] Invalid argument is used. pOther instance is invalid", GetErrorMessage(E_INVALID_ARG)); + ReleaseAll(); - __pErasList = CloneArrayListN(pOther->__pErasList); // Copying EraList - __pMonthsList = CloneArrayListN(pOther->__pMonthsList); // Copying Month List - __pShortMonthsList = CloneArrayListN(pOther->__pShortMonthsList); // Copying Short Month List - __pWeekdaysList = CloneArrayListN(pOther->__pWeekdaysList); // Copying Weekdays List - __pShortWeekdaysList = CloneArrayListN(pOther->__pShortWeekdaysList); // Copying Short Weekdays List - __pAmPmList = CloneArrayListN(pOther->__pAmPmList); // Copying AM/ PM String + __pErasList = CloneArrayListN(pOther->__pErasList); + __pMonthsList = CloneArrayListN(pOther->__pMonthsList); + __pShortMonthsList = CloneArrayListN(pOther->__pShortMonthsList); + __pWeekdaysList = CloneArrayListN(pOther->__pWeekdaysList); + __pShortWeekdaysList = CloneArrayListN(pOther->__pShortWeekdaysList); + __pAmPmList = CloneArrayListN(pOther->__pAmPmList); if(pOther->__pTimeZonesMap) { - __pTimeZonesMap = CloneMultiHashMapN(pOther->__pTimeZonesMap); // Copying available TimeZone List + __pTimeZonesMap = CloneMultiHashMapN(pOther->__pTimeZonesMap); } - __CalendarType = pOther->__CalendarType; // Copying Calendar Type + __CalendarType = pOther->__CalendarType; + + if(__pIcuDateFormatSymbols) + { + delete __pIcuDateFormatSymbols; + __pIcuDateFormatSymbols = null; + } + _DateTimeSymbolsImpl* pDTS = const_cast<_DateTimeSymbolsImpl*>(pOther); + __pIcuDateFormatSymbols = new U_ICU_NAMESPACE::DateFormatSymbols(*(pDTS->GetIcuSymbols())); + SysTryReturnVoidResult(NID_LCL, __pIcuDateFormatSymbols, E_OUT_OF_MEMORY, "It is not enough memory."); } @@ -134,7 +139,7 @@ _DateTimeSymbolsImpl::AddTimeZoneName(const String& timeZoneId, const String& co if (!__pTimeZonesMap) { - MultiHashMap* pMultiHashMap = new (std::nothrow) MultiHashMap(); + MultiHashMap* pMultiHashMap = new (std::nothrow) MultiHashMap(SingleObjectDeleter); SysTryReturnResult(NID_LCL, pMultiHashMap, E_OUT_OF_MEMORY, "Memory allocation failed."); pMultiHashMap->Construct(); @@ -172,7 +177,7 @@ _DateTimeSymbolsImpl::GetAmPm(void) const { SysAssertf(__pAmPmList != null, "Not yet constructed! Construct() should be called before use"); - ClearLastResult(); // Setting Last result to E_SUCCESS + ClearLastResult(); return __pAmPmList; } @@ -182,17 +187,19 @@ _DateTimeSymbolsImpl::SetAmPm(const String& amPm) { SysAssertf(__pAmPmList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), AM_PM_COUNT, amPm); if (!IsFailed(r)) { - __pAmPmList->RemoveAll(true); delete __pAmPmList; __pAmPmList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pAmPmList, count); + __pIcuDateFormatSymbols->setAmPmStrings(pIcuArray, count); + delete[] pIcuArray; } - return r; } @@ -208,16 +215,18 @@ _DateTimeSymbolsImpl::SetEras(const String& eras) { SysAssertf(__pErasList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), ERAS_COUNT, eras); if (!IsFailed(r)) { - __pErasList->RemoveAll(true); delete __pErasList; - __pErasList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pErasList, count); + __pIcuDateFormatSymbols->setEras(pIcuArray, count); + delete[] pIcuArray; } return r; @@ -228,7 +237,7 @@ _DateTimeSymbolsImpl::GetMonths(void) const { SysAssertf(__pMonthsList != null, "Not yet constructed! Construct() should be called before use"); - ClearLastResult(); // Setting Last result to E_SUCCESS + ClearLastResult(); return __pMonthsList; } @@ -237,16 +246,18 @@ _DateTimeSymbolsImpl::SetMonths(const String& months) { SysAssertf(__pMonthsList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), MONTH_COUNT, months); if (!IsFailed(r)) { - __pMonthsList->RemoveAll(true); delete __pMonthsList; - __pMonthsList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pMonthsList, count); + __pIcuDateFormatSymbols->setMonths(pIcuArray, count); + delete[] pIcuArray; } return r; @@ -256,7 +267,7 @@ _DateTimeSymbolsImpl::GetShortMonths(void) const { SysAssertf(__pShortMonthsList != null, "Not yet constructed! Construct() should be called before use"); - ClearLastResult(); // Setting Last result to E_SUCCESS + ClearLastResult(); return __pShortMonthsList; } @@ -265,16 +276,18 @@ _DateTimeSymbolsImpl::SetShortMonths(const String& shortMonths) { SysAssertf(__pShortMonthsList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), MONTH_COUNT, shortMonths); if (!IsFailed(r)) { - __pShortMonthsList->RemoveAll(true); delete __pShortMonthsList; - __pShortMonthsList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pShortMonthsList, count); + __pIcuDateFormatSymbols->setShortMonths(pIcuArray, count); + delete[] pIcuArray; } return r; @@ -285,7 +298,7 @@ _DateTimeSymbolsImpl::GetWeekdays(void) const { SysAssertf(__pWeekdaysList != null, "Not yet constructed! Construct() should be called before use"); - ClearLastResult(); // Setting Last result to E_SUCCESS + ClearLastResult(); return __pWeekdaysList; } @@ -294,16 +307,18 @@ _DateTimeSymbolsImpl::SetWeekdays(const String& weekdays) { SysAssertf(__pWeekdaysList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), WEEKDAYS_COUNT, weekdays); if (!IsFailed(r)) { - __pWeekdaysList->RemoveAll(true); delete __pWeekdaysList; - __pWeekdaysList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pWeekdaysList, count); + __pIcuDateFormatSymbols->setWeekdays(pIcuArray, count); + delete[] pIcuArray; } return r; @@ -314,8 +329,7 @@ const IList* _DateTimeSymbolsImpl::GetShortWeekdays(void) const { SysAssertf(__pShortWeekdaysList != null, "Not yet constructed! Construct() should be called before use"); - - ClearLastResult(); // Setting Last result to E_SUCCESS + ClearLastResult(); return __pShortWeekdaysList; } @@ -324,16 +338,18 @@ _DateTimeSymbolsImpl::SetShortWeekdays(const String& shortWeekdays) { SysAssertf(__pShortWeekdaysList != null, "Not yet constructed! Construct() should be called before use"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTempArrayList(new (std::nothrow) ArrayList()); + std::unique_ptr< ArrayList > pTempArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturnResult(NID_LCL, pTempArrayList != null, E_OUT_OF_MEMORY, "Memory allocation failed."); result r = SetList(pTempArrayList.get(), WEEKDAYS_COUNT, shortWeekdays); if (!IsFailed(r)) { - __pShortWeekdaysList->RemoveAll(true); delete __pShortWeekdaysList; - __pShortWeekdaysList = pTempArrayList.release(); + int count = 0; + U_ICU_NAMESPACE::UnicodeString* pIcuArray = _LocaleData::ConvertOspArrayToIcuStringArrayN(__pShortWeekdaysList, count); + __pIcuDateFormatSymbols->setShortWeekdays(pIcuArray, count); + delete[] pIcuArray; } return r; @@ -392,7 +408,6 @@ _DateTimeSymbolsImpl::GetTimeZoneName(Tizen::Base::String& timeZoneId, int timeZ result _DateTimeSymbolsImpl::SetTimeZoneName(const Tizen::Base::String& timeZoneId, const Tizen::Base::String& concatenatedTimeZoneName) { - // checking if concatenatedTimeZoneName has 4 names StringTokenizer tokenizer(concatenatedTimeZoneName, L"|"); SysTryReturnResult(NID_LCL, (tokenizer.GetTokenCount() == MAX_TIMEZONE_NAME), E_INVALID_ARG, "Invalid argument is used. %ls is invalid.", concatenatedTimeZoneName.GetPointer()); @@ -422,15 +437,13 @@ _DateTimeSymbolsImpl::SetTimeZoneName(const Tizen::Base::String& timeZoneId, con } -// internal function -// This function makes a copy of input array list of strings IList* _DateTimeSymbolsImpl::CloneArrayListN(const IList* pList) const { SysTryReturn(NID_LCL, pList, null, E_INVALID_ARG, "[%s] Invalid argument is used. pList is Null", GetErrorMessage(E_INVALID_ARG)); - ClearLastResult(); // Setting last result to E_SUCCESS - std::unique_ptr< ArrayList, AllElementsDeleter > pClonedArrayList(new (std::nothrow) ArrayList()); + ClearLastResult(); + std::unique_ptr< ArrayList > pClonedArrayList(new (std::nothrow) ArrayList(SingleObjectDeleter)); SysTryReturn(NID_LCL, pClonedArrayList, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed", GetErrorMessage(E_OUT_OF_MEMORY)); result r = pClonedArrayList->Construct(pList->GetCount()); @@ -459,7 +472,7 @@ _DateTimeSymbolsImpl::CloneMultiHashMapN(const Tizen::Base::Collection::IMultiMa ClearLastResult(); - std::unique_ptr< MultiHashMap, AllElementsDeleter > pClonedMultiHashMap(new (std::nothrow) MultiHashMap()); + std::unique_ptr< MultiHashMap > pClonedMultiHashMap(new (std::nothrow) MultiHashMap(SingleObjectDeleter)); SysTryReturn(NID_LCL, pClonedMultiHashMap, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY)); result r = pClonedMultiHashMap->Construct(); @@ -515,11 +528,9 @@ _DateTimeSymbolsImpl::SetList(Tizen::Base::Collection::ArrayList* pArrayList, in SysTryReturnResult(NID_LCL, (tokenizer.GetTokenCount() == tokenCount), E_INVALID_ARG, "Invalid argument is used. stringWillBeTokenized=%ls", stringWillBeTokenized.GetPointer()); + SysTryReturnResult(NID_LCL, pArrayList, E_INVALID_ARG, "Invalid argument is used. pArrayList should not be null"); - std::unique_ptr< ArrayList, AllElementsDeleter > pTmpArrayList(pArrayList); - SysTryReturnResult(NID_LCL, pTmpArrayList, E_INVALID_ARG, "Invalid argument is used. pArrayList should not be null"); - - result r = pTmpArrayList->Construct(tokenCount); // Constructing list for tokenCount elements + result r = pArrayList->Construct(tokenCount); if (!IsFailed(r)) { String token; @@ -529,14 +540,12 @@ _DateTimeSymbolsImpl::SetList(Tizen::Base::Collection::ArrayList* pArrayList, in pListStr.reset(new (std::nothrow) String(token)); SysTryReturnResult(NID_LCL, pListStr, E_OUT_OF_MEMORY, "Memory allocation failed."); - r = pTmpArrayList->Add(pListStr.get()); + r = pArrayList->Add(pListStr.get()); SysTryReturnResult(NID_LCL, r == E_SUCCESS, r, "Failed to add value to array list."); pListStr.release(); } } - - pTmpArrayList.release(); return r; } @@ -545,26 +554,25 @@ _DateTimeSymbolsImpl::ReleaseList(IList* pList) { if (pList) { - pList->RemoveAll(true); // Remove elements and de-allocate memory used by them delete pList; + pList = null; } } -// This function release all the list after deleting their contents void _DateTimeSymbolsImpl::ReleaseAll(void) { - ReleaseList(__pErasList); // Deleting EraList after deleting its contents - ReleaseList(__pMonthsList); // Deleting MonthsList after deleting its contents - ReleaseList(__pShortMonthsList); // Deleting ShortMonthsList after deleting its contents - ReleaseList(__pWeekdaysList); // Deleting WeekdaysList after deleting its contents - ReleaseList(__pShortWeekdaysList); // Deleting ShortWeekdaysList after deleting its contents - ReleaseList(__pAmPmList); // Deleting AmPmList after deleting its contents + ReleaseList(__pErasList); + ReleaseList(__pMonthsList); + ReleaseList(__pShortMonthsList); + ReleaseList(__pWeekdaysList); + ReleaseList(__pShortWeekdaysList); + ReleaseList(__pAmPmList); if (__pTimeZonesMap) { - __pTimeZonesMap->RemoveAll(true); // Removing and deleting contents of TimeZonesMap - delete __pTimeZonesMap; // Deleting TimeZonesMap + delete __pTimeZonesMap; + __pTimeZonesMap = null; } } @@ -574,6 +582,64 @@ _DateTimeSymbolsImpl::GetDateTimeSymbolsImpl(DateTimeSymbols* pDateTimeSymbols) return pDateTimeSymbols->__pDateTimeSymbolsImpl; } +U_ICU_NAMESPACE::DateFormatSymbols* +_DateTimeSymbolsImpl::GetIcuSymbols(void) +{ + return __pIcuDateFormatSymbols; +} + +Tizen::Base::Collection::IList* +_DateTimeSymbolsImpl::GetSymbolAttributeArrayN(DateFormatSymbolsAttributes attributeName) +{ + SysTryReturn(NID_LCL, __pIcuDateFormatSymbols, null, E_SYSTEM, "It is not initialized."); + ClearLastResult(); + int count = 0; + const IcuUnicodeString* pIcuList = null; + + switch (attributeName) + { + case DATE_FORMAT_SYM_ERA_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getEras(count); + break; + } + case DATE_FORMAT_SYM_MONTH_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getMonths(count); + break; + } + case DATE_FORMAT_SYM_SHORT_MONTH_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getShortMonths(count); + break; + } + case DATE_FORMAT_SYM_WEEKDAY_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getWeekdays(count); + break; + } + case DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getShortWeekdays(count); + break; + } + case DATE_FORMAT_SYM_AM_PM_LIST: + { + pIcuList = __pIcuDateFormatSymbols->getAmPmStrings(count); + break; + } + default: + { + SetLastResult(E_UNSUPPORTED_OPERATION); + break; + } + } + + SysTryReturn(NID_LCL, pIcuList, null, E_SYSTEM, "It is faile to get symbols."); + return _LocaleData::ConvertIcuStringArrayToOspArrayN(pIcuList, count); +} + + }; }; // Tizen::Locale diff --git a/src/locales/FLcl_DateTimeSymbolsImpl.h b/src/locales/FLcl_DateTimeSymbolsImpl.h index 5059b66..fdcb6c0 100644 --- a/src/locales/FLcl_DateTimeSymbolsImpl.h +++ b/src/locales/FLcl_DateTimeSymbolsImpl.h @@ -33,6 +33,11 @@ #include #include +namespace U_ICU_NAMESPACE +{ + class UnicodeString; + class DateFormatSymbols; +} namespace Tizen { namespace Locales { @@ -57,7 +62,6 @@ class _DateTimeSymbolsImpl { public: -// Construct Operations _DateTimeSymbolsImpl(void); virtual ~_DateTimeSymbolsImpl(void); @@ -91,13 +95,16 @@ public: void ReleaseList(Tizen::Base::Collection::IList* pList); void ReleaseAll(); + U_ICU_NAMESPACE::DateFormatSymbols* GetIcuSymbols(void); static _DateTimeSymbolsImpl* GetDateTimeSymbolsImpl(DateTimeSymbols* pDateTimeSymbols); private: _DateTimeSymbolsImpl(const _DateTimeSymbolsImpl& dateTimeSymbolsImpl); _DateTimeSymbolsImpl& operator =(const _DateTimeSymbolsImpl& dateTimeSymbolsImpl); -// Attribute + Tizen::Base::Collection::IList* GetSymbolAttributeArrayN(DateFormatSymbolsAttributes attributeName); + +private: Tizen::Base::Collection::IList* __pErasList; Tizen::Base::Collection::IList* __pMonthsList; Tizen::Base::Collection::IList* __pShortMonthsList; diff --git a/src/locales/FLcl_LocaleData.cpp b/src/locales/FLcl_LocaleData.cpp index 8df7445..03643b8 100644 --- a/src/locales/FLcl_LocaleData.cpp +++ b/src/locales/FLcl_LocaleData.cpp @@ -32,7 +32,6 @@ #include #include #include "FBase_StringConverter.h" -#include "FLcl_DateTimeSymbolsImpl.h" #include "FLcl_CalendarImpl.h" #include "FLcl_IcuCalendarImpl.h" #include "FLcl_LocaleData.h" @@ -68,19 +67,19 @@ _LocaleData::GetIcuString(const String& ospStr) { IcuUnicodeString icuStr; - if (!ospStr.IsEmpty()) // if ospStr is not empty - { - ByteBuffer* pBuff = null; - pBuff = StringUtil::StringToUtf8N(ospStr); // Convert unicode value to UTF8 - if (pBuff) - { - icuStr = IcuUnicodeString((const char*) pBuff->GetPointer()); // Create ICU string using UTF8 array - icuStr.setCharAt(0, icuStr.charAt(0)); // This is to handle ICU copy on write design - delete pBuff; // delete temporary buffer - } - } - - return icuStr; + if (!ospStr.IsEmpty()) // if ospStr is not empty + { + ByteBuffer* pBuff = null; + pBuff = StringUtil::StringToUtf8N(ospStr); // Convert unicode value to UTF8 + if (pBuff) + { + icuStr = IcuUnicodeString((const char*) pBuff->GetPointer()); // Create ICU string using UTF8 array + icuStr.setCharAt(0, icuStr.charAt(0)); // This is to handle ICU copy on write design + delete pBuff; // delete temporary buffer + } + } + + return icuStr; } // This function convert ICU string to OSP string @@ -151,42 +150,33 @@ _LocaleData::ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrLis return pTempArrayList.release(); // Return array list } -// this function convert OSP string array list to ICU string array list IcuUnicodeString* _LocaleData::ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::IList* pIcuStrList, int& count) { - count = 0; // Setting count [Out param] to 0 + count = 0; SysTryReturn(NID_LCL, pIcuStrList, null, E_INVALID_ARG, "[%s] Invalid argument is used. pIcuStrList is null.", GetErrorMessage(E_INVALID_ARG)); count = pIcuStrList->GetCount(); - if (count > 0) // if pIcuStrList is not empty + SysTryReturn(NID_LCL, count > 0, null, E_INVALID_ARG, "The list is empty."); + + std::unique_ptr< IcuUnicodeString[] > pIcuStrArray(new IcuUnicodeString[count]); + SysTryReturn(NID_LCL, pIcuStrArray, null, E_OUT_OF_MEMORY, "It is not enough memory."); + + std::unique_ptr< IEnumerator > pEnum(pIcuStrList->GetEnumeratorN()); + SysTryReturn(NID_LCL, pEnum, null, E_SYSTEM, "It is failed to get enumerator."); + + int i = 0; + String* pObj = null; + while (pEnum->MoveNext() == E_SUCCESS) { - IcuUnicodeString* pIcuStrArray = new IcuUnicodeString[count]; - if (pIcuStrArray) // if allocation is successful + pObj = static_cast< String* >(pEnum->GetCurrent()); + if (pObj) { - IEnumerator* pEnum = pIcuStrList->GetEnumeratorN(); - if (pEnum) // if pEnum is non null - { - int i = 0; - String* pObj = null; - while (pEnum->MoveNext() == E_SUCCESS) // if enum has more value - { - pObj = static_cast< String* >(pEnum->GetCurrent()); // Get object and cast it to String - if (pObj) // if String is non null - { - GetIcuString(*pObj, pIcuStrArray[i]); // Convert it to ICU string and set to array - i++; - } - } - - delete pEnum; // Delete enumerator - return pIcuStrArray; // return ICU Array - } - delete[] pIcuStrArray; + GetIcuString(*pObj, pIcuStrArray[i]); + i++; } } - - return null; // return null in case of failure + return pIcuStrArray.release(); } @@ -730,98 +720,6 @@ _LocaleData::SetNumberFormatterAttributes(const bool newValue, NumberFormatterAt } } -result -_LocaleData::SetDateFormatSymbols(const Locale& locale) -{ - if (__pIcuDateFormatSymbols) - { - delete __pIcuDateFormatSymbols; - __pIcuDateFormatSymbols = null; - } - - UErrorCode ec = U_ZERO_ERROR; - result r = SetLocale(locale); - - if (!IsFailed(r)) - { - __pIcuDateFormatSymbols = new IcuDateFormatSymbols(__icuLocale, ec); - - if (__pIcuDateFormatSymbols && U_SUCCESS(ec)) - { - return E_SUCCESS; - } - } - - delete __pIcuDateFormatSymbols; - __pIcuDateFormatSymbols = null; - - return r; -} - -IList* -_LocaleData::GetDateFormatSymbolAttrArrayN(DateFormatSymbolsAttributes attrName) -{ - if (__pIcuDateFormatSymbols) - { - ClearLastResult(); - int count = 0; - const IcuUnicodeString* pIcuList = null; - - switch (attrName) - { - case DATE_FORMAT_SYM_ERA_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getEras(count); - break; - } - - case DATE_FORMAT_SYM_MONTH_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getMonths(count); - break; - } - - case DATE_FORMAT_SYM_SHORT_MONTH_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getShortMonths(count); - break; - } - - case DATE_FORMAT_SYM_WEEKDAY_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getWeekdays(count); - break; - } - - case DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getShortWeekdays(count); - break; - } - - case DATE_FORMAT_SYM_AM_PM_LIST: - { - pIcuList = __pIcuDateFormatSymbols->getAmPmStrings(count); - break; - } - - default: - { - SetLastResult(E_UNSUPPORTED_OPERATION); - break; - } - } - - if (pIcuList) - { - return ConvertIcuStringArrayToOspArrayN(pIcuList, count); - } - } - - SetLastResult(E_INVALID_STATE); - return null; -} - IcuUDate _LocaleData::GetIcuDate(DateTime date) @@ -844,216 +742,9 @@ _LocaleData::GetIcuDate(DateTime date) return icuDate; } -result -_LocaleData::SetDateTimeFormatter(DateTimeStyle dateStyle, DateTimeStyle timeStyle, const Locale& locale) -{ - IcuDateFormat* pIcuDateFormat = null; - - result r = SetLocale(locale); - SysTryReturnResult(NID_LCL, !IsFailed(r), E_INVALID_ARG, "Locale setting failed."); - - U_ICU_NAMESPACE::DateFormat::EStyle icuDateStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) dateStyle; - U_ICU_NAMESPACE::DateFormat::EStyle icuTimeStyle = (U_ICU_NAMESPACE::DateFormat::EStyle) timeStyle; - - if (dateStyle == DATE_TIME_STYLE_NONE) - { - if (timeStyle != DATE_TIME_STYLE_NONE) - { - pIcuDateFormat = IcuDateFormat::createTimeInstance(icuTimeStyle, __icuLocale); - } - } - else - { - if (timeStyle == DATE_TIME_STYLE_NONE) - { - pIcuDateFormat = IcuDateFormat::createDateInstance(icuDateStyle, __icuLocale); - } - else - { - pIcuDateFormat = IcuDateFormat::createDateTimeInstance(icuDateStyle, icuTimeStyle, __icuLocale); - } - } - - if (pIcuDateFormat) - { - if (__pIcuDateFormat) - { - delete __pIcuDateFormat; - __pIcuDateFormat = null; - } - __pIcuDateFormat = dynamic_cast< IcuSimpleDateFormat* >(pIcuDateFormat); - - if (__pIcuDateFormat) - { - if (__pIcuDateFormatSymbols) - { - delete __pIcuDateFormatSymbols; - __pIcuDateFormatSymbols = null; - } - - const IcuDateFormatSymbols* pDateTimeFormatSym = __pIcuDateFormat->getDateFormatSymbols(); - - if (pDateTimeFormatSym) - { - __pIcuDateFormatSymbols = new IcuDateFormatSymbols(*pDateTimeFormatSym); - } - - return E_SUCCESS; - } - } - - delete pIcuDateFormat; - return E_INVALID_ARG; -} - - -result -_LocaleData::FormatDateTime(const DateTime& date, String& str) -{ - std::auto_ptr pCal(Calendar::CreateInstanceN()); - SysTryReturnResult(NID_LCL, pCal.get(), E_OUT_OF_MEMORY, "Memory allocation failed"); - - result r = pCal->SetTime(date); - SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar"); - - r = pCal->Clear(TIME_FIELD_MILLISECOND); - SysTryReturn(NID_LCL, r == E_SUCCESS, r, r, "[%s] Unable to set date time in default calendar"); - - return FormatDateTime(*pCal, str); -} - -result -_LocaleData::FormatDateTime(const Calendar& calendar, Tizen::Base::String& str) -{ - SysTryReturnResult(NID_LCL, __pIcuDateFormat, E_INVALID_STATE, "This instance is not constructed"); - ClearLastResult(); - - const _IcuCalendarImpl* _pIcuCalendarImpl = _CalendarImpl::GetImpl(calendar); - if (_pIcuCalendarImpl) - { - IcuCalendar* pIcuCal = _pIcuCalendarImpl->GetIcuCalendarCloneN(); - if (pIcuCal) - { - IcuFieldPosition icuFp; - IcuUnicodeString icuStr; - - GetIcuString(str,icuStr); - icuStr = __pIcuDateFormat->format(*pIcuCal, icuStr, icuFp); - str = _LocaleData::GetOspString(icuStr); - - delete pIcuCal; - return GetLastResult(); - } - } - - return E_SYSTEM; -} - -String -_LocaleData::GetDateTimePattern() -{ - SysTryReturn(NID_LCL, __pIcuDateFormat, String(""), E_INVALID_STATE, "This instance is not constructed"); - IcuUnicodeString icuPattern; - - icuPattern = __pIcuDateFormat->toPattern(icuPattern); - return _LocaleData::GetOspString(icuPattern); -} - -result -_LocaleData::SetDateTimePattern(const String& pattern) -{ - SysTryReturnResult(NID_LCL, __pIcuDateFormat, E_INVALID_STATE, "This instance is not constructed"); - IcuUnicodeString icuStr; - - GetIcuString(pattern, icuStr); - - __pIcuDateFormat->applyPattern(icuStr); - - return E_SUCCESS; -} -DateTimeSymbols* -_LocaleData::GetDateTimeSymbolsN(DateTimeSymbols* pDateTimeSymbols) -{ - SysTryReturn(NID_LCL, __pIcuDateFormatSymbols, null, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed"); - SysTryReturn(NID_LCL, pDateTimeSymbols, null, E_INVALID_ARG, "[%s] Invalid argument is used. pDateTimeSymbols is null.", GetErrorMessage(E_INVALID_ARG)); - - _DateTimeSymbolsImpl* pDateTimeSymbolsImpl = _DateTimeSymbolsImpl::GetDateTimeSymbolsImpl(pDateTimeSymbols); - - if (pDateTimeSymbolsImpl) - { - pDateTimeSymbolsImpl->ReleaseAll(); - - pDateTimeSymbolsImpl->__pErasList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_ERA_LIST); - pDateTimeSymbolsImpl->__pMonthsList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_MONTH_LIST); - pDateTimeSymbolsImpl->__pShortMonthsList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_MONTH_LIST); - pDateTimeSymbolsImpl->__pWeekdaysList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_WEEKDAY_LIST); - pDateTimeSymbolsImpl->__pShortWeekdaysList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_SHORT_WEEKDAY_LIST); - pDateTimeSymbolsImpl->__pAmPmList = GetDateFormatSymbolAttrArrayN(DATE_FORMAT_SYM_AM_PM_LIST); - - return pDateTimeSymbols; - } - - return null; -} - -// This function convert and set ICU DateTime symbols from OSP DateTimeSymbols -result -_LocaleData::SetDateTimeSymbols(const DateTimeSymbols& newValue) -{ - UErrorCode ec = U_ZERO_ERROR; - - if (!__pIcuDateFormatSymbols) - { - __pIcuDateFormatSymbols = new IcuDateFormatSymbols(ec); - } - - IcuUnicodeString* pIcuArray = null; - int count = 0; - - if (U_SUCCESS(ec) && __pIcuDateFormatSymbols != null) - { - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetEras(), count); - __pIcuDateFormatSymbols->setEras(pIcuArray, count); - delete[] pIcuArray; - - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetMonths(), count); - __pIcuDateFormatSymbols->setMonths(pIcuArray, count); - delete[] pIcuArray; - - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetShortMonths(), count); - __pIcuDateFormatSymbols->setShortMonths(pIcuArray, count); - delete[] pIcuArray; - - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetWeekdays(), count); - __pIcuDateFormatSymbols->setWeekdays(pIcuArray, count); - delete[] pIcuArray; - - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetShortWeekdays(), count); - __pIcuDateFormatSymbols->setShortWeekdays(pIcuArray, count); - delete[] pIcuArray; - - pIcuArray = ConvertOspArrayToIcuStringArrayN(newValue.GetAmPm(), count); - __pIcuDateFormatSymbols->setAmPmStrings(pIcuArray, count); - delete[] pIcuArray; - -// From ICU Docs: SimpleDateFormat no longer use the zone strings stored in a DateFormatSymbols. Therefore, the time zone strings -// set by this method have no effects in an instance of SimpleDateFormat for formatting time zones. -// __pIcuDateFormatSymbols->setZoneStrings(); - - __pIcuDateFormat->setDateFormatSymbols(*__pIcuDateFormatSymbols); - return E_SUCCESS; - } - - return E_UNSUPPORTED_OPERATION; -} - - _LocaleData::_LocaleData(void) : __icuLocale() - , // default ICU locale - __pIcuNumberFormatter(null) - , __pIcuDateFormatSymbols(null) - , __pIcuDateFormat(null) + , __pIcuNumberFormatter(null) { } @@ -1065,18 +756,6 @@ _LocaleData::~_LocaleData(void) delete __pIcuNumberFormatter; __pIcuNumberFormatter = null; } - - if (__pIcuDateFormatSymbols) // Delete __pIcuDateFormatSymbols and set to null - { - delete __pIcuDateFormatSymbols; - __pIcuDateFormatSymbols = null; - } - - if (__pIcuDateFormat) // Delete __pIcuDateFormat and set to null - { - delete __pIcuDateFormat; - __pIcuDateFormat = null; - } } diff --git a/src/locales/FLcl_LocaleData.h b/src/locales/FLcl_LocaleData.h index b0faf5e..eada8f8 100644 --- a/src/locales/FLcl_LocaleData.h +++ b/src/locales/FLcl_LocaleData.h @@ -23,22 +23,15 @@ // Includes #include -#include -#include -#include #include -#include -#include #include #include #include -#include -#include +#include #include #include #include #include "FLcl_NumberFormatterImpl.h" -#include "FLcl_DateTimeSymbolsImpl.h" #include "FLcl_FieldPosition.h" @@ -49,42 +42,17 @@ typedef UChar IcuUChar; typedef U_ICU_NAMESPACE::UnicodeString IcuUnicodeString; typedef U_ICU_NAMESPACE::StringEnumeration IcuStringEnumeration; typedef U_ICU_NAMESPACE::Locale IcuLocale; -typedef U_ICU_NAMESPACE::TimeZone IcuTimeZone; -typedef U_ICU_NAMESPACE::BasicTimeZone IcuBasicTimeZone; -typedef U_ICU_NAMESPACE::SimpleTimeZone IcuSimpleTimeZone; typedef U_ICU_NAMESPACE::DecimalFormatSymbols IcuDecimalFormatSymbols; typedef U_ICU_NAMESPACE::Calendar IcuCalendar; typedef U_ICU_NAMESPACE::GregorianCalendar IcuGregorianCalendar; -typedef U_ICU_NAMESPACE::InitialTimeZoneRule IcuInitialTimeZoneRule; -typedef U_ICU_NAMESPACE::AnnualTimeZoneRule IcuAnnualTimeZoneRule; -typedef U_ICU_NAMESPACE::DateTimeRule IcuDateTimeRule; typedef U_ICU_NAMESPACE::NumberFormat IcuNumberFormat; typedef U_ICU_NAMESPACE::DecimalFormat IcuDecimalFormat; typedef U_ICU_NAMESPACE::FieldPosition IcuFieldPosition; -typedef U_ICU_NAMESPACE::DateFormatSymbols IcuDateFormatSymbols; -typedef U_ICU_NAMESPACE::DateFormat IcuDateFormat; -typedef U_ICU_NAMESPACE::SimpleDateFormat IcuSimpleDateFormat; - namespace Tizen { namespace Locales { /** - * @enum DstRuleMode - * Possible DST rule mode - * - * @since 1.0 - */ -enum DstRuleMode -{ - EXACT_DAY = 0, - DAY_OF_WEEK_IN_MONTH, - AFTER_THE_SPECIFIED_DAY, - BEFORE_THE_SPECIFIED_DAY, - BACKWARD_FROM_END_OF_MONTH -}; - -/** * @class _LocaleData * @brief This class is for loading the @e locale data. * @since 1.0 @@ -119,22 +87,18 @@ public: // Operations private: - - Tizen::Base::Collection::ArrayList* ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count); - IcuUnicodeString* ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::IList* pIcuStrList, int& count); - - // Methods to support Locale const IcuLocale& GetIcuLocale(void); - IcuLocale GetIcuLocale(const Tizen::Locales::Locale& ospLocale); public: static Tizen::Base::String GetOspString(const IcuUnicodeString& icuStr); static U_ICU_NAMESPACE::UnicodeString GetIcuString(const Tizen::Base::String& ospString); static void GetIcuString(const Tizen::Base::String& ospStr, IcuUnicodeString& icuStr); + static IcuUnicodeString* ConvertOspArrayToIcuStringArrayN(const Tizen::Base::Collection::IList* pIcuStrList, int& count); + static Tizen::Base::Collection::ArrayList* ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count); static IcuUDate GetIcuDate(Tizen::Base::DateTime date); static IcuFieldPosition GetIcuFieldPosition(_FieldPosition pos); - + static IcuLocale GetIcuLocale(const Tizen::Locales::Locale& ospLocale); // Methods to support Locale bool IsLocaleSupported(); result SetLocale(const Locale& ospLocale); @@ -157,20 +121,6 @@ public: bool GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName); void SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName); - - // Methods to support DateTimeSymbols - result SetDateFormatSymbols(const Locale& locale); - Tizen::Base::Collection::IList* GetDateFormatSymbolAttrArrayN(DateFormatSymbolsAttributes attrName); - - // Methods to support DateTimeFormatter - result SetDateTimeFormatter(DateTimeStyle dateStyle, DateTimeStyle timeStyle, const Locale& locale); - result FormatDateTime(const Tizen::Base::DateTime& date, Tizen::Base::String& str); - result FormatDateTime(const Calendar& calendar, Tizen::Base::String& str); - Tizen::Base::String GetDateTimePattern(); - result SetDateTimePattern(const Tizen::Base::String& pattern); - DateTimeSymbols* GetDateTimeSymbolsN(DateTimeSymbols* pDateTimeSymbols); - result SetDateTimeSymbols(const DateTimeSymbols& newValue); - private: _LocaleData(const _LocaleData& localeData); _LocaleData& operator =(const _LocaleData& localeData); @@ -178,9 +128,6 @@ private: private: IcuLocale __icuLocale; IcuDecimalFormat* __pIcuNumberFormatter; - IcuDateFormatSymbols* __pIcuDateFormatSymbols; - IcuSimpleDateFormat* __pIcuDateFormat; - }; // LocaleData }} // Tizen::Locales diff --git a/src/locales/FLcl_LocaleManagerImpl.cpp b/src/locales/FLcl_LocaleManagerImpl.cpp index bcfecbb..c0b4764 100644 --- a/src/locales/FLcl_LocaleManagerImpl.cpp +++ b/src/locales/FLcl_LocaleManagerImpl.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -88,6 +89,21 @@ _LocaleManagerImpl::GetSystemLocale(void) return Locale(LANGUAGE_INVALID, COUNTRY_INVALID, null); } +U_ICU_NAMESPACE::Locale +_LocaleManagerImpl::GetSystemIcuLocale(void) +{ + char* pRegionPtr; + if (runtime_info_get_value_string(RUNTIME_INFO_KEY_REGION, &pRegionPtr) == RUNTIME_INFO_ERROR_NONE) + { + SetLastResult(E_SUCCESS); + U_ICU_NAMESPACE::Locale locale(pRegionPtr); + + free(pRegionPtr); + return locale; + } + return U_ICU_NAMESPACE::Locale(); +} + IMap* _LocaleManagerImpl::GetAvailableEglibcLocaesN(void) diff --git a/src/locales/FLcl_TimeZoneImpl.cpp b/src/locales/FLcl_TimeZoneImpl.cpp index 41f757e..ae5853c 100644 --- a/src/locales/FLcl_TimeZoneImpl.cpp +++ b/src/locales/FLcl_TimeZoneImpl.cpp @@ -20,13 +20,33 @@ */ #include +#include +#include +#include +#include #include #include #include "FLcl_LocaleData.h" #include "FLcl_TimeZoneImpl.h" +typedef U_ICU_NAMESPACE::TimeZone IcuTimeZone; +typedef U_ICU_NAMESPACE::BasicTimeZone IcuBasicTimeZone; +typedef U_ICU_NAMESPACE::SimpleTimeZone IcuSimpleTimeZone; +typedef U_ICU_NAMESPACE::InitialTimeZoneRule IcuInitialTimeZoneRule; +typedef U_ICU_NAMESPACE::AnnualTimeZoneRule IcuAnnualTimeZoneRule; +typedef U_ICU_NAMESPACE::DateTimeRule IcuDateTimeRule; + +enum DstRuleMode +{ + EXACT_DAY = 0, + DAY_OF_WEEK_IN_MONTH, + AFTER_THE_SPECIFIED_DAY, + BEFORE_THE_SPECIFIED_DAY, + BACKWARD_FROM_END_OF_MONTH +}; + using namespace Tizen::Base; namespace Tizen { namespace Locales diff --git a/src/locales/inc/FLcl_LocaleManagerImpl.h b/src/locales/inc/FLcl_LocaleManagerImpl.h index 86d61df..ccb6b70 100644 --- a/src/locales/inc/FLcl_LocaleManagerImpl.h +++ b/src/locales/inc/FLcl_LocaleManagerImpl.h @@ -29,6 +29,7 @@ namespace U_ICU_NAMESPACE { class StringEnumeration; +class Locale; } namespace Tizen { namespace Locales @@ -40,6 +41,8 @@ class _LocaleManagerImpl public: static Tizen::Locales::Locale GetSystemLocale(void); + static U_ICU_NAMESPACE::Locale GetSystemIcuLocale(void); + static Tizen::Base::Collection::IList* GetAvailableLocalesN(void); // Get available c-locale from file static Tizen::Base::Collection::IMap* GetAvailableEglibcLocaesN(void);