[2.2] Expand the destCapacity due to U_BUFFER_OVERFLOW_ERROR
[platform/framework/native/appfw.git] / src / base / utility / FBaseUtil_IcuConverter.cpp
index ae410f8..b974646 100644 (file)
@@ -1,5 +1,4 @@
 //
-// Open Service Platform
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
 // Licensed under the Apache License, Version 2.0 (the License);
@@ -202,109 +201,83 @@ _ICUConverter::GetResultFromIcuErrorCode(UErrorCode& err)
        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 = len * 4 + 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