#include "stdafx.h" #include "MraRTFMsg.h" #define COLORTABLE_COUNT 8 #define RTF_COLORTBLCOLOURS "\\red255\\green0\\blue0;\\red0\\green255\\blue0;\\red0\\green0\\blue255;\\red255\\green0\\blue255;\\red255\\green255\\blue0;\\red0\\green255\\blue255;\\red0\\green0\\blue0;\\red255\\green255\\blue255;" static const LPSTR lpszColours[COLORTABLE_COUNT] = { "red", "green", "blue", "magenta", "yellow", "cyan", "black", "white" }; #define CRLF "\r\n" #define PAR "\\par " #define BB_COLOR_TAG "[color=" #define SYMBOLS_COUNT 19 static const LPSTR lpszSimbols[SYMBOLS_COUNT] = { "\r\n", "\\", "{", "}", "[b]", "[/b]", "[u]", "[/u]", "[i]", "[/i]", "[/color]", "[color = red]", "[color = green]", "[color = blue]", "[color = magenta]", "[color = yellow]", "[color = cyan]", "[color = black]", "[color = white]", }; static const size_t dwcSimbolsCount[SYMBOLS_COUNT] = { 2, 1, 1, 1, 3, 4, 3, 4, 3, 4, 8, 11, 13, 12, 15, 14, 12, 13, 13, }; static const LPSTR lpszRTFTags[SYMBOLS_COUNT] = { "\\par", "\\\\", "\\{", "\\}", "{\\b ", "}", "{\\ul ", "}", "{\\i ", "}", "}", "{\\cf2 ", "{\\cf3 ", "{\\cf4 ", "{\\cf5 ", "{\\cf6 ", "{\\cf7 ", "{\\cf8 ", "{\\cf9 ", }; static const size_t dwcRTFTagsCount[SYMBOLS_COUNT] = { 4, 2, 2, 2, 4, 1, 5, 1, 4, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6 }; DWORD MraTextToRTFData(LPSTR lpszMessage, size_t dwMessageSize, LPSTR lpszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize); bool MraIsMessageFlashAnimation(const CMStringW &lpwszMessage) { int iStart = lpwszMessage.Find(_T("id = flas")); if (iStart != -1) if (lpwszMessage.Find(_T("'"), iStart) != -1) return true; return false; } DWORD MraTextToRTFData(LPSTR lpszMessage, size_t dwMessageSize, LPSTR lpszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize) { if (lpszMessage && dwMessageSize && lpszMessageConverted && dwMessageConvertedBuffSize) { BYTE tm, bCurByte; LPSTR lpszMessageConvertedCur, lpszMessageConvertedMax; size_t i; lpszMessageConvertedCur = lpszMessageConverted; lpszMessageConvertedMax = (lpszMessageConverted+dwMessageConvertedBuffSize); for (i = 0; i < dwMessageSize && lpszMessageConvertedMax-lpszMessageConvertedCur > 3; i++) { *((WORD*)lpszMessageConvertedCur) = *((WORD*)"\\'"); bCurByte = (*((BYTE*)lpszMessage+i)); tm = (bCurByte>>4)&0xf; lpszMessageConvertedCur[2] = (tm>9)? ('a'+tm-10):('0'+tm); tm = bCurByte&0xf; lpszMessageConvertedCur[3] = (tm>9)? ('a'+tm-10):('0'+tm); lpszMessageConvertedCur += 4; (*((BYTE*)lpszMessageConvertedCur)) = 0; } if (pdwMessageConvertedSize) *pdwMessageConvertedSize = lpszMessageConvertedCur - lpszMessageConverted; return NO_ERROR; } if (pdwMessageConvertedSize) *pdwMessageConvertedSize = 0; return ERROR_INVALID_HANDLE; } DWORD MraSymbolsToRTFTags(LPSTR lpszMessage, size_t dwMessageSize, LPSTR lpszMessageConverted, size_t dwMessageConvertedBuffSize, size_t *pdwMessageConvertedSize) { DWORD dwRetErrorCode = NO_ERROR; LPSTR lpszFounded[SYMBOLS_COUNT], lpszMessageConvertedCur, lpszMessageCur, lpszMessageCurPrev, lpszMessageConvertedMax; size_t i, dwFirstFoundIndex = 0, dwFoundCount = 0, dwMemPartToCopy; lpszMessageCurPrev = lpszMessage; lpszMessageConvertedCur = lpszMessageConverted; lpszMessageConvertedMax = (lpszMessageConverted+dwMessageConvertedBuffSize); for (i = 0; i < SYMBOLS_COUNT; i++) { // loking for first time lpszFounded[i] = (LPSTR)MemoryFind((lpszMessageCurPrev-lpszMessage), lpszMessage, dwMessageSize, lpszSimbols[i], dwcSimbolsCount[i]); if (lpszFounded[i]) dwFoundCount++; } while (dwFoundCount) { for (i = 0;i (lpszMessageConvertedCur+(dwMemPartToCopy+dwcRTFTagsCount[dwFirstFoundIndex]))) { MraTextToRTFData(lpszMessageCurPrev, dwMemPartToCopy, lpszMessageConvertedCur, (lpszMessageConvertedMax-lpszMessageConvertedCur), &i);lpszMessageConvertedCur += i; memcpy(lpszMessageConvertedCur, lpszRTFTags[dwFirstFoundIndex], dwcRTFTagsCount[dwFirstFoundIndex]);lpszMessageConvertedCur += dwcRTFTagsCount[dwFirstFoundIndex]; lpszMessageCurPrev = (lpszFounded[dwFirstFoundIndex]+dwcSimbolsCount[dwFirstFoundIndex]); for (i = 0;i= (lpszMessageRTFCur + sizeof(PAR) + sizeof(CRLF) + 2)) { memcpy(lpszMessageRTFCur, PAR, sizeof(PAR)); lpszMessageRTFCur += (sizeof(PAR) - 1); memcpy(lpszMessageRTFCur, CRLF, sizeof(CRLF)); lpszMessageRTFCur += (sizeof(CRLF) - 1); memcpy(lpszMessageRTFCur, "}", 2); lpszMessageRTFCur += 2; debugLogA("%s\n", szMessageRTF); return NO_ERROR; } return ERROR_BUFFER_OVERFLOW; } return 0; }