Refactory NumberSymbols.
authorHokwon Song <hokwon.song@samsung.com>
Wed, 21 Aug 2013 10:04:01 +0000 (19:04 +0900)
committerHokwon Song <hokwon.song@samsung.com>
Wed, 21 Aug 2013 10:24:34 +0000 (19:24 +0900)
Change-Id: I9e0c4ccc77b9fa75ebcede91b5efc2732d65740e
Signed-off-by: Hokwon Song <hokwon.song@samsung.com>
src/locales/FLclNumberSymbols.cpp
src/locales/FLcl_LocaleData.cpp
src/locales/FLcl_LocaleData.h
src/locales/FLcl_NumberSymbolsImpl.cpp
src/locales/FLcl_NumberSymbolsImpl.h

index 9c09925..02fd499 100644 (file)
@@ -34,10 +34,6 @@ using namespace Tizen::Base;
 namespace Tizen { namespace Locales
 {
 
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////
-// Public Method
-
 NumberSymbols::NumberSymbols(void)
        : __pNumberSymbolsImpl(null)
 {
@@ -52,7 +48,6 @@ NumberSymbols::~NumberSymbols(void)
 result
 NumberSymbols::Construct(const Locale& locale)
 {
-       // Object is not allowed to construct twice
        SysAssertf(__pNumberSymbolsImpl == null,
                "Already constructed! Calling Construct() twice or more on a same instance is not allowed for this class");
 
@@ -62,7 +57,6 @@ NumberSymbols::Construct(const Locale& locale)
        {
                r = E_UNSUPPORTED_OPERATION;
        }
-       // validating locale
        SysTryReturnResult(NID_LCL, _LocaleImpl::IsSupported(locale), r, "Given locale is not supported");
 
        __pNumberSymbolsImpl = new (std::nothrow) _NumberSymbolsImpl;
index 03643b8..809d3a1 100644 (file)
@@ -237,34 +237,6 @@ _LocaleData::SetLocale(const Locale& ospLocale)
        return (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG;
 }
 
-result
-_LocaleData::GetNumberSymbols(const Locale& locale, String symbols[])
-{
-       UErrorCode status = U_ZERO_ERROR;
-       ;
-       SetLocale(locale);
-
-       SysTryReturnResult(NID_LCL, IsLocaleSupported(), E_SYSTEM, "A System error has been occurred. Locale is not supported");
-
-       IcuDecimalFormatSymbols sym(__icuLocale, status);
-       SysTryReturnResult(NID_LCL, U_SUCCESS(status),  E_SYSTEM, "A System error has been occurred. Unable to get ICU Decimal Format Symbols");
-
-       symbols[NUMBER_SYMBOL_DECIMAL_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kDecimalSeparatorSymbol));
-       symbols[NUMBER_SYMBOL_GROUPING_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kGroupingSeparatorSymbol));
-       symbols[NUMBER_SYMBOL_PATTERN_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPatternSeparatorSymbol));
-       symbols[NUMBER_SYMBOL_PERCENT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPercentSymbol));
-       symbols[NUMBER_SYMBOL_ZERO_DIGIT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kZeroDigitSymbol));
-       symbols[NUMBER_SYMBOL_DIGIT] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kDigitSymbol));
-       symbols[NUMBER_SYMBOL_CURRENCY] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kCurrencySymbol));
-       symbols[NUMBER_SYMBOL_INTL_CURRENCY] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kIntlCurrencySymbol));
-       symbols[NUMBER_SYMBOL_MONETARY_SEPARATOR] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kMonetarySeparatorSymbol));
-       symbols[NUMBER_SYMBOL_PER_MILL] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPerMillSymbol));
-       symbols[NUMBER_SYMBOL_EXPONENTIAL] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kExponentialSymbol));
-       symbols[NUMBER_SYMBOL_PLUS_SIGN] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kPlusSignSymbol));
-       symbols[NUMBER_SYMBOL_MINUS_SIGN] = _LocaleData::GetOspString(sym.getSymbol(IcuDecimalFormatSymbols::kMinusSignSymbol));
-
-       return E_SUCCESS;
-}
 
 result
 _LocaleData::SetNumberFormatter(const Locale& locale, NumberFormatterStyle style)
