summaryrefslogtreecommitdiff
path: root/noncore/unsupported/mailit/popclient.cpp
Unidiff
Diffstat (limited to 'noncore/unsupported/mailit/popclient.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/unsupported/mailit/popclient.cpp14
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
24extern "C" { 24extern "C" {
25#include "md5.h" 25#include "md5.h"
26} 26}
27 27
28#include <qcstring.h> 28#include <qcstring.h>
29 29
30PopClient::PopClient() 30PopClient::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
46PopClient::~PopClient() 47PopClient::~PopClient()
47{ 48{
48 delete socket; 49 delete socket;
49 delete stream; 50 delete stream;
50} 51}
51 52
52void PopClient::newConnection(QString target, int port) 53void 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
68void PopClient::setAccount(QString popUser, QString popPasswd) 69void PopClient::setAccount(QString popUser, QString popPasswd)
69{ 70{
70 popUserName = popUser; 71 popUserName = popUser;
71 popPassword = popPasswd; 72 popPassword = popPasswd;
72} 73}
73 74
74void PopClient::setSynchronize(int lastCount) 75void PopClient::setSynchronize(int lastCount)
75{ 76{
76 synchronize = TRUE; 77 synchronize = TRUE;
77 lastSync = lastCount; 78 lastSync = lastCount;
78} 79}
79 80
80void PopClient::removeSynchronize() 81void PopClient::removeSynchronize()
81{ 82{
82 synchronize = FALSE; 83 synchronize = FALSE;
83 lastSync = 0; 84 lastSync = 0;
84} 85}
85 86
86void PopClient::headersOnly(bool headers, int limit) 87void PopClient::headersOnly(bool headers, int limit)
87{ 88{
88 preview = headers; 89 preview = headers;
89 headerLimit = limit; 90 headerLimit = limit;
90} 91}
91 92
92void PopClient::setSelectedMails(MailList *list) 93void PopClient::setSelectedMails(MailList *list)
93{ 94{
94 selected = TRUE; 95 selected = TRUE;
95 mailList = list; 96 mailList = list;
96} 97}
97 98
98void PopClient::connectionEstablished() 99void PopClient::connectionEstablished()
99{ 100{
100 emit updateStatus(tr("Connection established")); 101 emit updateStatus(tr("Connection established"));
101} 102}
102 103
103void PopClient::errorHandling(int status) 104void 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
111void PopClient::incomingData() 112void 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}