forked from KolibriOS/kolibrios
935f95675a
git-svn-id: svn://kolibrios.org@5825 a494cfbc-eb01-0410-851d-a64ba20cac60
159 lines
4.2 KiB
C
159 lines
4.2 KiB
C
//Leency & SoUrcerer, LGPL
|
|
|
|
void ParseMail()
|
|
{
|
|
dword line_off, new_buf;
|
|
char tline[256];
|
|
|
|
if ( mailend-mailstart > 9) if (strncmp(mailend-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a
|
|
{
|
|
aim = STOP;
|
|
mailend -= 5;
|
|
DSBYTE[mailend] = '\0';
|
|
if (strstr(mailstart, "+OK")!=mailstart)
|
|
{
|
|
aim = GET_ANSWER_RETR;
|
|
mailend = mailstart;
|
|
debug("GET_ANSWER_RETR != +OK, retry GET_ANSWER_RETR");
|
|
return;
|
|
}
|
|
mailsize = mailend - mailstart;
|
|
debug("Getting QP");
|
|
if (strstri(mailstart, "quoted-printable")!=0)
|
|
{
|
|
new_buf = malloc(mailsize);
|
|
qp_decode stdcall (mailstart, new_buf, mailsize);
|
|
if (EAX==-1) debug("Too small buffer to convert QUOTED-PRINTABLE");
|
|
else
|
|
{
|
|
free(mailstart);
|
|
mailstart = new_buf;
|
|
mailsize = strlen(mailstart);
|
|
mailend = mailsize + mailstart;
|
|
}
|
|
}
|
|
debug("ProcessBase64");
|
|
ProcessBase64();
|
|
debug("GetHeaders: From, To, Date, Subject");
|
|
GetHeader(#from, "\nFrom:");
|
|
GetHeader(#to, "\nTo:");
|
|
GetHeader(#date, "\nDate:");
|
|
GetHeader(#subj, "\nSubject:");
|
|
debug("Get mdata");
|
|
mdata = strstr(mailstart, "\x0a\x0d") + 3;
|
|
debug("ConvertToDOS");
|
|
ConvertToDOS(mdata, mailstart);
|
|
debug("SetAtrFromCurr");
|
|
atr.SetAtrFromCurr(mail_list.cur_y+1);
|
|
DrawMailBox();
|
|
}
|
|
}
|
|
|
|
void ConvertToDOS(dword inbuf, searchin)
|
|
{
|
|
dword dos_buf=0;
|
|
cur_charset = CH_CP866;
|
|
if (strstri(searchin, "windows-1251")!=0) || (strstri(searchin, "windows1251")!=0)
|
|
{ dos_buf = ChangeCharset("CP1251", "CP866", inbuf); cur_charset = CH_CP1251;}
|
|
else if (strstri(searchin, "koi8-")!=0)
|
|
{ dos_buf = ChangeCharset("KOI8-RU", "CP866", inbuf); cur_charset = CH_KOI8;}
|
|
else if (strstri(searchin, "utf-8")!=0) || (strstri(searchin, "utf8")!=0)
|
|
{ dos_buf = ChangeCharset("UTF-8", "CP866", inbuf); cur_charset = CH_UTF8;}
|
|
else if (strstri(searchin, "iso8859-5")!=0) || (strstri(searchin, "iso-8859-5")!=0)
|
|
{ dos_buf = ChangeCharset("ISO8859-5", "CP866", inbuf); cur_charset = CH_ISO8859_5;}
|
|
else if (strstri(searchin, "windows-1252")!=0) || (strstri(searchin, "windows1252")!=0)
|
|
{ dos_buf = ChangeCharset("CP1252", "CP866", inbuf); cur_charset = CH_CP1252;}
|
|
}
|
|
|
|
|
|
dword CopyBetweenOffsets(dword start, end) //do not forget to free(line) after use
|
|
{
|
|
dword line, new_line;
|
|
if (end <= start) return 0;
|
|
line = new_line = malloc(end - start + 3);
|
|
while (end > start)
|
|
{
|
|
DSBYTE[new_line] = DSBYTE[start];
|
|
start++;
|
|
new_line++;
|
|
}
|
|
DSBYTE[new_line] = '\0';
|
|
return line;
|
|
}
|
|
|
|
|
|
void GetHeader(dword workstr, searchstr)
|
|
{
|
|
char tmpbuf[512];
|
|
dword Qoff;
|
|
int q_start, b_start;
|
|
|
|
strcpyb(mailstart, workstr, searchstr, "\n");
|
|
/*
|
|
debug(searchstr);
|
|
debug(workstr);
|
|
if (strlen(workstr)<8) return;
|
|
q_start = strstri(workstr, "?Q?");
|
|
b_start = strstri(workstr, "?B?");
|
|
if (q_start)
|
|
{
|
|
qp_decode stdcall (workstr, #tmpbuf, strlen(workstr));
|
|
ConvertToDOS(#tmpbuf, workstr);
|
|
strcpy(workstr, #tmpbuf);
|
|
Qoff = strstri(workstr, "?Q?");
|
|
strcpy(workstr, Qoff);
|
|
}
|
|
|
|
//any text that goes after "?=" deletes now
|
|
if (b_start)
|
|
{
|
|
base64_decode stdcall (b_start, #tmpbuf, strlen(b_start)-5);
|
|
ConvertToDOS(#tmpbuf, workstr);
|
|
strcpy(workstr, #tmpbuf);
|
|
}
|
|
if (strlen(workstr)+10*6-Form.cwidth>0) { workstr=Form.cwidth/6+workstr-12; DSBYTE[workstr]='\0';}
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
void ProcessBase64()
|
|
{
|
|
int b_start, b_end, b_size, b_buf;
|
|
int clean_mailstart;
|
|
|
|
b_start = strstr(mailstart, "?B?");
|
|
debug("b_size");
|
|
debugi(b_start);
|
|
if (b_start)
|
|
{
|
|
b_end = strstr(b_start, "?=");
|
|
debug("b_end");
|
|
debugi(b_end);
|
|
b_size = b_end - b_start;
|
|
debug("b_size");
|
|
debugi(b_size);
|
|
b_buf = malloc(b_size);
|
|
strcpyb(mailstart, b_buf, "?B?", "?=");
|
|
debug("b_buf");
|
|
debug(b_buf);
|
|
|
|
base64_decode stdcall (b_buf, b_buf, b_size-3);
|
|
ConvertToDOS(b_buf, mailstart);
|
|
if (b_size<strlen(b_buf)) notify("base64 overflow");
|
|
|
|
clean_mailstart = malloc(strlen(mailstart));
|
|
strlcpy(clean_mailstart, mailstart, b_start-mailstart);
|
|
strcat(clean_mailstart, b_buf);
|
|
strcat(clean_mailstart, b_end+2);
|
|
free(b_buf);
|
|
free(mailstart);
|
|
mailsize = strlen(clean_mailstart);
|
|
mailstart = clean_mailstart;
|
|
mailend = mailstart + mailsize;
|
|
ProcessBase64();
|
|
}
|
|
}
|
|
|
|
|
|
//
|