index eada8f8..b885448 100644 (file)
@@ -103,9 +103,6 @@ public:
        bool IsLocaleSupported();
        result SetLocale(const Locale& ospLocale);
 
-       // Methods to support NumberSymbols
-       result GetNumberSymbols(const Locale &locale, Tizen::Base::String symbols[]);
-
        // Methods to support NumberFormatter
        result SetNumberFormatter(const Locale& locale, NumberFormatterStyle style);
        result FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str);
index 4f3eb6c..ed1c5b4 100644 (file)
  * @file            FLclNumberSymbols.cpp
  * @brief           This is the implementation file for NumberSymbols class.
  */
-
+#include <unicode/locid.h>
 #include <FBaseSysLog.h>
 #include <FApp_AppInfo.h>
 #include "FLcl_NumberSymbolsImpl.h"
 #include "FLcl_LocaleData.h"
 
-
 using namespace Tizen::Base;
 
 namespace Tizen { namespace Locales
 {
 
-
-/////////////////////////////////////////////////////////////////////////////////////////////////////
-// Public Method
+static U_ICU_NAMESPACE::DecimalFormatSymbols::ENumberFormatSymbol NUMBER_SYMBOL_TYPE_CONVERT_TABLE[NUMBER_SYMBOL_COUNT] =
+       { U_ICU_NAMESPACE::DecimalFormatSymbols::kDecimalSeparatorSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kGroupingSeparatorSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kPatternSeparatorSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kPercentSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kZeroDigitSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kDigitSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kCurrencySymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kIntlCurrencySymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kMonetarySeparatorSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kPerMillSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kExponentialSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kPlusSignSymbol
+       , U_ICU_NAMESPACE::DecimalFormatSymbols::kMinusSignSymbol
+       };
 
 _NumberSymbolsImpl::_NumberSymbolsImpl(void)
        : __locale(LANGUAGE_INVALID, COUNTRY_INVALID)
+       , __pIcuDecimalFormatSymbols(null)
 {
 }
 
 
 _NumberSymbolsImpl::_NumberSymbolsImpl(const _NumberSymbolsImpl& other)
        : __locale(LANGUAGE_INVALID, COUNTRY_INVALID)
+       , __pIcuDecimalFormatSymbols(null)
 {
-       this->__locale = other.__locale;
-
-       for (int i = 0; i < NUMBER_SYMBOL_COUNT; i++)
-       {
-               this->__symbols[i] = other.__symbols[i];                               // Copying symbols
-       }
+       __locale = other.__locale;
+       __pIcuDecimalFormatSymbols = new U_ICU_NAMESPACE::DecimalFormatSymbols(*other.__pIcuDecimalFormatSymbols);
+       SysTryReturn(NID_LCL, __pIcuDecimalFormatSymbols, , E_OUT_OF_MEMORY, "It is not enough memory.");
 }
 
 
@@ -57,12 +67,13 @@ _NumberSymbolsImpl::operator =(const _NumberSymbolsImpl& rhs)
 {
        if (this != &rhs)
        {
-               for (int i = 0; i < (int) NUMBER_SYMBOL_COUNT; ++i)
+               __locale = rhs.__locale;
+               if (__pIcuDecimalFormatSymbols)
                {
-                       __symbols[(NumberSymbol) i] = rhs.__symbols[(NumberSymbol) i];        // Copying symbols
+                       delete __pIcuDecimalFormatSymbols;
+                       __pIcuDecimalFormatSymbols = null;
                }
-
-               __locale = rhs.__locale;
+               __pIcuDecimalFormatSymbols = new U_ICU_NAMESPACE::DecimalFormatSymbols(*rhs.__pIcuDecimalFormatSymbols);
        }
 
        return *this;
@@ -71,40 +82,45 @@ _NumberSymbolsImpl::operator =(const _NumberSymbolsImpl& rhs)
 
 _NumberSymbolsImpl::~_NumberSymbolsImpl(void)
 {
+       if (__pIcuDecimalFormatSymbols)
+       {
+               delete __pIcuDecimalFormatSymbols;
+       }
 }
 
 result
 _NumberSymbolsImpl::Construct(const Locale& locale)
 {
-       result r = E_SUCCESS;
-       _LocaleData localeData;
-       r = localeData.GetNumberSymbols(locale, __symbols);                            // Get number symbols from ICU
+       result r = (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) 
+                       ? E_UNSUPPORTED_OPERATION 
+                       : E_INVALID_ARG;
 
-       if (!IsFailed(r))
-       {
-               __locale = locale;
-               return E_SUCCESS;
-       }
+       U_ICU_NAMESPACE::Locale icuLocale = _LocaleData::GetIcuLocale(locale);
+       SysTryReturnResult(NID_LCL, icuLocale.isBogus() != true, r, "It is an invalid locale.");
+
+       UErrorCode status = U_ZERO_ERROR;
+       __pIcuDecimalFormatSymbols = new U_ICU_NAMESPACE::DecimalFormatSymbols(icuLocale, status);
+       SysTryReturnResult(NID_LCL, __pIcuDecimalFormatSymbols, E_OUT_OF_MEMORY, "It is not enough memory.");
+       __locale = locale;
 
-       return (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG;
+       return E_SUCCESS;
 }
 
 
 String
 _NumberSymbolsImpl::GetNumberSymbol(NumberSymbol symbol) const
 {
-       return (symbol < NUMBER_SYMBOL_COUNT) ? __symbols[symbol] : String();       // Get symbol value for symbol
+       SysTryReturn(NID_LCL, symbol < NUMBER_SYMBOL_COUNT, String(), E_INVALID_ARG, "It is an invalid argument.");
+       return  _LocaleData::GetOspString(__pIcuDecimalFormatSymbols->getSymbol(NUMBER_SYMBOL_TYPE_CONVERT_TABLE[symbol]));
 }
 
 
 result
 _NumberSymbolsImpl::SetNumberSymbol(const NumberSymbol symbol, const String& str)
 {
-       if (symbol < NUMBER_SYMBOL_COUNT)                                           // validate symbol value
-       {
-               __symbols[symbol] = str;                                                // Set symbol
-       }
-
+       SysTryReturnResult(NID_LCL, symbol < NUMBER_SYMBOL_COUNT, E_INVALID_ARG, "It is an invalid argument.");
+       U_ICU_NAMESPACE::UnicodeString icuStr = _LocaleData::GetIcuString(str);
+       __pIcuDecimalFormatSymbols->setSymbol(NUMBER_SYMBOL_TYPE_CONVERT_TABLE[symbol], icuStr);
        return E_SUCCESS;
 }
 
@@ -113,7 +129,7 @@ const Locale*
 _NumberSymbolsImpl::GetLocale(void) const
 {
        ClearLastResult();
-       return &__locale;                                                           // return locale object stored during construction
+       return &__locale;
 }
 
 
index a95a81f..02232e9 100644 (file)
@@ -25,7 +25,7 @@
 #define _FLCL_INTERNAL_NUMBER_SYMBOLS_IMPL_H_
 
 // Includes
-#include <FLclLocale.h>
+#include <unicode/dcfmtsym.h>
 #include <FLclNumberSymbols.h>
 
 
@@ -35,7 +35,6 @@ namespace Tizen { namespace Locales
 class _NumberSymbolsImpl
        : public Tizen::Base::Object
 {
-// Construct Operations
 public:
        _NumberSymbolsImpl(void);
        virtual ~_NumberSymbolsImpl(void);
@@ -43,19 +42,15 @@ public:
        _NumberSymbolsImpl(const _NumberSymbolsImpl& other);
        _NumberSymbolsImpl& operator =(const _NumberSymbolsImpl& other);
 
-
-// Operations
 public:
        result Construct(const Locale& locale);
        Tizen::Base::String GetNumberSymbol(NumberSymbol symbol) const;
        result SetNumberSymbol(NumberSymbol symbol, const Tizen::Base::String& str);
        const Locale* GetLocale(void) const;
 
-
-// Attribute
 private:
        Locale __locale;
-       Tizen::Base::String __symbols[NUMBER_SYMBOL_COUNT];
+       U_ICU_NAMESPACE::DecimalFormatSymbols* __pIcuDecimalFormatSymbols;
 
 }; // _NumberSymbolsImpl