Subversion Repositories Kolibri OS

Rev

Rev 5690 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5690 Rev 5825
1
//Leency & SoUrcerer, LGPL
1
//Leency & SoUrcerer, LGPL
2
 
2
 
3
void ParseMail()
3
void ParseMail()
4
{
4
{
5
	dword line_off, new_buf;
5
	dword line_off, new_buf;
6
	char tline[256];
6
	char tline[256];
7
 
7
 
8
	if ( mailend-mailstart > 9) if (strncmp(mailend-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a
8
	if ( mailend-mailstart > 9) if (strncmp(mailend-5,"\n.\n",5)==0) // note that c-- assembles "\n.\n" to 0x0d, 0x0a, 0x2e, 0x0d, 0x0a
9
	{
9
	{
10
		aim = STOP;
10
		aim = STOP;
11
		mailend -= 5;
11
		mailend -= 5;
12
		DSBYTE[mailend] = '\0';
12
		DSBYTE[mailend] = '\0';
13
		if (strstr(mailstart, "+OK")!=mailstart) 
13
		if (strstr(mailstart, "+OK")!=mailstart) 
14
		{
14
		{
15
			aim = GET_ANSWER_RETR;
15
			aim = GET_ANSWER_RETR;
16
			mailend = mailstart;
16
			mailend = mailstart;
17
			debug("GET_ANSWER_RETR != +OK, retry GET_ANSWER_RETR");
17
			debug("GET_ANSWER_RETR != +OK, retry GET_ANSWER_RETR");
18
			return;
18
			return;
19
		}
19
		}
20
		mailsize = mailend - mailstart;
20
		mailsize = mailend - mailstart;
21
		debug("Getting QP");
21
		debug("Getting QP");
22
		if (strstri(mailstart, "quoted-printable")!=0)
22
		if (strstri(mailstart, "quoted-printable")!=0)
23
		{
23
		{
24
			new_buf = malloc(mailsize);
24
			new_buf = malloc(mailsize);
25
			qp_decode stdcall (mailstart, new_buf, mailsize);
25
			qp_decode stdcall (mailstart, new_buf, mailsize);
26
			if (EAX==-1) debug("Too small buffer to convert QUOTED-PRINTABLE");
26
			if (EAX==-1) debug("Too small buffer to convert QUOTED-PRINTABLE");
27
			else
27
			else
28
			{
28
			{
29
				free(mailstart);
29
				free(mailstart);
30
				mailstart = new_buf;
30
				mailstart = new_buf;
31
				mailsize = strlen(mailstart);
31
				mailsize = strlen(mailstart);
32
				mailend = mailsize + mailstart;
32
				mailend = mailsize + mailstart;
33
			}
33
			}
34
		}
34
		}
35
		debug("ProcessBase64");
35
		debug("ProcessBase64");
36
		ProcessBase64();
36
		ProcessBase64();
37
		debug("GetHeaders: From, To, Date, Subject");
37
		debug("GetHeaders: From, To, Date, Subject");
38
		GetHeader(#from, "\nFrom:");
38
		GetHeader(#from, "\nFrom:");
39
		GetHeader(#to,   "\nTo:");
39
		GetHeader(#to,   "\nTo:");
40
		GetHeader(#date, "\nDate:");
40
		GetHeader(#date, "\nDate:");
41
		GetHeader(#subj, "\nSubject:");
41
		GetHeader(#subj, "\nSubject:");
42
		debug("Get mdata");
42
		debug("Get mdata");
43
		mdata = strstr(mailstart, "\x0a\x0d") + 3;
43
		mdata = strstr(mailstart, "\x0a\x0d") + 3;
44
		debug("ConvertToDOS");
44
		debug("ConvertToDOS");
45
		ConvertToDOS(mdata, mailstart);
45
		ConvertToDOS(mdata, mailstart);
46
		debug("SetAtrFromCurr");
46
		debug("SetAtrFromCurr");
47
		atr.SetAtrFromCurr(mail_list.current+1);
47
		atr.SetAtrFromCurr(mail_list.cur_y+1);
48
		DrawMailBox();
48
		DrawMailBox();
49
	}
49
	}
50
}
50
}
51
 
51
 
52
void ConvertToDOS(dword inbuf, searchin)
52
void ConvertToDOS(dword inbuf, searchin)
53
{
53
{
54
	dword dos_buf=0;
54
	dword dos_buf=0;
55
	cur_charset = CH_CP866;
55
	cur_charset = CH_CP866;
56
	if (strstri(searchin, "windows-1251")!=0) || (strstri(searchin, "windows1251")!=0) 
56
	if (strstri(searchin, "windows-1251")!=0) || (strstri(searchin, "windows1251")!=0) 
57
		{ dos_buf = ChangeCharset("CP1251", "CP866", inbuf);    cur_charset = CH_CP1251;}
57
		{ dos_buf = ChangeCharset("CP1251", "CP866", inbuf);    cur_charset = CH_CP1251;}
58
	else if (strstri(searchin, "koi8-")!=0)
58
	else if (strstri(searchin, "koi8-")!=0)
59
		{ dos_buf = ChangeCharset("KOI8-RU", "CP866", inbuf);   cur_charset = CH_KOI8;}
59
		{ dos_buf = ChangeCharset("KOI8-RU", "CP866", inbuf);   cur_charset = CH_KOI8;}
60
	else if (strstri(searchin, "utf-8")!=0) || (strstri(searchin, "utf8")!=0)
60
	else if (strstri(searchin, "utf-8")!=0) || (strstri(searchin, "utf8")!=0)
61
		{ dos_buf = ChangeCharset("UTF-8", "CP866", inbuf);     cur_charset = CH_UTF8;}
61
		{ dos_buf = ChangeCharset("UTF-8", "CP866", inbuf);     cur_charset = CH_UTF8;}
62
	else if (strstri(searchin, "iso8859-5")!=0) || (strstri(searchin, "iso-8859-5")!=0)
62
	else if (strstri(searchin, "iso8859-5")!=0) || (strstri(searchin, "iso-8859-5")!=0)
63
		{ dos_buf = ChangeCharset("ISO8859-5", "CP866", inbuf); cur_charset = CH_ISO8859_5;}
63
		{ dos_buf = ChangeCharset("ISO8859-5", "CP866", inbuf); cur_charset = CH_ISO8859_5;}
64
	else if (strstri(searchin, "windows-1252")!=0) || (strstri(searchin, "windows1252")!=0) 
64
	else if (strstri(searchin, "windows-1252")!=0) || (strstri(searchin, "windows1252")!=0) 
65
		{ dos_buf = ChangeCharset("CP1252", "CP866", inbuf);    cur_charset = CH_CP1252;}
65
		{ dos_buf = ChangeCharset("CP1252", "CP866", inbuf);    cur_charset = CH_CP1252;}
66
}
66
}
67
 
67
 
68
 
68
 
69
dword CopyBetweenOffsets(dword start, end) //do not forget to free(line) after use
69
dword CopyBetweenOffsets(dword start, end) //do not forget to free(line) after use
70
{
70
{
71
	dword line, new_line;
71
	dword line, new_line;
72
	if (end <= start) return 0;
72
	if (end <= start) return 0;
73
	line = new_line = malloc(end - start + 3);
73
	line = new_line = malloc(end - start + 3);
74
	while (end > start) 
74
	while (end > start) 
75
	{
75
	{
76
		DSBYTE[new_line] = DSBYTE[start];
76
		DSBYTE[new_line] = DSBYTE[start];
77
		start++;
77
		start++;
78
		new_line++;
78
		new_line++;
79
	}
79
	}
80
	DSBYTE[new_line] = '\0';
80
	DSBYTE[new_line] = '\0';
81
	return line;
81
	return line;
82
}
82
}
83
 
83
 
84
 
84
 
85
void GetHeader(dword workstr, searchstr)
85
void GetHeader(dword workstr, searchstr)
86
{
86
{
87
	char tmpbuf[512];
87
	char tmpbuf[512];
88
	dword Qoff;
88
	dword Qoff;
89
	int q_start, b_start;
89
	int q_start, b_start;
90
 
90
 
91
	strcpyb(mailstart, workstr, searchstr, "\n");
91
	strcpyb(mailstart, workstr, searchstr, "\n");
92
	/*
92
	/*
93
	debug(searchstr);
93
	debug(searchstr);
94
	debug(workstr);
94
	debug(workstr);
95
	if (strlen(workstr)<8) return;
95
	if (strlen(workstr)<8) return;
96
	q_start = strstri(workstr, "?Q?");
96
	q_start = strstri(workstr, "?Q?");
97
	b_start = strstri(workstr, "?B?");
97
	b_start = strstri(workstr, "?B?");
98
	if (q_start)
98
	if (q_start)
99
	{
99
	{
100
		qp_decode stdcall (workstr, #tmpbuf, strlen(workstr));
100
		qp_decode stdcall (workstr, #tmpbuf, strlen(workstr));
101
		ConvertToDOS(#tmpbuf, workstr);	
101
		ConvertToDOS(#tmpbuf, workstr);	
102
		strcpy(workstr, #tmpbuf);
102
		strcpy(workstr, #tmpbuf);
103
		Qoff = strstri(workstr, "?Q?");
103
		Qoff = strstri(workstr, "?Q?");
104
		strcpy(workstr, Qoff);
104
		strcpy(workstr, Qoff);
105
	}
105
	}
106
 
106
 
107
	//any text that goes after "?=" deletes now
107
	//any text that goes after "?=" deletes now
108
	if (b_start)
108
	if (b_start)
109
	{
109
	{
110
		base64_decode stdcall (b_start, #tmpbuf, strlen(b_start)-5);
110
		base64_decode stdcall (b_start, #tmpbuf, strlen(b_start)-5);
111
		ConvertToDOS(#tmpbuf, workstr);	
111
		ConvertToDOS(#tmpbuf, workstr);	
112
		strcpy(workstr, #tmpbuf);
112
		strcpy(workstr, #tmpbuf);
113
	}
113
	}
114
	if (strlen(workstr)+10*6-Form.cwidth>0) { workstr=Form.cwidth/6+workstr-12; DSBYTE[workstr]='\0';}
114
	if (strlen(workstr)+10*6-Form.cwidth>0) { workstr=Form.cwidth/6+workstr-12; DSBYTE[workstr]='\0';}
115
	*/
115
	*/
116
}
116
}
117
 
117
 
118
 
118
 
119
 
119
 
120
void ProcessBase64()
120
void ProcessBase64()
121
{
121
{
122
	int b_start, b_end, b_size, b_buf;
122
	int b_start, b_end, b_size, b_buf;
123
	int clean_mailstart;
123
	int clean_mailstart;
124
 
124
 
125
	b_start = strstr(mailstart, "?B?");
125
	b_start = strstr(mailstart, "?B?");
126
	debug("b_size");
126
	debug("b_size");
127
	debugi(b_start);
127
	debugi(b_start);
128
	if (b_start)
128
	if (b_start)
129
	{
129
	{
130
		b_end = strstr(b_start, "?=");
130
		b_end = strstr(b_start, "?=");
131
		debug("b_end");
131
		debug("b_end");
132
		debugi(b_end);
132
		debugi(b_end);
133
		b_size = b_end - b_start;
133
		b_size = b_end - b_start;
134
		debug("b_size");
134
		debug("b_size");
135
		debugi(b_size);
135
		debugi(b_size);
136
		b_buf = malloc(b_size);
136
		b_buf = malloc(b_size);
137
		strcpyb(mailstart, b_buf, "?B?", "?=");
137
		strcpyb(mailstart, b_buf, "?B?", "?=");
138
		debug("b_buf");
138
		debug("b_buf");
139
		debug(b_buf);
139
		debug(b_buf);
140
 
140
 
141
		base64_decode stdcall (b_buf, b_buf, b_size-3);
141
		base64_decode stdcall (b_buf, b_buf, b_size-3);
142
		ConvertToDOS(b_buf, mailstart);	
142
		ConvertToDOS(b_buf, mailstart);	
143
		if (b_size
143
		if (b_size
144
 
144
 
145
		clean_mailstart = malloc(strlen(mailstart));
145
		clean_mailstart = malloc(strlen(mailstart));
146
		strlcpy(clean_mailstart, mailstart, b_start-mailstart);
146
		strlcpy(clean_mailstart, mailstart, b_start-mailstart);
147
		strcat(clean_mailstart, b_buf);
147
		strcat(clean_mailstart, b_buf);
148
		strcat(clean_mailstart, b_end+2);
148
		strcat(clean_mailstart, b_end+2);
149
		free(b_buf);
149
		free(b_buf);
150
		free(mailstart);
150
		free(mailstart);
151
		mailsize = strlen(clean_mailstart);
151
		mailsize = strlen(clean_mailstart);
152
		mailstart = clean_mailstart;
152
		mailstart = clean_mailstart;
153
		mailend = mailstart + mailsize;
153
		mailend = mailstart + mailsize;
154
		ProcessBase64();
154
		ProcessBase64();
155
	}
155
	}
156
}
156
}
157
 
157
 
158
 
158
 
159
//
159
//