#include "Mra.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 SIMBOLS_COUNT	19
static const LPSTR lpszSimbols[SIMBOLS_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[SIMBOLS_COUNT]=
{
	2,
	1,
	1,
	1,
	3,
	4,
	3,
	4,
	3,
	4,
	8,
	11,
	13,
	12,
	15,
	14,
	12,
	13,
	13,
};
static const LPSTR lpszRTFTags[SIMBOLS_COUNT]=
{
	"\\par",
	"\\\\",
	"\\{",
	"\\}",
	"{\\b ",
	"}",
	"{\\ul ",
	"}",
	"{\\i ",
	"}",
	"}",
	"{\\cf2 ",
	"{\\cf3 ",
	"{\\cf4 ",
	"{\\cf5 ",
	"{\\cf6 ",
	"{\\cf7 ",
	"{\\cf8 ",
	"{\\cf9 ",
};
static const SIZE_T dwcRTFTagsCount[SIMBOLS_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(LPWSTR lpwszMessage,SIZE_T dwMessageSize)
{
	BOOL bRet=FALSE;
	LPWSTR lpwszFounded;
	dwMessageSize*=sizeof(WCHAR);
	lpwszFounded=(LPWSTR)MemoryFind(0,lpwszMessage,dwMessageSize,L"id=flas",28);
	if (lpwszFounded)
	{
		if (MemoryFind(((lpwszFounded-lpwszMessage)+32),lpwszMessage,dwMessageSize,L"'",18)) bRet=TRUE;
	}
return(bRet);
}
DWORD MraTextToRTFData(LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize)
{
	DWORD dwRetErrorCode=NO_ERROR;
	if (lpszMessage && dwMessageSize && lpszMessageConverted && dwMessageConvertedBuffSize)
	{
		BYTE tm,bCurByte;
		LPSTR lpszMessageConvertedCur,lpszMessageConvertedMax;
		SIZE_T i;
		lpszMessageConvertedCur=lpszMessageConverted;
		lpszMessageConvertedMax=(lpszMessageConverted+dwMessageConvertedBuffSize);
		for(i=0;(i3);i++)
		{
			//lpszMessageConvertedCur+=mir_snprintf(lpszMessageConvertedCur,8,"\\'%x",(*((BYTE*)lpszMessage+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);
	}else{
		if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)=0;
		dwRetErrorCode=ERROR_INVALID_HANDLE;
	}
return(dwRetErrorCode);
}
DWORD MraSybolsToRTFTags(DWORD dwFlags,LPSTR lpszMessage,SIZE_T dwMessageSize,LPSTR lpszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize)
{
	DWORD dwRetErrorCode=NO_ERROR;
	LPSTR lpszFounded[SIMBOLS_COUNT],lpszMessageConvertedCur,lpszMessageCur,lpszMessageCurPrev,lpszMessageConvertedMax;
	SIZE_T i,dwFirstFoundedIndex=0,dwFoundedCount=0,dwMemPartToCopy;
#ifdef _DEBUG //check table
	for(i=0;i(lpszMessageConvertedCur+(dwMemPartToCopy+dwcRTFTagsCount[dwFirstFoundedIndex])))
			{
				//memmove(lpszMessageConvertedCur,lpszMessageCurPrev,dwMemPartToCopy);lpszMessageConvertedCur+=dwMemPartToCopy;
				MraTextToRTFData(lpszMessageCurPrev,dwMemPartToCopy,lpszMessageConvertedCur,(lpszMessageConvertedMax-lpszMessageConvertedCur),&i);lpszMessageConvertedCur+=i;
				memmove(lpszMessageConvertedCur,lpszRTFTags[dwFirstFoundedIndex],dwcRTFTagsCount[dwFirstFoundedIndex]);lpszMessageConvertedCur+=dwcRTFTagsCount[dwFirstFoundedIndex];
				lpszMessageCurPrev=(lpszFounded[dwFirstFoundedIndex]+dwcSimbolsCount[dwFirstFoundedIndex]);
				for(i=0;i=(lpszMessageRTFCur+sizeof(PAR)+sizeof(CRLF)+2))
					{
						memmove(lpszMessageRTFCur,PAR,sizeof(PAR));lpszMessageRTFCur+=(sizeof(PAR)-1);
						memmove(lpszMessageRTFCur,CRLF,sizeof(CRLF));lpszMessageRTFCur+=(sizeof(CRLF)-1);
						memmove(lpszMessageRTFCur,"}",2);lpszMessageRTFCur+=2;
						if (pdwMessageRTFSize) (*pdwMessageRTFSize)=(lpszMessageRTFCur-lpszMessageRTF);
						DebugPrintCRLFA(lpszMessageRTF);
						dwRetErrorCode=NO_ERROR;
					}else{
						if (pdwMessageRTFSize) (*pdwMessageRTFSize)=dwMessageRTFBuffSize+1024;
						dwRetErrorCode=ERROR_BUFFER_OVERFLOW;
						DebugBreak();
					}
				}
				MEMFREE(lpszMessage);
			}
		}else{
			if (pdwMessageRTFSize) (*pdwMessageRTFSize)=dwMessageSize;
			dwRetErrorCode=ERROR_BUFFER_OVERFLOW;
			DebugBreak();
		}
	}else{
		dwRetErrorCode=ERROR_INVALID_HANDLE;
	}
return(dwRetErrorCode);
}