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 | //8)>=> |
159 | //8)>=> |