// Includes
#include <locale.h>
-#include <memory>
-#include <stdlib.h>
#include <unistd.h>
-#include <limits.h>
-#include <runtime_info.h>
#include <unique_ptr.h>
#include <FBaseSysLog.h>
-#include <FSysSettingInfo.h>
-#include <FLclNumberSymbols.h>
-#include <FApp_AppInfo.h>
+#include <FBaseUtilStringUtil.h>
#include "FBase_StringConverter.h"
-#include "FLcl_CalendarImpl.h"
-#include "FLcl_IcuCalendarImpl.h"
#include "FLcl_LocaleData.h"
-#include "FLcl_LocaleImpl.h"
// Other defines
namespace Tizen { namespace Locales
{
-/////////////////////////////////////////////////////////////////////////////////////////////////////
-// Public Method
-
-// this function is to convert ICU FieldPosition from OSP _FieldPosition
IcuFieldPosition
_LocaleData::GetIcuFieldPosition(_FieldPosition pos)
{
return icuPos;
}
+
U_ICU_NAMESPACE::UnicodeString
_LocaleData::GetIcuString(const String& ospStr)
{
return icuStr;
}
-// This function convert ICU string to OSP string
+
String
_LocaleData::GetOspString(const IcuUnicodeString& icuStr)
{
return String("");
}
-// This convert OSP string to ICU strings
-void
-_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;
-}
-// This function return OSP array list of OSP string from ICU string list
ArrayList*
_LocaleData::ConvertIcuStringArrayToOspArrayN(const IcuUnicodeString* pIcuStrList, int count)
{
pObj = static_cast< String* >(pEnum->GetCurrent());
if (pObj)
{
- GetIcuString(*pObj, pIcuStrArray[i]);
+ pIcuStrArray[i] = GetIcuString(*pObj);
i++;
}
}
}
-const IcuLocale&
-_LocaleData::GetIcuLocale(void)
-{
- return __icuLocale;
-}
-
-bool
-_LocaleData::IsLocaleSupported(void)
-{
- return !__icuLocale.isBogus();
-}
-
-result
-_LocaleData::SetLocale(const Locale& ospLocale)
-{
- if (_LocaleImpl::IsSupported(ospLocale))
- {
- __icuLocale = GetIcuLocale(ospLocale);
- return E_SUCCESS;
- }
-
- __icuLocale.setToBogus();
- return (Tizen::App::_AppInfo::GetApiVersion() == _API_VERSION_2_0 && Tizen::App::_AppInfo::IsOspCompat()) ? E_UNSUPPORTED_OPERATION : E_INVALID_ARG;
-}
-
-
-result
-_LocaleData::SetNumberFormatter(const Locale& locale, NumberFormatterStyle style)
-{
- if (__pIcuNumberFormatter)
- {
- delete __pIcuNumberFormatter;
- __pIcuNumberFormatter = null;
- }
-
- IcuNumberFormat* pNumFmt = null;
- UErrorCode ec = U_ZERO_ERROR;
- result r = SetLocale(locale);
-
- if (!IsFailed(r))
- {
- switch (style)
- {
- case NUM_FORMATTER_STYLE_NUMBER:
- {
- pNumFmt = IcuNumberFormat::createInstance(__icuLocale, ec);
- break;
- }
-
- case NUM_FORMATTER_STYLE_CURRENCY:
- {
- pNumFmt = IcuNumberFormat::createCurrencyInstance(__icuLocale, ec);
- break;
- }
-
- case NUM_FORMATTER_STYLE_PERCENT:
- {
- pNumFmt = IcuNumberFormat::createPercentInstance(__icuLocale, ec);
- break;
- }
-
- default:
- {
- r = E_UNSUPPORTED_OPERATION;
- break;
- }
- }
-
- if (IsFailed(r))
- {
- return r;
- }
-
- if (U_SUCCESS(ec))
- {
- if (pNumFmt && (pNumFmt->getDynamicClassID() == IcuDecimalFormat::getStaticClassID()))
- {
- __pIcuNumberFormatter = dynamic_cast< IcuDecimalFormat* >(pNumFmt);
- if (__pIcuNumberFormatter)
- {
- return E_SUCCESS;
- }
- }
- }
- }
-
- return E_UNSUPPORTED_OPERATION;
-}
-
-result
-_LocaleData::FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str)
-{
- str = "";
-
- if (__pIcuNumberFormatter)
- {
- IcuUnicodeString icuStr;
- IcuFieldPosition icuPos = GetIcuFieldPosition(pos);
- icuStr = __pIcuNumberFormatter->format(static_cast< int32_t >(number), icuStr, icuPos);
-
- str = _LocaleData::GetOspString(icuStr);
- return E_SUCCESS;
- }
-
- return E_SYSTEM;
-}
-
-result
-_LocaleData::FormatNumber(double number, _FieldPosition& pos, Tizen::Base::String& str)
-{
- str = "";
-
- if (__pIcuNumberFormatter)
- {
- IcuUnicodeString icuStr;
- IcuFieldPosition icuPos = GetIcuFieldPosition(pos);
- icuStr = __pIcuNumberFormatter->format(number, icuStr, icuPos);
-
- str = _LocaleData::GetOspString(icuStr);
- return E_SUCCESS;
- }
-
- return E_SYSTEM;
-}
-
-result
-_LocaleData::ApplyNumberPattern(const Tizen::Base::String& pattern, bool localized)
-{
- if (__pIcuNumberFormatter)
- {
- IcuUnicodeString icuPattern;
- icuPattern = __pIcuNumberFormatter->toPattern(icuPattern);
-
- UErrorCode ec = U_ZERO_ERROR;
- IcuUParseError parseError = {0,};
- IcuUnicodeString icuNewPatter;
- GetIcuString(pattern, icuNewPatter);
-
- if (localized)
- {
- __pIcuNumberFormatter->applyLocalizedPattern(icuNewPatter, parseError, ec);
- }
- else
- {
- __pIcuNumberFormatter->applyPattern(icuNewPatter, parseError, ec);
- }
-
- if (U_SUCCESS(ec))
- {
- return E_SUCCESS;
- }
- else
- {
- SysLog(NID_LCL, "Error [%d -> %s] in setting pattern to %ls at %d:%d",
- ec, u_errorName(ec), pattern.GetPointer(), parseError.line, parseError.offset);
-
- __pIcuNumberFormatter->applyPattern(icuPattern, ec);
- }
- }
-
- return E_INVALID_ARG;
-}
-
-String
-_LocaleData::GetNumberFormatterStringAttributes(NumberFormatterAttributes attrName)
-{
- IcuUnicodeString icuRetValue;
-
- if (__pIcuNumberFormatter)
- {
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_CURRENCY:
- {
- icuRetValue = __pIcuNumberFormatter->getCurrency();
- break;
- }
-
- case NUM_FORMATTER_FIELD_POSITIVE_PREFIX:
- {
- icuRetValue = __pIcuNumberFormatter->getPositivePrefix(icuRetValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX:
- {
- icuRetValue = __pIcuNumberFormatter->getNegativePrefix(icuRetValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX:
- {
- icuRetValue = __pIcuNumberFormatter->getPositiveSuffix(icuRetValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX:
- {
- icuRetValue = __pIcuNumberFormatter->getNegativeSuffix(icuRetValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_PATTERN:
- {
- icuRetValue = __pIcuNumberFormatter->toPattern(icuRetValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_LOCALIZED_PATTERN:
- {
- icuRetValue = __pIcuNumberFormatter->toLocalizedPattern(icuRetValue);
- break;
- }
-
- default:
- {
- break;
- }
- }
-
- return _LocaleData::GetOspString(icuRetValue);
- }
-
- return Tizen::Base::String("");
-}
-
-void
-_LocaleData::SetNumberFormatterAttributes(const String& newValue, NumberFormatterAttributes attrName)
-{
- if (__pIcuNumberFormatter)
- {
- IcuUnicodeString icuNewValue;
- GetIcuString(newValue, icuNewValue);
-
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_CURRENCY:
- {
- __pIcuNumberFormatter->setCurrency(icuNewValue.getTerminatedBuffer());
- break;
- }
-
- case NUM_FORMATTER_FIELD_POSITIVE_PREFIX:
- {
- __pIcuNumberFormatter->setPositivePrefix(icuNewValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_NEGATIVE_PREFIX:
- {
- __pIcuNumberFormatter->setNegativePrefix(icuNewValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_POSITIVE_SUFFIX:
- {
- __pIcuNumberFormatter->setPositiveSuffix(icuNewValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_NEGATIVE_SUFFIX:
- {
- __pIcuNumberFormatter->setNegativeSuffix(icuNewValue);
- break;
- }
-
- default:
- {
- break;
- }
- }
- }
-}
-
-int
-_LocaleData::GetNumberFormatterIntAttributes(NumberFormatterAttributes attrName)
-{
- int res = 0;
- if (__pIcuNumberFormatter)
- {
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS:
- {
- res = __pIcuNumberFormatter->getMaximumIntegerDigits();
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS:
- {
- res = __pIcuNumberFormatter->getMinimumIntegerDigits();
- break;
- }
-
- case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS:
- {
- res = __pIcuNumberFormatter->getMaximumFractionDigits();
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS:
- {
- res = __pIcuNumberFormatter->getMinimumFractionDigits();
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS:
- {
- res = __pIcuNumberFormatter->getMinimumExponentDigits();
- break;
- }
-
- case NUM_FORMATTER_FIELD_MULTIPLIER:
- {
- res = __pIcuNumberFormatter->getMultiplier();
- break;
- }
-
- case NUM_FORMATTER_FIELD_GROUPING_SIZE:
- {
- res = __pIcuNumberFormatter->getGroupingSize();
- break;
- }
-
- default:
- {
- res = 0;
- break;
- }
- }
- }
-
- return res;
-}
-
-void
-_LocaleData::SetNumberFormatterAttributes(const int newValue, NumberFormatterAttributes attrName)
-{
- if (__pIcuNumberFormatter)
- {
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_MAX_INTEGER_DIGITS:
- {
- __pIcuNumberFormatter->setMaximumIntegerDigits(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_INTEGER_DIGITS:
- {
- __pIcuNumberFormatter->setMinimumIntegerDigits(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_MAX_FRACTION_DIGITS:
- {
- __pIcuNumberFormatter->setMaximumFractionDigits(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_FRACTION_DIGITS:
- {
- __pIcuNumberFormatter->setMinimumFractionDigits(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_MIN_EXPONENT_DIGITS:
- {
- __pIcuNumberFormatter->setMinimumExponentDigits(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_MULTIPLIER:
- {
- __pIcuNumberFormatter->setMultiplier(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_GROUPING_SIZE:
- {
- __pIcuNumberFormatter->setGroupingSize(newValue);
- break;
- }
-
- default:
- {
- break;
- }
- }
- }
-}
-
-bool
-_LocaleData::GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName)
-{
- bool res = false;
- if (__pIcuNumberFormatter)
- {
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_IS_GROUPING_USED:
- {
- res = __pIcuNumberFormatter->isGroupingUsed();
- break;
- }
-
- case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN:
- {
- res = __pIcuNumberFormatter->isDecimalSeparatorAlwaysShown();
- break;
- }
-
- case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN:
- {
- IcuUnicodeString ps("+");
- IcuUnicodeString pp;
- pp = __pIcuNumberFormatter->getPositivePrefix(pp);
-
- res = (pp == ps);
- break;
- }
-
- default:
- {
- res = false;
- break;
- }
- }
- }
-
- return res;
-}
-
-void
-_LocaleData::SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName)
-{
- if (__pIcuNumberFormatter)
- {
- switch (attrName)
- {
- case NUM_FORMATTER_FIELD_IS_GROUPING_USED:
- {
- __pIcuNumberFormatter->setGroupingUsed(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_IS_DECIMAL_SEPARATOR_ALWAYS_SHOWN:
- {
- __pIcuNumberFormatter->setDecimalSeparatorAlwaysShown(newValue);
- break;
- }
-
- case NUM_FORMATTER_FIELD_IS_POSITIVE_SIGN_ALWAYS_SHOWN:
- {
- IcuUnicodeString ps("+");
- IcuUnicodeString pp;
- pp = __pIcuNumberFormatter->getPositivePrefix(pp);
-
- if (newValue)
- {
- __pIcuNumberFormatter->setPositivePrefix(ps);
- }
- else
- {
- if (pp == ps)
- {
- __pIcuNumberFormatter->setPositivePrefix("");
- }
- }
- break;
- }
-
- default:
- {
- break;
- }
- }
- }
-}
-
-
IcuUDate
_LocaleData::GetIcuDate(DateTime date)
{
}
_LocaleData::_LocaleData(void)
- : __icuLocale()
- , __pIcuNumberFormatter(null)
{
}
_LocaleData::~_LocaleData(void)
{
- if (__pIcuNumberFormatter) // Delete __pIcuNumberFormatter and set to null
- {
- delete __pIcuNumberFormatter;
- __pIcuNumberFormatter = null;
- }
}
class _LocaleData
: public Tizen::Base::Object
{
-
-
-// Construct Operations
-public:
- /**
- * Creates an @b uninitialized instance.
- *
- * @remarks After creating an instance of this class, you must explicitly call the @e Construct() method
- * to initialize the instance.
- * @see Construct
- */
- _LocaleData(void);
-
-
- /**
- * Destroys this instance.
- */
- virtual ~_LocaleData(void);
-
-
-// Operations
-private:
- const IcuLocale& GetIcuLocale(void);
-
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);
-
- // Methods to support NumberFormatter
- result SetNumberFormatter(const Locale& locale, NumberFormatterStyle style);
- result FormatNumber(long number, _FieldPosition& pos, Tizen::Base::String& str);
- result FormatNumber(double number, _FieldPosition& pos, Tizen::Base::String& str);
- result ApplyNumberPattern(const Tizen::Base::String& pattern, bool localized);
-
- Tizen::Base::String GetNumberFormatterStringAttributes(NumberFormatterAttributes attrName);
- void SetNumberFormatterAttributes(const Tizen::Base::String& newValue, NumberFormatterAttributes attrName);
-
- int GetNumberFormatterIntAttributes(NumberFormatterAttributes attrName);
- void SetNumberFormatterAttributes(const int newValue, NumberFormatterAttributes attrName);
-
- bool GetNumberFormatterBoolAttributes(NumberFormatterAttributes attrName);
- void SetNumberFormatterAttributes(const bool newValue, NumberFormatterAttributes attrName);
private:
+ _LocaleData(void);
+ virtual ~_LocaleData(void);
_LocaleData(const _LocaleData& localeData);
_LocaleData& operator =(const _LocaleData& localeData);
-private:
- IcuLocale __icuLocale;
- IcuDecimalFormat* __pIcuNumberFormatter;
}; // LocaleData
}} // Tizen::Locales