Diffstat (limited to 'noncore/net/mailit/popclient.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/mailit/popclient.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/noncore/net/mailit/popclient.cpp b/noncore/net/mailit/popclient.cpp index 6105d09..fedc4e2 100644 --- a/noncore/net/mailit/popclient.cpp +++ b/noncore/net/mailit/popclient.cpp @@ -8,48 +8,49 @@ ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "popclient.h" #include "emailhandler.h" //#define APOP_TEST extern "C" { #include "md5.h" } #include <qcstring.h> PopClient::PopClient() { + socket = new QSocket(this, "popClient"); connect(socket, SIGNAL(error(int)), this, SLOT(errorHandling(int))); connect(socket, SIGNAL(connected()), this, SLOT(connectionEstablished())); connect(socket, SIGNAL(readyRead()), this, SLOT(incomingData())); stream = new QTextStream(socket); receiving = FALSE; synchronize = FALSE; lastSync = 0; headerLimit = 0; preview = FALSE; } PopClient::~PopClient() { delete socket; delete stream; } void PopClient::newConnection(QString target, int port) { if (receiving) { qWarning("socket in use, connection refused"); @@ -96,112 +97,114 @@ void PopClient::setSelectedMails(MailList *list) } void PopClient::connectionEstablished() { emit updateStatus(tr("Connection established")); } void PopClient::errorHandling(int status) { emit updateStatus(tr("Error Occured")); emit errorOccurred(status); socket->close(); receiving = FALSE; } void PopClient::incomingData() { QString response, temp, temp2, timeStamp; QString md5Source; int start, end; // char *md5Digest; char md5Digest[16]; // if ( !socket->canReadLine() ) // return; + response = socket->readLine(); switch(status) { //logging in case Init: { #ifdef APOP_TEST start = response.find('<',0); end = response.find('>', start); if( start >= 0 && end > start ) { timeStamp = response.mid( start , end - start + 1); md5Source = timeStamp + popPassword; md5_buffer( (char const *)md5Source, md5Source.length(),&md5Digest[0]); for(int j =0;j < MD5_DIGEST_LENGTH ;j++) { printf("%x", md5Digest[j]); } printf("\n"); // qDebug(md5Digest); *stream << "APOP " << popUserName << " " << md5Digest << "\r\n"; // qDebug("%s", stream); status = Stat; } else #endif { timeStamp = ""; *stream << "USER " << popUserName << "\r\n"; status = Pass; } - break; + break; } case Pass: { *stream << "PASS " << popPassword << "\r\n"; - status = Stat; + status = Stat; + break; } //ask for number of messages case Stat: { if (response[0] == '+') { *stream << "STAT" << "\r\n"; - status = Mcnt; + status = Mcnt; } else errorHandling(ErrLoginFailed); break; } //get count of messages, eg "+OK 4 900.." -> int 4 case Mcnt: { if (response[0] == '+') { temp = response.replace(0, 4, ""); int x = temp.find(" ", 0); temp.truncate((uint) x); newMessages = temp.toInt(); messageCount = 1; status = List; if (synchronize) { //messages deleted from server, reload all - if (newMessages < lastSync) - lastSync = 0; + if (newMessages < lastSync) + lastSync = 0; messageCount = 1; } if (selected) { int *ptr = mailList->first(); if (ptr != 0) { newMessages++; //to ensure no early jumpout messageCount = *ptr; } else newMessages = 0; } } else errorHandling(ErrUnknownResponse); } //Read message number x, count upwards to messageCount case List: { if (messageCount <= newMessages) { *stream << "LIST " << messageCount << "\r\n"; status = Size; temp2.setNum(newMessages - lastSync); temp.setNum(messageCount - lastSync); if (!selected) { emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); } else { //completing a previously closed transfer @@ -252,49 +255,48 @@ void PopClient::incomingData() if (status != Quit) { //because of idiotic switch if (response[0] == '+') { message = ""; status = Read; if (!socket->canReadLine()) //sync. problems break; response = socket->readLine(); } else errorHandling(ErrUnknownResponse); } } //add all incoming lines to body. When size is reached, send //message, and go back to read new message case Read: { if (status != Quit) { //because of idiotic switch message += response; while ( socket->canReadLine() ) { response = socket->readLine(); message += response; } emit downloadedSize(message.length()); int x = message.find("\r\n.\r\n",-5); if (x == -1) { break; } else { //message reach entire size - if ( (selected)||(mailSize <= headerLimit)) //mail size limit is not used if late download is active { emit newMessage(message, messageCount-1, mailSize, TRUE); } else { //incomplete mail downloaded emit newMessage(message, messageCount-1, mailSize, FALSE); } if ((messageCount > newMessages)||(selected)) //last message ? { status = Quit; if (selected) { //grab next from queue newMessages--; status = Quit; } } else { *stream << "LIST " << messageCount << "\r\n"; status = Size; temp2.setNum(newMessages - lastSync); temp.setNum(messageCount - lastSync); emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); break; |