void SerialReceiver::process(int serialByte) { if (serialByte > 0){ switch (state) { case SR_STATE_IDLE: processNewMsg(serialByte); break; case SR_STATE_RECEIVING: processCurMsg(serialByte); break; case SR_STATE_MESSAGE: break; default: break; } } }
//----------------------------------------------------------------------------- bool KMAcctPop::doProcessNewMail(KMIOStatus *wid) { DwPopClient client; QString passwd; QString response, status; int num, size; // number of all msgs / size of all msgs int id, i; // id of message to read int tmout; int dummy; char dummyStr[32]; //int replyCode; // ReplyCode need from User & Passwd call. KMMessage* msg; gotMsgs = FALSE; bool doFetchMsg; bool addedOk; //Flag if msg was delivered succesfully wid->prepareTransmission(host(), KMIOStatus::RETRIEVE); // is everything specified ? app->processEvents(); if (mHost.isEmpty() || mPort<=0) { warning(i18n("Please specify Host, Port and\n" "destination folder in the settings\n" "and try again.")); return FALSE; } client.SetReceiveTimeout(20); // Handle connect, user, and password. if (!authenticate(client)) return FALSE; if (client.Stat() != '+') return popError("STAT", client); response = client.SingleLineResponse().c_str(); sscanf(response.data(), "%3s %d %d", dummyStr, &num, &size); //#warning "*** If client.Last() cannot be found then install the latest kdesupport" if (!mRetrieveAll && client.Last() == '+') { response = client.SingleLineResponse().c_str(); sscanf(response.data(), "%3s %d", dummyStr, &id); id++; } else id = 1; // workaround but still is no good. If msgs are too big in size // we will get a timeout. client.SetReceiveTimeout(40); addedOk = true; // do while there are mesages to take and last msg wass added succesfully while (id <= num && addedOk) { client.SetReceiveTimeout(40); if(wid->abortRequested()) { client.Quit(); return gotMsgs; } wid->updateProgressBar(id, num); app->processEvents(); if (client.List(id) != '+') return popError("LIST", client); response = client.SingleLineResponse().c_str(); sscanf(response.data(), "%3s %d %d", dummyStr, &dummy, &size); doFetchMsg = TRUE; if (size > 4500 && !mRetrieveAll) { // If the message is large it is cheaper to first load // the header to check the status of the message. // We will have to load the entire message with the RETR // command below, so we will not fetch the header for // small messages. if (client.Top(id,1) != '+') return popError("TOP", client); response = client.MultiLineResponse().c_str(); i = response.find("\nStatus:"); if (i<0) i = response.find("\rStatus:"); if (i>=0) { status = response.mid(i+8,32).stripWhiteSpace(); if (strnicmp(status,"RO",2)==0 || strnicmp(status,"OR",2)==0) { doFetchMsg=FALSE; debug("message %d is old -- no need to download it", id); } } } if (doFetchMsg) { // set timeout depending on size tmout = size >> 8; if (tmout < 30) tmout = 30; client.SetReceiveTimeout(tmout); if (client.Retr(id) != '+') return popError("RETR", client); response = client.MultiLineResponse().c_str(); msg = new KMMessage; msg->fromString(response,TRUE); if (mRetrieveAll || msg->status()!=KMMsgStatusOld) addedOk = processNewMsg(msg); //added ok? Error displayed if not. else delete msg; } // If we should delete from server _and_ we added ok then delete it if(!mLeaveOnServer && addedOk) { if(client.Dele(id) != '+') return popError("DELE",client); else std::cout << client.SingleLineResponse().c_str(); } gotMsgs = TRUE; id++; } wid->transmissionCompleted(); client.Quit(); return gotMsgs; }