author | llornkcor <llornkcor> | 2003-05-24 02:07:21 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-05-24 02:07:21 (UTC) |
commit | 694ff39fe4f0f4164edd7a2a80abe6be3a4fa2f9 (patch) (side-by-side diff) | |
tree | 6c3f2a5837e32adf2755de4f90d3590d585f1a96 | |
parent | 62d2ddfb5cd77e2637cdf7fe16d76aac04975984 (diff) | |
download | opie-694ff39fe4f0f4164edd7a2a80abe6be3a4fa2f9.zip opie-694ff39fe4f0f4164edd7a2a80abe6be3a4fa2f9.tar.gz opie-694ff39fe4f0f4164edd7a2a80abe6be3a4fa2f9.tar.bz2 |
fix for a few crashes. one being stack overwrite. please test before I commit to 0_99
-rw-r--r-- | noncore/net/mailit/emailclient.cpp | 8 | ||||
-rw-r--r-- | noncore/net/mailit/emailhandler.cpp | 6 | ||||
-rw-r--r-- | noncore/net/mailit/mailitwindow.cpp | 2 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailclient.cpp | 8 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailhandler.cpp | 6 | ||||
-rw-r--r-- | noncore/unsupported/mailit/mailitwindow.cpp | 2 |
6 files changed, 20 insertions, 12 deletions
diff --git a/noncore/net/mailit/emailclient.cpp b/noncore/net/mailit/emailclient.cpp index 2102ba7..da1226c 100644 --- a/noncore/net/mailit/emailclient.cpp +++ b/noncore/net/mailit/emailclient.cpp @@ -408,132 +408,132 @@ void EmailClient::mailArrived(const Email &mail, bool fromDisk) //addressList->addContact(newMail.fromMail, newMail.from); } mailconf->writeEntry("downloaded", newMail.downloaded); QString stringMailId; stringMailId.setNum(thisMailId); //see if any attatchments needs to be stored for ( ePtr=newMail.files.first(); ePtr != 0; ePtr=newMail.files.next() ) { QString stringId; stringId.setNum(ePtr->id); int id = mailconf->readNumEntry("enclosureid_" + stringId); if (id != ePtr->id) { //new entry mailconf->writeEntry("enclosureid_" + stringId, ePtr->id); mailconf->writeEntry("name_" + stringId, ePtr->originalName); mailconf->writeEntry("contenttype_" + stringId, ePtr->contentType); mailconf->writeEntry("contentattribute_" + stringId, ePtr->contentAttribute); mailconf->writeEntry("saved_" + stringId, ePtr->saved); mailconf->writeEntry("installed_" + stringId, FALSE); ePtr->name = stringMailId + "_" + stringId; ePtr->path = getPath(TRUE); if (emailHandler->getEnclosure(ePtr)) { //file saved ePtr->saved = TRUE; mailconf->writeEntry("saved_" + stringId, ePtr->saved); mailconf->writeEntry("filename_" + stringId, ePtr->name); mailconf->writeEntry("path_" + stringId, ePtr->path); } else { ePtr->saved = FALSE; mailconf->writeEntry("saved_" + stringId, ePtr->saved); } } else { ePtr->saved = mailconf->readBoolEntry("saved_" + stringId); ePtr->installed = mailconf->readBoolEntry("installed_" + stringId); if (ePtr->saved) { ePtr->name = mailconf->readEntry("filename_" + stringId); ePtr->path = mailconf->readEntry("path_" + stringId); } } } bool found=false; if (!fromDisk) { Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); while ((item != NULL)&&(!found)) { mailPtr = item->getMail(); if (mailPtr->id == newMail.id) { item->setMail(newMail); emit mailUpdated(item->getMail()); found = true; } item = (EmailListItem *) item->nextSibling(); } } if ((!found)||(fromDisk)) { item = new EmailListItem(inboxView, newMail, TRUE); } - if (item->getMail()->files.count()>0) - { - item->setPixmap(0, Resource::loadPixmap("mailit/attach")); - } +// if (item->getMail()->files.count()>0) +// { +// item->setPixmap(0, Resource::loadPixmap("mailit/attach")); +// } /*if (!newMail.downloaded) mailDownloadList.sizeInsert(newMail.serverId, newMail.size);*/ mailboxView->setCurrentTab(0); } void EmailClient::allMailArrived(int count) { // not previewing means all mailtransfer has been done /*if (!previewingMail) {*/ if ( (allAccounts) && ( (currentAccount = accountList.next()) !=0 ) ) { emit newCaption("Mailit - " + currentAccount->accountName); getNewMail(); return; } else { allAccounts = FALSE; receiving = FALSE; getMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); selectAccountMenu->setEnabled(TRUE); status1Label->setText("Idle"); progressBar->reset(); return; } //} // all headers downloaded from server, start downloading remaining mails previewingMail = FALSE; status1Label->setText(currentAccount->accountName); progressBar->reset(); mailboxView->setCurrentTab(0); } void EmailClient::moveMailFront(Email *mailPtr) { if ( (receiving) && (mailPtr->fromAccountId == currentAccount->id) ) { mailDownloadList.moveFront(mailPtr->serverId, mailPtr->size); } } void EmailClient::smtpError(int code) { QString temp; if (code == ErrUnknownResponse) temp = "Unknown response from server"; if (code == QSocket::ErrHostNotFound) temp = "host not found"; if (code == QSocket::ErrConnectionRefused) temp = "connection refused"; if (code == QSocket::ErrSocketRead) temp = "socket packet error"; if (code != ErrCancel) { QMessageBox::warning(qApp->activeWindow(), "Sending error", temp, "OK\n"); } else { status2Label->setText("Aborted by user"); } diff --git a/noncore/net/mailit/emailhandler.cpp b/noncore/net/mailit/emailhandler.cpp index 59ccd90..39f693d 100644 --- a/noncore/net/mailit/emailhandler.cpp +++ b/noncore/net/mailit/emailhandler.cpp @@ -114,291 +114,295 @@ void EmailHandler::getMailHeaders() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); mailAccount.synchronize ? popClient->setSynchronize(mailAccount.lastServerMailCount): popClient->removeSynchronize(); headers = TRUE; popClient->headersOnly(headers, mailAccount.syncLimit); //less than requested syncLimit, download all qDebug("Initiating connection"); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::getMailByList(MailList *mailList) { if (mailList->count() == 0) { //should not occur though emit mailTransfered(0); return; } headers = FALSE; popClient->headersOnly(FALSE, 0); popClient->setAccount(mailAccount.popUserName,mailAccount.popPasswd); popClient->setSelectedMails(mailList); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::messageArrived(const QString &message, int id, uint size, bool complete) { Email mail; mail.rawMail = message; mail.serverId = id; mail.size = size; mail.downloaded = complete; emit mailArrived(mail, FALSE); } bool EmailHandler::parse(const QString &in, const QString &lineShift, Email *mail) { QString temp, boundary; int pos; QString delimiter, header, body, mimeHeader, mimeBody; QString content, contentType, contentAttribute, id, encoding; QString fileName, storedName; int enclosureId = 0; mail->rawMail = in; mail->received = TRUE; mail->files.setAutoDelete(TRUE); temp = lineShift + "." + lineShift; if (in.right(temp.length()) != temp) { mail->rawMail += temp; } delimiter = lineShift + lineShift; // "\n\n" or "\r\n\r\n" pos = in.find(delimiter, 0, FALSE); header = in.left(pos); body = in.right(in.length() - pos - delimiter.length()); if ((body.at(body.length()-2) == '.') && (body.at(body.length()-3) == '\n')) body.truncate(body.length()-2); - TextParser p(header, lineShift); + // TextParser p(header, lineShift); + TextParser * lp = new TextParser(header, lineShift); +#define p (*lp) if ((pos = p.find("FROM",':', 0, TRUE)) != -1) { pos++; if (p.separatorAt(pos) == ' ') { mail->from = p.getString(&pos, '<', false); mail->from = mail->from.stripWhiteSpace(); if ( (mail->from.length() > 2) && (mail->from[0] == '"') ) { mail->from = mail->from.left(mail->from.length() - 1); mail->from = mail->from.right(mail->from.length() - 1); } pos++; mail->fromMail = p.getString(&pos, '>', false); } else { if (p.separatorAt(pos) == '<') //No name.. nasty pos++; //pos++; mail->fromMail = p.getString(&pos, 'z', TRUE); if (mail->fromMail.at(mail->fromMail.length()-1) == '>') mail->fromMail.truncate(mail->fromMail.length() - 1); mail->from=mail->fromMail; } } pos=0; //Search for To: after the FROM: attribute to prevent hitting the Delivered-To: while((pos = p.find("TO",':', pos+1, TRUE))!=-1) { QString rec; if (p.separatorAt(pos-1)!='-') //The - separator means that this is a Delivered-To: or Reply-To: { pos++; mail->recipients.append(p.getString(&pos, '\r', TRUE)); } } // //if (pos==-1) mail->recipients.append (tr("undisclosed recipients") ); if ((pos = p.find("CC",':', 0, TRUE)) != -1) { pos++; mail->carbonCopies.append (p.getString(&pos, 'z', TRUE) ); } if ((pos = p.find("SUBJECT",':', 0, TRUE)) != -1) { pos++; mail->subject = p.getString(&pos, 'z', TRUE); } if ((pos = p.find("DATE",':', 0, TRUE)) != -1) { pos++; mail->date = p.getString(&pos, 'z', TRUE); } if ((pos = p.find("MESSAGE",'-', 0, TRUE)) != -1) { pos++; if ( (p.wordAt(pos).upper() == "ID") && (p.separatorAt(pos) == ':') ) { id = p.getString(&pos, 'z', TRUE); mail->id = id; } } pos = 0; while ( ((pos = p.find("MIME",'-', pos, TRUE)) != -1) ) { pos++; if ( (p.wordAt(pos).upper() == "VERSION") && (p.separatorAt(pos) == ':') ) { pos++; if (p.getString(&pos, 'z', true) == "1.0") { mail->mimeType = 1; } } } if (mail->mimeType == 1) { boundary = ""; if ((pos = p.find("BOUNDARY", '=', 0, TRUE)) != -1) { pos++; boundary = p.getString(&pos, 'z', true); if (boundary[0] == '"') { boundary = boundary.left(boundary.length() - 1); //strip " boundary = boundary.right(boundary.length() - 1); //strip " } boundary = "--" + boundary; //create boundary field } if (boundary == "") { //fooled by Mime-Version mail->body = body; mail->bodyPlain = body; + delete lp; return mail; } while (body.length() > 0) { pos = body.find(boundary, 0, FALSE); pos = body.find(delimiter, pos, FALSE); mimeHeader = body.left(pos); mimeBody = body.right(body.length() - pos - delimiter.length()); TextParser bp(mimeHeader, lineShift); contentType = ""; contentAttribute = ""; fileName = ""; if ((pos = bp.find("CONTENT",'-', 0, TRUE)) != -1) { pos++; if ( (bp.wordAt(pos).upper() == "TYPE") && (bp.separatorAt(pos) == ':') ) { contentType = bp.nextWord().upper(); if (bp.nextSeparator() == '/') contentAttribute = bp.nextWord().upper(); content = contentType + "/" + contentAttribute; } if ((pos = bp.find("ENCODING",':', 0, TRUE)) != -1) { pos++; encoding = bp.getString(&pos, 'z', TRUE); } if ( (pos = bp.find("FILENAME",'=', 0, TRUE)) != -1) { pos++; fileName = bp.getString(&pos, 'z', TRUE); fileName = fileName.right(fileName.length() - 1); fileName = fileName.left(fileName.length() - 1); } } pos = mimeBody.find(boundary, 0, FALSE); if (pos == -1) //should not occur, malformed mail pos = mimeBody.length(); body = mimeBody.right(mimeBody.length() - pos); mimeBody = mimeBody.left(pos); if (fileName != "") { //attatchments of some type, audio, image etc. Enclosure e; e.id = enclosureId; e.originalName = fileName; e.contentType = contentType; e.contentAttribute = contentAttribute; e.encoding = encoding; e.body = mimeBody; e.saved = FALSE; mail->addEnclosure(&e); enclosureId++; } else if (contentType == "TEXT") { if (contentAttribute == "PLAIN") { mail->body = mimeBody; mail->bodyPlain = mimeBody; } if (contentAttribute == "HTML") { mail->body = mimeBody; } } } } else { mail->bodyPlain = body; mail->body = body; } + delete lp; return TRUE; } bool EmailHandler::getEnclosure(Enclosure *ePtr) { QFile f(ePtr->path + ePtr->name); char src[4]; char *destPtr; QByteArray buffer; uint bufCount, pos, decodedCount, size, x; if (! f.open(IO_WriteOnly) ) { qWarning("could not save: " + ePtr->path + ePtr->name); return FALSE; } if (ePtr->encoding.upper() == "BASE64") { size = (ePtr->body.length() * 3 / 4); //approximate size (always above) buffer.resize(size); bufCount = 0; pos = 0; destPtr = buffer.data(); while (pos < ePtr->body.length()) { decodedCount = 4; x = 0; while ( (x < 4) && (pos < ePtr->body.length()) ) { src[x] = ePtr->body[pos].latin1(); pos++; if (src[x] == '\r' || src[x] == '\n' || src[x] == ' ') x--; x++; } if (x > 1) { decodedCount = parse64base(src, destPtr); destPtr += decodedCount; bufCount += decodedCount; } } buffer.resize(bufCount); //set correct length of file f.writeBlock(buffer); } else { QTextStream t(&f); t << ePtr->body; } return TRUE; } int EmailHandler::parse64base(char *src, char *bufOut) { char c, z; char li[4]; int processed; //conversion table withouth table... for (int x = 0; x < 4; x++) { c = src[x]; if ( (int) c >= 'A' && (int) c <= 'Z') li[x] = (int) c - (int) 'A'; if ( (int) c >= 'a' && (int) c <= 'z') li[x] = (int) c - (int) 'a' + 26; if ( (int) c >= '0' && (int) c <= '9') diff --git a/noncore/net/mailit/mailitwindow.cpp b/noncore/net/mailit/mailitwindow.cpp index a111241..f945a0f 100644 --- a/noncore/net/mailit/mailitwindow.cpp +++ b/noncore/net/mailit/mailitwindow.cpp @@ -79,90 +79,90 @@ void MailItWindow::closeEvent(QCloseEvent *e) showEmailClient(); } } void MailItWindow::compose() { viewingMail = FALSE; emailClient->hide(); readMail->hide(); views->raiseWidget(writeMail); writeMail->setAddressList(emailClient->getAdrListRef()); writeMail->newMail(); setCaption( tr( "Write mail" ) ); } void MailItWindow::composeReply(Email &mail, bool& replyAll) { compose(); writeMail->reply(mail,replyAll) ; } void MailItWindow::composeForward(Email &mail) { compose(); writeMail->forward(mail) ; } void MailItWindow::showEmailClient() { viewingMail = FALSE; writeMail->hide(); readMail->hide(); views->raiseWidget(emailClient); setCaption( tr(currentCaption) ); } void MailItWindow::viewMail(QListView *view, Email *mail) { viewingMail = TRUE; emailClient->hide(); int result=0; if ((mail->received)&&(!mail->downloaded)) { QMessageBox mb( tr("Mail not downloaded"), tr("The mail you have clicked \n" "has not been downloaded yet.\n " "Would you like to do it now ?"), QMessageBox::Information, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape,0 ); result=mb.exec(); if (result==QMessageBox::Yes) { emailClient->download(mail); } } readMail->update(view, mail); views->raiseWidget(readMail); - setCaption( tr( "Examine mail" ) ); + setCaption( tr( "Read Mail" ) ); } void MailItWindow::updateMailView(Email *mail) { if (viewingMail) { readMail->mailUpdated(mail); } } void MailItWindow::updateCaption(const QString &newCaption) { currentCaption = newCaption; setCaption(tr(currentCaption)); } void MailItWindow::setDocument(const QString &_address) { // strip leading 'mailto:' QString address = _address; if (address.startsWith("mailto:")) address = address.mid(6); compose(); writeMail->setRecipient(address); } diff --git a/noncore/unsupported/mailit/emailclient.cpp b/noncore/unsupported/mailit/emailclient.cpp index 2102ba7..da1226c 100644 --- a/noncore/unsupported/mailit/emailclient.cpp +++ b/noncore/unsupported/mailit/emailclient.cpp @@ -408,132 +408,132 @@ void EmailClient::mailArrived(const Email &mail, bool fromDisk) //addressList->addContact(newMail.fromMail, newMail.from); } mailconf->writeEntry("downloaded", newMail.downloaded); QString stringMailId; stringMailId.setNum(thisMailId); //see if any attatchments needs to be stored for ( ePtr=newMail.files.first(); ePtr != 0; ePtr=newMail.files.next() ) { QString stringId; stringId.setNum(ePtr->id); int id = mailconf->readNumEntry("enclosureid_" + stringId); if (id != ePtr->id) { //new entry mailconf->writeEntry("enclosureid_" + stringId, ePtr->id); mailconf->writeEntry("name_" + stringId, ePtr->originalName); mailconf->writeEntry("contenttype_" + stringId, ePtr->contentType); mailconf->writeEntry("contentattribute_" + stringId, ePtr->contentAttribute); mailconf->writeEntry("saved_" + stringId, ePtr->saved); mailconf->writeEntry("installed_" + stringId, FALSE); ePtr->name = stringMailId + "_" + stringId; ePtr->path = getPath(TRUE); if (emailHandler->getEnclosure(ePtr)) { //file saved ePtr->saved = TRUE; mailconf->writeEntry("saved_" + stringId, ePtr->saved); mailconf->writeEntry("filename_" + stringId, ePtr->name); mailconf->writeEntry("path_" + stringId, ePtr->path); } else { ePtr->saved = FALSE; mailconf->writeEntry("saved_" + stringId, ePtr->saved); } } else { ePtr->saved = mailconf->readBoolEntry("saved_" + stringId); ePtr->installed = mailconf->readBoolEntry("installed_" + stringId); if (ePtr->saved) { ePtr->name = mailconf->readEntry("filename_" + stringId); ePtr->path = mailconf->readEntry("path_" + stringId); } } } bool found=false; if (!fromDisk) { Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); while ((item != NULL)&&(!found)) { mailPtr = item->getMail(); if (mailPtr->id == newMail.id) { item->setMail(newMail); emit mailUpdated(item->getMail()); found = true; } item = (EmailListItem *) item->nextSibling(); } } if ((!found)||(fromDisk)) { item = new EmailListItem(inboxView, newMail, TRUE); } - if (item->getMail()->files.count()>0) - { - item->setPixmap(0, Resource::loadPixmap("mailit/attach")); - } +// if (item->getMail()->files.count()>0) +// { +// item->setPixmap(0, Resource::loadPixmap("mailit/attach")); +// } /*if (!newMail.downloaded) mailDownloadList.sizeInsert(newMail.serverId, newMail.size);*/ mailboxView->setCurrentTab(0); } void EmailClient::allMailArrived(int count) { // not previewing means all mailtransfer has been done /*if (!previewingMail) {*/ if ( (allAccounts) && ( (currentAccount = accountList.next()) !=0 ) ) { emit newCaption("Mailit - " + currentAccount->accountName); getNewMail(); return; } else { allAccounts = FALSE; receiving = FALSE; getMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); selectAccountMenu->setEnabled(TRUE); status1Label->setText("Idle"); progressBar->reset(); return; } //} // all headers downloaded from server, start downloading remaining mails previewingMail = FALSE; status1Label->setText(currentAccount->accountName); progressBar->reset(); mailboxView->setCurrentTab(0); } void EmailClient::moveMailFront(Email *mailPtr) { if ( (receiving) && (mailPtr->fromAccountId == currentAccount->id) ) { mailDownloadList.moveFront(mailPtr->serverId, mailPtr->size); } } void EmailClient::smtpError(int code) { QString temp; if (code == ErrUnknownResponse) temp = "Unknown response from server"; if (code == QSocket::ErrHostNotFound) temp = "host not found"; if (code == QSocket::ErrConnectionRefused) temp = "connection refused"; if (code == QSocket::ErrSocketRead) temp = "socket packet error"; if (code != ErrCancel) { QMessageBox::warning(qApp->activeWindow(), "Sending error", temp, "OK\n"); } else { status2Label->setText("Aborted by user"); } diff --git a/noncore/unsupported/mailit/emailhandler.cpp b/noncore/unsupported/mailit/emailhandler.cpp index 59ccd90..39f693d 100644 --- a/noncore/unsupported/mailit/emailhandler.cpp +++ b/noncore/unsupported/mailit/emailhandler.cpp @@ -114,291 +114,295 @@ void EmailHandler::getMailHeaders() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); mailAccount.synchronize ? popClient->setSynchronize(mailAccount.lastServerMailCount): popClient->removeSynchronize(); headers = TRUE; popClient->headersOnly(headers, mailAccount.syncLimit); //less than requested syncLimit, download all qDebug("Initiating connection"); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::getMailByList(MailList *mailList) { if (mailList->count() == 0) { //should not occur though emit mailTransfered(0); return; } headers = FALSE; popClient->headersOnly(FALSE, 0); popClient->setAccount(mailAccount.popUserName,mailAccount.popPasswd); popClient->setSelectedMails(mailList); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::messageArrived(const QString &message, int id, uint size, bool complete) { Email mail; mail.rawMail = message; mail.serverId = id; mail.size = size; mail.downloaded = complete; emit mailArrived(mail, FALSE); } bool EmailHandler::parse(const QString &in, const QString &lineShift, Email *mail) { QString temp, boundary; int pos; QString delimiter, header, body, mimeHeader, mimeBody; QString content, contentType, contentAttribute, id, encoding; QString fileName, storedName; int enclosureId = 0; mail->rawMail = in; mail->received = TRUE; mail->files.setAutoDelete(TRUE); temp = lineShift + "." + lineShift; if (in.right(temp.length()) != temp) { mail->rawMail += temp; } delimiter = lineShift + lineShift; // "\n\n" or "\r\n\r\n" pos = in.find(delimiter, 0, FALSE); header = in.left(pos); body = in.right(in.length() - pos - delimiter.length()); if ((body.at(body.length()-2) == '.') && (body.at(body.length()-3) == '\n')) body.truncate(body.length()-2); - TextParser p(header, lineShift); + // TextParser p(header, lineShift); + TextParser * lp = new TextParser(header, lineShift); +#define p (*lp) if ((pos = p.find("FROM",':', 0, TRUE)) != -1) { pos++; if (p.separatorAt(pos) == ' ') { mail->from = p.getString(&pos, '<', false); mail->from = mail->from.stripWhiteSpace(); if ( (mail->from.length() > 2) && (mail->from[0] == '"') ) { mail->from = mail->from.left(mail->from.length() - 1); mail->from = mail->from.right(mail->from.length() - 1); } pos++; mail->fromMail = p.getString(&pos, '>', false); } else { if (p.separatorAt(pos) == '<') //No name.. nasty pos++; //pos++; mail->fromMail = p.getString(&pos, 'z', TRUE); if (mail->fromMail.at(mail->fromMail.length()-1) == '>') mail->fromMail.truncate(mail->fromMail.length() - 1); mail->from=mail->fromMail; } } pos=0; //Search for To: after the FROM: attribute to prevent hitting the Delivered-To: while((pos = p.find("TO",':', pos+1, TRUE))!=-1) { QString rec; if (p.separatorAt(pos-1)!='-') //The - separator means that this is a Delivered-To: or Reply-To: { pos++; mail->recipients.append(p.getString(&pos, '\r', TRUE)); } } // //if (pos==-1) mail->recipients.append (tr("undisclosed recipients") ); if ((pos = p.find("CC",':', 0, TRUE)) != -1) { pos++; mail->carbonCopies.append (p.getString(&pos, 'z', TRUE) ); } if ((pos = p.find("SUBJECT",':', 0, TRUE)) != -1) { pos++; mail->subject = p.getString(&pos, 'z', TRUE); } if ((pos = p.find("DATE",':', 0, TRUE)) != -1) { pos++; mail->date = p.getString(&pos, 'z', TRUE); } if ((pos = p.find("MESSAGE",'-', 0, TRUE)) != -1) { pos++; if ( (p.wordAt(pos).upper() == "ID") && (p.separatorAt(pos) == ':') ) { id = p.getString(&pos, 'z', TRUE); mail->id = id; } } pos = 0; while ( ((pos = p.find("MIME",'-', pos, TRUE)) != -1) ) { pos++; if ( (p.wordAt(pos).upper() == "VERSION") && (p.separatorAt(pos) == ':') ) { pos++; if (p.getString(&pos, 'z', true) == "1.0") { mail->mimeType = 1; } } } if (mail->mimeType == 1) { boundary = ""; if ((pos = p.find("BOUNDARY", '=', 0, TRUE)) != -1) { pos++; boundary = p.getString(&pos, 'z', true); if (boundary[0] == '"') { boundary = boundary.left(boundary.length() - 1); //strip " boundary = boundary.right(boundary.length() - 1); //strip " } boundary = "--" + boundary; //create boundary field } if (boundary == "") { //fooled by Mime-Version mail->body = body; mail->bodyPlain = body; + delete lp; return mail; } while (body.length() > 0) { pos = body.find(boundary, 0, FALSE); pos = body.find(delimiter, pos, FALSE); mimeHeader = body.left(pos); mimeBody = body.right(body.length() - pos - delimiter.length()); TextParser bp(mimeHeader, lineShift); contentType = ""; contentAttribute = ""; fileName = ""; if ((pos = bp.find("CONTENT",'-', 0, TRUE)) != -1) { pos++; if ( (bp.wordAt(pos).upper() == "TYPE") && (bp.separatorAt(pos) == ':') ) { contentType = bp.nextWord().upper(); if (bp.nextSeparator() == '/') contentAttribute = bp.nextWord().upper(); content = contentType + "/" + contentAttribute; } if ((pos = bp.find("ENCODING",':', 0, TRUE)) != -1) { pos++; encoding = bp.getString(&pos, 'z', TRUE); } if ( (pos = bp.find("FILENAME",'=', 0, TRUE)) != -1) { pos++; fileName = bp.getString(&pos, 'z', TRUE); fileName = fileName.right(fileName.length() - 1); fileName = fileName.left(fileName.length() - 1); } } pos = mimeBody.find(boundary, 0, FALSE); if (pos == -1) //should not occur, malformed mail pos = mimeBody.length(); body = mimeBody.right(mimeBody.length() - pos); mimeBody = mimeBody.left(pos); if (fileName != "") { //attatchments of some type, audio, image etc. Enclosure e; e.id = enclosureId; e.originalName = fileName; e.contentType = contentType; e.contentAttribute = contentAttribute; e.encoding = encoding; e.body = mimeBody; e.saved = FALSE; mail->addEnclosure(&e); enclosureId++; } else if (contentType == "TEXT") { if (contentAttribute == "PLAIN") { mail->body = mimeBody; mail->bodyPlain = mimeBody; } if (contentAttribute == "HTML") { mail->body = mimeBody; } } } } else { mail->bodyPlain = body; mail->body = body; } + delete lp; return TRUE; } bool EmailHandler::getEnclosure(Enclosure *ePtr) { QFile f(ePtr->path + ePtr->name); char src[4]; char *destPtr; QByteArray buffer; uint bufCount, pos, decodedCount, size, x; if (! f.open(IO_WriteOnly) ) { qWarning("could not save: " + ePtr->path + ePtr->name); return FALSE; } if (ePtr->encoding.upper() == "BASE64") { size = (ePtr->body.length() * 3 / 4); //approximate size (always above) buffer.resize(size); bufCount = 0; pos = 0; destPtr = buffer.data(); while (pos < ePtr->body.length()) { decodedCount = 4; x = 0; while ( (x < 4) && (pos < ePtr->body.length()) ) { src[x] = ePtr->body[pos].latin1(); pos++; if (src[x] == '\r' || src[x] == '\n' || src[x] == ' ') x--; x++; } if (x > 1) { decodedCount = parse64base(src, destPtr); destPtr += decodedCount; bufCount += decodedCount; } } buffer.resize(bufCount); //set correct length of file f.writeBlock(buffer); } else { QTextStream t(&f); t << ePtr->body; } return TRUE; } int EmailHandler::parse64base(char *src, char *bufOut) { char c, z; char li[4]; int processed; //conversion table withouth table... for (int x = 0; x < 4; x++) { c = src[x]; if ( (int) c >= 'A' && (int) c <= 'Z') li[x] = (int) c - (int) 'A'; if ( (int) c >= 'a' && (int) c <= 'z') li[x] = (int) c - (int) 'a' + 26; if ( (int) c >= '0' && (int) c <= '9') diff --git a/noncore/unsupported/mailit/mailitwindow.cpp b/noncore/unsupported/mailit/mailitwindow.cpp index a111241..f945a0f 100644 --- a/noncore/unsupported/mailit/mailitwindow.cpp +++ b/noncore/unsupported/mailit/mailitwindow.cpp @@ -79,90 +79,90 @@ void MailItWindow::closeEvent(QCloseEvent *e) showEmailClient(); } } void MailItWindow::compose() { viewingMail = FALSE; emailClient->hide(); readMail->hide(); views->raiseWidget(writeMail); writeMail->setAddressList(emailClient->getAdrListRef()); writeMail->newMail(); setCaption( tr( "Write mail" ) ); } void MailItWindow::composeReply(Email &mail, bool& replyAll) { compose(); writeMail->reply(mail,replyAll) ; } void MailItWindow::composeForward(Email &mail) { compose(); writeMail->forward(mail) ; } void MailItWindow::showEmailClient() { viewingMail = FALSE; writeMail->hide(); readMail->hide(); views->raiseWidget(emailClient); setCaption( tr(currentCaption) ); } void MailItWindow::viewMail(QListView *view, Email *mail) { viewingMail = TRUE; emailClient->hide(); int result=0; if ((mail->received)&&(!mail->downloaded)) { QMessageBox mb( tr("Mail not downloaded"), tr("The mail you have clicked \n" "has not been downloaded yet.\n " "Would you like to do it now ?"), QMessageBox::Information, QMessageBox::Yes | QMessageBox::Default, QMessageBox::No | QMessageBox::Escape,0 ); result=mb.exec(); if (result==QMessageBox::Yes) { emailClient->download(mail); } } readMail->update(view, mail); views->raiseWidget(readMail); - setCaption( tr( "Examine mail" ) ); + setCaption( tr( "Read Mail" ) ); } void MailItWindow::updateMailView(Email *mail) { if (viewingMail) { readMail->mailUpdated(mail); } } void MailItWindow::updateCaption(const QString &newCaption) { currentCaption = newCaption; setCaption(tr(currentCaption)); } void MailItWindow::setDocument(const QString &_address) { // strip leading 'mailto:' QString address = _address; if (address.startsWith("mailto:")) address = address.mid(6); compose(); writeMail->setRecipient(address); } |