//
-// Open Service Platform
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the License);
return E_SUCCESS;
}
+struct UConverterDeleter
+{
+ void operator ()(UConverter* pConverter)
+ {
+ if (pConverter)
+ {
+ ucnv_close(pConverter);
+ }
+ }
+};
+
char*
-ConvertWcsToMbsN(const wchar_t* pValue)
+WcharToUtf8N(const wchar_t* pValue)
{
SysTryReturn(NID_BASE_UTIL, pValue != null, null, E_INVALID_ARG, "[%s] Invalid argument is used. The pValue is null.", GetErrorMessage(E_INVALID_ARG));
int len = wcslen(pValue);
+ if (len == 0)
+ {
+ char* pRet = new (std::nothrow) char[1];
+ SysTryReturn(NID_BASE_UTIL, pRet != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+ pRet[0] = '\0';
+ return pRet;
+ }
UErrorCode err = U_ZERO_ERROR;
- UConverter* pConverter = ucnv_open("UTF-8", &err);
+ std::unique_ptr< UConverter, UConverterDeleter > pConverter(ucnv_open("UTF-8", &err));
+ SysTryReturn(NID_BASE_UTIL, pConverter, null, E_OUT_OF_MEMORY, "[%s] ucnv_open() failed. pConverter is null.", GetErrorMessage(E_OUT_OF_MEMORY));
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] ucnv_open() failed. The err must be U_ZERO_ERROR.", GetErrorMessage(E_INVALID_ARG));
- result r = _ICUConverter::GetResultFromIcuErrorCode(err);
- SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, null, r, "[%s] The err must be U_ZERO_ERROR.", GetErrorMessage(r));
+ ucnv_setFromUCallBack(pConverter.get(), UCNV_FROM_U_CALLBACK_STOP, null, null, null, &err);
- ucnv_setFromUCallBack(pConverter, UCNV_FROM_U_CALLBACK_STOP, null, null, null, &err);
-
- int icuStrLen = len * 2;
- UChar* pIcuStr = new (std::nothrow) UChar[icuStrLen];
+ int icuStrCapacity = len * 2 + 1;
+ std::unique_ptr< UChar[] > pIcuStr(new (std::nothrow) UChar[icuStrCapacity]);
SysTryReturn(NID_BASE_UTIL, pIcuStr != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-
+
int outLen = 0;
- UChar* pResultStr = u_strFromWCS(pIcuStr, icuStrLen, &outLen, pValue, len, &err);
+ UChar* pResultStr = u_strFromWCS(pIcuStr.get(), icuStrCapacity, &outLen, pValue, len, &err);
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] u_strFromWCS() failed. pValue is %ls.", GetErrorMessage(E_INVALID_ARG), pValue);
- char* pOutBuf = null;
- if (U_SUCCESS(err))
- {
- char* pTmpOut = null;
- int outBytesLeftOut = len * 4;
- pOutBuf = new (std::nothrow) char[outBytesLeftOut + 1];
- SysTryCatch(NID_BASE_UTIL, pOutBuf != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
+ int destCapacity = outLen * 2 + 1;
+ std::unique_ptr< char[] > pDst(new (std::nothrow) char[destCapacity]);
+ SysTryReturn(NID_BASE_UTIL, pDst != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
- pTmpOut = pOutBuf;
- memset(pOutBuf, 0, outBytesLeftOut + 1);
- int retLength = ucnv_fromUChars(pConverter, pTmpOut, outBytesLeftOut, pResultStr, outLen, &err);
-
- r = _ICUConverter::GetResultFromIcuErrorCode(err);
- if (IsFailed(r))
- {
- delete[] pOutBuf;
- pOutBuf = null;
- }
- }
+ ucnv_fromUChars(pConverter.get(), pDst.get(), destCapacity, pResultStr, outLen, &err);
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] ucnv_fromUChars() failed. pValue is %ls.", GetErrorMessage(E_INVALID_ARG), pValue);
-CATCH:
- if (pConverter)
- {
- ucnv_close(pConverter);
- pConverter = null;
- }
- delete[] pIcuStr;
- pIcuStr = null;
- SetLastResult(r);
- return pOutBuf;
+ return pDst.release();
}
wchar_t*
-ConvertMbsToWcsN(const char* pValue)
+Utf8ToWcharN(const char* pValue)
{
- int len = strlen(pValue);
- SysTryReturn(NID_BASE_UTIL, len != 0, null, E_INVALID_ARG, "[%s] Invalid argument is used. The pValue is an empty string.", GetErrorMessage(E_INVALID_ARG));
+ SysTryReturn(NID_BASE_UTIL, pValue != null, null, E_INVALID_ARG, "[%s] Invalid argument is used. The pValue is null.", GetErrorMessage(E_INVALID_ARG));
UErrorCode err = U_ZERO_ERROR;
- UConverter* pConverter = ucnv_open("UTF-8", &err);
-
- result r = _ICUConverter::GetResultFromIcuErrorCode(err);
- SysTryReturn(NID_BASE_UTIL, r == E_SUCCESS, null, r, "[%s] The err must be U_ZERO_ERROR.", GetErrorMessage(r));
+ std::unique_ptr< UConverter, UConverterDeleter > pConverter(ucnv_open("UTF-8", &err));
+ SysTryReturn(NID_BASE_UTIL, pConverter, null, E_OUT_OF_MEMORY, "[%s] ucnv_open() failed. pConverter is null.", GetErrorMessage(E_OUT_OF_MEMORY));
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] ucnv_open() failed. The err must be U_ZERO_ERROR.", GetErrorMessage(E_INVALID_ARG));
- ucnv_setFromUCallBack(pConverter, UCNV_FROM_U_CALLBACK_STOP, null, null, null, &err);
+ ucnv_setFromUCallBack(pConverter.get(), UCNV_FROM_U_CALLBACK_STOP, null, null, null, &err);
- int icuStrLen = len + 1;
- UChar* pIcuStr = new (std::nothrow) UChar[icuStrLen];
+ int len = strlen(pValue);
+ int icuStrCapacity = len + 1;
+ std::unique_ptr< UChar[] > pIcuStr(new (std::nothrow) UChar[icuStrCapacity]);
SysTryReturn(NID_BASE_UTIL, pIcuStr != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
- memset(pIcuStr, 0, sizeof(UChar) * (icuStrLen));
- const char* pTmpIn = pValue;
- signed int retLength = ucnv_toUChars(pConverter, pIcuStr, icuStrLen, pTmpIn, len, &err);
+ signed int retLength = ucnv_toUChars(pConverter.get(), pIcuStr.get(), icuStrCapacity, pValue, len, &err);
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] ucnv_toUChars() failed. pValue is %s.", GetErrorMessage(E_INVALID_ARG), pValue);
- wchar_t* pDst = null;
- wchar_t* pResultStr = null;
- if (U_SUCCESS(err))
- {
- pDst = new (std::nothrow) wchar_t[retLength + 1];
- SysTryCatch(NID_BASE_UTIL, pDst != null, , E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
- memset(pDst, 0, sizeof(wchar_t) * (retLength + 1));
- pResultStr = u_strToWCS(pDst, retLength, &retLength, pIcuStr, retLength, &err);
-
- r = _ICUConverter::GetResultFromIcuErrorCode(err);
- if (IsFailed(r))
- {
- delete[] pDst;
- pDst = null;
- }
- }
+ int destCapacity = retLength + String::DEFAULT_CAPACITY + 1;
+ std::unique_ptr< wchar_t[] > pDst(new (std::nothrow) wchar_t[destCapacity]);
+ SysTryReturn(NID_BASE_UTIL, pDst != null, null, E_OUT_OF_MEMORY, "[%s] Memory allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
-CATCH:
- if (pConverter)
- {
- ucnv_close(pConverter);
- pConverter = null;
- }
- SetLastResult(r);
- delete[] pIcuStr;
- pIcuStr = null;
- return pResultStr;
-}
+ u_strToWCS(pDst.get(), destCapacity, &retLength, pIcuStr.get(), retLength, &err);
+ SysTryReturn(NID_BASE_UTIL, U_SUCCESS(err), null, E_INVALID_ARG, "[%s] u_strToWCS() failed. pValue is %s.", GetErrorMessage(E_INVALID_ARG), pValue);
+ return pDst.release();
+}
} } } // Tizen::Base::Utility