-rw-r--r-- | noncore/net/mailit/emailclient.cpp | 65 | ||||
-rw-r--r-- | noncore/net/mailit/emailclient.h | 3 | ||||
-rw-r--r-- | noncore/net/mailit/emailhandler.cpp | 14 | ||||
-rw-r--r-- | noncore/net/mailit/emailhandler.h | 1 | ||||
-rw-r--r-- | noncore/net/mailit/mailitwindow.cpp | 24 | ||||
-rw-r--r-- | noncore/net/mailit/popclient.cpp | 72 | ||||
-rw-r--r-- | noncore/net/mailit/writemail.cpp | 26 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailclient.cpp | 65 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailclient.h | 3 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailhandler.cpp | 14 | ||||
-rw-r--r-- | noncore/unsupported/mailit/emailhandler.h | 1 | ||||
-rw-r--r-- | noncore/unsupported/mailit/mailitwindow.cpp | 24 | ||||
-rw-r--r-- | noncore/unsupported/mailit/popclient.cpp | 72 | ||||
-rw-r--r-- | noncore/unsupported/mailit/writemail.cpp | 26 |
14 files changed, 184 insertions, 226 deletions
diff --git a/noncore/net/mailit/emailclient.cpp b/noncore/net/mailit/emailclient.cpp index 23059cf..dff1888 100644 --- a/noncore/net/mailit/emailclient.cpp +++ b/noncore/net/mailit/emailclient.cpp @@ -353,25 +353,25 @@ void EmailClient::mailArrived(const Email &mail, bool fromDisk) { newMail.downloaded = mailconf->readBoolEntry("downloaded"); newMail.size = mailconf->readNumEntry("size"); newMail.serverId = mailconf->readNumEntry("serverid"); newMail.fromAccountId = mailconf->readNumEntry("fromaccountid"); } else { //mail arrived from server newMail.serverId = mail.serverId; newMail.size = mail.size; newMail.downloaded = mail.downloaded; - newMail.fromAccountId = currentAccount->id; + newMail.fromAccountId = emailHandler->getAccount()->id; mailconf->writeEntry("fromaccountid", newMail.fromAccountId); } //add if read or not newMail.read = mailconf->readBoolEntry("mailread"); //check if new mail if ( (thisMailId = mailconf->readNumEntry("internalmailid", -1)) == -1) { thisMailId = mailIdCount; mailIdCount++; //set server count, so that if the user aborts, the new @@ -471,29 +471,29 @@ void EmailClient::allMailArrived(int count) status1Label->setText("Idle"); progressBar->reset(); return; } //} // all headers downloaded from server, start downloading remaining mails previewingMail = FALSE; status1Label->setText(currentAccount->accountName); progressBar->reset(); - //emailHandler->getMailByList(&mailDownloadList); 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) @@ -655,25 +655,25 @@ QString EmailClient::getPath(bool enclosurePath) if ( !dir.exists() ) dir.mkdir( dir.path() ); return (dir.path() + "/"); } return (dir.path() + "/"); } void EmailClient::readSettings() { - int y,acc_count, accountPos=0; + int y,acc_count; mailconf->setGroup("mailitglobal"); acc_count=mailconf->readNumEntry("Accounts",0); for (int accountPos = 0;accountPos<acc_count ; accountPos++) { mailconf->setGroup("Account_"+QString::number(accountPos+1)); //Account numbers start at 1 ... account.accountName = mailconf->readEntry("AccName",""); account.name = mailconf->readEntry("UserName",""); account.emailAddress = mailconf->readEntry("Email",""); account.popUserName = mailconf->readEntry("POPUser",""); account.popPasswd = mailconf->readEntryCrypt("POPPassword",""); @@ -882,31 +882,39 @@ void EmailClient::setDownloadedSize(int size) int total = progressBar->totalSteps(); if (size < total) { progressBar->setProgress(size); } else { progressBar->setProgress(total); } } void EmailClient::deleteItem() { bool inbox=mailboxView->currentTab()==0; + QListView* box; EmailListItem* eli; + int pos; + + inbox ? box=inboxView : box=outboxView; - inbox ? eli=(EmailListItem*)inboxView->selectedItem():eli=(EmailListItem*)outboxView->selectedItem(); + eli=(EmailListItem*)box->selectedItem(); if (eli) - deleteMail(eli,(bool&)inbox); + { + box->setSelected(eli->itemBelow(),true); //select the previous item + + deleteMail(eli,(bool&)inbox); //remove mail entry + } } void EmailClient::inboxItemPressed() { // timerID=startTimer(500); } void EmailClient::inboxItemReleased() { // killTimer(timerID); } @@ -930,52 +938,31 @@ void EmailClient::timerEvent(QTimerEvent *e) */ } Email* EmailClient::getCurrentMail() { EmailListItem *eli=(EmailListItem* ) (inboxView->selectedItem()); if (eli!=NULL) return eli->getMail(); else return NULL; } -/* -void EmailClient::reply() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) +void EmailClient::download(Email* mail) { - emit reply(*mail); - } -} + MailAccount* acc=0; -void EmailClient::replyAll() -{ - Email* mail=getCurrentMail(); + tempMailDownloadList.clear(); + tempMailDownloadList.sizeInsert(mail->serverId, mail->size); + if (accountList.count()>0) + qDebug("Accounts present"); - if (mail!=NULL) + acc=accountList.at(mail->fromAccountId-1); + if (acc) { - emit replyAll(*mail); - } + emailHandler->setAccount(*acc); + emailHandler->getMailByList(&tempMailDownloadList); } - -void EmailClient::forward() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) - { - emit reply(*mail); - } -} - -void EmailClient::remove() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) - { - emit remove(*mail); + else + QMessageBox::warning(qApp->activeWindow(), + tr("No account associated"), tr("There is no active account \nassociated to this mail\n it can not be downloaded"), "Abort\n"); } -}*/ diff --git a/noncore/net/mailit/emailclient.h b/noncore/net/mailit/emailclient.h index 0890dcf..549683b 100644 --- a/noncore/net/mailit/emailclient.h +++ b/noncore/net/mailit/emailclient.h @@ -61,24 +61,25 @@ private: MailAccount *ac; }; //class EmailClient : public EmailClientBase class EmailClient : public QMainWindow { Q_OBJECT public: EmailClient( QWidget* parent, const char* name, WFlags fl = 0 ); ~EmailClient(); AddressList* getAdrListRef(); + void download(Email*); protected: void timerEvent(QTimerEvent*); signals: void composeRequested(); void viewEmail(QListView *, Email *); void mailUpdated(Email *); void newCaption(const QString &); void replyRequested(Email&, bool&); void forwardRequested(Email&); void removeItem(EmailListItem*, bool&); @@ -130,24 +131,26 @@ private: int timerID; Config *mailconf; int newAccountId, idCount, mailIdCount; int accountIdCount; AccountList accountList; AddressList *addressList; EditAccount *editAccountView; EmailListItem *item; EmailHandler *emailHandler; QList<Email> quedMessages; MailList mailDownloadList; + MailList tempMailDownloadList; + bool sending, receiving, previewingMail, allAccounts; QString lineShift; MailAccount account, *currentAccount; QToolBar *bar; QProgressBar *progressBar; QStatusBar *statusBar; QLabel *status1Label, *status2Label; QToolButton *getMailButton; QAction *sendMailButton; QAction *composeButton; QAction *cancelButton; diff --git a/noncore/net/mailit/emailhandler.cpp b/noncore/net/mailit/emailhandler.cpp index b180051..fbbada7 100644 --- a/noncore/net/mailit/emailhandler.cpp +++ b/noncore/net/mailit/emailhandler.cpp @@ -118,36 +118,38 @@ void EmailHandler::getMailHeaders() 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->newConnection(mailAccount.popServer, 110); + + 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 incomplete) +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 = incomplete; + mail.downloaded = complete; emit mailArrived(mail, FALSE); } bool EmailHandler::parse(QString in, 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; @@ -173,31 +175,29 @@ bool EmailHandler::parse(QString in, QString lineShift, Email *mail) TextParser p(header, lineShift); 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) == '<') - || (p.separatorAt(pos) == ' ')) //No name.. nasty - pos++; + 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) { diff --git a/noncore/net/mailit/emailhandler.h b/noncore/net/mailit/emailhandler.h index e47fd9a..b645868 100644 --- a/noncore/net/mailit/emailhandler.h +++ b/noncore/net/mailit/emailhandler.h @@ -102,24 +102,25 @@ struct MailAccount const int ErrUnknownResponse = 1001; const int ErrLoginFailed = 1002; const int ErrCancel = 1003; class EmailHandler : public QObject { Q_OBJECT public: EmailHandler(); void setAccount(MailAccount account); + MailAccount* getAccount(){return &mailAccount;} void sendMail(QList<Email> *mailList); void getMail(); void getMailHeaders(); void getMailByList(MailList *mailList); bool parse(QString in, QString lineShift, Email *mail); bool getEnclosure(Enclosure *ePtr); int parse64base(char *src, char *dest); int encodeMime(Email *mail); int encodeFile(QString fileName, QString *toBody); void encode64base(char *src, QString *dest, int len); void cancel(); diff --git a/noncore/net/mailit/mailitwindow.cpp b/noncore/net/mailit/mailitwindow.cpp index 7181adf..ffee67e 100644 --- a/noncore/net/mailit/mailitwindow.cpp +++ b/noncore/net/mailit/mailitwindow.cpp @@ -9,24 +9,25 @@ ** 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 <qwhatsthis.h> +#include <qmessagebox.h> #include "mailitwindow.h" MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) : QMainWindow(parent, name, WStyle_ContextHelp) { currentCaption = "Mailit"; setCaption(tr(currentCaption)); views = new QWidgetStack(this); setCentralWidget(views); QWhatsThis::add(views,tr("Central view area")); emailClient = new EmailClient(views, "client"); writeMail = new WriteMail(views, "writing"); @@ -52,47 +53,47 @@ MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) SLOT(composeReply(Email &, bool&)) ); connect(readMail, SIGNAL(forwardRequested(Email &)), this, SLOT(composeForward(Email &)) ); connect(readMail, SIGNAL(removeItem(EmailListItem *, bool &)), emailClient, SLOT(deleteMail(EmailListItem *, bool &)) ); connect(readMail, SIGNAL(viewingMail(Email *)), emailClient, SLOT(moveMailFront(Email *)) ); connect(emailClient, SIGNAL(newCaption(const QString &)), this, SLOT(updateCaption(const QString &)) ); viewingMail = FALSE; - } MailItWindow::~MailItWindow() { } void MailItWindow::closeEvent(QCloseEvent *e) { if (views->visibleWidget() == emailClient) { e->accept(); } else { 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(); @@ -104,24 +105,45 @@ 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" ) ); } void MailItWindow::updateMailView(Email *mail) { if (viewingMail) { readMail->mailUpdated(mail); } } diff --git a/noncore/net/mailit/popclient.cpp b/noncore/net/mailit/popclient.cpp index 67306be..6105d09 100644 --- a/noncore/net/mailit/popclient.cpp +++ b/noncore/net/mailit/popclient.cpp @@ -51,25 +51,25 @@ PopClient::~PopClient() void PopClient::newConnection(QString target, int port) { if (receiving) { qWarning("socket in use, connection refused"); return; } status = Init; socket->connectToHost(target, port); receiving = TRUE; - selected = FALSE; + //selected = FALSE; emit updateStatus("DNS lookup"); } void PopClient::setAccount(QString popUser, QString popPasswd) { popUserName = popUser; popPassword = popPasswd; } void PopClient::setSynchronize(int lastCount) { @@ -179,46 +179,47 @@ void PopClient::incomingData() if (synchronize) { //messages deleted from server, reload all if (newMessages < lastSync) lastSync = 0; messageCount = 1; } if (selected) { int *ptr = mailList->first(); if (ptr != 0) { newMessages++; //to ensure no early jumpout - messageCount = *(mailList->first()); + 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 - if ( (messageCount - lastSync) <= 0) { + /* if ( (messageCount - lastSync) <= 0) { temp.setNum(messageCount); emit updateStatus(tr("Previous message ") + temp); - } else { + } else {*/ emit updateStatus(tr("Completing message ") + temp); - } + //} } break; } else { emit updateStatus(tr("No new Messages")); status = Quit; } } //get size of message, eg "500 characters in message.." -> int 500 case Size: { if (status != Quit) { //because of idiotic switch if (response[0] == '+') { temp = response.replace(0, 4, ""); @@ -228,25 +229,25 @@ void PopClient::incomingData() emit currentMailSize(mailSize); status = Retr; } else { //qWarning(response); errorHandling(ErrUnknownResponse); } } } //Read message number x, count upwards to messageCount case Retr: { if (status != Quit) { - if (mailSize <= headerLimit) + if ((selected)||(mailSize <= headerLimit)) { *stream << "RETR " << messageCount << "\r\n"; } else { //only header *stream << "TOP " << messageCount << " 0\r\n"; } messageCount++; status = Ignore; break; } } case Ignore: { if (status != Quit) { //because of idiotic switch if (response[0] == '+') { @@ -263,105 +264,62 @@ void PopClient::incomingData() 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 - //complete mail downloaded - //if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ - if ( mailSize <= headerLimit) + + 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) //that was the last message + + if ((messageCount > newMessages)||(selected)) //last message ? + { status = Quit; - else { //ask for new message if (selected) { //grab next from queue - int *ptr = mailList->next(); - if (ptr != 0) { - messageCount = *ptr; - *stream << "LIST " << messageCount << "\r\n"; - status = Size; - //completing a previously closed transfer - if ( (messageCount - lastSync) <= 0) { - temp.setNum(messageCount); - emit updateStatus(tr("Previous message ") + temp); - } else { - temp.setNum(messageCount - lastSync); - emit updateStatus(tr("Completing message ") + temp); - } - break; - } else { newMessages--; status = Quit; } - } else { + } + else + { *stream << "LIST " << messageCount << "\r\n"; status = Size; temp2.setNum(newMessages - lastSync); temp.setNum(messageCount - lastSync); emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); break; } } } if (status != Quit) break; } - } case Quit: { *stream << "Quit\r\n"; status = Done; int newM = newMessages - lastSync; if (newM > 0) { temp.setNum(newM); emit updateStatus(temp + tr(" new messages")); } else { emit updateStatus(tr("No new messages")); } socket->close(); receiving = FALSE; emit mailTransfered(newM); break; } } } - -// if( bAPOPAuthentication ) -// { -// if( m_strTimeStamp.IsEmpty() ) -// { -// SetLastError("Apop error!"); -// return false; -// } -// strMD5Source = m_strTimeStamp+pszPassword; -// strMD5Dst = MD5_GetMD5( (BYTE*)(const char*)strMD5Source , strMD5Source.GetLength() ); -// sprintf(msg , "apop %s %s\r\n" , pszUser , strMD5Dst); -// ret = send(m_sPop3Socket , msg , strlen(msg) , NULL); -// if(ret == SOCKET_ERROR) -// { -// SetLastError("Socket error!"); -// m_bSocketOK = false; -// m_bConnected = false; -// return false; -// } -// if( !GetSocketResult(&strResult , COMMAND_END_FLAG) ) -// return false; -// if( 0 == strResult.Find('-' , 0) ) -// { -// SetLastError("Username or Password error!"); -// return false; -// } -// m_bConnected = true; - -// } diff --git a/noncore/net/mailit/writemail.cpp b/noncore/net/mailit/writemail.cpp index 0336c83..dcf0c6e 100644 --- a/noncore/net/mailit/writemail.cpp +++ b/noncore/net/mailit/writemail.cpp @@ -114,50 +114,49 @@ void WriteMail::init() grid->addWidget( ccInput, 0, 1 ); QWhatsThis::add(ccInput,QWidget::tr("If you would like to send copies of your mail they can be entered here")); addressButton = new QToolButton( widget, "addressButton" ); addressButton->setPixmap( Resource::loadPixmap("AddressBook") ); addressButton->setToggleButton(TRUE); grid->addWidget( addressButton, 0, 2 ); connect(addressButton, SIGNAL(clicked()), this, SLOT(getAddress()) ); QWhatsThis::add(addressButton,QWidget::tr("This button opens the address selector with all mail adresses from your OPIE addressbook")); emailInput = new QMultiLineEdit( widget, "emailInput" ); grid->addMultiCellWidget( emailInput, 2, 2, 0, 2); - QWhatsThis::add(recipientsBox,QWidget::tr("Enter your mail text here")); + QWhatsThis::add(emailInput,QWidget::tr("Enter your mail text here")); addressView = new QListView( widget, "addressView"); addressView->addColumn("Name"); addressView->addColumn("EMail"); addressView->setAllColumnsShowFocus(TRUE); addressView->setMultiSelection(TRUE); addressView->hide(); grid->addMultiCellWidget( addressView, 3, 3, 0, 2); - QWhatsThis::add(recipientsBox,QWidget::tr("Chose the recipients from this list")); + QWhatsThis::add(recipientsBox,QWidget::tr("Choose the recipients from this list")); okButton = new QToolButton(bar, "ok"); okButton->setPixmap( Resource::loadPixmap("enter") ); okButton->hide(); connect(okButton, SIGNAL(clicked()), this, SLOT(addRecipients()) ); QWhatsThis::add(okButton,QWidget::tr("Queue your mail by clicking here")); setCentralWidget(widget); } void WriteMail::reject() { emit cancelMail(); } -// need to insert date void WriteMail::accept() { QStringList attachedFiles, attachmentsType; int idCount = 0; if (toInput->text() == "") { QMessageBox::warning(this,tr("No recipient"), tr("Send mail to whom?"), tr("OK\n")); return; } if (! getRecipients(false) ) @@ -243,30 +242,41 @@ void WriteMail::getAddress() emailInput->show(); } } void WriteMail::attachFile() { addAtt->showMaximized(); } void WriteMail::reply(Email replyMail, bool replyAll) { int pos; + QString ccRecipients; mail = replyMail; mail.files.clear(); toInput->setText(mail.fromMail); - //replyAll ? ccInput->setText(mail.c) + + if (replyAll) + { + for (QStringList::Iterator it = mail.carbonCopies.begin();it != mail.carbonCopies.end(); ++it) + { + ccRecipients.append(*it); + ccRecipients.append(";"); + } + ccRecipients.truncate(ccRecipients.length()-1); //no ; at the end + ccInput->setText(ccRecipients); + } addRecipients(replyAll); subjectInput->setText(tr("Re: ") + mail.subject); pos = 0; mail.body.insert(pos, ">"); while (pos != -1) { pos = mail.body.find('\n', pos); if (pos != -1) mail.body.insert(++pos, ">>"); } @@ -312,41 +322,40 @@ bool WriteMail::getRecipients(bool ccField) } temp = temp.stripWhiteSpace(); if ( temp.find('@') == -1) return false; ccField ? mail.carbonCopies.append(temp) : mail.recipients.append(temp); addressList->addContact(temp, ""); return TRUE; } void WriteMail::addRecipients() { - - addRecipients(false); + toInput->isVisible() ? addRecipients(false) : addRecipients(true); } void WriteMail::addRecipients(bool ccField) { QString recipients = ""; mail.recipients.clear(); QListViewItem *item = addressView->firstChild(); while (item != NULL) { if ( item->isSelected() ) { if (recipients == "") { - recipients = item->text(0); + recipients = item->text(1); } else { - recipients += "; " + item->text(0); + recipients += "; " + item->text(1); } } item = item->nextSibling(); } ccField ? ccInput->setText(recipients):toInput->setText(recipients); addressView->hide(); okButton->hide(); emailInput->show(); addressButton->setOn(FALSE); showingAddressList = !showingAddressList; @@ -367,15 +376,14 @@ void WriteMail::changeRecipients(int selection) } void WriteMail::setRecipient(const QString &recipient) { toInput->setText(recipient); } void WriteMail::newMail() { toInput->clear(); subjectInput->clear(); emailInput->clear(); - //to clear selected setAddressList(addressList); } diff --git a/noncore/unsupported/mailit/emailclient.cpp b/noncore/unsupported/mailit/emailclient.cpp index 23059cf..dff1888 100644 --- a/noncore/unsupported/mailit/emailclient.cpp +++ b/noncore/unsupported/mailit/emailclient.cpp @@ -353,25 +353,25 @@ void EmailClient::mailArrived(const Email &mail, bool fromDisk) { newMail.downloaded = mailconf->readBoolEntry("downloaded"); newMail.size = mailconf->readNumEntry("size"); newMail.serverId = mailconf->readNumEntry("serverid"); newMail.fromAccountId = mailconf->readNumEntry("fromaccountid"); } else { //mail arrived from server newMail.serverId = mail.serverId; newMail.size = mail.size; newMail.downloaded = mail.downloaded; - newMail.fromAccountId = currentAccount->id; + newMail.fromAccountId = emailHandler->getAccount()->id; mailconf->writeEntry("fromaccountid", newMail.fromAccountId); } //add if read or not newMail.read = mailconf->readBoolEntry("mailread"); //check if new mail if ( (thisMailId = mailconf->readNumEntry("internalmailid", -1)) == -1) { thisMailId = mailIdCount; mailIdCount++; //set server count, so that if the user aborts, the new @@ -471,29 +471,29 @@ void EmailClient::allMailArrived(int count) status1Label->setText("Idle"); progressBar->reset(); return; } //} // all headers downloaded from server, start downloading remaining mails previewingMail = FALSE; status1Label->setText(currentAccount->accountName); progressBar->reset(); - //emailHandler->getMailByList(&mailDownloadList); 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) @@ -655,25 +655,25 @@ QString EmailClient::getPath(bool enclosurePath) if ( !dir.exists() ) dir.mkdir( dir.path() ); return (dir.path() + "/"); } return (dir.path() + "/"); } void EmailClient::readSettings() { - int y,acc_count, accountPos=0; + int y,acc_count; mailconf->setGroup("mailitglobal"); acc_count=mailconf->readNumEntry("Accounts",0); for (int accountPos = 0;accountPos<acc_count ; accountPos++) { mailconf->setGroup("Account_"+QString::number(accountPos+1)); //Account numbers start at 1 ... account.accountName = mailconf->readEntry("AccName",""); account.name = mailconf->readEntry("UserName",""); account.emailAddress = mailconf->readEntry("Email",""); account.popUserName = mailconf->readEntry("POPUser",""); account.popPasswd = mailconf->readEntryCrypt("POPPassword",""); @@ -882,31 +882,39 @@ void EmailClient::setDownloadedSize(int size) int total = progressBar->totalSteps(); if (size < total) { progressBar->setProgress(size); } else { progressBar->setProgress(total); } } void EmailClient::deleteItem() { bool inbox=mailboxView->currentTab()==0; + QListView* box; EmailListItem* eli; + int pos; + + inbox ? box=inboxView : box=outboxView; - inbox ? eli=(EmailListItem*)inboxView->selectedItem():eli=(EmailListItem*)outboxView->selectedItem(); + eli=(EmailListItem*)box->selectedItem(); if (eli) - deleteMail(eli,(bool&)inbox); + { + box->setSelected(eli->itemBelow(),true); //select the previous item + + deleteMail(eli,(bool&)inbox); //remove mail entry + } } void EmailClient::inboxItemPressed() { // timerID=startTimer(500); } void EmailClient::inboxItemReleased() { // killTimer(timerID); } @@ -930,52 +938,31 @@ void EmailClient::timerEvent(QTimerEvent *e) */ } Email* EmailClient::getCurrentMail() { EmailListItem *eli=(EmailListItem* ) (inboxView->selectedItem()); if (eli!=NULL) return eli->getMail(); else return NULL; } -/* -void EmailClient::reply() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) +void EmailClient::download(Email* mail) { - emit reply(*mail); - } -} + MailAccount* acc=0; -void EmailClient::replyAll() -{ - Email* mail=getCurrentMail(); + tempMailDownloadList.clear(); + tempMailDownloadList.sizeInsert(mail->serverId, mail->size); + if (accountList.count()>0) + qDebug("Accounts present"); - if (mail!=NULL) + acc=accountList.at(mail->fromAccountId-1); + if (acc) { - emit replyAll(*mail); - } + emailHandler->setAccount(*acc); + emailHandler->getMailByList(&tempMailDownloadList); } - -void EmailClient::forward() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) - { - emit reply(*mail); - } -} - -void EmailClient::remove() -{ - Email* mail=getCurrentMail(); - - if (mail!=NULL) - { - emit remove(*mail); + else + QMessageBox::warning(qApp->activeWindow(), + tr("No account associated"), tr("There is no active account \nassociated to this mail\n it can not be downloaded"), "Abort\n"); } -}*/ diff --git a/noncore/unsupported/mailit/emailclient.h b/noncore/unsupported/mailit/emailclient.h index 0890dcf..549683b 100644 --- a/noncore/unsupported/mailit/emailclient.h +++ b/noncore/unsupported/mailit/emailclient.h @@ -61,24 +61,25 @@ private: MailAccount *ac; }; //class EmailClient : public EmailClientBase class EmailClient : public QMainWindow { Q_OBJECT public: EmailClient( QWidget* parent, const char* name, WFlags fl = 0 ); ~EmailClient(); AddressList* getAdrListRef(); + void download(Email*); protected: void timerEvent(QTimerEvent*); signals: void composeRequested(); void viewEmail(QListView *, Email *); void mailUpdated(Email *); void newCaption(const QString &); void replyRequested(Email&, bool&); void forwardRequested(Email&); void removeItem(EmailListItem*, bool&); @@ -130,24 +131,26 @@ private: int timerID; Config *mailconf; int newAccountId, idCount, mailIdCount; int accountIdCount; AccountList accountList; AddressList *addressList; EditAccount *editAccountView; EmailListItem *item; EmailHandler *emailHandler; QList<Email> quedMessages; MailList mailDownloadList; + MailList tempMailDownloadList; + bool sending, receiving, previewingMail, allAccounts; QString lineShift; MailAccount account, *currentAccount; QToolBar *bar; QProgressBar *progressBar; QStatusBar *statusBar; QLabel *status1Label, *status2Label; QToolButton *getMailButton; QAction *sendMailButton; QAction *composeButton; QAction *cancelButton; diff --git a/noncore/unsupported/mailit/emailhandler.cpp b/noncore/unsupported/mailit/emailhandler.cpp index b180051..fbbada7 100644 --- a/noncore/unsupported/mailit/emailhandler.cpp +++ b/noncore/unsupported/mailit/emailhandler.cpp @@ -118,36 +118,38 @@ void EmailHandler::getMailHeaders() 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->newConnection(mailAccount.popServer, 110); + + 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 incomplete) +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 = incomplete; + mail.downloaded = complete; emit mailArrived(mail, FALSE); } bool EmailHandler::parse(QString in, 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; @@ -173,31 +175,29 @@ bool EmailHandler::parse(QString in, QString lineShift, Email *mail) TextParser p(header, lineShift); 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) == '<') - || (p.separatorAt(pos) == ' ')) //No name.. nasty - pos++; + 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) { diff --git a/noncore/unsupported/mailit/emailhandler.h b/noncore/unsupported/mailit/emailhandler.h index e47fd9a..b645868 100644 --- a/noncore/unsupported/mailit/emailhandler.h +++ b/noncore/unsupported/mailit/emailhandler.h @@ -102,24 +102,25 @@ struct MailAccount const int ErrUnknownResponse = 1001; const int ErrLoginFailed = 1002; const int ErrCancel = 1003; class EmailHandler : public QObject { Q_OBJECT public: EmailHandler(); void setAccount(MailAccount account); + MailAccount* getAccount(){return &mailAccount;} void sendMail(QList<Email> *mailList); void getMail(); void getMailHeaders(); void getMailByList(MailList *mailList); bool parse(QString in, QString lineShift, Email *mail); bool getEnclosure(Enclosure *ePtr); int parse64base(char *src, char *dest); int encodeMime(Email *mail); int encodeFile(QString fileName, QString *toBody); void encode64base(char *src, QString *dest, int len); void cancel(); diff --git a/noncore/unsupported/mailit/mailitwindow.cpp b/noncore/unsupported/mailit/mailitwindow.cpp index 7181adf..ffee67e 100644 --- a/noncore/unsupported/mailit/mailitwindow.cpp +++ b/noncore/unsupported/mailit/mailitwindow.cpp @@ -9,24 +9,25 @@ ** 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 <qwhatsthis.h> +#include <qmessagebox.h> #include "mailitwindow.h" MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) : QMainWindow(parent, name, WStyle_ContextHelp) { currentCaption = "Mailit"; setCaption(tr(currentCaption)); views = new QWidgetStack(this); setCentralWidget(views); QWhatsThis::add(views,tr("Central view area")); emailClient = new EmailClient(views, "client"); writeMail = new WriteMail(views, "writing"); @@ -52,47 +53,47 @@ MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) SLOT(composeReply(Email &, bool&)) ); connect(readMail, SIGNAL(forwardRequested(Email &)), this, SLOT(composeForward(Email &)) ); connect(readMail, SIGNAL(removeItem(EmailListItem *, bool &)), emailClient, SLOT(deleteMail(EmailListItem *, bool &)) ); connect(readMail, SIGNAL(viewingMail(Email *)), emailClient, SLOT(moveMailFront(Email *)) ); connect(emailClient, SIGNAL(newCaption(const QString &)), this, SLOT(updateCaption(const QString &)) ); viewingMail = FALSE; - } MailItWindow::~MailItWindow() { } void MailItWindow::closeEvent(QCloseEvent *e) { if (views->visibleWidget() == emailClient) { e->accept(); } else { 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(); @@ -104,24 +105,45 @@ 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" ) ); } void MailItWindow::updateMailView(Email *mail) { if (viewingMail) { readMail->mailUpdated(mail); } } diff --git a/noncore/unsupported/mailit/popclient.cpp b/noncore/unsupported/mailit/popclient.cpp index 67306be..6105d09 100644 --- a/noncore/unsupported/mailit/popclient.cpp +++ b/noncore/unsupported/mailit/popclient.cpp @@ -51,25 +51,25 @@ PopClient::~PopClient() void PopClient::newConnection(QString target, int port) { if (receiving) { qWarning("socket in use, connection refused"); return; } status = Init; socket->connectToHost(target, port); receiving = TRUE; - selected = FALSE; + //selected = FALSE; emit updateStatus("DNS lookup"); } void PopClient::setAccount(QString popUser, QString popPasswd) { popUserName = popUser; popPassword = popPasswd; } void PopClient::setSynchronize(int lastCount) { @@ -179,46 +179,47 @@ void PopClient::incomingData() if (synchronize) { //messages deleted from server, reload all if (newMessages < lastSync) lastSync = 0; messageCount = 1; } if (selected) { int *ptr = mailList->first(); if (ptr != 0) { newMessages++; //to ensure no early jumpout - messageCount = *(mailList->first()); + 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 - if ( (messageCount - lastSync) <= 0) { + /* if ( (messageCount - lastSync) <= 0) { temp.setNum(messageCount); emit updateStatus(tr("Previous message ") + temp); - } else { + } else {*/ emit updateStatus(tr("Completing message ") + temp); - } + //} } break; } else { emit updateStatus(tr("No new Messages")); status = Quit; } } //get size of message, eg "500 characters in message.." -> int 500 case Size: { if (status != Quit) { //because of idiotic switch if (response[0] == '+') { temp = response.replace(0, 4, ""); @@ -228,25 +229,25 @@ void PopClient::incomingData() emit currentMailSize(mailSize); status = Retr; } else { //qWarning(response); errorHandling(ErrUnknownResponse); } } } //Read message number x, count upwards to messageCount case Retr: { if (status != Quit) { - if (mailSize <= headerLimit) + if ((selected)||(mailSize <= headerLimit)) { *stream << "RETR " << messageCount << "\r\n"; } else { //only header *stream << "TOP " << messageCount << " 0\r\n"; } messageCount++; status = Ignore; break; } } case Ignore: { if (status != Quit) { //because of idiotic switch if (response[0] == '+') { @@ -263,105 +264,62 @@ void PopClient::incomingData() 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 - //complete mail downloaded - //if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ - if ( mailSize <= headerLimit) + + 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) //that was the last message + + if ((messageCount > newMessages)||(selected)) //last message ? + { status = Quit; - else { //ask for new message if (selected) { //grab next from queue - int *ptr = mailList->next(); - if (ptr != 0) { - messageCount = *ptr; - *stream << "LIST " << messageCount << "\r\n"; - status = Size; - //completing a previously closed transfer - if ( (messageCount - lastSync) <= 0) { - temp.setNum(messageCount); - emit updateStatus(tr("Previous message ") + temp); - } else { - temp.setNum(messageCount - lastSync); - emit updateStatus(tr("Completing message ") + temp); - } - break; - } else { newMessages--; status = Quit; } - } else { + } + else + { *stream << "LIST " << messageCount << "\r\n"; status = Size; temp2.setNum(newMessages - lastSync); temp.setNum(messageCount - lastSync); emit updateStatus(tr("Retrieving ") + temp + "/" + temp2); break; } } } if (status != Quit) break; } - } case Quit: { *stream << "Quit\r\n"; status = Done; int newM = newMessages - lastSync; if (newM > 0) { temp.setNum(newM); emit updateStatus(temp + tr(" new messages")); } else { emit updateStatus(tr("No new messages")); } socket->close(); receiving = FALSE; emit mailTransfered(newM); break; } } } - -// if( bAPOPAuthentication ) -// { -// if( m_strTimeStamp.IsEmpty() ) -// { -// SetLastError("Apop error!"); -// return false; -// } -// strMD5Source = m_strTimeStamp+pszPassword; -// strMD5Dst = MD5_GetMD5( (BYTE*)(const char*)strMD5Source , strMD5Source.GetLength() ); -// sprintf(msg , "apop %s %s\r\n" , pszUser , strMD5Dst); -// ret = send(m_sPop3Socket , msg , strlen(msg) , NULL); -// if(ret == SOCKET_ERROR) -// { -// SetLastError("Socket error!"); -// m_bSocketOK = false; -// m_bConnected = false; -// return false; -// } -// if( !GetSocketResult(&strResult , COMMAND_END_FLAG) ) -// return false; -// if( 0 == strResult.Find('-' , 0) ) -// { -// SetLastError("Username or Password error!"); -// return false; -// } -// m_bConnected = true; - -// } diff --git a/noncore/unsupported/mailit/writemail.cpp b/noncore/unsupported/mailit/writemail.cpp index 0336c83..dcf0c6e 100644 --- a/noncore/unsupported/mailit/writemail.cpp +++ b/noncore/unsupported/mailit/writemail.cpp @@ -114,50 +114,49 @@ void WriteMail::init() grid->addWidget( ccInput, 0, 1 ); QWhatsThis::add(ccInput,QWidget::tr("If you would like to send copies of your mail they can be entered here")); addressButton = new QToolButton( widget, "addressButton" ); addressButton->setPixmap( Resource::loadPixmap("AddressBook") ); addressButton->setToggleButton(TRUE); grid->addWidget( addressButton, 0, 2 ); connect(addressButton, SIGNAL(clicked()), this, SLOT(getAddress()) ); QWhatsThis::add(addressButton,QWidget::tr("This button opens the address selector with all mail adresses from your OPIE addressbook")); emailInput = new QMultiLineEdit( widget, "emailInput" ); grid->addMultiCellWidget( emailInput, 2, 2, 0, 2); - QWhatsThis::add(recipientsBox,QWidget::tr("Enter your mail text here")); + QWhatsThis::add(emailInput,QWidget::tr("Enter your mail text here")); addressView = new QListView( widget, "addressView"); addressView->addColumn("Name"); addressView->addColumn("EMail"); addressView->setAllColumnsShowFocus(TRUE); addressView->setMultiSelection(TRUE); addressView->hide(); grid->addMultiCellWidget( addressView, 3, 3, 0, 2); - QWhatsThis::add(recipientsBox,QWidget::tr("Chose the recipients from this list")); + QWhatsThis::add(recipientsBox,QWidget::tr("Choose the recipients from this list")); okButton = new QToolButton(bar, "ok"); okButton->setPixmap( Resource::loadPixmap("enter") ); okButton->hide(); connect(okButton, SIGNAL(clicked()), this, SLOT(addRecipients()) ); QWhatsThis::add(okButton,QWidget::tr("Queue your mail by clicking here")); setCentralWidget(widget); } void WriteMail::reject() { emit cancelMail(); } -// need to insert date void WriteMail::accept() { QStringList attachedFiles, attachmentsType; int idCount = 0; if (toInput->text() == "") { QMessageBox::warning(this,tr("No recipient"), tr("Send mail to whom?"), tr("OK\n")); return; } if (! getRecipients(false) ) @@ -243,30 +242,41 @@ void WriteMail::getAddress() emailInput->show(); } } void WriteMail::attachFile() { addAtt->showMaximized(); } void WriteMail::reply(Email replyMail, bool replyAll) { int pos; + QString ccRecipients; mail = replyMail; mail.files.clear(); toInput->setText(mail.fromMail); - //replyAll ? ccInput->setText(mail.c) + + if (replyAll) + { + for (QStringList::Iterator it = mail.carbonCopies.begin();it != mail.carbonCopies.end(); ++it) + { + ccRecipients.append(*it); + ccRecipients.append(";"); + } + ccRecipients.truncate(ccRecipients.length()-1); //no ; at the end + ccInput->setText(ccRecipients); + } addRecipients(replyAll); subjectInput->setText(tr("Re: ") + mail.subject); pos = 0; mail.body.insert(pos, ">"); while (pos != -1) { pos = mail.body.find('\n', pos); if (pos != -1) mail.body.insert(++pos, ">>"); } @@ -312,41 +322,40 @@ bool WriteMail::getRecipients(bool ccField) } temp = temp.stripWhiteSpace(); if ( temp.find('@') == -1) return false; ccField ? mail.carbonCopies.append(temp) : mail.recipients.append(temp); addressList->addContact(temp, ""); return TRUE; } void WriteMail::addRecipients() { - - addRecipients(false); + toInput->isVisible() ? addRecipients(false) : addRecipients(true); } void WriteMail::addRecipients(bool ccField) { QString recipients = ""; mail.recipients.clear(); QListViewItem *item = addressView->firstChild(); while (item != NULL) { if ( item->isSelected() ) { if (recipients == "") { - recipients = item->text(0); + recipients = item->text(1); } else { - recipients += "; " + item->text(0); + recipients += "; " + item->text(1); } } item = item->nextSibling(); } ccField ? ccInput->setText(recipients):toInput->setText(recipients); addressView->hide(); okButton->hide(); emailInput->show(); addressButton->setOn(FALSE); showingAddressList = !showingAddressList; @@ -367,15 +376,14 @@ void WriteMail::changeRecipients(int selection) } void WriteMail::setRecipient(const QString &recipient) { toInput->setText(recipient); } void WriteMail::newMail() { toInput->clear(); subjectInput->clear(); emailInput->clear(); - //to clear selected setAddressList(addressList); } |