Diffstat (limited to 'noncore/unsupported/mailit/popclient.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/unsupported/mailit/popclient.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/noncore/unsupported/mailit/popclient.cpp b/noncore/unsupported/mailit/popclient.cpp index 6105d09..fedc4e2 100644 --- a/noncore/unsupported/mailit/popclient.cpp +++ b/noncore/unsupported/mailit/popclient.cpp | |||
@@ -1,325 +1,327 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qt Palmtop Environment. | 4 | ** This file is part of Qt Palmtop Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | #include "popclient.h" | 20 | #include "popclient.h" |
21 | #include "emailhandler.h" | 21 | #include "emailhandler.h" |
22 | //#define APOP_TEST | 22 | //#define APOP_TEST |
23 | 23 | ||
24 | extern "C" { | 24 | extern "C" { |
25 | #include "md5.h" | 25 | #include "md5.h" |
26 | } | 26 | } |
27 | 27 | ||
28 | #include <qcstring.h> | 28 | #include <qcstring.h> |
29 | 29 | ||
30 | PopClient::PopClient() | 30 | PopClient::PopClient() |
31 | { | 31 | { |
32 | |||
32 | socket = new QSocket(this, "popClient"); | 33 | socket = new QSocket(this, "popClient"); |
33 | connect(socket, SIGNAL(error(int)), this, SLOT(errorHandling(int))); | 34 | connect(socket, SIGNAL(error(int)), this, SLOT(errorHandling(int))); |
34 | connect(socket, SIGNAL(connected()), this, SLOT(connectionEstablished())); | 35 | connect(socket, SIGNAL(connected()), this, SLOT(connectionEstablished())); |
35 | connect(socket, SIGNAL(readyRead()), this, SLOT(incomingData())); | 36 | connect(socket, SIGNAL(readyRead()), this, SLOT(incomingData())); |
36 | 37 | ||
37 | stream = new QTextStream(socket); | 38 | stream = new QTextStream(socket); |
38 | 39 | ||
39 | receiving = FALSE; | 40 | receiving = FALSE; |
40 | synchronize = FALSE; | 41 | synchronize = FALSE; |
41 | lastSync = 0; | 42 | lastSync = 0; |
42 | headerLimit = 0; | 43 | headerLimit = 0; |
43 | preview = FALSE; | 44 | preview = FALSE; |
44 | } | 45 | } |
45 | 46 | ||
46 | PopClient::~PopClient() | 47 | PopClient::~PopClient() |
47 | { | 48 | { |
48 | delete socket; | 49 | delete socket; |
49 | delete stream; | 50 | delete stream; |
50 | } | 51 | } |
51 | 52 | ||
52 | void PopClient::newConnection(QString target, int port) | 53 | void PopClient::newConnection(QString target, int port) |
53 | { | 54 | { |
54 | if (receiving) { | 55 | if (receiving) { |
55 | qWarning("socket in use, connection refused"); | 56 | qWarning("socket in use, connection refused"); |
56 | return; | 57 | return; |
57 | } | 58 | } |
58 | 59 | ||
59 | status = Init; | 60 | status = Init; |
60 | 61 | ||
61 | socket->connectToHost(target, port); | 62 | socket->connectToHost(target, port); |
62 | receiving = TRUE; | 63 | receiving = TRUE; |
63 | //selected = FALSE; | 64 | //selected = FALSE; |
64 | 65 | ||
65 | emit updateStatus("DNS lookup"); | 66 | emit updateStatus("DNS lookup"); |
66 | } | 67 | } |
67 | 68 | ||
68 | void PopClient::setAccount(QString popUser, QString popPasswd) | 69 | void PopClient::setAccount(QString popUser, QString popPasswd) |
69 | { | 70 | { |
70 | popUserName = popUser; | 71 | popUserName = popUser; |
71 | popPassword = popPasswd; | 72 | popPassword = popPasswd; |
72 | } | 73 | } |
73 | 74 | ||
74 | void PopClient::setSynchronize(int lastCount) | 75 | void PopClient::setSynchronize(int lastCount) |
75 | { | 76 | { |
76 | synchronize = TRUE; | 77 | synchronize = TRUE; |
77 | lastSync = lastCount; | 78 | lastSync = lastCount; |
78 | } | 79 | } |
79 | 80 | ||
80 | void PopClient::removeSynchronize() | 81 | void PopClient::removeSynchronize() |
81 | { | 82 | { |
82 | synchronize = FALSE; | 83 | synchronize = FALSE; |
83 | lastSync = 0; | 84 | lastSync = 0; |
84 | } | 85 | } |
85 | 86 | ||
86 | void PopClient::headersOnly(bool headers, int limit) | 87 | void PopClient::headersOnly(bool headers, int limit) |
87 | { | 88 | { |
88 | preview = headers; | 89 | preview = headers; |
89 | headerLimit = limit; | 90 | headerLimit = limit; |
90 | } | 91 | } |
91 | 92 | ||
92 | void PopClient::setSelectedMails(MailList *list) | 93 | void PopClient::setSelectedMails(MailList *list) |
93 | { | 94 | { |
94 | selected = TRUE; | 95 | selected = TRUE; |
95 | mailList = list; | 96 | mailList = list; |
96 | } | 97 | } |
97 | 98 | ||
98 | void PopClient::connectionEstablished() | 99 | void PopClient::connectionEstablished() |
99 | { | 100 | { |
100 | emit updateStatus(tr("Connection established")); | 101 | emit updateStatus(tr("Connection established")); |
101 | } | 102 | } |
102 | 103 | ||
103 | void PopClient::errorHandling(int status) | 104 | void PopClient::errorHandling(int status) |
104 | { | 105 | { |
105 | emit updateStatus(tr("Error Occured")); | 106 | emit updateStatus(tr("Error Occured")); |
106 | emit errorOccurred(status); | 107 | emit errorOccurred(status); |
107 | socket->close(); | 108 | socket->close(); |
108 | receiving = FALSE; | 109 | receiving = FALSE; |
109 | } | 110 | } |
110 | 111 | ||
111 | void PopClient::incomingData() | 112 | void PopClient::incomingData() |
112 | { | 113 | { |
113 | QString response, temp, temp2, timeStamp; | 114 | QString response, temp, temp2, timeStamp; |
114 | QString md5Source; | 115 | QString md5Source; |
115 | int start, end; | 116 | int start, end; |
116 | // char *md5Digest; | 117 | // char *md5Digest; |
117 | char md5Digest[16]; | 118 | char md5Digest[16]; |
118 | // if ( !socket->canReadLine() ) | 119 | // if ( !socket->canReadLine() ) |
119 | // return; | 120 | // return; |
121 | |||
120 | 122 | ||
121 | response = socket->readLine(); | 123 | response = socket->readLine(); |
122 | 124 | ||
123 | switch(status) { | 125 | switch(status) { |
124 | //logging in | 126 | //logging in |
125 | case Init: { | 127 | case Init: { |
126 | #ifdef APOP_TEST | 128 | #ifdef APOP_TEST |
127 | start = response.find('<',0); | 129 | start = response.find('<',0); |
128 | end = response.find('>', start); | 130 | end = response.find('>', start); |
129 | if( start >= 0 && end > start ) | 131 | if( start >= 0 && end > start ) |
130 | { | 132 | { |
131 | timeStamp = response.mid( start , end - start + 1); | 133 | timeStamp = response.mid( start , end - start + 1); |
132 | md5Source = timeStamp + popPassword; | 134 | md5Source = timeStamp + popPassword; |
133 | 135 | ||
134 | md5_buffer( (char const *)md5Source, md5Source.length(),&md5Digest[0]); | 136 | md5_buffer( (char const *)md5Source, md5Source.length(),&md5Digest[0]); |
135 | 137 | ||
136 | for(int j =0;j < MD5_DIGEST_LENGTH ;j++) | 138 | for(int j =0;j < MD5_DIGEST_LENGTH ;j++) |
137 | { | 139 | { |
138 | printf("%x", md5Digest[j]); | 140 | printf("%x", md5Digest[j]); |
139 | } | 141 | } |
140 | printf("\n"); | 142 | printf("\n"); |
141 | // qDebug(md5Digest); | 143 | // qDebug(md5Digest); |
142 | *stream << "APOP " << popUserName << " " << md5Digest << "\r\n"; | 144 | *stream << "APOP " << popUserName << " " << md5Digest << "\r\n"; |
143 | // qDebug("%s", stream); | 145 | // qDebug("%s", stream); |
144 | status = Stat; | 146 | status = Stat; |
145 | } | 147 | } |
146 | else | 148 | else |
147 | #endif | 149 | #endif |
148 | { | 150 | { |
149 | timeStamp = ""; | 151 | timeStamp = ""; |
150 | *stream << "USER " << popUserName << "\r\n"; | 152 | *stream << "USER " << popUserName << "\r\n"; |
151 | status = Pass; | 153 | status = Pass; |
152 | } | 154 | } |
153 | 155 | ||
154 | break; | 156 | break; |
155 | } | 157 | } |
156 | 158 | ||
157 | case Pass: { | 159 | case Pass: { |
158 | *stream << "PASS " << popPassword << "\r\n"; | 160 | *stream << "PASS " << popPassword << "\r\n"; |
159 | status = Stat; | 161 | status = Stat; |
162 | |||
160 | break; | 163 | break; |
161 | } | 164 | } |
162 | //ask for number of messages | 165 | //ask for number of messages |
163 | case Stat: { | 166 | case Stat: { |
164 | if (response[0] == '+') { | 167 | if (response[0] == '+') { |
165 | *stream << "STAT" << "\r\n"; | 168 | *stream << "STAT" << "\r\n"; |
166 | status = Mcnt; | 169 | status = Mcnt; |
167 | } else errorHandling(ErrLoginFailed); | 170 | } else errorHandling(ErrLoginFailed); |
168 | break; | 171 | break; |
169 | } | 172 | } |
170 | //get count of messages, eg "+OK 4 900.." -> int 4 | 173 | //get count of messages, eg "+OK 4 900.." -> int 4 |
171 | case Mcnt: { | 174 | case Mcnt: { |
172 | if (response[0] == '+') { | 175 | if (response[0] == '+') { |
173 | temp = response.replace(0, 4, ""); | 176 | temp = response.replace(0, 4, ""); |
174 | int x = temp.find(" ", 0); | 177 | int x = temp.find(" ", 0); |
175 | temp.truncate((uint) x); | 178 | temp.truncate((uint) x); |
176 | newMessages = temp.toInt(); | 179 | newMessages = temp.toInt(); |
177 | messageCount = 1; | 180 | messageCount = 1; |
178 | status = List; | 181 | status = List; |
179 | 182 | ||
180 | if (synchronize) { | 183 | if (synchronize) { |
181 | //messages deleted from server, reload all | 184 | //messages deleted from server, reload all |
182 | if (newMessages < lastSync) | 185 | if (newMessages < lastSync) |
183 | lastSync = 0; | 186 | lastSync = 0; |
184 | messageCount = 1; | 187 | messageCount = 1; |
185 | } | 188 | } |
186 | 189 | ||
187 | if (selected) { | 190 | if (selected) { |
188 | int *ptr = mailList->first(); | 191 | int *ptr = mailList->first(); |
189 | if (ptr != 0) { | 192 | if (ptr != 0) { |
190 | newMessages++; //to ensure no early jumpout | 193 | newMessages++; //to ensure no early jumpout |
191 | messageCount = *ptr; | 194 | messageCount = *ptr; |
192 | } else newMessages = 0; | 195 | } else newMessages = 0; |
193 | } | 196 | } |
194 | 197 | ||
195 | } else errorHandling(ErrUnknownResponse); | 198 | } else errorHandling(ErrUnknownResponse); |
196 | } | 199 | } |
197 | //Read message number x, count upwards to messageCount | 200 | //Read message number x, count upwards to messageCount |
198 | case List: { | 201 | case List: { |
199 | if (messageCount <= newMessages) { | 202 | if (messageCount <= newMessages) { |
200 | *stream << "LIST " << messageCount << "\r\n"; | 203 | *stream << "LIST " << messageCount << "\r\n"; |
201 | status = Size; | 204 | status = Size; |
202 | temp2.setNum(newMessages - lastSync); | 205 | temp2.setNum(newMessages - lastSync); |
203 | temp.setNum(messageCount - lastSync); | 206 | temp.setNum(messageCount - lastSync); |
204 | if (!selected) { | 207 | if (!selected) { |
205 | emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); | 208 | emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); |
206 | } else { | 209 | } else { |
207 | //completing a previously closed transfer | 210 | //completing a previously closed transfer |
208 | /* if ( (messageCount - lastSync) <= 0) { | 211 | /* if ( (messageCount - lastSync) <= 0) { |
209 | temp.setNum(messageCount); | 212 | temp.setNum(messageCount); |
210 | emit updateStatus(tr("Previous message ") + temp); | 213 | emit updateStatus(tr("Previous message ") + temp); |
211 | } else {*/ | 214 | } else {*/ |
212 | emit updateStatus(tr("Completing message ") + temp); | 215 | emit updateStatus(tr("Completing message ") + temp); |
213 | //} | 216 | //} |
214 | } | 217 | } |
215 | break; | 218 | break; |
216 | } else { | 219 | } else { |
217 | emit updateStatus(tr("No new Messages")); | 220 | emit updateStatus(tr("No new Messages")); |
218 | status = Quit; | 221 | status = Quit; |
219 | } | 222 | } |
220 | } | 223 | } |
221 | //get size of message, eg "500 characters in message.." -> int 500 | 224 | //get size of message, eg "500 characters in message.." -> int 500 |
222 | case Size: { | 225 | case Size: { |
223 | if (status != Quit) { //because of idiotic switch | 226 | if (status != Quit) { //because of idiotic switch |
224 | if (response[0] == '+') { | 227 | if (response[0] == '+') { |
225 | temp = response.replace(0, 4, ""); | 228 | temp = response.replace(0, 4, ""); |
226 | int x = temp.find(" ", 0); | 229 | int x = temp.find(" ", 0); |
227 | temp = temp.right(temp.length() - ((uint) x + 1) ); | 230 | temp = temp.right(temp.length() - ((uint) x + 1) ); |
228 | mailSize = temp.toInt(); | 231 | mailSize = temp.toInt(); |
229 | emit currentMailSize(mailSize); | 232 | emit currentMailSize(mailSize); |
230 | 233 | ||
231 | status = Retr; | 234 | status = Retr; |
232 | } else { | 235 | } else { |
233 | //qWarning(response); | 236 | //qWarning(response); |
234 | errorHandling(ErrUnknownResponse); | 237 | errorHandling(ErrUnknownResponse); |
235 | } | 238 | } |
236 | } | 239 | } |
237 | } | 240 | } |
238 | //Read message number x, count upwards to messageCount | 241 | //Read message number x, count upwards to messageCount |
239 | case Retr: { | 242 | case Retr: { |
240 | if (status != Quit) { | 243 | if (status != Quit) { |
241 | if ((selected)||(mailSize <= headerLimit)) | 244 | if ((selected)||(mailSize <= headerLimit)) |
242 | { | 245 | { |
243 | *stream << "RETR " << messageCount << "\r\n"; | 246 | *stream << "RETR " << messageCount << "\r\n"; |
244 | } else { //only header | 247 | } else { //only header |
245 | *stream << "TOP " << messageCount << " 0\r\n"; | 248 | *stream << "TOP " << messageCount << " 0\r\n"; |
246 | } | 249 | } |
247 | messageCount++; | 250 | messageCount++; |
248 | status = Ignore; | 251 | status = Ignore; |
249 | break; | 252 | break; |
250 | } } | 253 | } } |
251 | case Ignore: { | 254 | case Ignore: { |
252 | if (status != Quit) { //because of idiotic switch | 255 | if (status != Quit) { //because of idiotic switch |
253 | if (response[0] == '+') { | 256 | if (response[0] == '+') { |
254 | message = ""; | 257 | message = ""; |
255 | status = Read; | 258 | status = Read; |
256 | if (!socket->canReadLine()) //sync. problems | 259 | if (!socket->canReadLine()) //sync. problems |
257 | break; | 260 | break; |
258 | response = socket->readLine(); | 261 | response = socket->readLine(); |
259 | } else errorHandling(ErrUnknownResponse); | 262 | } else errorHandling(ErrUnknownResponse); |
260 | } | 263 | } |
261 | } | 264 | } |
262 | //add all incoming lines to body. When size is reached, send | 265 | //add all incoming lines to body. When size is reached, send |
263 | //message, and go back to read new message | 266 | //message, and go back to read new message |
264 | case Read: { | 267 | case Read: { |
265 | if (status != Quit) { //because of idiotic switch | 268 | if (status != Quit) { //because of idiotic switch |
266 | message += response; | 269 | message += response; |
267 | while ( socket->canReadLine() ) { | 270 | while ( socket->canReadLine() ) { |
268 | response = socket->readLine(); | 271 | response = socket->readLine(); |
269 | message += response; | 272 | message += response; |
270 | } | 273 | } |
271 | emit downloadedSize(message.length()); | 274 | emit downloadedSize(message.length()); |
272 | int x = message.find("\r\n.\r\n",-5); | 275 | int x = message.find("\r\n.\r\n",-5); |
273 | if (x == -1) { | 276 | if (x == -1) { |
274 | break; | 277 | break; |
275 | } else { //message reach entire size | 278 | } else { //message reach entire size |
276 | |||
277 | if ( (selected)||(mailSize <= headerLimit)) //mail size limit is not used if late download is active | 279 | if ( (selected)||(mailSize <= headerLimit)) //mail size limit is not used if late download is active |
278 | { | 280 | { |
279 | emit newMessage(message, messageCount-1, mailSize, TRUE); | 281 | emit newMessage(message, messageCount-1, mailSize, TRUE); |
280 | } else { //incomplete mail downloaded | 282 | } else { //incomplete mail downloaded |
281 | emit newMessage(message, messageCount-1, mailSize, FALSE); | 283 | emit newMessage(message, messageCount-1, mailSize, FALSE); |
282 | } | 284 | } |
283 | 285 | ||
284 | if ((messageCount > newMessages)||(selected)) //last message ? | 286 | if ((messageCount > newMessages)||(selected)) //last message ? |
285 | { | 287 | { |
286 | status = Quit; | 288 | status = Quit; |
287 | if (selected) { //grab next from queue | 289 | if (selected) { //grab next from queue |
288 | newMessages--; | 290 | newMessages--; |
289 | status = Quit; | 291 | status = Quit; |
290 | } | 292 | } |
291 | } | 293 | } |
292 | else | 294 | else |
293 | { | 295 | { |
294 | *stream << "LIST " << messageCount << "\r\n"; | 296 | *stream << "LIST " << messageCount << "\r\n"; |
295 | status = Size; | 297 | status = Size; |
296 | temp2.setNum(newMessages - lastSync); | 298 | temp2.setNum(newMessages - lastSync); |
297 | temp.setNum(messageCount - lastSync); | 299 | temp.setNum(messageCount - lastSync); |
298 | emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); | 300 | emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); |
299 | 301 | ||
300 | break; | 302 | break; |
301 | } | 303 | } |
302 | } | 304 | } |
303 | } | 305 | } |
304 | if (status != Quit) | 306 | if (status != Quit) |
305 | break; | 307 | break; |
306 | } | 308 | } |
307 | case Quit: { | 309 | case Quit: { |
308 | *stream << "Quit\r\n"; | 310 | *stream << "Quit\r\n"; |
309 | status = Done; | 311 | status = Done; |
310 | int newM = newMessages - lastSync; | 312 | int newM = newMessages - lastSync; |
311 | if (newM > 0) { | 313 | if (newM > 0) { |
312 | temp.setNum(newM); | 314 | temp.setNum(newM); |
313 | emit updateStatus(temp + tr(" new messages")); | 315 | emit updateStatus(temp + tr(" new messages")); |
314 | } else { | 316 | } else { |
315 | emit updateStatus(tr("No new messages")); | 317 | emit updateStatus(tr("No new messages")); |
316 | } | 318 | } |
317 | 319 | ||
318 | socket->close(); | 320 | socket->close(); |
319 | receiving = FALSE; | 321 | receiving = FALSE; |
320 | emit mailTransfered(newM); | 322 | emit mailTransfered(newM); |
321 | break; | 323 | break; |
322 | } | 324 | } |
323 | } | 325 | } |
324 | 326 | ||
325 | } | 327 | } |