kolibrios-gitea/programs/cmm/liza/parselist.c

159 lines
4.2 KiB
C
Raw Normal View History

//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.current+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();
}
}
//