#include "MmsPluginDrm.h"
#include "MsgDrmWrapper.h"
#endif
+#include "MmsPluginTextConvert.h"
#include "MmsPluginUtil.h"
static bool _MmsBinaryDecodeGetBytes(FILE *pFile, char *szBuff, int bufLen, int totalLength); /* bufLen < gMmsDecodeMaxLen */
* MMS_CODE_PREVIOUSLYSENTBY shall be a pair with MMS_CODE_PREVIOUSLYSENTDATE
*/
+ /*
+ * fixme: There is no proper field to store this information.
+ * Just increase pointer now.
+ */
+
if (__MmsDecodeValueLength(pFile, &valueLength, totalLength) <= 0) {
MSG_DEBUG("MmsBinaryDecodeMsgHeader : 1. invalid MMS_CODE_PREVIOUSLYSENTBY \n");
goto __CATCH;
* MMS_CODE_PREVIOUSLYSENTDATE shall be a pair with MMS_CODE_PREVIOUSLYSENTBY
*/
+ /*
+ * fixme: There is no proper field to store this information.
+ * Just increase pointer now.
+ */
+
if (__MmsDecodeValueLength(pFile, &valueLength, totalLength) <= 0) {
MSG_DEBUG("MmsBinaryDecodeMsgHeader : 1. invalid MMS_CODE_PREVIOUSLYSENTDATE \n");
goto __CATCH;
__RETURN:
+ if (mmsHeader.pTo == NULL && pLastTo) {
+ free(pLastTo);
+ }
+
+ if (mmsHeader.pCc == NULL && pLastCc) {
+ free(pLastCc);
+ }
+
+ if (mmsHeader.pBcc == NULL && pLastBcc) {
+ free(pLastBcc);
+ }
+
MSG_DEBUG("MmsBinaryDecodeMsgHeader: success\n");
return true;
__CATCH:
+
+ if (mmsHeader.pTo == NULL && pLastTo) {
+ free(pLastTo);
+ }
+
+ if (mmsHeader.pCc == NULL && pLastCc) {
+ free(pLastCc);
+ }
+
+ if (mmsHeader.pBcc == NULL && pLastBcc) {
+ free(pLastBcc);
+ }
+
MSG_DEBUG("MmsBinaryDecodeMsgHeader: failed\n");
return false;
__CATCH:
+ /* fixme: Delete multipart using MmsDeleteMsg() */
+
return false;
}
#endif
int length = 0;
int offset = 0;
- MsgMultipart *pMultipart = NULL;
-
MSG_DEBUG("MmsBinaryDecodeMsgBody:\n");
if (szFilePath != NULL)
default:
/* Single part message ---------------------------------------------- */
-
- strcpy(mmsHeader.msgBody.szOrgFilePath, szFilePath);
+ if (szFilePath != NULL)
+ strcpy(mmsHeader.msgBody.szOrgFilePath, szFilePath);
offset = _MmsGetDecodeOffset();
if (offset >= totalLength)
__CATCH:
- if (pMultipart) {
- if (pMultipart->pBody) {
- if (pMultipart->pBody->body.pText) {
- free(pMultipart->pBody->body.pText);
- pMultipart->pBody->body.pText = NULL;
- }
-
- free(pMultipart->pBody);
- pMultipart->pBody = NULL;
- }
-
- free(pMultipart);
- pMultipart = NULL;
- }
-
return false;
}
__CATCH:
- if (szTypeString) {
- free(szTypeString);
- szTypeString = NULL;
- }
return false;
}
Well-known-charset = Any-charset | Integer-value
; Both are encoded using values from Character Set Assignments table in Assigned Numbers
Any-charset = <Octet 128>
- ; Equivalent to the special RFC2616 charset value ¡°*¡±
+ ; Equivalent to the special RFC2616 charset value ��*��
*/
int charset = 0;
if (szTemp == NULL)
goto __CATCH;
- if (_MmsBinaryDecodeGetBytes(pFile, szTemp, valueLength, totalLength) < 0) {
+ if (_MmsBinaryDecodeGetBytes(pFile, szTemp, valueLength, totalLength) == false) {
MSG_DEBUG("MmsBinaryDecodePartHeader : default _MmsBinaryDecodeGetBytes() fail\n");
if (szTemp) {
free(szTemp);
pLastMultipart->pNext = pMultipart;
pLastMultipart = pMultipart;
+ pPreMultipart = pMultipart;
}
pMsgType->contentSize += pMultipart->pBody->size;
nEntries--;
- pPreMultipart = pMultipart;
+
MmsDebugPrintMulitpartEntry(pMultipart, index++);
}
memset(szContentURI, 0, contentURILen + 1);
- if (_MmsBinaryDecodeGetBytes(pFile, szContentURI, contentURILen + 1, totalLength) < 0) {
+ if (_MmsBinaryDecodeGetBytes(pFile, szContentURI, contentURILen + 1, totalLength) == false) {
MSG_DEBUG("__MmsParseDCFInfo : contentType is invalid\n");
goto __CATCH;
}
goto __CATCH;
}
- remove(szTempFilePath);
+ if (remove(szTempFilePath) != 0)
+ MSG_DEBUG("remove fail");
+
isFileCreated = false;
if (MmsBinaryDecodeMovePointer(pFile, offset + fullBodyLength, totalLength) == false)
return true;
__CATCH:
- if (isFileCreated)
- remove(szTempFilePath);
-
+ if (isFileCreated) {
+ if (remove(szTempFilePath) != 0)
+ MSG_DEBUG("remove fail");
+ }
if (pRawData) {
free(pRawData);
pRawData = NULL;
goto __CATCH;
}
+ if (pszOrgData) {
+ free(pszOrgData);
+ pszOrgData = NULL;
+ }
+
MsgFflush(hFile);
MsgCloseFile(hFile);
hConvertedFile = NULL;
}
- if (hTempFile != NULL) {
- MsgCloseFile(hTempFile);
- hTempFile = NULL;
- }
-
if (pszMmsLoadTempBuf) {
free(pszMmsLoadTempBuf);
pszMmsLoadTempBuf = NULL;
pszOrgData = NULL;
}
- if (hFile != NULL) {
- MsgCloseFile(hFile);
- hFile = NULL;
- }
-
remove(szTempFile);
remove(szTempFilePath);
hFile = NULL;
}
- remove(szTempFile);
- remove(szTempFilePath);
- remove(MMS_DECODE_DRM_CONVERTED_TEMP_FILE); //remove convertin result if it goes to __CATCH
+ if (remove(szTempFile) != 0)
+ MSG_DEBUG("remove fail");
+
+ if (remove(szTempFilePath) != 0)
+ MSG_DEBUG("remove fail");
+
+ if (remove(MMS_DECODE_DRM_CONVERTED_TEMP_FILE) != 0)
+ MSG_DEBUG("remove fail"); //remove convertin result if it goes to __CATCH
return false;
}
if (hConvertedFile != NULL) {
MsgCloseFile(hConvertedFile);
- remove(MMS_DECODE_DRM_CONVERTED_TEMP_FILE);
+
+ if (remove(MMS_DECODE_DRM_CONVERTED_TEMP_FILE) != 0)
+ MSG_DEBUG("remove fail");
+
hConvertedFile = NULL;
}
__RETURN:
- if (pData) {
- free(pData);
- pData = NULL;
- }
-
return length;
__CATCH:
__RETURN:
- if (pData) {
- free(pData);
- pData = NULL;
- }
-
szBuff[0] = '\0';
length = 0;
return szBuff;
__RETURN:
- if (pData) {
- free(pData);
- pData = NULL;
- }
*pLength = 1;
* ; Both are encoded using values from
* Character Set Assignments table in Assigned Numbers
* Any-charset = <Octet 128>
- * ; Equivalent to the special RFC2616 charset value ¡°*¡±
+ * ; Equivalent to the special RFC2616 charset value ��*��
*/
if (pFile == NULL || nCharSet == NULL || pCharSetLen == NULL)
UINT32 valueLength = 0;
UINT32 charSet = 0;
int charSetLen = 0;
- int nChar = 0;
- int nRead2 = 0;
- int nByte = 0;
int nTemp = 0;
char *pData = NULL;
char *pTempData = NULL;
unsigned short *mszTempStr = NULL;
char *pConvertedStr = NULL;
- char *pNewData = NULL;
-
MSG_DEBUG("__MmsBinaryDecodeEncodedString: decode string..\n");
strncpy(szBuff, pData, bufLen - 1);
}
- switch (charSet) {
- case MSG_CHARSET_UTF16:
- case MSG_CHARSET_USC2:
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: MSG_CHARSET_USC2 \n");
+ {//temp brace
nTemp = strlen(szBuff);
- pTempData = (char *)malloc(nTemp + 1);
- if (pTempData == NULL) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: Memory Full \n");
- goto __CATCH;
- }
-
- memset(pTempData, 0, nTemp + 1);
- memcpy(pTempData, szBuff, nTemp + 1);
-
- if (((UINT8)pTempData[0]) == 0xFF && ((UINT8)pTempData[1]) == 0xFE) {
- if ((nChar = (nTemp / 2 - 1)) <= 0) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString(%d) : nChar is invalid value (%d), charset(%d)\n", __LINE__, nChar, charSet);
- goto __CATCH ;
- }
-
- mszTempStr = (unsigned short*) malloc(nChar * sizeof(unsigned short));
- if (mszTempStr == NULL) {
- MSG_DEBUG("MmsGetMediaPartData : 1. Memory Full !!! \n");
- goto __CATCH;
- }
- memcpy(mszTempStr, ((unsigned short*)pTempData + 1), nChar * sizeof(unsigned short));
+ const char *pToCharSet = "UTF-8";
- nByte = MsgGetUnicode2UTFCodeSize(((unsigned short*)pTempData + 1), nChar);
+ UINT16 charset_code = _MmsGetBinaryValue(MmsCodeCharSet, charSet);
- pConvertedStr = (char *)malloc(nByte + 1);
- if (pConvertedStr)
- MsgUnicode2UTF ((unsigned char*)pConvertedStr, nByte + 1, mszTempStr, nChar);
- } else {
- if ((nChar = (nTemp / 2)) <= 0) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString(%d) : nChar is invalid value (%d), charset(%d)\n", __LINE__, nChar, charSet);
- goto __CATCH ;
- }
-
- mszTempStr = (unsigned short*) malloc(nChar * sizeof(unsigned short));
- if (mszTempStr == NULL) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: 2. Memory Full !!! \n");
- goto __CATCH;
- }
-
- memcpy(mszTempStr, ((unsigned short*)pTempData), nChar * sizeof(unsigned short));
-
- nByte = MsgGetUnicode2UTFCodeSize(((unsigned short*)pTempData), nChar);
-
- pConvertedStr = (char *)malloc(nByte + 1);
- if (pConvertedStr != NULL)
- MsgUnicode2UTF ((unsigned char*)pConvertedStr, nByte + 1, mszTempStr, nChar);
- }
-
- if (pConvertedStr != NULL) {
- pNewData = pConvertedStr;
- nRead2 = nByte;
-
- strncpy(szBuff, pNewData, bufLen - 1);
- }
-
- break;
-
- case MSG_CHARSET_US_ASCII:
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: MSG_CHARSET_US_ASCII \n");
-
- case MSG_CHARSET_UTF8:
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: MSG_CHARSET_UTF8 or Others \n");
-
- pNewData = pTempData;
- nRead2 = nTemp;
-
- break;
-
- case MSG_CHARSET_ISO_8859_7: /* Greek */
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: MSG_CHARSET_ISO_8859_7 \n");
-
- nTemp = strlen(szBuff);
- pTempData = (char *)malloc(nTemp + 1);
- if (pTempData == NULL)
- {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: Memory Full \n");
- goto __CATCH;
- }
-
- memset(pTempData, 0 , nTemp + 1);
- memcpy(pTempData, szBuff, nTemp + 1);
-
- nByte = MsgGetLatin72UTFCodeSize((unsigned char*)pTempData, nTemp);
- pConvertedStr = (char *)malloc(nByte + 1);
-
- if (pConvertedStr != NULL) {
- MsgLatin7code2UTF((unsigned char*)pConvertedStr, nByte + 1, (unsigned char*)pTempData, nTemp);
-
- pNewData = pConvertedStr;
- nRead2 = nByte;
-
- strncpy(szBuff, pNewData, bufLen - 1);
- }
-
- break;
-
- case MSG_CHARSET_ISO_8859_9: /* Turkish */
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: MSG_CHARSET_ISO_8859_9 \n");
-
- nTemp = strlen(szBuff);
- pTempData = (char *)malloc(nTemp + 1);
- if (pTempData == NULL) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: Memory Full \n");
- goto __CATCH;
- }
-
- memset(pTempData, 0 , nTemp + 1);
- memcpy(pTempData, szBuff, nTemp + 1);
-
- nByte = MsgGetLatin52UTFCodeSize((unsigned char*)pTempData, nTemp);
- pConvertedStr = (char *)malloc(nByte + 1);
-
- if (pConvertedStr != NULL) {
- MsgLatin5code2UTF((unsigned char*)pConvertedStr, nByte + 1, (unsigned char*)pTempData, nTemp);
-
- pNewData = pConvertedStr;
- nRead2 = nByte;
-
- strncpy(szBuff, pNewData, bufLen - 1);
- }
-
- break;
-
- default:
-
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: Other charsets \n");
-
- nTemp = strlen(szBuff);
- pTempData = (char *)malloc(nTemp + 1);
- if (pTempData == NULL) {
- MSG_DEBUG("__MmsBinaryDecodeEncodedString: Memory Full \n");
- goto __CATCH;
+ const char *pFromCharSet = MmsPluginTextConvertGetCharSet(charset_code);
+ if (pFromCharSet == NULL || !strcmp(pFromCharSet, pToCharSet)) {
+ return true;
}
- memset(pTempData, 0, nTemp + 1);
- memcpy(pTempData, szBuff, nTemp + 1);
-
- nByte = MsgGetLatin2UTFCodeSize((unsigned char*)pTempData, nTemp);
- pConvertedStr = (char *)malloc(nByte + 1);
+ char *pDest = NULL;
+ int destLen = 0;
- if (pConvertedStr != NULL) {
- MsgLatin2UTF((unsigned char*)pConvertedStr, nByte + 1, (unsigned char*)pTempData, nTemp);
+ if (MmsPluginTextConvert(pToCharSet, pFromCharSet, szBuff, nTemp, &pDest, &destLen) == false) {
+ MSG_DEBUG("MmsPluginTextConvert Fail");
- pNewData = pConvertedStr;
- nRead2 = nByte;
+ } else {
- strncpy(szBuff, pNewData, bufLen - 1);
+ memset(szBuff, 0x00, bufLen);
+ snprintf(szBuff, destLen, "%s", pDest);
}
-
- break;
-
- } //switch (charset)
-
- } //switch (__MmsDecodeValueLength....)
+ }
+ }
if (pData) {
free(pData);
}
}
+ /* fixme: charset transformation */
+
break;
}
int utf8BufSize = 0;
utf8BufSize = MsgGetLatin2UTFCodeSize((unsigned char*)pLatinBuff, length);
+ if (utf8BufSize < 3)
+ utf8BufSize = 3;//min value
+
pUTF8Buff = (char *)malloc(utf8BufSize + 1);
if (pUTF8Buff == NULL) {
MSG_DEBUG("__MmsDecodeGetFilename: pUTF8Buff alloc fail \n");
pMsg->msgID = msgID;
/* read from MMS raw file */
- if (szFullPath != NULL)
- strncpy(pMsg->szFileName, szFullPath + strlen(MSG_DATA_PATH), strlen(szFullPath + strlen(MSG_DATA_PATH)));
+ strncpy(pMsg->szFileName, szFullPath + strlen(MSG_DATA_PATH), strlen(szFullPath + strlen(MSG_DATA_PATH)));
MSG_DEBUG("szFullPath = (%s)", szFullPath);
if (pUTF8Buff) {
if ((pExt = strrchr(pUTF8Buff, '.')) != NULL) {
- if ((MSG_FILENAME_LEN_MAX-1) < strlen(pUTF8Buff)) {
- nameLen = (MSG_FILENAME_LEN_MAX-1) - strlen(pExt);
+ if ((MSG_LOCALE_FILENAME_LEN_MAX-1) < strlen(pUTF8Buff)) {
+ nameLen = (MSG_LOCALE_FILENAME_LEN_MAX-1) - strlen(pExt);
} else {
nameLen = strlen(pUTF8Buff) - strlen(pExt);
}
strncpy(pType->param.szName, pUTF8Buff, nameLen);
strcat (pType->param.szName, pExt);
} else {
- strncpy(pType->param.szName, pUTF8Buff, (MSG_FILENAME_LEN_MAX-1));
+ strncpy(pType->param.szName, pUTF8Buff, (MSG_LOCALE_FILENAME_LEN_MAX-1));
}
free(pUTF8Buff);
pUTF8Buff = NULL;
length = strlen(pSrc);
utf8BufSize = MsgGetLatin2UTFCodeSize((unsigned char*)pSrc, length);
+ if (utf8BufSize < 3)
+ utf8BufSize = 3; //min value
+
pUTF8Buff = (char *)malloc(utf8BufSize + 1);
if (pUTF8Buff == NULL) {
free(pUTF8Buff);
pUTF8Buff = NULL;
}
- if (pData) {
- free(pData);
- pData = NULL;
- }
+
return NULL;
}
case MIME_APPLICATION_VND_WAP_MULTIPART_ALTERNATIVE:
case MIME_MULTIPART_ALTERNATIVE:
- /*
+ /* fixme:
* Policy: multipart/alternative
* multipart/alternative message has only several parts of media.
* You should choose one of them and make the alternative part
if (pSelectedPart == NULL) {
MSG_DEBUG("MsgResolveNestedMultipart : MIME_MULTIPART_REPORT [no selected part]\n");
- MSG_DEBUG("MsgResolveNestedMultipart : MIME_MULTIPART_REPORT [no selected part]\n");
pRemoveList = pPartBody->body.pMultipart->pNext;
- pSelectedPart = pPartBody->body.pMultipart;
- pSelectedPart->pNext = NULL;
+ if (pPartBody->body.pMultipart != NULL) {
+ pSelectedPart = pPartBody->body.pMultipart;
+ pSelectedPart->pNext = NULL;
+ }
} else {
if (pPrevPart == NULL) {
// first part is selected
return szReturn;
__CATCH:
- if (szTemp) {
- free(szTemp);
- szTemp = NULL;
- }
return NULL;
}
#endif
case MSG_FILED_CONTENT_REPLACE_POS:
MsgMIMERemoveQuote(szFieldValue);
- strncpy(pType->szContentRepPos, szFieldValue, sizeof(pType->szContentRepPos));
+ strncpy(pType->szContentRepPos, szFieldValue, sizeof(pType->szContentRepPos) - 1);
break;
case MSG_FILED_CONTENT_REPLACE_SIZE:
MsgMIMERemoveQuote(szFieldValue);
- strncpy(pType->szContentRepSize, szFieldValue, sizeof(pType->szContentRepSize));
+ strncpy(pType->szContentRepSize, szFieldValue, sizeof(pType->szContentRepSize) - 1);
break;
case MSG_FILED_CONTENT_REPLACE_INDEX:
MsgMIMERemoveQuote(szFieldValue);
- strncpy(pType->szContentRepIndex, szFieldValue, sizeof(pType->szContentRepIndex));
+ strncpy(pType->szContentRepIndex, szFieldValue, sizeof(pType->szContentRepIndex) - 1);
break;
default:
}
if (pPartType->param.szName[0] == '\0' && pPartType->param.szFileName[0] == '\0')
- strcpy(pPartType->param.szName, pPartType->param.szFileName);
+ snprintf(pPartType->param.szName, sizeof(pPartType->param.szName), "%s", pPartType->param.szFileName);
- if (pPartType->param.szName) {
- strcpy(szFileName, pPartType->param.szName);
+ if (pPartType->param.szName[0] != '\0') {
+ snprintf(szFileName, MSG_FILENAME_LEN_MAX+1, "%s", pPartType->param.szName);
} else {
snprintf(szFileName, MSG_FILENAME_LEN_MAX+1, "%lu", (unsigned long)index);
}
memcpy(mszTempStr, ((unsigned short*)pTemp + 1), nChar * sizeof(unsigned short));
nByte = MsgGetUnicode2UTFCodeSize(((unsigned short*)pTemp + 1), nChar);
+ if (nByte < 3)
+ nByte = 3; //min value
pConvertedStr = (char *)malloc(nByte + 1);
if (pConvertedStr != NULL)