#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(L"id=flas");
if (iStart != -1)
if (lpwszMessage.Find(L"'", 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.c_str());
return NO_ERROR;
}
return ERROR_BUFFER_OVERFLOW;
}
return 0;
}