/*
Plugin of Miranda IM for communicating with users of the AIM protocol.
Copyright (c) 2008-2012 Boris Krasnovskiy
Copyright (C) 2005-2006 Aaron Myles Landwehr
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "stdafx.h"
#pragma warning( disable: 4706 )
char* process_status_msg(const char *str, const char* sn)
{
const char *src = str;
size_t size = mir_strlen(src) + 1;
char* res = (char*)mir_alloc(size);
char* dest = res;
size_t len = mir_strlen(sn);
for (; *src; ++src) {
if (src[0] == '\n' && (src == str || src[-1] != '\r')) {
int off = dest - res;
res = (char*)mir_realloc(res, ++size);
dest = res + off;
*(dest++) = '\r';
*(dest++) = *src;
}
else if (src[0] == '%' && src[1] == 'n') {
int off = dest - res;
res = (char*)mir_realloc(res, size + len);
dest = res + off;
size += len;
memcpy(dest, sn, len);
dest += len;
++src;
}
else if (src[0] == '%' && src[1] == 'd') {
int off = dest - res;
res = (char*)mir_realloc(res, size + 20);
dest = res + off;
size += 20;
dest += GetDateFormatA(LOCALE_USER_DEFAULT, 0, nullptr, nullptr, dest, 20) - 1;
++src;
}
else if (src[0] == '%' && src[1] == 't') {
int off = dest - res;
res = (char*)mir_realloc(res, size + 20);
dest = res + off;
size += 20;
dest += GetTimeFormatA(LOCALE_USER_DEFAULT, 0, nullptr, nullptr, dest, 20) - 1;
++src;
}
else *(dest++) = *src;
}
*dest = '\0';
return res;
}
void html_decode(char* str)
{
char *p, *q;
if (str == nullptr) return;
for (p = q = str; *p != '\0'; p++, q++) {
if (*p == '&') {
if (!strnicmp(p, "&", 5)) { *q = '&'; p += 4; }
else if (!strnicmp(p, "'", 6)) { *q = '\''; p += 5; }
else if (!strnicmp(p, ">", 4)) { *q = '>'; p += 3; }
else if (!strnicmp(p, "<", 4)) { *q = '<'; p += 3; }
else if (!strnicmp(p, """, 6)) { *q = '"'; p += 5; }
else if (*(p + 1) == '#') {
char *s = strchr(p, ';');
if (s) {
wchar_t t[2] = { (wchar_t)atoi(p + 2), 0 };
char *t1 = mir_utf8encodeW(t);
if (t1 && *t1) {
mir_strcpy(q, t1);
q += mir_strlen(t1) - 1;
}
mir_free(t1);
p = s;
}
else
*q = *p;
}
else { *q = *p; }
}
else if (*p == '<') {
if (!strnicmp(p, "
", 3)) { mir_strcpy(q, "\r\n\r\n"); q += 3; p += 2; }
else if (!strnicmp(p, "
", 4)) { mir_strcpy(q, "\r\n\r\n"); q += 3; p += 3; }
else if (!strnicmp(p, "
", 4)) { mir_strcpy(q, "\r\n"); ++q; p += 3; }
else if (!strnicmp(p, "
", 6)) { mir_strcpy(q, "\r\n"); ++q; p += 5; }
else if (!strnicmp(p, "
", 4)) { mir_strcpy(q, "\r\n"); ++q; p += 3; }
else if (!strnicmp(p, "
", 6)) { mir_strcpy(q, "\r\n"); ++q; p += 5; }
else {
char *l = strchr(p, '>');
if (l) { p = l; --q; }
else *q = *p;
}
}
else *q = *p;
}
*q = '\0';
}
char* html_encode(const char* str)
{
char *s, *q;
const char *p;
int c;
if (str == nullptr) return nullptr;
for (c = 0, p = str; *p != '\0'; p++) {
switch (*p) {
case '&': c += 5; break;
case '\'': c += 6; break;
case '>': c += 4; break;
case '<': c += 4; break;
case '"': c += 6; break;
case '\n': c += 4; break;
default: c++; break;
}
}
s = (char*)mir_alloc(c + 27);
mir_strcpy(s, "");
for (p = str, q = s + 12; *p != '\0'; p++) {
switch (*p) {
case '&': memcpy(q, "&", 5); q += 5; break;
case '>': memcpy(q, ">", 4); q += 4; break;
case '<': memcpy(q, "<", 4); q += 4; break;
case '"': memcpy(q, """, 6); q += 6; break;
case '\r': break;
case '\n': memcpy(q, "
", 4); q += 4; break;
default: *q = *p; ++q; break;
}
}
mir_strcpy(q, "");
return s;
}
char* html_to_bbcodes(char *src)
{
char *ptr;
char *ptrl;
char *rptr;
char* dest = mir_strdup(src);
while ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 1) = 'b';
*(ptr + 2) = ']';
if ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 2) = 'b';
*(ptr + 3) = ']';
}
else {
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 6);
memcpy(&dest[mir_strlen(dest)], "[/b]", 5);
}
}
while ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 1) = 'i';
*(ptr + 2) = ']';
if ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 2) = 'i';
*(ptr + 3) = ']';
}
else {
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 6);
memcpy(&dest[mir_strlen(dest)], "[/i]", 5);
}
}
while ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 1) = 'u';
*(ptr + 2) = ']';
if ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 2) = 'u';
*(ptr + 3) = ']';
}
else {
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 6);
memcpy(&dest[mir_strlen(dest)], "[/u]", 5);
}
}
while ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 1) = 's';
*(ptr + 2) = ']';
if ((ptr = strstr(dest, "")) != nullptr || (ptr = strstr(dest, "")) != nullptr) {
*ptr = '[';
*(ptr + 2) = 's';
*(ptr + 3) = ']';
}
else {
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 6);
memcpy(&dest[mir_strlen(dest)], "[/s]", 5);
}
}
rptr = dest;
while (ptr = strstr(rptr, ""))) {
ptr -= 1;
memmove(ptr, ptr + 1, mir_strlen(ptr + 1) + 1);
*(ptr) = ']';
ptrl -= 1;
char* s1 = strstr(ptrl, ""))) {
ptr -= 1;
memmove(ptr, ptr + 1, mir_strlen(ptr + 1) + 1);
*(ptr) = ']';
ptrl -= 1;
char* s1 = strstr(ptrl, ""))) {
memmove(ptrl + 7, ptr, mir_strlen(ptr) + 1);
*(ptrl + 7) = ']';
ptr = ptrl + 7;
char* s1 = strstr(ptr, ""))) {
memmove(ptrl + 7, ptr, mir_strlen(ptr) + 1);
*(ptrl + 7) = ']';
ptr = ptrl + 7;
char* s1 = strstr(ptr, ""))) {
*(ptr) = ']';
if ((ptrl = strstr(ptr, "';
}
while ((ptr = strstr(dest, "[/b]")) != nullptr) {
*ptr = '<';
*(ptr + 2) = 'b';
*(ptr + 3) = '>';
}
while ((ptr = strstr(dest, "[i]")) != nullptr) {
*ptr = '<';
*(ptr + 1) = 'i';
*(ptr + 2) = '>';
}
while ((ptr = strstr(dest, "[/i]")) != nullptr) {
*ptr = '<';
*(ptr + 2) = 'i';
*(ptr + 3) = '>';
}
while ((ptr = strstr(dest, "[u]")) != nullptr) {
*ptr = '<';
*(ptr + 1) = 'u';
*(ptr + 2) = '>';
}
while ((ptr = strstr(dest, "[/u]")) != nullptr) {
*ptr = '<';
*(ptr + 2) = 'u';
*(ptr + 3) = '>';
}
while ((ptr = strstr(dest, "[s]")) != nullptr) {
*ptr = '<';
*(ptr + 1) = 's';
*(ptr + 2) = '>';
}
while ((ptr = strstr(dest, "[/s]")) != nullptr) {
*ptr = '<';
*(ptr + 2) = 's';
*(ptr + 3) = '>';
}
rptr = dest;
while ((ptr = strstr(rptr, "[color="))) {
int addr = ptr - rptr;
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 8);
rptr = dest;
ptr = rptr + addr;
memmove(ptr + 5, ptr, mir_strlen(ptr) + 1);
memcpy(ptr, "';
if ((ptr = strstr(ptr, "[/color]"))) {
memcpy(ptr, "", 7);
memmove(ptr + 7, ptr + 8, mir_strlen(ptr + 8) + 1);
}
}
else
rptr++;
}
while ((ptr = strstr(rptr, "[url="))) {
int addr = ptr - rptr;
dest = (char*)mir_realloc(dest, mir_strlen(dest) + 8);
rptr = dest;
ptr = rptr + addr;
memmove(ptr + 3, ptr, mir_strlen(ptr) + 1);
memcpy(ptr, "';
if ((ptr = strstr(ptr, "[/url]"))) {
memcpy(ptr, "", 4);
memmove(ptr + 4, ptr + 6, mir_strlen(ptr + 6) + 1);
}
}
else
rptr++;
}
return dest;
}
void strip_tag(char* begin, char* end)
{
memmove(begin, end + 1, mir_strlen(end + 1) + 1);
}
//strip a tag within a string
char* strip_tag_within(char* begin, char* end)
{
while (char *sub_begin = strchr(begin, '<')) {
if (sub_begin < end)//less than the original ending
{
char *sub_end = strchr(begin, '>');
strip_tag(sub_begin, sub_end);
end = end - (sub_end - sub_begin) - 1;
}
else
break;
}
return end;
}
char* rtf_to_html(HWND hwndDlg, int DlgItem)
{
char* buf = (char*)mir_alloc(4024);
size_t pos = 0;
int start = 0;
int end = 1;
BOOL Bold = false;
BOOL Italic = false;
BOOL Underline = false;
char Face[32] = "";
COLORREF Color = 0;
COLORREF BackColor = 0;
int Size = 0;
GETTEXTLENGTHEX tl;
tl.flags = GTL_DEFAULT;
tl.codepage = CP_ACP;
int oldstart = 0, oldend = 0;
SendDlgItemMessage(hwndDlg, DlgItem, EM_GETSEL, (WPARAM)&oldstart, (LPARAM)&oldend);
int length = SendDlgItemMessage(hwndDlg, DlgItem, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0);
while (start < length) {
SendDlgItemMessage(hwndDlg, DlgItem, EM_SETSEL, start, end);
CHARFORMAT2A cfOld;
cfOld.cbSize = sizeof(cfOld);
cfOld.dwMask = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_SIZE | CFM_COLOR | CFM_BACKCOLOR | CFM_FACE;
SendDlgItemMessageA(hwndDlg, DlgItem, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&cfOld);
BOOL isBold = (cfOld.dwEffects & CFE_BOLD) && (cfOld.dwMask & CFM_BOLD);
BOOL isItalic = (cfOld.dwEffects & CFE_ITALIC) && (cfOld.dwMask & CFM_ITALIC);
BOOL isUnderline = (cfOld.dwEffects & CFE_UNDERLINE) && (cfOld.dwMask & CFM_UNDERLINE);
COLORREF isColor = cfOld.crTextColor;
COLORREF isBackColor = cfOld.crBackColor;
int isSize;
if (cfOld.yHeight == 38 * 20)
isSize = 7;
else if (cfOld.yHeight == 24 * 20)
isSize = 6;
else if (cfOld.yHeight == 18 * 20)
isSize = 5;
else if (cfOld.yHeight == 14 * 20)
isSize = 4;
else if (cfOld.yHeight == 12 * 20)
isSize = 3;
else if (cfOld.yHeight == 10 * 20)
isSize = 2;
else if (cfOld.yHeight == 8 * 20)
isSize = 1;
else
isSize = 3;
wchar_t text[3] = L"";
SendDlgItemMessage(hwndDlg, DlgItem, EM_GETSELTEXT, 0, (LPARAM)&text);
if (Bold != isBold) {
Bold = isBold;
if (isBold) {
mir_strcpy(&buf[pos], "");
pos += 3;
}
else {
if (start != 0) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
}
}
if (Italic != isItalic) {
Italic = isItalic;
if (isItalic) {
mir_strcpy(&buf[pos], "");
pos += 3;
}
else {
if (start != 0) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
}
}
if (Underline != isUnderline) {
Underline = isUnderline;
if (isUnderline) {
mir_strcpy(&buf[pos], "");
pos += 3;
}
else {
if (start != 0) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
}
}
if (Size != isSize || Color != isColor || BackColor != isBackColor || mir_strcmp(Face, cfOld.szFaceName)) {
Size = isSize;
Color = isColor;
BackColor = isBackColor;
mir_strcpy(Face, cfOld.szFaceName);
if (start != 0) {
mir_strcpy(&buf[pos], "");
pos += 7;
}
mir_strcpy(&buf[pos], "> 8), chBackColor, 16);
size_t len = mir_strlen(chBackColor);
if (len < 6) {
memmove(chBackColor + (6 - len), chBackColor, len + 1);
for (int i = 0; i < 6; i++)
chBackColor[i] = '0';
}
mir_strcpy(&buf[pos], chBackColor);
pos += 6;
}
if (!(cfOld.dwEffects & CFE_AUTOCOLOR)) {
mir_strcpy(&buf[pos], " color=#");
pos += 8;
char chColor[7];
_itoa((_htonl(Color) >> 8), chColor, 16);
size_t len = mir_strlen(chColor);
if (len < 6) {
memmove(chColor + (6 - len), chColor, len + 1);
for (int i = 0; i < 6; i++)
chColor[i] = '0';
}
mir_strcpy(&buf[pos], chColor);
pos += 6;
}
mir_strcpy(&buf[pos], " size=");
pos += 6;
char chSize[2];
_itoa(Size, chSize, 10);
mir_strcpy(&buf[pos], chSize);
pos++;
mir_strcpy(&buf[pos], ">");
pos++;
}
if (text[0] == '\r') {
mir_strcpy(&buf[pos], "
");
pos += 4;
}
else {
T2Utf txt(text);
mir_strcpy(&buf[pos], txt);
pos += mir_strlen(txt);
}
start++;
end++;
}
if (Bold) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
if (Italic) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
if (Underline) {
mir_strcpy(&buf[pos], "");
pos += 4;
}
mir_strcpy(&buf[pos], "");
pos += 7;
SendDlgItemMessage(hwndDlg, DlgItem, EM_SETSEL, oldstart, oldend);
return buf;
}
void wcs_htons(wchar_t *ch)
{
if (ch == nullptr) return;
for (size_t i = 0; i < mir_wstrlen(ch); i++)
ch[i] = _htons(ch[i]);
}
char* bytes_to_string(char *bytes, int num_bytes)
{
if (num_bytes == 0) return nullptr;
char *string = (char*)mir_alloc(num_bytes * 2 + 1);
for (int i = 0; i < num_bytes; i++) {
char store[2];
unsigned char bit = (bytes[i] & 0xF0) >> 4;
_itoa(bit, store, 16);
memcpy(&string[i * 2], store, 1);
bit = (bytes[i] & 0x0F);
_itoa(bit, store, 16);
memcpy(&string[i * 2 + 1], store, 1);
}
string[num_bytes * 2] = '\0';
return string;
}
void string_to_bytes(char *string, char *bytes)
{
char sbyte[3];
sbyte[2] = '\0';
size_t length = mir_strlen(string);
for (size_t i = 0; i < length; i += 2) {
sbyte[0] = string[i];
sbyte[1] = string[i + 1];
bytes[i / 2] = (char)strtol(sbyte, nullptr, 16);
}
}
bool is_utf(const char *msg)
{
bool res = false;
if (msg) {
for (unsigned i = 0; !res; ++i) {
char c = msg[i];
if (c == 0) break;
res = (c & 0x80) != 0;
}
}
return res;
}
char* get_fname(char *path)
{
char *pszFile = strrchr(path, '\\');
if (pszFile) pszFile++; else pszFile = path;
return pszFile;
}
wchar_t* get_dir(wchar_t *path)
{
wchar_t *cpath = mir_wstrdup(path);
wchar_t *swd = wcsrchr(cpath, '\\');
if (swd) swd[1] = 0; else cpath[0] = 0;
return cpath;
}
aimString::aimString(char *str)
{
if (str == nullptr) {
szString = nullptr;
size = 0;
unicode = false;
}
else {
unicode = is_utf(str);
if (unicode) {
wszString = mir_utf8decodeW(str);
wcs_htons(wszString);
size = mir_wstrlen(wszString) * sizeof(wchar_t);
}
else {
szString = mir_utf8decodeA(str);
size = mir_strlen(szString);
}
}
}
#pragma warning( default: 4706 )