author | groucho <groucho> | 2003-04-24 11:19:11 (UTC) |
---|---|---|
committer | groucho <groucho> | 2003-04-24 11:19:11 (UTC) |
commit | 9671975e21266e3bfa6f3c793a3278b67cea34b7 (patch) (side-by-side diff) | |
tree | 876c77939cfd0e00fc844b1b5af09b2978564a6d | |
parent | 51e782b9658de61dc02579e115a9c62f396609a3 (diff) | |
download | opie-9671975e21266e3bfa6f3c793a3278b67cea34b7.zip opie-9671975e21266e3bfa6f3c793a3278b67cea34b7.tar.gz opie-9671975e21266e3bfa6f3c793a3278b67cea34b7.tar.bz2 |
- reworked size filtering
- started reworking offline download
- better tab focus switching
- Hello "Whats this" capability
- Fixed parsing of To: header files (no more Delivered-To: and Reply-To: matches)
- Good bye Settings.txt, hello Config Objects and encrypted passwords
- Translation improvements (added trs)
- Parser optimizations
30 files changed, 450 insertions, 474 deletions
diff --git a/noncore/net/mailit/addatt.cpp b/noncore/net/mailit/addatt.cpp index d268f1f..daefac6 100644 --- a/noncore/net/mailit/addatt.cpp +++ b/noncore/net/mailit/addatt.cpp @@ -1,224 +1,224 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qlayout.h> #include <qhbox.h> #include <qdir.h> #include <qstringlist.h> #include <qpe/resource.h> #include "addatt.h" FileItem::FileItem(QListView *parent, DocLnk* dl) : QListViewItem(parent) { /*file = fileInfo; type = fileType;*/ doclnk=dl; setText(0, doclnk->name()); /* if (fileType == "Picture") { setPixmap(0, Resource::loadPixmap("pixmap")); } else if (fileType == "Document") { setPixmap(0, Resource::loadPixmap("txt")); } else if (fileType == "Sound") { setPixmap(0, Resource::loadPixmap("play")); } else if (fileType == "Movie") { setPixmap(0, Resource::loadPixmap("MPEGPlayer")); } else if (fileType == "File") { setPixmap(0, Resource::loadPixmap("exec")); }*/ } FileItem::~FileItem() { if (doclnk!=NULL) delete doclnk; doclnk=NULL; } AddAtt::AddAtt(QWidget *parent, const char *name, WFlags f) : QDialog(parent, name, f) { - setCaption("Adding attatchments"); + setCaption("Adding attachments"); QGridLayout *top = new QGridLayout(this, 1,1 ); QHBox *buttons=new QHBox(this); /*fileCategoryButton = new QPushButton(this);*/ - attatchButton = new QPushButton(tr("Attatch..."), buttons); + attachButton = new QPushButton(tr("attach..."), buttons); removeButton = new QPushButton(tr("Remove"), buttons); /*fileCategories = new QPopupMenu(fileCategoryButton); fileCategoryButton->setPopup(fileCategories); fileCategories->insertItem("Document"); fileCategories->insertItem("Picture"); fileCategories->insertItem("Sound"); fileCategories->insertItem("Movie"); fileCategories->insertItem("File"); fileCategoryButton->setText("Document"); top->addWidget(fileCategoryButton, 0, 0);*/ top->addWidget(buttons,1,0); - //buttons->addWidget(attatchButton,0,0); + //buttons->addWidget(attachButton,0,0); //buttons->addWidget(removeButton,0,1); //connect(fileCategories, SIGNAL(activated(int)), this, // SLOT(fileCategorySelected(int)) );*/ - connect(attatchButton, SIGNAL(clicked()), this, - SLOT(addAttatchment()) ); + connect(attachButton, SIGNAL(clicked()), this, + SLOT(addattachment()) ); connect(removeButton, SIGNAL(clicked()), this, - SLOT(removeAttatchment()) ); + SLOT(removeattachment()) ); /*listView = new QListView(this, "AttView"); listView->addColumn("Documents");* connect(listView, SIGNAL(doubleClicked(QListViewItem *)), this, - SLOT(addAttatchment()) );*/ + SLOT(addattachment()) );*/ attView = new QListView(this, "Selected"); attView->addColumn(tr("Attached")); attView->addColumn(tr("File type")); connect(attView, SIGNAL(doubleClicked(QListViewItem *)), this, - SLOT(removeAttatchment()) ); + SLOT(removeattachment()) ); //top->addWidget(ofs, 0,0); top->addWidget(attView, 0,0); clear(); } void AddAtt::clear() { attView->clear(); //getFiles(); modified = FALSE; } /*void AddAtt::fileCategorySelected(int id) { fileCategoryButton->setText(fileCategories->text(id)); getFiles(); }*/ -void AddAtt::addAttatchment() +void AddAtt::addattachment() { OFileDialog ofs("Attachments",this,0,0,"/root/Documents"); ofs.showMaximized(); if (ofs.exec()==QDialog::Accepted) { DocLnk* dl=new DocLnk(ofs.selectedDocument()); FileItem* fi=new FileItem(attView,dl); fi->setPixmap(0,dl->pixmap()); fi->setText(1,dl->type()); attView->insertItem(fi); modified = TRUE; } } -void AddAtt::removeAttatchment() +void AddAtt::removeattachment() { if (attView->selectedItem() != NULL) { attView->takeItem(attView->selectedItem()); } modified = TRUE; } void AddAtt::reject() { if (modified) { attView->clear(); modified = FALSE; } } void AddAtt::accept() { modified = FALSE; hide(); } void AddAtt::getFiles() { QString path, selected; /*listView->clear(); selected = fileCategoryButton->text(); if (selected == "Picture") { path = "../pics/"; } else if (selected == "Document") { path = "" ; //sub-dirs not decided } else if (selected == "Sound") { path = "../sounds/"; //sub-dirs not decided } else if (selected == "Movie") { path = ""; //sub-dirs not decided } else if (selected == "File") { path = ""; //sub-dirs not decided } dir = new QDir(path); dir->setFilter(QDir::Files); const QFileInfoList *dirInfoList = dir->entryInfoList(); QFileInfoListIterator it(*dirInfoList); // create list iterator while ( (fi=it.current()) ) { // for each file... item = new FileItem(lis+ütView, *fi, selected); ++it; // goto next list element }*/ } -QStringList AddAtt::returnAttatchedFiles() +QStringList AddAtt::returnattachedFiles() { QFileInfo info; QStringList list; item = (FileItem *) attView->firstChild(); while (item != NULL) { DocLnk* dl=item->getDocLnk(); list+=dl->file(); /*info = item->getFileInfo(); list += info.filePath();*/ item = (FileItem *) item->nextSibling(); } return list; } QStringList AddAtt::returnFileTypes() { QStringList list; item = (FileItem *) attView->firstChild(); while (item != NULL) { list += item->getDocLnk()->type(); item = (FileItem *) item->nextSibling(); } return list; } diff --git a/noncore/net/mailit/addatt.h b/noncore/net/mailit/addatt.h index fcf3279..a365947 100644 --- a/noncore/net/mailit/addatt.h +++ b/noncore/net/mailit/addatt.h @@ -1,76 +1,76 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef ADDATT_H #define ADDATT_H #include <qdialog.h> #include <qlistview.h> #include <qpushbutton.h> #include <qpopupmenu.h> #include <qstring.h> #include <qfileinfo.h> #include <qstringlist.h> #include <opie/ofiledialog.h> #include <qpe/applnk.h> class FileItem : public QListViewItem { public: //FileItem(QListView *parent, QFileInfo fileInfo, QString fileType); FileItem(QListView*, DocLnk*); ~FileItem(); DocLnk* getDocLnk() {return doclnk;} private: DocLnk* doclnk; }; class AddAtt : public QDialog { Q_OBJECT public: AddAtt(QWidget *parent = 0, const char *name = 0, WFlags f = 0); - QStringList returnAttatchedFiles(); + QStringList returnattachedFiles(); QStringList returnFileTypes(); void getFiles(); void clear(); public slots: //void fileCategorySelected(int); - void addAttatchment(); - void removeAttatchment(); + void addattachment(); + void removeattachment(); void reject(); void accept(); private: FileItem* item; QListView *attView; - QPushButton *attatchButton, *removeButton; + QPushButton *attachButton, *removeButton; QPopupMenu *fileCategories; bool modified; //QFileInfo *fi; OFileDialog* ofs; }; #endif diff --git a/noncore/net/mailit/addresslist.cpp b/noncore/net/mailit/addresslist.cpp index 8d9ab91..7d60ebf 100644 --- a/noncore/net/mailit/addresslist.cpp +++ b/noncore/net/mailit/addresslist.cpp @@ -28,134 +28,134 @@ AddressList::AddressList() { addresses.setAutoDelete(TRUE); read(); dirty = FALSE; } AddressList::~AddressList() { addresses.clear(); } void AddressList::addContact(QString email, QString name) { //skip if not a valid email address, if (email.find( '@') == -1) return; if ( ! containsEmail(email) ) { Contact *in = new Contact; in->email = email; in->name = name; addresses.append(in); dirty = TRUE; } } bool AddressList::containsEmail(QString email) { return ( getEmailRef(email) != -1 ); } bool AddressList::containsName(QString name) { return ( getNameRef(name) != -1 ); } QString AddressList::getNameByEmail(QString email) { int pos = getEmailRef(email); if (pos != -1) { Contact *ptr = addresses.at(pos); return ptr->name; } return NULL; } QString AddressList::getEmailByName(QString name) { int pos = getNameRef(name); if (pos != -1) { Contact *ptr = addresses.at(pos); return ptr->email; } return NULL; } int AddressList::getEmailRef(QString email) { int pos = 0; Contact *ptr; for (ptr = addresses.first(); ptr != 0; ptr = addresses.next() ) { if (ptr->email == email) return pos; pos++; } return -1; } int AddressList::getNameRef(QString name) { int pos = 0; Contact *ptr; for (ptr = addresses.first(); ptr != 0; ptr = addresses.next() ) { if (ptr->name == name) return pos; pos++; } return -1; } QList<Contact>* AddressList::getContactList() { return &addresses; } void AddressList::read() { OContactAccess::List::Iterator it; QString lineEmail, lineName, email, name; OContactAccess m_contactdb("mailit"); OContactAccess::List m_list = m_contactdb.sorted( true, 0, 0, 0 ); - //OContact* oc; + //OContact* oc;(*it).defaultEmail() for ( it = m_list.begin(); it != m_list.end(); ++it ) { //oc=(OContact*) it; if ((*it).defaultEmail().length()!=0) addContact((*it).defaultEmail(),(*it).fileAs()); } /*if (! f.open(IO_ReadOnly) ) return; QTextStream stream(&f); while (! stream.atEnd() ) { lineEmail = stream.readLine(); if (! stream.atEnd() ) lineName = stream.readLine(); else return; email = getRightString(lineEmail); name = getRightString(lineName); addContact(email, name); } f.close();*/ } QString AddressList::getRightString(QString in) { QString out = ""; int pos = in.find('='); if (pos != -1) { out = in.mid(pos+1).stripWhiteSpace(); } return out; } diff --git a/noncore/net/mailit/emailclient.cpp b/noncore/net/mailit/emailclient.cpp index ad1e0b4..23059cf 100644 --- a/noncore/net/mailit/emailclient.cpp +++ b/noncore/net/mailit/emailclient.cpp @@ -1,864 +1,841 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qapplication.h> #include <qmessagebox.h> #include <qfile.h> #include <qcheckbox.h> #include <qmenubar.h> #include <qaction.h> +#include <qwhatsthis.h> #include <qpe/resource.h> #include "emailclient.h" QCollection::Item AccountList::newItem(QCollection::Item d) { return dupl( (MailAccount *) d); } MailAccount* AccountList::dupl(MailAccount *in) { ac = new MailAccount(*in); return ac; } EmailClient::EmailClient( QWidget* parent, const char* name, WFlags fl ) : QMainWindow( parent, name, fl ) { emailHandler = new EmailHandler(); addressList = new AddressList(); sending = FALSE; receiving = FALSE; previewingMail = FALSE; mailIdCount = 1; accountIdCount = 1; allAccounts = FALSE; init(); connect(emailHandler, SIGNAL(mailSent()), this, SLOT(mailSent()) ); connect(emailHandler, SIGNAL(smtpError(int)), this, SLOT(smtpError(int)) ); connect(emailHandler, SIGNAL(popError(int)), this, SLOT(popError(int)) ); connect(inboxView, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(inboxItemSelected()) ); connect(outboxView, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(outboxItemSelected()) ); connect(inboxView, SIGNAL(pressed(QListViewItem *)), this, SLOT(inboxItemPressed()) ); connect(inboxView, SIGNAL(clicked(QListViewItem *)), this, SLOT(inboxItemReleased()) ); connect(emailHandler, SIGNAL(mailArrived(const Email &, bool)), this, SLOT(mailArrived(const Email &, bool)) ); connect(emailHandler, SIGNAL(mailTransfered(int)), this, SLOT(allMailArrived(int)) ); mailconf = new Config("mailit"); //In case Synchronize is not defined in settings.txt readSettings(); updateAccounts(); lineShift = "\n"; readMail(); lineShift = "\r\n"; + mailboxView->setCurrentTab(0); //ensure that inbox has focus } EmailClient::~EmailClient() { //needs to be moved from destructor to closewindow event saveMail(getPath(FALSE) + "inbox.txt", inboxView); //does not currently work. Defining outbox in the same //format as inbox is not a good solution as they have //different properties saveMail(getPath(FALSE) + "outbox.txt", outboxView); saveSettings(); mailconf->write(); delete mailconf; } void EmailClient::init() { statusBar = new QStatusBar(this); statusBar->setSizeGripEnabled(FALSE); status1Label = new QLabel( tr("Idle"), statusBar); status2Label = new QLabel("", statusBar); connect(emailHandler, SIGNAL(updatePopStatus(const QString &)), status2Label, SLOT(setText(const QString &)) ); connect(emailHandler, SIGNAL(updateSmtpStatus(const QString &)), status2Label, SLOT(setText(const QString &)) ); progressBar = new QProgressBar(statusBar); + connect(emailHandler, SIGNAL(mailboxSize(int)), this, SLOT(setTotalSize(int)) ); connect(emailHandler, SIGNAL(currentMailSize(int)), this, SLOT(setMailSize(int)) ); connect(emailHandler, SIGNAL(downloadedSize(int)), this, SLOT(setDownloadedSize(int)) ); statusBar->addWidget(status1Label); statusBar->addWidget(progressBar); statusBar->addWidget(status2Label); setToolBarsMovable(FALSE); bar = new QToolBar(this); + QWhatsThis::add(bar,tr("Main operation toolbar")); bar->setHorizontalStretchable( TRUE ); mb = new QMenuBar( bar ); QPopupMenu *mail = new QPopupMenu(mb); mb->insertItem( tr( "&Mail" ), mail); QPopupMenu *configure = new QPopupMenu(mb); mb->insertItem( tr( "Accounts" ), configure); selectAccountMenu = new QPopupMenu(mb); editAccountMenu = new QPopupMenu(mb); deleteAccountMenu = new QPopupMenu(mb); mail->insertItem(tr("Get Mail in"), selectAccountMenu); configure->insertItem(tr("Edit account"), editAccountMenu); configure->insertItem(tr("Delete account"), deleteAccountMenu); bar = new QToolBar(this); getMailButton = new QToolButton(Resource::loadPixmap("mailit/getmail"),tr("getMail"),tr("select account"), this,SLOT(getAllNewMail()),bar); - //connect(setAccountlButton, SIGNAL(activated()), this, SLOT(setCurrentAccount()) ); - // setAccountButton->addTo(bar); - //setAccountButton->addTo(mail); - - /*idCount = 0; - - for (MailAccount* accountPtr = accountList.first(); accountPtr != 0; - accountPtr = accountList.next()) { + QWhatsThis::add(getMailButton,tr("Click to download mail via all available accounts.\n Press and hold to select the desired account.")); - selectAccountMenu->insertItem(accountPtr->accountName,this, SLOT(selectAccount(int)), 0, idCount); - idCount++; - }*/ getMailButton->setPopup(selectAccountMenu); - - /*getMailButton = new QAction(tr("Get all mail"), Resource::loadPixmap("mailit/getmail"), QString::null, 0, this, 0); - connect(getMailButton, SIGNAL(activated()), this, SLOT(getAllNewMail()) ); - getMailButton->addTo(bar);*/ - //getMailButton->addTo(mail); - sendMailButton = new QAction(tr("Send mail"), Resource::loadPixmap("mailit/sendqueue"), QString::null, 0, this, 0); connect(sendMailButton, SIGNAL(activated()), this, SLOT(sendQuedMail()) ); sendMailButton->addTo(bar); sendMailButton->addTo(mail); + sendMailButton->setWhatsThis("Send mail queued in the outbox"); composeButton = new QAction(tr("Compose"), Resource::loadPixmap("new"), QString::null, 0, this, 0); connect(composeButton, SIGNAL(activated()), this, SLOT(compose()) ); composeButton->addTo(bar); composeButton->addTo(mail); + composeButton->setWhatsThis("Compose a new mail"); cancelButton = new QAction(tr("Cancel transfer"), Resource::loadPixmap("close"), QString::null, 0, this, 0); connect(cancelButton, SIGNAL(activated()), this, SLOT(cancel()) ); cancelButton->addTo(mail); cancelButton->addTo(bar); cancelButton->setEnabled(FALSE); + cancelButton->setWhatsThis("Stop the currently active mail transfer"); + deleteButton = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); connect( deleteButton, SIGNAL( activated() ), this, SLOT( deleteItem() ) ); deleteButton->addTo(bar); + deleteButton->setWhatsThis("Remove the currently selected eMail(s)"); mailboxView = new OTabWidget( this, "mailboxView" ); QWidget* widget = new QWidget( mailboxView, "widget" ); grid_2 = new QGridLayout( widget ); // grid_2->setSpacing(6); // grid_2->setMargin( 11 ); inboxView = new QListView( widget, "inboxView" ); inboxView->addColumn( tr( "From" ) ); inboxView->addColumn( tr( "Subject" ) ); inboxView->addColumn( tr( "Date" ) ); inboxView->setMinimumSize( QSize( 0, 0 ) ); inboxView->setAllColumnsShowFocus(TRUE); + QWhatsThis::add(inboxView,QWidget::tr("This is the inbox view.\n It keeps the fetched mail which can be viewed by double clicking the entry.\n" + " A blue attachment icon shows whether this mail has attachments.")); grid_2->addWidget( inboxView, 2, 0 ); mailboxView->addTab( widget, "mailit/inbox", tr( "Inbox" ) ); QWidget* widget_2 = new QWidget( mailboxView, "widget_2" ); grid_3 = new QGridLayout( widget_2 ); // grid_3->setSpacing(6); // grid_3->setMargin( 11 ); outboxView = new QListView( widget_2, "outboxView" ); outboxView->addColumn( tr( "To" ) ); outboxView->addColumn( tr( "Subject" ) ); outboxView->setAllColumnsShowFocus(TRUE); + QWhatsThis::add(outboxView,QWidget::tr("This is the oubox view.\n It keeps the queued mails to send which can be reviewed by double clicking the entry.")); grid_3->addWidget( outboxView, 0, 0 ); mailboxView->addTab( widget_2,"mailit/outbox", tr( "Outbox" ) ); setCentralWidget(mailboxView); - mailboxView->setCurrentTab(0); } void EmailClient::compose() { emit composeRequested(); } void EmailClient::cancel() { emailHandler->cancel(); } AddressList* EmailClient::getAdrListRef() { return addressList; } //this needs to be rewritten to syncronize with outboxView void EmailClient::enqueMail(const Email &mail) { if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(), tr("No account selected"), tr("You must create an account"), "OK\n"); return; } if (accountList.count() > 0) { currentAccount = accountList.first(); qWarning("using account " + currentAccount->name); } Email addMail = mail; addMail.from = currentAccount->name; addMail.fromMail = currentAccount->emailAddress; addMail.rawMail.prepend("From: " + addMail.from + "<" + addMail.fromMail + ">\n"); item = new EmailListItem(outboxView, addMail, false); mailboxView->setCurrentTab(1); } void EmailClient::sendQuedMail() { int count = 0; if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(), "No account selected", "You must create an account", "OK\n"); return; } //traverse listview, find messages to send if (! sending) { item = (EmailListItem *) outboxView->firstChild(); if (item != NULL) { while (item != NULL) { quedMessages.append(item->getMail()); item = (EmailListItem *) item->nextSibling(); count++; } setMailAccount(); emailHandler->sendMail(&quedMessages); sending = TRUE; sendMailButton->setEnabled(FALSE); cancelButton->setEnabled(TRUE); } else { qWarning("sendQuedMail(): no messages to send"); } } } void EmailClient::setMailAccount() { emailHandler->setAccount(*currentAccount); } void EmailClient::mailSent() { sending = FALSE; sendMailButton->setEnabled(TRUE); quedMessages.clear(); outboxView->clear(); //should be moved to an sentBox } void EmailClient::getNewMail() { if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(),"No account selected", "You must create an account", "OK\n"); return; } setMailAccount(); receiving = TRUE; previewingMail = TRUE; getMailButton->setEnabled(FALSE); cancelButton->setEnabled(TRUE); selectAccountMenu->setEnabled(FALSE); status1Label->setText(currentAccount->accountName + " headers"); progressBar->reset(); //get any previous mails not downloaded and add to queue -/* mailDownloadList.clear(); + mailDownloadList.clear(); Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); while (item != NULL) { mailPtr = item->getMail(); if ( (!mailPtr->downloaded) && (mailPtr->fromAccountId == currentAccount->id) ) { mailDownloadList.sizeInsert(mailPtr->serverId, mailPtr->size); } item = (EmailListItem *) item->nextSibling(); - }*/ + } emailHandler->getMailHeaders(); + } void EmailClient::getAllNewMail() { allAccounts = TRUE; currentAccount = accountList.first(); getNewMail(); } void EmailClient::mailArrived(const Email &mail, bool fromDisk) { Enclosure *ePtr; Email newMail; int thisMailId; emailHandler->parse(mail.rawMail, lineShift, &newMail); - mailconf->setGroup(newMail.id); - if (fromDisk) { + if (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 + } + else + { //mail arrived from server newMail.serverId = mail.serverId; newMail.size = mail.size; newMail.downloaded = mail.downloaded; newMail.fromAccountId = currentAccount->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 //header is not reloaded - if (currentAccount->synchronize) + if ((currentAccount)&&(currentAccount->synchronize)) currentAccount->lastServerMailCount++; mailconf->writeEntry("internalmailid", thisMailId); mailconf->writeEntry("downloaded", newMail.downloaded); mailconf->writeEntry("size", (int) newMail.size); mailconf->writeEntry("serverid", newMail.serverId); - addressList->addContact(newMail.fromMail, newMail.from); - } else if (!fromDisk) { //body to header arrived - mailconf->writeEntry("downloaded", TRUE); + //addressList->addContact(newMail.fromMail, newMail.from); } + + mailconf->writeEntry("downloaded", newMail.downloaded); + QString stringMailId; stringMailId.setNum(thisMailId); - //se if any attatchments needs to be stored + //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); } } } - if (!previewingMail && !fromDisk) { + + bool found=false; + + if (!fromDisk) + { + Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); - while (item != NULL) { + 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(); } - } else { - item = new EmailListItem(inboxView, newMail, TRUE); - if (!newMail.downloaded) - mailDownloadList.sizeInsert(newMail.serverId, newMail.size); } + if ((!found)||(fromDisk)) item = new EmailListItem(inboxView, newMail, TRUE); + + /*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 (!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(); - emailHandler->getMailByList(&mailDownloadList); + //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) 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"); } sending = FALSE; sendMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); quedMessages.clear(); } void EmailClient::popError(int code) { QString temp; if (code == ErrUnknownResponse) temp = "Unknown response from server"; if (code == ErrLoginFailed) temp = "Login failed\nCheck user name and password"; 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(), "Receiving error", temp, "OK\n"); } else { status2Label->setText("Aborted by user"); } receiving = FALSE; getMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); selectAccountMenu->setEnabled(TRUE); } void EmailClient::inboxItemSelected() { - killTimer(timerID); + //killTimer(timerID); item = (EmailListItem*) inboxView->selectedItem(); if (item != NULL) { emit viewEmail(inboxView, item->getMail()); } } void EmailClient::outboxItemSelected() { - killTimer(timerID); + //killTimer(timerID); item = (EmailListItem*) outboxView->selectedItem(); if (item != NULL) { emit viewEmail(outboxView, item->getMail()); } } void EmailClient::readMail() { Email mail; int start, stop; QString s, del; QFile f(getPath(FALSE) + "inbox.txt"); -// QFileInfo fi(f); - //qDebug( f.name()); if ( f.open(IO_ReadOnly) ) { // file opened successfully QTextStream t( &f ); // use a text stream s = t.read(); f.close(); start = 0; del = "\n.\n"; while ((uint) start < s.length()) { stop = s.find(del, start); if (stop == -1) stop = s.length() - del.length(); mail.rawMail = s.mid(start, stop + del.length() - start ); start = stop + del.length(); mailArrived(mail, TRUE); } } QFile fo(getPath(FALSE) + "outbox.txt"); if ( fo.open(IO_ReadOnly) ) { // file opened successfully QTextStream t( &fo ); // use a text stream s = t.read(); fo.close(); start = 0; del = "\n.\n"; while ((uint) start < s.length()) { stop = s.find(del, start); if (stop == -1) stop = s.length() - del.length(); mail.rawMail = s.mid(start, stop + del.length() - start ); start = stop + del.length(); emailHandler->parse(mail.rawMail, lineShift, &mail); mail.sent = false; mail.received = false; enqueMail(mail); } } } void EmailClient::saveMail(QString fileName, QListView *view) { QFile f(fileName); Email *mail; if (! f.open(IO_WriteOnly) ) { qWarning("could not open file"); return; } item = (EmailListItem *) view->firstChild(); - //qDebug (QString("Write : ") ); QTextStream t(&f); while (item != NULL) { mail = item->getMail(); - //qDebug(mail->rawMail); - //qDebug(mail->recipients.first()); t << mail->rawMail; mailconf->setGroup(mail->id); mailconf->writeEntry("mailread", mail->read); item = (EmailListItem *) item->nextSibling(); } f.close(); } //paths for mailit, is settings, inbox, enclosures QString EmailClient::getPath(bool enclosurePath) { QString basePath = "qtmail"; QString enclosures = "enclosures"; QDir dir = (QString(getenv("HOME")) + "/Applications/" + basePath); if ( !dir.exists() ) dir.mkdir( dir.path() ); if (enclosurePath) { dir = (QString(getenv("HOME")) + "/Applications/" + basePath + "/" + enclosures); if ( !dir.exists() ) dir.mkdir( dir.path() ); return (dir.path() + "/"); } return (dir.path() + "/"); } void EmailClient::readSettings() { - TextParser *p; - QString s; - int pos, accountPos, y; - QFile f( getPath(FALSE) + "settings.txt"); - - if ( f.open(IO_ReadOnly) ) { // file opened successfully - QTextStream t( &f ); // use a text stream - s = t.read(); - f.close(); - - p = new TextParser(s, "\n"); - - accountPos = 0; - while ( (accountPos = p->find("ACCOUNTSTART",';', accountPos, TRUE)) != -1 ) { - accountPos++; - if ( (pos = p->find("ACCOUNTNAME",':', accountPos, TRUE)) != -1 ) - account.accountName = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("NAME",':', accountPos, TRUE)) != -1) - account.name = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("EMAIL",':', accountPos, TRUE)) != -1) - account.emailAddress = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPUSER",':', accountPos, TRUE)) != -1) - account.popUserName = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPPASSWORD",':', accountPos, TRUE)) != -1) - account.popPasswd = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPSERVER",':', accountPos, TRUE)) != -1) - account.popServer = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("SMTPSERVER",':', accountPos, TRUE)) != -1) - account.smtpServer = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("ACCOUNTID",':', accountPos, TRUE)) != -1) { - s = p->getString(& ++pos, 'z', TRUE); - account.id = s.toInt(); - } + int y,acc_count, accountPos=0; + 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",""); + account.popServer = mailconf->readEntry("POPServer",""); + account.smtpServer = mailconf->readEntry("SMTPServer",""); + account.id = mailconf->readNumEntry("AccountId",0); + account.syncLimit = mailconf->readNumEntry("HeaderLimit",0); account.lastServerMailCount = 0; account.synchronize = FALSE; - if ( (pos = p->find("SYNCHRONIZE",':', accountPos, TRUE)) != -1) { - if (p->getString(& ++pos, 'z', TRUE).upper() == "YES") { - account.synchronize = TRUE; - if ( (pos = p->find("LASTSERVERMAILCOUNT",':', accountPos, TRUE)) != -1) { - s = p->getString(& ++pos, 'z', TRUE); - account.lastServerMailCount = s.toInt(); - } - } - } - if ( (pos = p->find("SYNCLIMIT",':', accountPos, TRUE)) != -1) { - account.syncLimit = p->getString(& ++pos, 'z', TRUE).toInt(); + account.synchronize = (mailconf->readEntry("Synchronize","No")=="Yes"); + if (account.synchronize) + { + mailconf->readNumEntry("LASTSERVERMAILCOUNT",0); } - accountList.append(&account); } - delete p; - } + mailconf->setGroup("mailitglobal"); - if ( (y = mailconf->readNumEntry("mailidcount", -1)) != -1) { + + if ( (y = mailconf->readNumEntry("mailidcount", -1)) != -1) + { mailIdCount = y; } - if ( (y = mailconf->readNumEntry("accountidcount", -1)) != -1) { + if ( (y = mailconf->readNumEntry("accountidcount", -1)) != -1) + { accountIdCount = y; } } void EmailClient::saveSettings() { - - QString temp; - QFile f( getPath(FALSE) + "settings.txt"); + int acc_count=0; MailAccount *accountPtr; - if (! f.open(IO_WriteOnly) ) { - qWarning("could not save settings file"); + + if (!mailconf) + { + qWarning("could not save settings"); return; } - QTextStream t(&f); - t << "#Settings for OPIE Mailit program\n"; for (accountPtr = accountList.first(); accountPtr != 0; - accountPtr = accountList.next()) { - - t << "accountStart;\n"; - t << "AccountName: " + accountPtr->accountName + "\n"; - t << "Name: " + accountPtr->name + "\n"; - t << "Email: " + accountPtr->emailAddress + "\n"; - t << "POPUser: " + accountPtr->popUserName + "\n"; - t << "POPPAssword: " + accountPtr->popPasswd + "\n"; - t << "POPServer: " + accountPtr->popServer + "\n"; - t << "SMTPServer: " + accountPtr->smtpServer + "\n"; - t << "AccountId: " << accountPtr->id << "\n"; - if (accountPtr->synchronize) { - t << "Synchronize: Yes\n"; - t << "LastServerMailCount: "; - t << accountPtr->lastServerMailCount << "\n"; - } else { - t << "Synchronize: No\n"; + accountPtr = accountList.next()) + { + mailconf->setGroup("Account_"+QString::number(++acc_count)); + mailconf->writeEntry("AccName",accountPtr->accountName ); + mailconf->writeEntry("UserName",accountPtr->name); + mailconf->writeEntry("Email",accountPtr->emailAddress); + mailconf->writeEntry("POPUser",accountPtr->popUserName); + mailconf->writeEntryCrypt("POPPassword",accountPtr->popPasswd); + mailconf->writeEntry("POPServer",accountPtr->popServer); + mailconf->writeEntry("SMTPServer",accountPtr->smtpServer); + mailconf->writeEntry("AccountId",accountPtr->id); + if (accountPtr->synchronize) + { + mailconf->writeEntry("Synchronize","Yes"); + mailconf->writeEntry("HeaderLimit",accountPtr->syncLimit); + mailconf->writeEntry("LastServerMailCount",accountPtr->lastServerMailCount); + } + else + { + mailconf->writeEntry("Synchronize", "No"); } - t << "SyncLimit: "; - t << accountPtr->syncLimit << "\n"; - t << "accountEnd;\n"; } - f.close(); mailconf->setGroup("mailitglobal"); + mailconf->writeEntry("Accounts",acc_count); mailconf->writeEntry("mailidcount", mailIdCount); mailconf->writeEntry("accountidcount", accountIdCount); } void EmailClient::selectAccount(int id) { if (accountList.count() > 0) { currentAccount = accountList.at(id); emit newCaption("Mailit - " + currentAccount->accountName); getNewMail(); } else { emit newCaption("Mailit ! No account defined"); } } void EmailClient::editAccount(int id) { MailAccount *newAccount; editAccountView = new EditAccount(this, "account", TRUE); if (id == newAccountId) { //new account newAccount = new MailAccount; editAccountView->setAccount(newAccount); } else { newAccount = accountList.at(id); editAccountView->setAccount(newAccount, FALSE); } editAccountView->showMaximized(); editAccountView->exec(); if (editAccountView->result() == QDialog::Accepted) { if (id == newAccountId) { newAccount->id = accountIdCount; accountIdCount++; accountList.append(newAccount); updateAccounts(); } else { updateAccounts(); } } delete editAccountView; } void EmailClient::deleteAccount(int id) { MailAccount *newAccount; QString message; newAccount = accountList.at(id); message = "Delete account:\n" + newAccount->accountName; switch( QMessageBox::warning( this, "Mailit", message, "Yes", "No", 0, 0, 1 ) ) { case 0: accountList.remove(id); updateAccounts(); break; case 1: break; } } void EmailClient::updateAccounts() { MailAccount *accountPtr; //rebuild menus, clear all first editAccountMenu->clear(); selectAccountMenu->clear(); deleteAccountMenu->clear(); newAccountId = editAccountMenu->insertItem("New", this, SLOT(editAccount(int)) ); editAccountMenu->insertSeparator(); idCount = 0; for (accountPtr = accountList.first(); accountPtr != 0; accountPtr = accountList.next()) { editAccountMenu->insertItem(accountPtr->accountName, this, SLOT(editAccount(int)), 0, idCount); selectAccountMenu->insertItem(accountPtr->accountName, this, SLOT(selectAccount(int)), 0, idCount); deleteAccountMenu->insertItem(accountPtr->accountName, this, SLOT(deleteAccount(int)), 0, idCount); idCount++; } } void EmailClient::deleteMail(EmailListItem *mailItem, bool &inbox) { Email *mPtr; Enclosure *ePtr; if (inbox) diff --git a/noncore/net/mailit/emailhandler.cpp b/noncore/net/mailit/emailhandler.cpp index f6c6d60..b180051 100644 --- a/noncore/net/mailit/emailhandler.cpp +++ b/noncore/net/mailit/emailhandler.cpp @@ -11,309 +11,325 @@ ** 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 <qfileinfo.h> #include <stdlib.h> #include <qapplication.h> #include <qmessagebox.h> #include <qcstring.h> #include "emailhandler.h" #include <qpe/applnk.h> #include <qpe/filemanager.h> QCollection::Item EnclosureList::newItem(QCollection::Item d) { return dupl( (Enclosure *) d); } Enclosure* EnclosureList::dupl(Enclosure *in) { ac = new Enclosure(*in); return ac; } EmailHandler::EmailHandler() { smtpClient = new SmtpClient(); popClient = new PopClient(); connect(smtpClient, SIGNAL(errorOccurred(int)), this, SIGNAL(smtpError(int)) ); connect(smtpClient, SIGNAL(mailSent()), this, SIGNAL(mailSent()) ); connect(smtpClient, SIGNAL(updateStatus(const QString &)), this, SIGNAL(updateSmtpStatus(const QString &)) ); connect(popClient, SIGNAL(errorOccurred(int)), this, SIGNAL(popError(int)) ); connect(popClient, SIGNAL(newMessage(const QString &, int, uint, bool)), this, SLOT(messageArrived(const QString &, int, uint, bool)) ); connect(popClient, SIGNAL(updateStatus(const QString &)), this, SIGNAL(updatePopStatus(const QString &)) ); connect(popClient, SIGNAL(mailTransfered(int)), this, SIGNAL(mailTransfered(int)) ); //relaying size information connect(popClient, SIGNAL(currentMailSize(int)), this, SIGNAL(currentMailSize(int)) ); connect(popClient, SIGNAL(downloadedSize(int)), this, SIGNAL(downloadedSize(int)) ); } void EmailHandler::sendMail(QList<Email> *mailList) { Email *currentMail; QString temp; QString userName = mailAccount.name; userName += " <" + mailAccount.emailAddress + ">"; for (currentMail = mailList->first(); currentMail != 0; currentMail = mailList->next()) { if (encodeMime(currentMail) == 0) { smtpClient->addMail(userName, currentMail->subject, currentMail->recipients, currentMail->rawMail); } else { //error temp = tr("Could not locate all files in \nmail with subject: ") + currentMail->subject; temp += tr("\nMail has NOT been sent"); QMessageBox::warning(qApp->activeWindow(), tr("Attachment error"), temp, tr("OK\n")); } } smtpClient->newConnection(mailAccount.smtpServer, 25); } void EmailHandler::setAccount(MailAccount account) { mailAccount = account; } void EmailHandler::getMail() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); if (mailAccount.synchronize) { popClient->setSynchronize(mailAccount.lastServerMailCount); } else { popClient->removeSynchronize(); } headers = FALSE; - popClient->headersOnly(headers, 0); + //popClient->headersOnly(headers, 0); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::getMailHeaders() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); - if (mailAccount.synchronize) { - popClient->setSynchronize(mailAccount.lastServerMailCount); - } else { - popClient->removeSynchronize(); - } + mailAccount.synchronize ? popClient->setSynchronize(mailAccount.lastServerMailCount): popClient->removeSynchronize(); headers = TRUE; popClient->headersOnly(headers, mailAccount.syncLimit); //less than requested syncLimit, download all 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->setSelectedMails(mailList); } -void EmailHandler::messageArrived(const QString &message, int id, uint size, bool complete) +void EmailHandler::messageArrived(const QString &message, int id, uint size, bool incomplete) { Email mail; mail.rawMail = message; mail.serverId = id; mail.size = size; - mail.downloaded = complete; + mail.downloaded = incomplete; 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; 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); 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++; 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; } } - //@@@ToDo: Rewrite the parser as To: stops at the first occurence- which is Delivered-To: - if ((pos = p.find("TO",':', 0, TRUE)) != -1) + 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)!='-') { pos++; + mail->recipients.append(p.getString(&pos, '\r', TRUE)); + } + /*else { + if ((p.separatorAt(pos) == '<')|| (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; + } mail->recipients.append (p.getString(&pos, 'z', TRUE) ); + }*/ } + // + //if (pos==-1) mail->recipients.append (tr("undisclosed recipients") ); - //@@@ToDo: Rewrite the parser as To: stops at the first occurence- which is Delivered-To: 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); + 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; 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") { diff --git a/noncore/net/mailit/emaillistitem.cpp b/noncore/net/mailit/emaillistitem.cpp index a325766..b925a1c 100644 --- a/noncore/net/mailit/emaillistitem.cpp +++ b/noncore/net/mailit/emaillistitem.cpp @@ -1,97 +1,99 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qstring.h> #include <qpe/resource.h> #include "emaillistitem.h" EmailListItem::EmailListItem(QListView *parent, Email mailIn, bool inbox) : QListViewItem(parent) { QString temp; mail = mailIn; if (inbox) { setText(0, mail.from); } else { QStringList::Iterator it = mail.recipients.begin(); temp = *it; if (mail.recipients.count() > 1) temp += "..."; setText(0, temp); } setText(1, mail.subject); + setText(2,mail.date); if (mailIn.files.count()>0) { setPixmap(0, Resource::loadPixmap("mailit/attach")); } + selected = FALSE; } Email* EmailListItem::getMail() { return &mail; } void EmailListItem::setMail(Email newMail) { mail = newMail; repaint(); } void EmailListItem::setItemSelected(bool enable) { selected = enable; setSelected(enable); repaint(); } bool EmailListItem::isItemSelected() { return selected; } void EmailListItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { QColorGroup _cg( cg ); QColor c = _cg.text(); if ( (! mail.read) && (mail.received) ) _cg.setColor( QColorGroup::Text, Qt::blue); if (!mail.downloaded) _cg.setColor( QColorGroup::Text, Qt::red); /* if (selected) { _cg.setColor(QColorGroup::Base, Qt::blue); _cg.setColor(QColorGroup::Text, Qt::yellow); if (isSelected()) { _cg.setColor(QColorGroup::HighlightedText, Qt::yellow); } else { _cg.setColor(QColorGroup::Highlight, Qt::blue); } } */ QListViewItem::paintCell( p, _cg, column, width, alignment ); _cg.setColor( QColorGroup::Text, c ); } diff --git a/noncore/net/mailit/mailitwindow.cpp b/noncore/net/mailit/mailitwindow.cpp index ef5fc09..7181adf 100644 --- a/noncore/net/mailit/mailitwindow.cpp +++ b/noncore/net/mailit/mailitwindow.cpp @@ -1,165 +1,143 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qwhatsthis.h> #include "mailitwindow.h" MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) - : QMainWindow(parent, name, 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"); readMail = new ReadMail(views, "reading"); views->raiseWidget(emailClient); connect(emailClient, SIGNAL(composeRequested()), this, SLOT(compose()) ); connect(emailClient, SIGNAL(viewEmail(QListView *, Email *)), this, SLOT(viewMail(QListView *, Email *)) ); connect(emailClient, SIGNAL(mailUpdated(Email *)), this, SLOT(updateMailView(Email *)) ); connect(writeMail, SIGNAL(cancelMail()), this, SLOT(showEmailClient()) ); connect(writeMail, SIGNAL(sendMailRequested(const Email &)), this, SLOT(showEmailClient()) ); connect(writeMail, SIGNAL(sendMailRequested(const Email &)), emailClient, SLOT(enqueMail(const Email &)) ); connect(readMail, SIGNAL(cancelView()), this, SLOT(showEmailClient()) ); connect(readMail, SIGNAL(replyRequested(Email &, bool&)), this, 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()); 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(); readMail->update(view, mail); views->raiseWidget(readMail); setCaption( tr( "Examine 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); } - -/*void MailItWindow::reply(Email& mail) -{ - qDebug("####EmailClient: 0 reached"); - composeReply(mail,(bool&)FALSE); -} - -void MailItWindow::replyAll(Email& mail) -{ - qDebug("####EmailClient: 1 reached"); - composeReply(mail,(bool&)TRUE); -} - -void MailItWindow::forward(Email& mail) -{ - qDebug("####EmailClient: 2 reached"); -} - -void MailItWindow::remove(Email&) -{ - qDebug("####EmailClient: 3 reached"); - //emit removeItem(eli,(bool&)TRUE); -} */
\ No newline at end of file diff --git a/noncore/net/mailit/popclient.cpp b/noncore/net/mailit/popclient.cpp index f9cc337..67306be 100644 --- a/noncore/net/mailit/popclient.cpp +++ b/noncore/net/mailit/popclient.cpp @@ -26,350 +26,342 @@ extern "C" { } #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"); return; } status = Init; socket->connectToHost(target, port); receiving = TRUE; selected = FALSE; emit updateStatus("DNS lookup"); } void PopClient::setAccount(QString popUser, QString popPasswd) { popUserName = popUser; popPassword = popPasswd; } void PopClient::setSynchronize(int lastCount) { synchronize = TRUE; lastSync = lastCount; } void PopClient::removeSynchronize() { synchronize = FALSE; lastSync = 0; } void PopClient::headersOnly(bool headers, int limit) { preview = headers; headerLimit = limit; } void PopClient::setSelectedMails(MailList *list) { selected = TRUE; 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(); - //qDebug(response +" %d", status); 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; - //qDebug( md5Source); -// for( int i = 0; i < md5Source.length(); i++) { -// buff[i] = (QChar)md5Source[i]; -// } md5_buffer( (char const *)md5Source, md5Source.length(),&md5Digest[0]); -// md5_buffer(char const *buffer, unsigned int len, char *digest); - -// MD5_Init( &ctx); -// MD5_Update( &ctx, buff, sizeof( buff) ); -// MD5_Final( md5Digest, &ctx); -// MD5( buff, md5Source.length(), md5Digest); 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; } - //password shhh. don't tell anyone (implement APOP...) + case Pass: { *stream << "PASS " << popPassword << "\r\n"; status = Stat; break; } //ask for number of messages case Stat: { if (response[0] == '+') { *stream << "STAT" << "\r\n"; 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; messageCount = 1; } if (selected) { int *ptr = mailList->first(); if (ptr != 0) { newMessages++; //to ensure no early jumpout messageCount = *(mailList->first()); } 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) { temp.setNum(messageCount); emit updateStatus(tr("Previous message ") + temp); } 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, ""); int x = temp.find(" ", 0); temp = temp.right(temp.length() - ((uint) x + 1) ); mailSize = temp.toInt(); emit currentMailSize(mailSize); status = Retr; } else { //qWarning(response); errorHandling(ErrUnknownResponse); } } } //Read message number x, count upwards to messageCount case Retr: { if (status != Quit) { - if (!preview || mailSize <= headerLimit) { + if (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] == '+') { 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 //complete mail downloaded - if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ + //if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ + if ( mailSize <= headerLimit) + { 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 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 { *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/readmail.cpp b/noncore/net/mailit/readmail.cpp index dc98a6f..4eae7f6 100644 --- a/noncore/net/mailit/readmail.cpp +++ b/noncore/net/mailit/readmail.cpp @@ -1,357 +1,367 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "readmail.h" #include <qimage.h> #include <qmime.h> #include <qaction.h> #include <qpe/resource.h> ReadMail::ReadMail( QWidget* parent, const char* name, WFlags fl ) : QMainWindow(parent, name, fl) { plainTxt = FALSE; init(); viewAtt = new ViewAtt(0, "View Attatchments"); } ReadMail::~ReadMail() { delete emailView->mimeSourceFactory(); delete viewAtt; } void ReadMail::init() { setToolBarsMovable(FALSE); bar = new QToolBar(this); bar->setHorizontalStretchable( TRUE ); menu = new QMenuBar( bar ); viewMenu = new QPopupMenu(menu); menu->insertItem( tr( "&View" ), viewMenu); mailMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Mail" ), mailMenu); bar = new QToolBar(this); //reply dependant on viewing inbox replyButton = new QAction( tr( "Reply" ), Resource::loadPixmap( "mailit/reply" ), QString::null, 0, this, 0 ); connect(replyButton, SIGNAL(activated()), this, SLOT(reply()) ); + replyButton->setWhatsThis(tr("Click here to reply to the selected mail")); forwardButton = new QAction( tr( "Forward" ), Resource::loadPixmap( "mailit/forward" ), QString::null, 0, this, 0 ); connect(forwardButton, SIGNAL(activated()), this, SLOT(forward()) ); + forwardButton->setWhatsThis(tr("Click here to forward the selected mail")); previousButton = new QAction( tr( "Previous" ), Resource::loadPixmap( "back" ), QString::null, 0, this, 0 ); connect( previousButton, SIGNAL( activated() ), this, SLOT( previous() ) ); previousButton->addTo(bar); previousButton->addTo(viewMenu); + previousButton->setWhatsThis(tr("Read the previous mail in the list")); nextButton = new QAction( tr( "Next" ), Resource::loadPixmap( "forward" ), QString::null, 0, this, 0 ); connect( nextButton, SIGNAL( activated() ), this, SLOT( next() ) ); nextButton->addTo(bar); nextButton->addTo(viewMenu); + previousButton->setWhatsThis(tr("Read the next mail in the list")); - attatchmentsButton = new QAction( tr( "Attatchments" ), Resource::loadPixmap( "mailit/attach" ), QString::null, 0, this, 0 ); - connect( attatchmentsButton, SIGNAL( activated() ), this, - SLOT( viewAttatchments() ) ); - attatchmentsButton->addTo(bar); - attatchmentsButton->addTo(viewMenu); + attachmentButton = new QAction( tr( "Attatchments" ), Resource::loadPixmap( "mailit/attach" ), QString::null, 0, this, 0 ); + connect( attachmentButton, SIGNAL( activated() ), this, + SLOT( viewAttachments() ) ); + attachmentButton->addTo(bar); + attachmentButton->addTo(viewMenu); + attachmentButton->setWhatsThis(tr("Click here to add attachments to your mail")); plainTextButton = new QAction( tr( "Text Format" ), Resource::loadPixmap( "DocsIcon" ), QString::null, 0, this, 0, TRUE); connect( plainTextButton, SIGNAL( activated() ), this, SLOT( shiftText() ) ); plainTextButton->addTo(bar); plainTextButton->addTo(viewMenu); + plainTextButton->setWhatsThis(tr("The mail view has 2 modes:\n" + "<LI><B>RichText</B> shows the mail as HTML with reach features (no standard line breaks)</LI>" + "<LI><B>Plain</B> shows the mail as standard plain text</LI>" + "Click here to switch between those view modes" )); deleteButton = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); connect( deleteButton, SIGNAL( activated() ), this, SLOT( deleteItem() ) ); deleteButton->addTo(bar); deleteButton->addTo(mailMenu); + deleteButton->setWhatsThis(tr("Click here to remove the selected mail")); viewMenu->insertItem(Resource::loadPixmap("close"), "Close", this, SLOT(close())); emailView = new QTextView( this, "emailView" ); setCentralWidget(emailView); mime = new QMimeSourceFactory(); emailView->setMimeSourceFactory(mime); } void ReadMail::updateView() { Enclosure *ePtr; QString mailStringSize; QString text, temp; mail->read = TRUE; //mark as read inbox = mail->received; replyButton->removeFrom(mailMenu); replyButton->removeFrom(bar); forwardButton->removeFrom(mailMenu); forwardButton->removeFrom(bar); if (inbox == TRUE) { replyButton->addTo(bar); replyButton->addTo(mailMenu); forwardButton->addTo(bar); forwardButton->addTo(mailMenu); if (!mail->downloaded) { //report currently viewed mail so that it will be //placed first in the queue of new mails to download emit viewingMail(mail); double mailSize = (double) mail->size; if (mailSize < 1024) { mailStringSize.setNum(mailSize); mailStringSize += " Bytes"; } else if (mailSize < 1024*1024) { mailStringSize.setNum( (mailSize / 1024), 'g', 2 ); mailStringSize += " Kb"; } else { mailStringSize.setNum( (mailSize / (1024*1024)), 'g', 3); mailStringSize += " Mb"; } } } QMimeSourceFactory *mime = emailView->mimeSourceFactory(); if (! plainTxt) { //use RichText, inline pics etc. emailView->setTextFormat(QTextView::RichText); text = "<b><big><center><font color=\"blue\">" + mail->subject +"</font></center></big></b><br>"; text += "<b>From: </b>" + mail->from + " <i>" + mail->fromMail + "</i><br>"; text +="<b>To: </b>"; for (QStringList::Iterator it = mail->recipients.begin(); it != mail->recipients.end(); ++it ) { text += *it + " "; } text +="<br><b>CC: </b>"; for (QStringList::Iterator it = mail->carbonCopies.begin(); it != mail->carbonCopies.end(); ++it ) { text += *it + " "; } text += "<br>" + mail->date; if (mail->files.count() > 0) { text += "<br><b>Attatchments: </b>"; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += ePtr->originalName + " "; } text += "<hr><br>" + mail->body; if (inbox) { for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += "<br><hr><b>Attatchment: </b>" + ePtr->originalName + "<hr>"; if (ePtr->contentType == "TEXT") { QFile f(ePtr->path + ePtr->name); if (f.open(IO_ReadOnly) ) { QTextStream t(&f); temp = t.read(); text += temp + "<br>"; f.close(); } else { text += "<b>Could not locate file</b><br>"; } } if (ePtr->contentType == "IMAGE") { // temp.setNum(emailView->width()); //get display width // text += "<img width=" + temp +" src =""" + // ePtr->originalName + """> </img>"; text += "<img src =""" + ePtr->originalName + """> </img>"; mime->setPixmap(ePtr->originalName, QPixmap( (ePtr->path + ePtr->name) )); } } } } else { if (mail->downloaded || !inbox) { text += "<hr><br>" + mail->body; } else { text += "<hr><br><b> Awaiting download </b><br>"; text += "Size of mail: " + mailStringSize; } } emailView->setText(text); } else { // show plain txt mail emailView->setTextFormat(QTextView::PlainText); text = "Subject: " + mail->subject + "\n"; text += "From: " + mail->from + " " + mail->fromMail + "\n"; text += "To: "; for (QStringList::Iterator it = mail->recipients.begin(); it != mail->recipients.end(); ++it ) { text += *it + " "; } text += "\nCC: "; for (QStringList::Iterator it = mail->carbonCopies.begin(); it != mail->carbonCopies.end(); ++it ) { text += *it + " "; } text += "\nDate: " + mail->date + "\n"; if (mail->files.count() > 0) { text += "Attatchments: "; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += ePtr->originalName + " "; } text += "\n\n"; } else text += "\n"; if (!inbox) { text += mail->body; } else if (mail->downloaded) { text += mail->bodyPlain; } else { text += "\nAwaiting download\n"; text += "Size of mail: " + mailStringSize; } emailView->setText(text); } if (mail->files.count() == 0) - attatchmentsButton->setEnabled(FALSE); - else attatchmentsButton->setEnabled(TRUE); + attachmentButton->setEnabled(FALSE); + else attachmentButton->setEnabled(TRUE); setCaption("Examining mail: " + mail->subject); } //update view with current EmailListItem (item) void ReadMail::update(QListView *thisView, Email *mailIn) { view = thisView; item = (EmailListItem *) view->selectedItem(); mail = mailIn; updateView(); updateButtons(); } void ReadMail::mailUpdated(Email *mailIn) { if (mailIn == mail) { updateView(); } else { updateButtons(); } } void ReadMail::close() { emit cancelView(); } //gets next item in listview, exits if there is no next void ReadMail::next() { item = (EmailListItem *) item->nextSibling(); if (item != NULL) { mail = item->getMail(); updateView(); } updateButtons(); } //gets previous item in listview, exits if there is no previous void ReadMail::previous() { item = (EmailListItem *) item->itemAbove(); if (item != NULL) { mail = item->getMail(); updateView(); } updateButtons(); } //deletes item, tries bringing up next or previous, exits if unsucessful void ReadMail::deleteItem() { EmailListItem *temp = item; temp = (EmailListItem *) item->nextSibling(); //trybelow if (temp == NULL) temp = (EmailListItem *) item->itemAbove(); //try above emit removeItem(item, inbox); item = temp; if (item != NULL) { //more items in list mail = item->getMail(); updateView(); updateButtons(); } else close(); //no more items to see } void ReadMail::updateButtons() { EmailListItem *temp; temp = item; if ((EmailListItem *) temp->nextSibling() == NULL) nextButton->setEnabled(FALSE); else nextButton->setEnabled(TRUE); temp = item; if ((EmailListItem *) temp->itemAbove() == NULL) previousButton->setEnabled(FALSE); else previousButton->setEnabled(TRUE); } void ReadMail::shiftText() { plainTxt = ! plainTxt; updateView(); } -void ReadMail::viewAttatchments() +void ReadMail::viewAttachments() { viewAtt->update(mail, inbox); viewAtt->showMaximized(); } void ReadMail::reply() { emit replyRequested(*mail, (bool&)TRUE); } void ReadMail::forward() { emit forwardRequested(*mail); } diff --git a/noncore/net/mailit/readmail.h b/noncore/net/mailit/readmail.h index 0fe0646..df32c34 100644 --- a/noncore/net/mailit/readmail.h +++ b/noncore/net/mailit/readmail.h @@ -1,89 +1,89 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef READMAIL_H #define READMAIL_H #include <qaction.h> #include <qmainwindow.h> #include <qmenubar.h> #include <qpopupmenu.h> #include <qlabel.h> #include <qlistview.h> #include <qlayout.h> #include <qtextview.h> #include "emailhandler.h" #include "emaillistitem.h" #include "viewatt.h" class ReadMail : public QMainWindow { Q_OBJECT public: ReadMail( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~ReadMail(); void update(QListView *thisView, Email *mailIn); void updateView(); void mailUpdated(Email *mailIn); signals: void cancelView(); void replyRequested(Email &, bool &); void forwardRequested(Email&); void removeItem(EmailListItem *, bool &); void viewingMail(Email *); public slots: void close(); void next(); void previous(); void deleteItem(); void shiftText(); - void viewAttatchments(); + void viewAttachments(); void reply(); void forward(); private: void init(); void updateButtons(); private: QListView *view; EmailListItem *item; bool plainTxt, inbox; Email *mail; ViewAtt *viewAtt; QToolBar *bar; QMenuBar *menu; QPopupMenu *viewMenu, *mailMenu; QAction *deleteButton; QMimeSourceFactory *mime; QAction *plainTextButton; QAction *nextButton; QTextView *emailView; - QAction *attatchmentsButton; + QAction *attachmentButton; QAction *previousButton; QAction *replyButton; QAction *forwardButton; }; #endif // READMAIL_H diff --git a/noncore/net/mailit/smtpclient.cpp b/noncore/net/mailit/smtpclient.cpp index b2e38e5..8a51a5b 100644 --- a/noncore/net/mailit/smtpclient.cpp +++ b/noncore/net/mailit/smtpclient.cpp @@ -1,171 +1,163 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "smtpclient.h" #include "emailhandler.h" SmtpClient::SmtpClient() { socket = new QSocket(this, "smtpClient"); stream = new QTextStream(socket); mailList.setAutoDelete(TRUE); connect(socket, SIGNAL(error(int)), this, SLOT(errorHandling(int))); connect(socket, SIGNAL(connected()), this, SLOT(connectionEstablished())); connect(socket, SIGNAL(readyRead()), this, SLOT(incomingData())); sending = FALSE; } SmtpClient::~SmtpClient() { delete socket; delete stream; } void SmtpClient::newConnection(QString target, int port) { if (sending) { qWarning("socket in use, connection refused"); return; } status = Init; sending = TRUE; socket->connectToHost(target, port); emit updateStatus(tr("DNS lookup")); } void SmtpClient::addMail(QString from, QString subject, QStringList to, QString body) { RawEmail *mail = new RawEmail; mail->from = from; mail->subject = subject; mail->to = to; mail->body = body; mailList.append(mail); } void SmtpClient::connectionEstablished() { emit updateStatus(tr("Connection established")); } void SmtpClient::errorHandling(int status) { emit errorOccurred(status); socket->close(); mailList.clear(); sending = FALSE; } void SmtpClient::incomingData() { QString response; if (!socket->canReadLine()) return; response = socket->readLine(); - //qDebug(response); switch(status) { case Init: { if (response[0] == '2') { status = From; mailPtr = mailList.first(); *stream << "HELO there\r\n"; - //qDebug("HELO"); } else errorHandling(ErrUnknownResponse); break; } case From: { if (response[0] == '2') { *stream << "MAIL FROM: " << mailPtr->from << "\r\n"; status = Recv; - //qDebug("MAIL FROM: "+mailPtr->from); } else errorHandling(ErrUnknownResponse); break; } case Recv: { if (response[0] == '2') { it = mailPtr->to.begin(); if (it == NULL) errorHandling(ErrUnknownResponse); *stream << "RCPT TO: " << *it << ">\r\n"; - //qDebug("RCPT TO: "+ *it); status = MRcv; } else errorHandling(ErrUnknownResponse); break; } case MRcv: { if (response[0] == '2') { it++; if ( it != mailPtr->to.end() ) { *stream << "RCPT TO: <" << *it << ">\r\n"; - //qDebug("RCPT TO: "+ *it); break; } else { status = Data; } } else errorHandling(ErrUnknownResponse); } case Data: { if (response[0] == '2') { *stream << "DATA\r\n"; status = Body; - //qDebug("DATA"); emit updateStatus(tr("Sending: ") + mailPtr->subject); } else errorHandling(ErrUnknownResponse); break; } case Body: { if (response[0] == '3') { *stream << mailPtr->body << "\r\n.\r\n"; mailPtr = mailList.next(); if (mailPtr != NULL) { status = From; } else { status = Quit; } - //qDebug("BODY"); } else errorHandling(ErrUnknownResponse); break; } case Quit: { if (response[0] == '2') { *stream << "QUIT\r\n"; status = Done; QString temp; temp.setNum(mailList.count()); emit updateStatus(tr("Sent ") + temp + tr(" messages")); emit mailSent(); mailList.clear(); sending = FALSE; socket->close(); - //qDebug("QUIT"); } else errorHandling(ErrUnknownResponse); break; } } } diff --git a/noncore/net/mailit/textparser.cpp b/noncore/net/mailit/textparser.cpp index f082417..3fa5f6e 100644 --- a/noncore/net/mailit/textparser.cpp +++ b/noncore/net/mailit/textparser.cpp @@ -1,181 +1,191 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "textparser.h" TextParser::TextParser(QString in, QString lineBreak) { data = in; lineSep = lineBreak; init(); createSeparators(); split(); } TextParser::TextParser(QString in, QString lineBreak, QString sep) { data = in; lineSep = lineBreak; init(); separators = sep; split(); } void TextParser::init() { lineCount = 0; linePos = 0; totalElmCount = 0; separatorPos = -1; //not initialized wordPos = -1; //not initialized sepAtLine = 0; sepAtPosElm = -1; //such that nextSep equals 0 wordAtLine = 0; wordAtPosElm = -1; //such that nextWord equals 0 atLine = 0; atPosElm = 0; } void TextParser::createSeparators() { separators = " @#,.:;<>*/(){}|'?-+=_"; } /* Returns pos of given search criteria, -1 if not found */ int TextParser::find(QString target, QChar sep, int pos, bool upperCase) { + + t_splitElm parsstr; + QString pString; + int atLine = 0, atPosElm = 0; - for (int x = 0; x < totalElmCount; x++) { - if (x >= pos) { - if (upperCase) { - if ((splitDone[atLine].elm[atPosElm].str.upper() == target) && - (splitDone[atLine].elm[atPosElm].separator == sep)) - return x; - } else { - if ((splitDone[atLine].elm[atPosElm].str == target) && - (splitDone[atLine].elm[atPosElm].separator == sep)) - return x; + getLineReference(pos,&atLine,&atPosElm); + + for (int x = pos; x < totalElmCount; x++) + { + parsstr=splitDone[atLine].elm[atPosElm++]; + + if (upperCase) + { + pString=parsstr.str.upper(); + target=target.upper(); } + else + { + pString=parsstr.str; } - atPosElm++; - if (atPosElm >= splitDone[atLine].elmCount) { //new Line + if ((pString == target) && (parsstr.separator == sep)) + { + return x; + } + if (atPosElm >= splitDone[atLine].elmCount) + { //new Line atLine++; atPosElm = 0; } } - return -1; } int TextParser::elmCount() { return totalElmCount; } QChar TextParser::separatorAt(int pos) { if (getLineReference(pos, &sepAtLine, &sepAtPosElm) == -1) return QChar::null; separatorPos = pos; return splitDone[sepAtLine].elm[sepAtPosElm].separator; } QChar TextParser::nextSeparator() { sepAtPosElm++; if (splitDone[sepAtLine].elmCount <= sepAtPosElm) { sepAtLine++; sepAtPosElm = 0; } separatorPos++; return splitDone[sepAtLine].elm[sepAtPosElm].separator; } bool TextParser::hasNextSeparator() { return ((separatorPos+1) < totalElmCount); } QString TextParser::wordAt(int pos) { if (getLineReference(pos, &wordAtLine, &wordAtPosElm) == -1) return NULL; wordPos = pos; return splitDone[wordAtLine].elm[wordAtPosElm].str; } QString TextParser::nextWord() { wordAtPosElm++; if (splitDone[wordAtLine].elmCount <= wordAtPosElm) { wordAtLine++; wordAtPosElm = 0; } wordPos++; return splitDone[wordAtLine].elm[wordAtPosElm].str; } bool TextParser::hasNextWord() { return ((wordPos + 1) < totalElmCount); } QString TextParser::getString(int *pos, QChar stop, bool lineEnd = false) { QString returnStr = wordAt(*pos); QChar chr = separatorAt(*pos); QString s; if (returnStr == "") return ""; if (chr == stop) return returnStr; if (!lineEnd) { while ((chr != stop) && hasNextWord()) { returnStr.append(chr); returnStr += nextWord(); chr = nextSeparator(); } } else { //copy from pos to end of line getLineReference(*pos, &atLine, &atPosElm); returnStr = ""; while (atPosElm < splitDone[atLine].elmCount) { if (splitDone[atLine].elm[atPosElm].str != "") { returnStr += splitDone[atLine].elm[atPosElm].str; } chr = splitDone[atLine].elm[atPosElm].separator; if (!chr.isNull() && (int) chr != 0) { returnStr.append(splitDone[atLine].elm[atPosElm].separator); } atPosElm++; } } *pos = wordPos; return returnStr; } diff --git a/noncore/net/mailit/viewatt.cpp b/noncore/net/mailit/viewatt.cpp index b6f5015..21885c2 100644 --- a/noncore/net/mailit/viewatt.cpp +++ b/noncore/net/mailit/viewatt.cpp @@ -1,118 +1,121 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "resource.h" #include "viewatt.h" +#include <qwhatsthis.h> #include <qpe/applnk.h> #include <qpe/mimetype.h> ViewAtt::ViewAtt(QWidget *parent, const char *name, WFlags f) : QMainWindow(parent, name, f) { setCaption("Exploring attatchments"); setToolBarsMovable( FALSE ); bar = new QToolBar(this); installButton = new QAction( tr( "Install" ), Resource::loadPixmap( "exec" ), QString::null, CTRL + Key_C, this, 0 ); connect(installButton, SIGNAL(activated()), this, SLOT(install()) ); + installButton->setWhatsThis(tr("Click here to install the attachment to your Documents")); listView = new QListView(this, "AttView"); listView->addColumn( "Attatchment" ); listView->addColumn( "Type" ); listView->addColumn( "Installed" ); setCentralWidget(listView); + QWhatsThis::add(listView,QWidget::tr("This is an overview about all attachments in the mail")); } void ViewAtt::update(Email *mailIn, bool inbox) { QListViewItem *item; Enclosure *ePtr; listView->clear(); if (inbox) { bar->clear(); installButton->addTo( bar ); bar->show(); } else { bar->hide(); } mail = mailIn; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { QString isInstalled = "No"; if (ePtr->installed) isInstalled = "Yes"; item = new QListViewItem(listView, ePtr->originalName, ePtr->contentType, isInstalled); const QString& mtypeDef=(const QString&) ePtr->contentType+"/"+ePtr->contentAttribute; MimeType mt(mtypeDef); item->setPixmap(0, mt.pixmap()); /* if (ePtr->contentType == "TEXT") { actions = new QAction( tr("View"), Resource::loadPixmap("TextEditor"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); } if (ePtr->contentType == "AUDIO") { actions = new QAction( tr("Play"), Resource::loadPixmap("SoundPlayer"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); item->setPixmap(0, Resource::loadPixmap("play")); } if (ePtr->contentType == "IMAGE") { actions = new QAction( tr("Show"), Resource::loadPixmap("pixmap"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); item->setPixmap(0, Resource::loadPixmap("pixmap")); }*/ } } void ViewAtt::install() { Enclosure *ePtr, *selPtr; QListViewItem *item; QString filename; DocLnk d; item = listView->selectedItem(); if (item != NULL) { filename = item->text(0); selPtr = NULL; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { if (ePtr->originalName == filename) selPtr = ePtr; } if (selPtr == NULL) { qWarning("Internal error, file is not installed to documents"); return; } d.setName(selPtr->originalName); d.setFile(selPtr->path + selPtr->name); d.setType(selPtr->contentType + "/" + selPtr->contentAttribute); d.writeLink(); selPtr->installed = TRUE; item->setText(2, "Yes"); } } diff --git a/noncore/net/mailit/writemail.cpp b/noncore/net/mailit/writemail.cpp index a9dcb02..0336c83 100644 --- a/noncore/net/mailit/writemail.cpp +++ b/noncore/net/mailit/writemail.cpp @@ -1,355 +1,363 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qmessagebox.h> +#include <qwhatsthis.h> #include "writemail.h" #include <qpe/resource.h> WriteMail::WriteMail( QWidget* parent, const char* name, WFlags fl ) : QMainWindow( parent, name, fl ) { showingAddressList = FALSE; init(); - addAtt = new AddAtt(0, "Add Attatchments"); + addAtt = new AddAtt(0, "Add Attachments"); } WriteMail::~WriteMail() { delete addAtt; } void WriteMail::setAddressList(AddressList *list) { Contact *cPtr; addressList = list; addressView->clear(); QList<Contact> *cListPtr = addressList->getContactList(); QListViewItem *item; for (cPtr = cListPtr->first(); cPtr != 0; cPtr = cListPtr->next() ) { item = new QListViewItem(addressView, cPtr->name, cPtr->email); } } void WriteMail::init() { setToolBarsMovable(FALSE); bar = new QToolBar(this); bar->setHorizontalStretchable( TRUE ); menu = new QMenuBar( bar ); mailMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Mail" ), mailMenu); addMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Add" ), addMenu); bar = new QToolBar(this); - attatchButton = new QAction(tr("Attatchment"), Resource::loadPixmap("mailit/attach"), QString::null, 0, this, 0); - attatchButton->addTo(bar); - attatchButton->addTo(addMenu); - connect( attatchButton, SIGNAL( activated() ), this, SLOT( attatchFile() ) ); + attachButton = new QAction(tr("Attachment"), Resource::loadPixmap("mailit/attach"), QString::null, 0, this, 0); + attachButton->addTo(bar); + attachButton->addTo(addMenu); + connect( attachButton, SIGNAL( activated() ), this, SLOT( attachFile() ) ); + attachButton->setWhatsThis(tr("Click here to attach files to your mail")); confirmButton = new QAction(tr("Enque mail"), Resource::loadPixmap("OKButton"), QString::null, 0, this, 0); confirmButton->addTo(bar); confirmButton->addTo(mailMenu); connect( confirmButton, SIGNAL( activated() ), this, SLOT( accept() ) ); + confirmButton->setWhatsThis(tr("This button puts your mail in the send queue")); newButton = new QAction(tr("New mail"), Resource::loadPixmap("new"), QString::null, 0, this, 0); newButton->addTo(mailMenu); connect( newButton, SIGNAL( activated() ), this, SLOT( newMail() ) ); + newButton->setWhatsThis(tr("Click here to create a new mail")); widget = new QWidget(this, "widget"); grid = new QGridLayout( widget ); recipientsBox = new QComboBox( FALSE, widget, "toLabel" ); recipientsBox->insertItem( tr( "To:" ) ); recipientsBox->insertItem( tr( "CC:" ) ); recipientsBox->setCurrentItem(0); grid->addWidget( recipientsBox, 0, 0 ); connect(recipientsBox,SIGNAL(activated(int)),this, SLOT(changeRecipients(int))); - subjetLabel = new QLabel( widget, "subjetLabel" ); subjetLabel->setText( tr( "Subject:" ) ); grid->addWidget( subjetLabel, 1, 0 ); ToolButton13_2 = new QToolButton( widget, "ToolButton13_2" ); ToolButton13_2->setText( tr( "..." ) ); grid->addWidget( ToolButton13_2, 1, 2 ); subjectInput = new QLineEdit( widget, "subjectInput" ); grid->addWidget( subjectInput, 1, 1 ); + QWhatsThis::add(subjectInput,QWidget::tr("The mail subject should be entered here")); toInput = new QLineEdit( widget, "toInput" ); grid->addWidget( toInput, 0, 1 ); + QWhatsThis::add(recipientsBox,QWidget::tr("Recipients can be entered here")); ccInput = new QLineEdit( widget, "ccInput" ); ccInput->hide(); 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")); 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")); 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 attatchedFiles, attatchmentsType; + 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) ) { QMessageBox::warning(this,tr("Incorrect recipient separator"), tr("Recipients must be separated by ;\nand be valid emailaddresses"), tr("OK\n")); return; } if ((ccInput->text()!="") && (! getRecipients(true) )) { QMessageBox::warning(this,tr("Incorrect carbon copy separator"), tr("CC Recipients must be separated by ;\nand be valid emailaddresses"), tr("OK\n")); return; } mail.subject = subjectInput->text(); mail.body = emailInput->text(); mail.sent = false; mail.received = false; mail.rawMail = "To: "; for (QStringList::Iterator it = mail.recipients.begin(); it != mail.recipients.end(); ++it) { mail.rawMail += (*it); mail.rawMail += ",\n"; } mail.rawMail.truncate(mail.rawMail.length()-2); mail.rawMail += "\nCC: "; for (QStringList::Iterator it = mail.carbonCopies.begin(); it != mail.carbonCopies.end(); ++it) { mail.rawMail += (*it); mail.rawMail += ",\n"; } mail.rawMail += mail.from; mail.rawMail += "\nSubject: "; mail.rawMail += mail.subject; mail.rawMail += "\n\n"; - attatchedFiles = addAtt->returnAttatchedFiles(); - attatchmentsType = addAtt->returnFileTypes(); + attachedFiles = addAtt->returnattachedFiles(); + attachmentsType = addAtt->returnFileTypes(); - QStringList::Iterator itType = attatchmentsType.begin(); + QStringList::Iterator itType = attachmentsType.begin(); Enclosure e; - for ( QStringList::Iterator it = attatchedFiles.begin(); it != attatchedFiles.end(); ++it ) { + for ( QStringList::Iterator it = attachedFiles.begin(); it != attachedFiles.end(); ++it ) { e.id = idCount; e.originalName = (*it).latin1(); e.contentType = (*itType).latin1(); e.contentAttribute = (*itType).latin1(); e.saved = TRUE; mail.addEnclosure(&e); itType++; idCount++; } mail.rawMail += mail.body; mail.rawMail += "\n"; mail.rawMail += ".\n"; emit sendMailRequested(mail); addAtt->clear(); } void WriteMail::getAddress() { showingAddressList = !showingAddressList; if (showingAddressList) { emailInput->hide(); addressView->show(); okButton->show(); } else { addressView->hide(); okButton->hide(); emailInput->show(); } } -void WriteMail::attatchFile() +void WriteMail::attachFile() { addAtt->showMaximized(); } void WriteMail::reply(Email replyMail, bool replyAll) { int pos; mail = replyMail; mail.files.clear(); toInput->setText(mail.fromMail); //replyAll ? ccInput->setText(mail.c) addRecipients(replyAll); subjectInput->setText(tr("Re: ") + mail.subject); pos = 0; - mail.body.insert(pos, ">>"); + mail.body.insert(pos, ">"); while (pos != -1) { pos = mail.body.find('\n', pos); if (pos != -1) mail.body.insert(++pos, ">>"); } emailInput->setText(mail.body); } void WriteMail::forward(Email forwMail) { int pos=0; QString fwdBody=tr("======forwarded message from "); fwdBody.append(forwMail.fromMail); fwdBody.append(tr(" starts======\n\n")); mail=forwMail; toInput->setText(""); ccInput->setText(""); subjectInput->setText(tr("FWD: ") + mail.subject); fwdBody+=mail.body; fwdBody+=QString(tr("======end of forwarded message======\n\n")); emailInput->setText(fwdBody); } bool WriteMail::getRecipients(bool ccField) { QString str, temp; int pos = 0; mail.recipients.clear(); ccField ? temp = ccInput->text() : temp=toInput->text() ; while ( (pos = temp.find(';')) != -1) { str = temp.left(pos).stripWhiteSpace(); temp = temp.right(temp.length() - (pos + 1)); if ( str.find('@') == -1) return false; ccField ? mail.carbonCopies.append(str) : mail.recipients.append(str); addressList->addContact(str, ""); } 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); } 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); } else { recipients += "; " + item->text(0); } } item = item->nextSibling(); } ccField ? ccInput->setText(recipients):toInput->setText(recipients); addressView->hide(); okButton->hide(); emailInput->show(); addressButton->setOn(FALSE); showingAddressList = !showingAddressList; } void WriteMail::changeRecipients(int selection) { if (selection==0) { toInput->show(); ccInput->hide(); } else if (selection==1) { diff --git a/noncore/net/mailit/writemail.h b/noncore/net/mailit/writemail.h index f193b13..921f27e 100644 --- a/noncore/net/mailit/writemail.h +++ b/noncore/net/mailit/writemail.h @@ -1,96 +1,96 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef WRITEMAIL_H #define WRITEMAIL_H #include <qmainwindow.h> #include <qaction.h> #include <qlabel.h> #include <qtoolbar.h> #include <qtoolbutton.h> #include <qmenubar.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qlistview.h> #include <qcombobox.h> #include "emailhandler.h" #include "addresslist.h" #include "addatt.h" class WriteMail : public QMainWindow { Q_OBJECT public: WriteMail( QWidget* parent, const char* name, WFlags fl = 0 ); ~WriteMail(); void reply(Email replyMail, bool replyAll); void setRecipient(const QString &recipient); void setAddressList(AddressList *list); void forward(Email forwMail); signals: void sendMailRequested(const Email &mail); void cancelMail(); public slots: void getAddress(); - void attatchFile(); + void attachFile(); void addRecipients(); void newMail(); void accept(); void reject(); void changeRecipients(int); private: bool getRecipients(bool); void init(); void addRecipients(bool); Email mail; AddAtt *addAtt; AddressList *addressList; bool showingAddressList; QToolBar *bar; QMenuBar *menu; QPopupMenu *addMenu, *mailMenu; QListView *addressView; QToolButton *okButton; QWidget *widget; - QAction *attatchButton; + QAction *attachButton; QAction *confirmButton; QAction *newButton; QLabel* subjetLabel; QToolButton* ToolButton13_2; QComboBox* recipientsBox; QLineEdit *subjectInput; QLineEdit *toInput; QLineEdit *ccInput; QToolButton* addressButton; QMultiLineEdit* emailInput; QGridLayout* grid; }; #endif // WRITEMAIL_H diff --git a/noncore/unsupported/mailit/addatt.cpp b/noncore/unsupported/mailit/addatt.cpp index d268f1f..daefac6 100644 --- a/noncore/unsupported/mailit/addatt.cpp +++ b/noncore/unsupported/mailit/addatt.cpp @@ -1,224 +1,224 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qlayout.h> #include <qhbox.h> #include <qdir.h> #include <qstringlist.h> #include <qpe/resource.h> #include "addatt.h" FileItem::FileItem(QListView *parent, DocLnk* dl) : QListViewItem(parent) { /*file = fileInfo; type = fileType;*/ doclnk=dl; setText(0, doclnk->name()); /* if (fileType == "Picture") { setPixmap(0, Resource::loadPixmap("pixmap")); } else if (fileType == "Document") { setPixmap(0, Resource::loadPixmap("txt")); } else if (fileType == "Sound") { setPixmap(0, Resource::loadPixmap("play")); } else if (fileType == "Movie") { setPixmap(0, Resource::loadPixmap("MPEGPlayer")); } else if (fileType == "File") { setPixmap(0, Resource::loadPixmap("exec")); }*/ } FileItem::~FileItem() { if (doclnk!=NULL) delete doclnk; doclnk=NULL; } AddAtt::AddAtt(QWidget *parent, const char *name, WFlags f) : QDialog(parent, name, f) { - setCaption("Adding attatchments"); + setCaption("Adding attachments"); QGridLayout *top = new QGridLayout(this, 1,1 ); QHBox *buttons=new QHBox(this); /*fileCategoryButton = new QPushButton(this);*/ - attatchButton = new QPushButton(tr("Attatch..."), buttons); + attachButton = new QPushButton(tr("attach..."), buttons); removeButton = new QPushButton(tr("Remove"), buttons); /*fileCategories = new QPopupMenu(fileCategoryButton); fileCategoryButton->setPopup(fileCategories); fileCategories->insertItem("Document"); fileCategories->insertItem("Picture"); fileCategories->insertItem("Sound"); fileCategories->insertItem("Movie"); fileCategories->insertItem("File"); fileCategoryButton->setText("Document"); top->addWidget(fileCategoryButton, 0, 0);*/ top->addWidget(buttons,1,0); - //buttons->addWidget(attatchButton,0,0); + //buttons->addWidget(attachButton,0,0); //buttons->addWidget(removeButton,0,1); //connect(fileCategories, SIGNAL(activated(int)), this, // SLOT(fileCategorySelected(int)) );*/ - connect(attatchButton, SIGNAL(clicked()), this, - SLOT(addAttatchment()) ); + connect(attachButton, SIGNAL(clicked()), this, + SLOT(addattachment()) ); connect(removeButton, SIGNAL(clicked()), this, - SLOT(removeAttatchment()) ); + SLOT(removeattachment()) ); /*listView = new QListView(this, "AttView"); listView->addColumn("Documents");* connect(listView, SIGNAL(doubleClicked(QListViewItem *)), this, - SLOT(addAttatchment()) );*/ + SLOT(addattachment()) );*/ attView = new QListView(this, "Selected"); attView->addColumn(tr("Attached")); attView->addColumn(tr("File type")); connect(attView, SIGNAL(doubleClicked(QListViewItem *)), this, - SLOT(removeAttatchment()) ); + SLOT(removeattachment()) ); //top->addWidget(ofs, 0,0); top->addWidget(attView, 0,0); clear(); } void AddAtt::clear() { attView->clear(); //getFiles(); modified = FALSE; } /*void AddAtt::fileCategorySelected(int id) { fileCategoryButton->setText(fileCategories->text(id)); getFiles(); }*/ -void AddAtt::addAttatchment() +void AddAtt::addattachment() { OFileDialog ofs("Attachments",this,0,0,"/root/Documents"); ofs.showMaximized(); if (ofs.exec()==QDialog::Accepted) { DocLnk* dl=new DocLnk(ofs.selectedDocument()); FileItem* fi=new FileItem(attView,dl); fi->setPixmap(0,dl->pixmap()); fi->setText(1,dl->type()); attView->insertItem(fi); modified = TRUE; } } -void AddAtt::removeAttatchment() +void AddAtt::removeattachment() { if (attView->selectedItem() != NULL) { attView->takeItem(attView->selectedItem()); } modified = TRUE; } void AddAtt::reject() { if (modified) { attView->clear(); modified = FALSE; } } void AddAtt::accept() { modified = FALSE; hide(); } void AddAtt::getFiles() { QString path, selected; /*listView->clear(); selected = fileCategoryButton->text(); if (selected == "Picture") { path = "../pics/"; } else if (selected == "Document") { path = "" ; //sub-dirs not decided } else if (selected == "Sound") { path = "../sounds/"; //sub-dirs not decided } else if (selected == "Movie") { path = ""; //sub-dirs not decided } else if (selected == "File") { path = ""; //sub-dirs not decided } dir = new QDir(path); dir->setFilter(QDir::Files); const QFileInfoList *dirInfoList = dir->entryInfoList(); QFileInfoListIterator it(*dirInfoList); // create list iterator while ( (fi=it.current()) ) { // for each file... item = new FileItem(lis+ütView, *fi, selected); ++it; // goto next list element }*/ } -QStringList AddAtt::returnAttatchedFiles() +QStringList AddAtt::returnattachedFiles() { QFileInfo info; QStringList list; item = (FileItem *) attView->firstChild(); while (item != NULL) { DocLnk* dl=item->getDocLnk(); list+=dl->file(); /*info = item->getFileInfo(); list += info.filePath();*/ item = (FileItem *) item->nextSibling(); } return list; } QStringList AddAtt::returnFileTypes() { QStringList list; item = (FileItem *) attView->firstChild(); while (item != NULL) { list += item->getDocLnk()->type(); item = (FileItem *) item->nextSibling(); } return list; } diff --git a/noncore/unsupported/mailit/addatt.h b/noncore/unsupported/mailit/addatt.h index fcf3279..a365947 100644 --- a/noncore/unsupported/mailit/addatt.h +++ b/noncore/unsupported/mailit/addatt.h @@ -1,76 +1,76 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef ADDATT_H #define ADDATT_H #include <qdialog.h> #include <qlistview.h> #include <qpushbutton.h> #include <qpopupmenu.h> #include <qstring.h> #include <qfileinfo.h> #include <qstringlist.h> #include <opie/ofiledialog.h> #include <qpe/applnk.h> class FileItem : public QListViewItem { public: //FileItem(QListView *parent, QFileInfo fileInfo, QString fileType); FileItem(QListView*, DocLnk*); ~FileItem(); DocLnk* getDocLnk() {return doclnk;} private: DocLnk* doclnk; }; class AddAtt : public QDialog { Q_OBJECT public: AddAtt(QWidget *parent = 0, const char *name = 0, WFlags f = 0); - QStringList returnAttatchedFiles(); + QStringList returnattachedFiles(); QStringList returnFileTypes(); void getFiles(); void clear(); public slots: //void fileCategorySelected(int); - void addAttatchment(); - void removeAttatchment(); + void addattachment(); + void removeattachment(); void reject(); void accept(); private: FileItem* item; QListView *attView; - QPushButton *attatchButton, *removeButton; + QPushButton *attachButton, *removeButton; QPopupMenu *fileCategories; bool modified; //QFileInfo *fi; OFileDialog* ofs; }; #endif diff --git a/noncore/unsupported/mailit/addresslist.cpp b/noncore/unsupported/mailit/addresslist.cpp index 8d9ab91..7d60ebf 100644 --- a/noncore/unsupported/mailit/addresslist.cpp +++ b/noncore/unsupported/mailit/addresslist.cpp @@ -28,134 +28,134 @@ AddressList::AddressList() { addresses.setAutoDelete(TRUE); read(); dirty = FALSE; } AddressList::~AddressList() { addresses.clear(); } void AddressList::addContact(QString email, QString name) { //skip if not a valid email address, if (email.find( '@') == -1) return; if ( ! containsEmail(email) ) { Contact *in = new Contact; in->email = email; in->name = name; addresses.append(in); dirty = TRUE; } } bool AddressList::containsEmail(QString email) { return ( getEmailRef(email) != -1 ); } bool AddressList::containsName(QString name) { return ( getNameRef(name) != -1 ); } QString AddressList::getNameByEmail(QString email) { int pos = getEmailRef(email); if (pos != -1) { Contact *ptr = addresses.at(pos); return ptr->name; } return NULL; } QString AddressList::getEmailByName(QString name) { int pos = getNameRef(name); if (pos != -1) { Contact *ptr = addresses.at(pos); return ptr->email; } return NULL; } int AddressList::getEmailRef(QString email) { int pos = 0; Contact *ptr; for (ptr = addresses.first(); ptr != 0; ptr = addresses.next() ) { if (ptr->email == email) return pos; pos++; } return -1; } int AddressList::getNameRef(QString name) { int pos = 0; Contact *ptr; for (ptr = addresses.first(); ptr != 0; ptr = addresses.next() ) { if (ptr->name == name) return pos; pos++; } return -1; } QList<Contact>* AddressList::getContactList() { return &addresses; } void AddressList::read() { OContactAccess::List::Iterator it; QString lineEmail, lineName, email, name; OContactAccess m_contactdb("mailit"); OContactAccess::List m_list = m_contactdb.sorted( true, 0, 0, 0 ); - //OContact* oc; + //OContact* oc;(*it).defaultEmail() for ( it = m_list.begin(); it != m_list.end(); ++it ) { //oc=(OContact*) it; if ((*it).defaultEmail().length()!=0) addContact((*it).defaultEmail(),(*it).fileAs()); } /*if (! f.open(IO_ReadOnly) ) return; QTextStream stream(&f); while (! stream.atEnd() ) { lineEmail = stream.readLine(); if (! stream.atEnd() ) lineName = stream.readLine(); else return; email = getRightString(lineEmail); name = getRightString(lineName); addContact(email, name); } f.close();*/ } QString AddressList::getRightString(QString in) { QString out = ""; int pos = in.find('='); if (pos != -1) { out = in.mid(pos+1).stripWhiteSpace(); } return out; } diff --git a/noncore/unsupported/mailit/emailclient.cpp b/noncore/unsupported/mailit/emailclient.cpp index ad1e0b4..23059cf 100644 --- a/noncore/unsupported/mailit/emailclient.cpp +++ b/noncore/unsupported/mailit/emailclient.cpp @@ -1,864 +1,841 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qapplication.h> #include <qmessagebox.h> #include <qfile.h> #include <qcheckbox.h> #include <qmenubar.h> #include <qaction.h> +#include <qwhatsthis.h> #include <qpe/resource.h> #include "emailclient.h" QCollection::Item AccountList::newItem(QCollection::Item d) { return dupl( (MailAccount *) d); } MailAccount* AccountList::dupl(MailAccount *in) { ac = new MailAccount(*in); return ac; } EmailClient::EmailClient( QWidget* parent, const char* name, WFlags fl ) : QMainWindow( parent, name, fl ) { emailHandler = new EmailHandler(); addressList = new AddressList(); sending = FALSE; receiving = FALSE; previewingMail = FALSE; mailIdCount = 1; accountIdCount = 1; allAccounts = FALSE; init(); connect(emailHandler, SIGNAL(mailSent()), this, SLOT(mailSent()) ); connect(emailHandler, SIGNAL(smtpError(int)), this, SLOT(smtpError(int)) ); connect(emailHandler, SIGNAL(popError(int)), this, SLOT(popError(int)) ); connect(inboxView, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(inboxItemSelected()) ); connect(outboxView, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(outboxItemSelected()) ); connect(inboxView, SIGNAL(pressed(QListViewItem *)), this, SLOT(inboxItemPressed()) ); connect(inboxView, SIGNAL(clicked(QListViewItem *)), this, SLOT(inboxItemReleased()) ); connect(emailHandler, SIGNAL(mailArrived(const Email &, bool)), this, SLOT(mailArrived(const Email &, bool)) ); connect(emailHandler, SIGNAL(mailTransfered(int)), this, SLOT(allMailArrived(int)) ); mailconf = new Config("mailit"); //In case Synchronize is not defined in settings.txt readSettings(); updateAccounts(); lineShift = "\n"; readMail(); lineShift = "\r\n"; + mailboxView->setCurrentTab(0); //ensure that inbox has focus } EmailClient::~EmailClient() { //needs to be moved from destructor to closewindow event saveMail(getPath(FALSE) + "inbox.txt", inboxView); //does not currently work. Defining outbox in the same //format as inbox is not a good solution as they have //different properties saveMail(getPath(FALSE) + "outbox.txt", outboxView); saveSettings(); mailconf->write(); delete mailconf; } void EmailClient::init() { statusBar = new QStatusBar(this); statusBar->setSizeGripEnabled(FALSE); status1Label = new QLabel( tr("Idle"), statusBar); status2Label = new QLabel("", statusBar); connect(emailHandler, SIGNAL(updatePopStatus(const QString &)), status2Label, SLOT(setText(const QString &)) ); connect(emailHandler, SIGNAL(updateSmtpStatus(const QString &)), status2Label, SLOT(setText(const QString &)) ); progressBar = new QProgressBar(statusBar); + connect(emailHandler, SIGNAL(mailboxSize(int)), this, SLOT(setTotalSize(int)) ); connect(emailHandler, SIGNAL(currentMailSize(int)), this, SLOT(setMailSize(int)) ); connect(emailHandler, SIGNAL(downloadedSize(int)), this, SLOT(setDownloadedSize(int)) ); statusBar->addWidget(status1Label); statusBar->addWidget(progressBar); statusBar->addWidget(status2Label); setToolBarsMovable(FALSE); bar = new QToolBar(this); + QWhatsThis::add(bar,tr("Main operation toolbar")); bar->setHorizontalStretchable( TRUE ); mb = new QMenuBar( bar ); QPopupMenu *mail = new QPopupMenu(mb); mb->insertItem( tr( "&Mail" ), mail); QPopupMenu *configure = new QPopupMenu(mb); mb->insertItem( tr( "Accounts" ), configure); selectAccountMenu = new QPopupMenu(mb); editAccountMenu = new QPopupMenu(mb); deleteAccountMenu = new QPopupMenu(mb); mail->insertItem(tr("Get Mail in"), selectAccountMenu); configure->insertItem(tr("Edit account"), editAccountMenu); configure->insertItem(tr("Delete account"), deleteAccountMenu); bar = new QToolBar(this); getMailButton = new QToolButton(Resource::loadPixmap("mailit/getmail"),tr("getMail"),tr("select account"), this,SLOT(getAllNewMail()),bar); - //connect(setAccountlButton, SIGNAL(activated()), this, SLOT(setCurrentAccount()) ); - // setAccountButton->addTo(bar); - //setAccountButton->addTo(mail); - - /*idCount = 0; - - for (MailAccount* accountPtr = accountList.first(); accountPtr != 0; - accountPtr = accountList.next()) { + QWhatsThis::add(getMailButton,tr("Click to download mail via all available accounts.\n Press and hold to select the desired account.")); - selectAccountMenu->insertItem(accountPtr->accountName,this, SLOT(selectAccount(int)), 0, idCount); - idCount++; - }*/ getMailButton->setPopup(selectAccountMenu); - - /*getMailButton = new QAction(tr("Get all mail"), Resource::loadPixmap("mailit/getmail"), QString::null, 0, this, 0); - connect(getMailButton, SIGNAL(activated()), this, SLOT(getAllNewMail()) ); - getMailButton->addTo(bar);*/ - //getMailButton->addTo(mail); - sendMailButton = new QAction(tr("Send mail"), Resource::loadPixmap("mailit/sendqueue"), QString::null, 0, this, 0); connect(sendMailButton, SIGNAL(activated()), this, SLOT(sendQuedMail()) ); sendMailButton->addTo(bar); sendMailButton->addTo(mail); + sendMailButton->setWhatsThis("Send mail queued in the outbox"); composeButton = new QAction(tr("Compose"), Resource::loadPixmap("new"), QString::null, 0, this, 0); connect(composeButton, SIGNAL(activated()), this, SLOT(compose()) ); composeButton->addTo(bar); composeButton->addTo(mail); + composeButton->setWhatsThis("Compose a new mail"); cancelButton = new QAction(tr("Cancel transfer"), Resource::loadPixmap("close"), QString::null, 0, this, 0); connect(cancelButton, SIGNAL(activated()), this, SLOT(cancel()) ); cancelButton->addTo(mail); cancelButton->addTo(bar); cancelButton->setEnabled(FALSE); + cancelButton->setWhatsThis("Stop the currently active mail transfer"); + deleteButton = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); connect( deleteButton, SIGNAL( activated() ), this, SLOT( deleteItem() ) ); deleteButton->addTo(bar); + deleteButton->setWhatsThis("Remove the currently selected eMail(s)"); mailboxView = new OTabWidget( this, "mailboxView" ); QWidget* widget = new QWidget( mailboxView, "widget" ); grid_2 = new QGridLayout( widget ); // grid_2->setSpacing(6); // grid_2->setMargin( 11 ); inboxView = new QListView( widget, "inboxView" ); inboxView->addColumn( tr( "From" ) ); inboxView->addColumn( tr( "Subject" ) ); inboxView->addColumn( tr( "Date" ) ); inboxView->setMinimumSize( QSize( 0, 0 ) ); inboxView->setAllColumnsShowFocus(TRUE); + QWhatsThis::add(inboxView,QWidget::tr("This is the inbox view.\n It keeps the fetched mail which can be viewed by double clicking the entry.\n" + " A blue attachment icon shows whether this mail has attachments.")); grid_2->addWidget( inboxView, 2, 0 ); mailboxView->addTab( widget, "mailit/inbox", tr( "Inbox" ) ); QWidget* widget_2 = new QWidget( mailboxView, "widget_2" ); grid_3 = new QGridLayout( widget_2 ); // grid_3->setSpacing(6); // grid_3->setMargin( 11 ); outboxView = new QListView( widget_2, "outboxView" ); outboxView->addColumn( tr( "To" ) ); outboxView->addColumn( tr( "Subject" ) ); outboxView->setAllColumnsShowFocus(TRUE); + QWhatsThis::add(outboxView,QWidget::tr("This is the oubox view.\n It keeps the queued mails to send which can be reviewed by double clicking the entry.")); grid_3->addWidget( outboxView, 0, 0 ); mailboxView->addTab( widget_2,"mailit/outbox", tr( "Outbox" ) ); setCentralWidget(mailboxView); - mailboxView->setCurrentTab(0); } void EmailClient::compose() { emit composeRequested(); } void EmailClient::cancel() { emailHandler->cancel(); } AddressList* EmailClient::getAdrListRef() { return addressList; } //this needs to be rewritten to syncronize with outboxView void EmailClient::enqueMail(const Email &mail) { if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(), tr("No account selected"), tr("You must create an account"), "OK\n"); return; } if (accountList.count() > 0) { currentAccount = accountList.first(); qWarning("using account " + currentAccount->name); } Email addMail = mail; addMail.from = currentAccount->name; addMail.fromMail = currentAccount->emailAddress; addMail.rawMail.prepend("From: " + addMail.from + "<" + addMail.fromMail + ">\n"); item = new EmailListItem(outboxView, addMail, false); mailboxView->setCurrentTab(1); } void EmailClient::sendQuedMail() { int count = 0; if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(), "No account selected", "You must create an account", "OK\n"); return; } //traverse listview, find messages to send if (! sending) { item = (EmailListItem *) outboxView->firstChild(); if (item != NULL) { while (item != NULL) { quedMessages.append(item->getMail()); item = (EmailListItem *) item->nextSibling(); count++; } setMailAccount(); emailHandler->sendMail(&quedMessages); sending = TRUE; sendMailButton->setEnabled(FALSE); cancelButton->setEnabled(TRUE); } else { qWarning("sendQuedMail(): no messages to send"); } } } void EmailClient::setMailAccount() { emailHandler->setAccount(*currentAccount); } void EmailClient::mailSent() { sending = FALSE; sendMailButton->setEnabled(TRUE); quedMessages.clear(); outboxView->clear(); //should be moved to an sentBox } void EmailClient::getNewMail() { if (accountList.count() == 0) { QMessageBox::warning(qApp->activeWindow(),"No account selected", "You must create an account", "OK\n"); return; } setMailAccount(); receiving = TRUE; previewingMail = TRUE; getMailButton->setEnabled(FALSE); cancelButton->setEnabled(TRUE); selectAccountMenu->setEnabled(FALSE); status1Label->setText(currentAccount->accountName + " headers"); progressBar->reset(); //get any previous mails not downloaded and add to queue -/* mailDownloadList.clear(); + mailDownloadList.clear(); Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); while (item != NULL) { mailPtr = item->getMail(); if ( (!mailPtr->downloaded) && (mailPtr->fromAccountId == currentAccount->id) ) { mailDownloadList.sizeInsert(mailPtr->serverId, mailPtr->size); } item = (EmailListItem *) item->nextSibling(); - }*/ + } emailHandler->getMailHeaders(); + } void EmailClient::getAllNewMail() { allAccounts = TRUE; currentAccount = accountList.first(); getNewMail(); } void EmailClient::mailArrived(const Email &mail, bool fromDisk) { Enclosure *ePtr; Email newMail; int thisMailId; emailHandler->parse(mail.rawMail, lineShift, &newMail); - mailconf->setGroup(newMail.id); - if (fromDisk) { + if (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 + } + else + { //mail arrived from server newMail.serverId = mail.serverId; newMail.size = mail.size; newMail.downloaded = mail.downloaded; newMail.fromAccountId = currentAccount->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 //header is not reloaded - if (currentAccount->synchronize) + if ((currentAccount)&&(currentAccount->synchronize)) currentAccount->lastServerMailCount++; mailconf->writeEntry("internalmailid", thisMailId); mailconf->writeEntry("downloaded", newMail.downloaded); mailconf->writeEntry("size", (int) newMail.size); mailconf->writeEntry("serverid", newMail.serverId); - addressList->addContact(newMail.fromMail, newMail.from); - } else if (!fromDisk) { //body to header arrived - mailconf->writeEntry("downloaded", TRUE); + //addressList->addContact(newMail.fromMail, newMail.from); } + + mailconf->writeEntry("downloaded", newMail.downloaded); + QString stringMailId; stringMailId.setNum(thisMailId); - //se if any attatchments needs to be stored + //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); } } } - if (!previewingMail && !fromDisk) { + + bool found=false; + + if (!fromDisk) + { + Email *mailPtr; item = (EmailListItem *) inboxView->firstChild(); - while (item != NULL) { + 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(); } - } else { - item = new EmailListItem(inboxView, newMail, TRUE); - if (!newMail.downloaded) - mailDownloadList.sizeInsert(newMail.serverId, newMail.size); } + if ((!found)||(fromDisk)) item = new EmailListItem(inboxView, newMail, TRUE); + + /*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 (!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(); - emailHandler->getMailByList(&mailDownloadList); + //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) 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"); } sending = FALSE; sendMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); quedMessages.clear(); } void EmailClient::popError(int code) { QString temp; if (code == ErrUnknownResponse) temp = "Unknown response from server"; if (code == ErrLoginFailed) temp = "Login failed\nCheck user name and password"; 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(), "Receiving error", temp, "OK\n"); } else { status2Label->setText("Aborted by user"); } receiving = FALSE; getMailButton->setEnabled(TRUE); cancelButton->setEnabled(FALSE); selectAccountMenu->setEnabled(TRUE); } void EmailClient::inboxItemSelected() { - killTimer(timerID); + //killTimer(timerID); item = (EmailListItem*) inboxView->selectedItem(); if (item != NULL) { emit viewEmail(inboxView, item->getMail()); } } void EmailClient::outboxItemSelected() { - killTimer(timerID); + //killTimer(timerID); item = (EmailListItem*) outboxView->selectedItem(); if (item != NULL) { emit viewEmail(outboxView, item->getMail()); } } void EmailClient::readMail() { Email mail; int start, stop; QString s, del; QFile f(getPath(FALSE) + "inbox.txt"); -// QFileInfo fi(f); - //qDebug( f.name()); if ( f.open(IO_ReadOnly) ) { // file opened successfully QTextStream t( &f ); // use a text stream s = t.read(); f.close(); start = 0; del = "\n.\n"; while ((uint) start < s.length()) { stop = s.find(del, start); if (stop == -1) stop = s.length() - del.length(); mail.rawMail = s.mid(start, stop + del.length() - start ); start = stop + del.length(); mailArrived(mail, TRUE); } } QFile fo(getPath(FALSE) + "outbox.txt"); if ( fo.open(IO_ReadOnly) ) { // file opened successfully QTextStream t( &fo ); // use a text stream s = t.read(); fo.close(); start = 0; del = "\n.\n"; while ((uint) start < s.length()) { stop = s.find(del, start); if (stop == -1) stop = s.length() - del.length(); mail.rawMail = s.mid(start, stop + del.length() - start ); start = stop + del.length(); emailHandler->parse(mail.rawMail, lineShift, &mail); mail.sent = false; mail.received = false; enqueMail(mail); } } } void EmailClient::saveMail(QString fileName, QListView *view) { QFile f(fileName); Email *mail; if (! f.open(IO_WriteOnly) ) { qWarning("could not open file"); return; } item = (EmailListItem *) view->firstChild(); - //qDebug (QString("Write : ") ); QTextStream t(&f); while (item != NULL) { mail = item->getMail(); - //qDebug(mail->rawMail); - //qDebug(mail->recipients.first()); t << mail->rawMail; mailconf->setGroup(mail->id); mailconf->writeEntry("mailread", mail->read); item = (EmailListItem *) item->nextSibling(); } f.close(); } //paths for mailit, is settings, inbox, enclosures QString EmailClient::getPath(bool enclosurePath) { QString basePath = "qtmail"; QString enclosures = "enclosures"; QDir dir = (QString(getenv("HOME")) + "/Applications/" + basePath); if ( !dir.exists() ) dir.mkdir( dir.path() ); if (enclosurePath) { dir = (QString(getenv("HOME")) + "/Applications/" + basePath + "/" + enclosures); if ( !dir.exists() ) dir.mkdir( dir.path() ); return (dir.path() + "/"); } return (dir.path() + "/"); } void EmailClient::readSettings() { - TextParser *p; - QString s; - int pos, accountPos, y; - QFile f( getPath(FALSE) + "settings.txt"); - - if ( f.open(IO_ReadOnly) ) { // file opened successfully - QTextStream t( &f ); // use a text stream - s = t.read(); - f.close(); - - p = new TextParser(s, "\n"); - - accountPos = 0; - while ( (accountPos = p->find("ACCOUNTSTART",';', accountPos, TRUE)) != -1 ) { - accountPos++; - if ( (pos = p->find("ACCOUNTNAME",':', accountPos, TRUE)) != -1 ) - account.accountName = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("NAME",':', accountPos, TRUE)) != -1) - account.name = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("EMAIL",':', accountPos, TRUE)) != -1) - account.emailAddress = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPUSER",':', accountPos, TRUE)) != -1) - account.popUserName = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPPASSWORD",':', accountPos, TRUE)) != -1) - account.popPasswd = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("POPSERVER",':', accountPos, TRUE)) != -1) - account.popServer = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("SMTPSERVER",':', accountPos, TRUE)) != -1) - account.smtpServer = p->getString(& ++pos, 'z', TRUE); - if ( (pos = p->find("ACCOUNTID",':', accountPos, TRUE)) != -1) { - s = p->getString(& ++pos, 'z', TRUE); - account.id = s.toInt(); - } + int y,acc_count, accountPos=0; + 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",""); + account.popServer = mailconf->readEntry("POPServer",""); + account.smtpServer = mailconf->readEntry("SMTPServer",""); + account.id = mailconf->readNumEntry("AccountId",0); + account.syncLimit = mailconf->readNumEntry("HeaderLimit",0); account.lastServerMailCount = 0; account.synchronize = FALSE; - if ( (pos = p->find("SYNCHRONIZE",':', accountPos, TRUE)) != -1) { - if (p->getString(& ++pos, 'z', TRUE).upper() == "YES") { - account.synchronize = TRUE; - if ( (pos = p->find("LASTSERVERMAILCOUNT",':', accountPos, TRUE)) != -1) { - s = p->getString(& ++pos, 'z', TRUE); - account.lastServerMailCount = s.toInt(); - } - } - } - if ( (pos = p->find("SYNCLIMIT",':', accountPos, TRUE)) != -1) { - account.syncLimit = p->getString(& ++pos, 'z', TRUE).toInt(); + account.synchronize = (mailconf->readEntry("Synchronize","No")=="Yes"); + if (account.synchronize) + { + mailconf->readNumEntry("LASTSERVERMAILCOUNT",0); } - accountList.append(&account); } - delete p; - } + mailconf->setGroup("mailitglobal"); - if ( (y = mailconf->readNumEntry("mailidcount", -1)) != -1) { + + if ( (y = mailconf->readNumEntry("mailidcount", -1)) != -1) + { mailIdCount = y; } - if ( (y = mailconf->readNumEntry("accountidcount", -1)) != -1) { + if ( (y = mailconf->readNumEntry("accountidcount", -1)) != -1) + { accountIdCount = y; } } void EmailClient::saveSettings() { - - QString temp; - QFile f( getPath(FALSE) + "settings.txt"); + int acc_count=0; MailAccount *accountPtr; - if (! f.open(IO_WriteOnly) ) { - qWarning("could not save settings file"); + + if (!mailconf) + { + qWarning("could not save settings"); return; } - QTextStream t(&f); - t << "#Settings for OPIE Mailit program\n"; for (accountPtr = accountList.first(); accountPtr != 0; - accountPtr = accountList.next()) { - - t << "accountStart;\n"; - t << "AccountName: " + accountPtr->accountName + "\n"; - t << "Name: " + accountPtr->name + "\n"; - t << "Email: " + accountPtr->emailAddress + "\n"; - t << "POPUser: " + accountPtr->popUserName + "\n"; - t << "POPPAssword: " + accountPtr->popPasswd + "\n"; - t << "POPServer: " + accountPtr->popServer + "\n"; - t << "SMTPServer: " + accountPtr->smtpServer + "\n"; - t << "AccountId: " << accountPtr->id << "\n"; - if (accountPtr->synchronize) { - t << "Synchronize: Yes\n"; - t << "LastServerMailCount: "; - t << accountPtr->lastServerMailCount << "\n"; - } else { - t << "Synchronize: No\n"; + accountPtr = accountList.next()) + { + mailconf->setGroup("Account_"+QString::number(++acc_count)); + mailconf->writeEntry("AccName",accountPtr->accountName ); + mailconf->writeEntry("UserName",accountPtr->name); + mailconf->writeEntry("Email",accountPtr->emailAddress); + mailconf->writeEntry("POPUser",accountPtr->popUserName); + mailconf->writeEntryCrypt("POPPassword",accountPtr->popPasswd); + mailconf->writeEntry("POPServer",accountPtr->popServer); + mailconf->writeEntry("SMTPServer",accountPtr->smtpServer); + mailconf->writeEntry("AccountId",accountPtr->id); + if (accountPtr->synchronize) + { + mailconf->writeEntry("Synchronize","Yes"); + mailconf->writeEntry("HeaderLimit",accountPtr->syncLimit); + mailconf->writeEntry("LastServerMailCount",accountPtr->lastServerMailCount); + } + else + { + mailconf->writeEntry("Synchronize", "No"); } - t << "SyncLimit: "; - t << accountPtr->syncLimit << "\n"; - t << "accountEnd;\n"; } - f.close(); mailconf->setGroup("mailitglobal"); + mailconf->writeEntry("Accounts",acc_count); mailconf->writeEntry("mailidcount", mailIdCount); mailconf->writeEntry("accountidcount", accountIdCount); } void EmailClient::selectAccount(int id) { if (accountList.count() > 0) { currentAccount = accountList.at(id); emit newCaption("Mailit - " + currentAccount->accountName); getNewMail(); } else { emit newCaption("Mailit ! No account defined"); } } void EmailClient::editAccount(int id) { MailAccount *newAccount; editAccountView = new EditAccount(this, "account", TRUE); if (id == newAccountId) { //new account newAccount = new MailAccount; editAccountView->setAccount(newAccount); } else { newAccount = accountList.at(id); editAccountView->setAccount(newAccount, FALSE); } editAccountView->showMaximized(); editAccountView->exec(); if (editAccountView->result() == QDialog::Accepted) { if (id == newAccountId) { newAccount->id = accountIdCount; accountIdCount++; accountList.append(newAccount); updateAccounts(); } else { updateAccounts(); } } delete editAccountView; } void EmailClient::deleteAccount(int id) { MailAccount *newAccount; QString message; newAccount = accountList.at(id); message = "Delete account:\n" + newAccount->accountName; switch( QMessageBox::warning( this, "Mailit", message, "Yes", "No", 0, 0, 1 ) ) { case 0: accountList.remove(id); updateAccounts(); break; case 1: break; } } void EmailClient::updateAccounts() { MailAccount *accountPtr; //rebuild menus, clear all first editAccountMenu->clear(); selectAccountMenu->clear(); deleteAccountMenu->clear(); newAccountId = editAccountMenu->insertItem("New", this, SLOT(editAccount(int)) ); editAccountMenu->insertSeparator(); idCount = 0; for (accountPtr = accountList.first(); accountPtr != 0; accountPtr = accountList.next()) { editAccountMenu->insertItem(accountPtr->accountName, this, SLOT(editAccount(int)), 0, idCount); selectAccountMenu->insertItem(accountPtr->accountName, this, SLOT(selectAccount(int)), 0, idCount); deleteAccountMenu->insertItem(accountPtr->accountName, this, SLOT(deleteAccount(int)), 0, idCount); idCount++; } } void EmailClient::deleteMail(EmailListItem *mailItem, bool &inbox) { Email *mPtr; Enclosure *ePtr; if (inbox) diff --git a/noncore/unsupported/mailit/emailhandler.cpp b/noncore/unsupported/mailit/emailhandler.cpp index f6c6d60..b180051 100644 --- a/noncore/unsupported/mailit/emailhandler.cpp +++ b/noncore/unsupported/mailit/emailhandler.cpp @@ -11,309 +11,325 @@ ** 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 <qfileinfo.h> #include <stdlib.h> #include <qapplication.h> #include <qmessagebox.h> #include <qcstring.h> #include "emailhandler.h" #include <qpe/applnk.h> #include <qpe/filemanager.h> QCollection::Item EnclosureList::newItem(QCollection::Item d) { return dupl( (Enclosure *) d); } Enclosure* EnclosureList::dupl(Enclosure *in) { ac = new Enclosure(*in); return ac; } EmailHandler::EmailHandler() { smtpClient = new SmtpClient(); popClient = new PopClient(); connect(smtpClient, SIGNAL(errorOccurred(int)), this, SIGNAL(smtpError(int)) ); connect(smtpClient, SIGNAL(mailSent()), this, SIGNAL(mailSent()) ); connect(smtpClient, SIGNAL(updateStatus(const QString &)), this, SIGNAL(updateSmtpStatus(const QString &)) ); connect(popClient, SIGNAL(errorOccurred(int)), this, SIGNAL(popError(int)) ); connect(popClient, SIGNAL(newMessage(const QString &, int, uint, bool)), this, SLOT(messageArrived(const QString &, int, uint, bool)) ); connect(popClient, SIGNAL(updateStatus(const QString &)), this, SIGNAL(updatePopStatus(const QString &)) ); connect(popClient, SIGNAL(mailTransfered(int)), this, SIGNAL(mailTransfered(int)) ); //relaying size information connect(popClient, SIGNAL(currentMailSize(int)), this, SIGNAL(currentMailSize(int)) ); connect(popClient, SIGNAL(downloadedSize(int)), this, SIGNAL(downloadedSize(int)) ); } void EmailHandler::sendMail(QList<Email> *mailList) { Email *currentMail; QString temp; QString userName = mailAccount.name; userName += " <" + mailAccount.emailAddress + ">"; for (currentMail = mailList->first(); currentMail != 0; currentMail = mailList->next()) { if (encodeMime(currentMail) == 0) { smtpClient->addMail(userName, currentMail->subject, currentMail->recipients, currentMail->rawMail); } else { //error temp = tr("Could not locate all files in \nmail with subject: ") + currentMail->subject; temp += tr("\nMail has NOT been sent"); QMessageBox::warning(qApp->activeWindow(), tr("Attachment error"), temp, tr("OK\n")); } } smtpClient->newConnection(mailAccount.smtpServer, 25); } void EmailHandler::setAccount(MailAccount account) { mailAccount = account; } void EmailHandler::getMail() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); if (mailAccount.synchronize) { popClient->setSynchronize(mailAccount.lastServerMailCount); } else { popClient->removeSynchronize(); } headers = FALSE; - popClient->headersOnly(headers, 0); + //popClient->headersOnly(headers, 0); popClient->newConnection(mailAccount.popServer, 110); } void EmailHandler::getMailHeaders() { popClient->setAccount(mailAccount.popUserName, mailAccount.popPasswd); - if (mailAccount.synchronize) { - popClient->setSynchronize(mailAccount.lastServerMailCount); - } else { - popClient->removeSynchronize(); - } + mailAccount.synchronize ? popClient->setSynchronize(mailAccount.lastServerMailCount): popClient->removeSynchronize(); headers = TRUE; popClient->headersOnly(headers, mailAccount.syncLimit); //less than requested syncLimit, download all 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->setSelectedMails(mailList); } -void EmailHandler::messageArrived(const QString &message, int id, uint size, bool complete) +void EmailHandler::messageArrived(const QString &message, int id, uint size, bool incomplete) { Email mail; mail.rawMail = message; mail.serverId = id; mail.size = size; - mail.downloaded = complete; + mail.downloaded = incomplete; 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; 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); 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++; 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; } } - //@@@ToDo: Rewrite the parser as To: stops at the first occurence- which is Delivered-To: - if ((pos = p.find("TO",':', 0, TRUE)) != -1) + 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)!='-') { pos++; + mail->recipients.append(p.getString(&pos, '\r', TRUE)); + } + /*else { + if ((p.separatorAt(pos) == '<')|| (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; + } mail->recipients.append (p.getString(&pos, 'z', TRUE) ); + }*/ } + // + //if (pos==-1) mail->recipients.append (tr("undisclosed recipients") ); - //@@@ToDo: Rewrite the parser as To: stops at the first occurence- which is Delivered-To: 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); + 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; 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") { diff --git a/noncore/unsupported/mailit/emaillistitem.cpp b/noncore/unsupported/mailit/emaillistitem.cpp index a325766..b925a1c 100644 --- a/noncore/unsupported/mailit/emaillistitem.cpp +++ b/noncore/unsupported/mailit/emaillistitem.cpp @@ -1,97 +1,99 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qstring.h> #include <qpe/resource.h> #include "emaillistitem.h" EmailListItem::EmailListItem(QListView *parent, Email mailIn, bool inbox) : QListViewItem(parent) { QString temp; mail = mailIn; if (inbox) { setText(0, mail.from); } else { QStringList::Iterator it = mail.recipients.begin(); temp = *it; if (mail.recipients.count() > 1) temp += "..."; setText(0, temp); } setText(1, mail.subject); + setText(2,mail.date); if (mailIn.files.count()>0) { setPixmap(0, Resource::loadPixmap("mailit/attach")); } + selected = FALSE; } Email* EmailListItem::getMail() { return &mail; } void EmailListItem::setMail(Email newMail) { mail = newMail; repaint(); } void EmailListItem::setItemSelected(bool enable) { selected = enable; setSelected(enable); repaint(); } bool EmailListItem::isItemSelected() { return selected; } void EmailListItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { QColorGroup _cg( cg ); QColor c = _cg.text(); if ( (! mail.read) && (mail.received) ) _cg.setColor( QColorGroup::Text, Qt::blue); if (!mail.downloaded) _cg.setColor( QColorGroup::Text, Qt::red); /* if (selected) { _cg.setColor(QColorGroup::Base, Qt::blue); _cg.setColor(QColorGroup::Text, Qt::yellow); if (isSelected()) { _cg.setColor(QColorGroup::HighlightedText, Qt::yellow); } else { _cg.setColor(QColorGroup::Highlight, Qt::blue); } } */ QListViewItem::paintCell( p, _cg, column, width, alignment ); _cg.setColor( QColorGroup::Text, c ); } diff --git a/noncore/unsupported/mailit/mailitwindow.cpp b/noncore/unsupported/mailit/mailitwindow.cpp index ef5fc09..7181adf 100644 --- a/noncore/unsupported/mailit/mailitwindow.cpp +++ b/noncore/unsupported/mailit/mailitwindow.cpp @@ -1,165 +1,143 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qwhatsthis.h> #include "mailitwindow.h" MailItWindow::MailItWindow(QWidget *parent, const char *name, WFlags fl) - : QMainWindow(parent, name, 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"); readMail = new ReadMail(views, "reading"); views->raiseWidget(emailClient); connect(emailClient, SIGNAL(composeRequested()), this, SLOT(compose()) ); connect(emailClient, SIGNAL(viewEmail(QListView *, Email *)), this, SLOT(viewMail(QListView *, Email *)) ); connect(emailClient, SIGNAL(mailUpdated(Email *)), this, SLOT(updateMailView(Email *)) ); connect(writeMail, SIGNAL(cancelMail()), this, SLOT(showEmailClient()) ); connect(writeMail, SIGNAL(sendMailRequested(const Email &)), this, SLOT(showEmailClient()) ); connect(writeMail, SIGNAL(sendMailRequested(const Email &)), emailClient, SLOT(enqueMail(const Email &)) ); connect(readMail, SIGNAL(cancelView()), this, SLOT(showEmailClient()) ); connect(readMail, SIGNAL(replyRequested(Email &, bool&)), this, 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()); 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(); readMail->update(view, mail); views->raiseWidget(readMail); setCaption( tr( "Examine 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); } - -/*void MailItWindow::reply(Email& mail) -{ - qDebug("####EmailClient: 0 reached"); - composeReply(mail,(bool&)FALSE); -} - -void MailItWindow::replyAll(Email& mail) -{ - qDebug("####EmailClient: 1 reached"); - composeReply(mail,(bool&)TRUE); -} - -void MailItWindow::forward(Email& mail) -{ - qDebug("####EmailClient: 2 reached"); -} - -void MailItWindow::remove(Email&) -{ - qDebug("####EmailClient: 3 reached"); - //emit removeItem(eli,(bool&)TRUE); -} */
\ No newline at end of file diff --git a/noncore/unsupported/mailit/popclient.cpp b/noncore/unsupported/mailit/popclient.cpp index f9cc337..67306be 100644 --- a/noncore/unsupported/mailit/popclient.cpp +++ b/noncore/unsupported/mailit/popclient.cpp @@ -26,350 +26,342 @@ extern "C" { } #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"); return; } status = Init; socket->connectToHost(target, port); receiving = TRUE; selected = FALSE; emit updateStatus("DNS lookup"); } void PopClient::setAccount(QString popUser, QString popPasswd) { popUserName = popUser; popPassword = popPasswd; } void PopClient::setSynchronize(int lastCount) { synchronize = TRUE; lastSync = lastCount; } void PopClient::removeSynchronize() { synchronize = FALSE; lastSync = 0; } void PopClient::headersOnly(bool headers, int limit) { preview = headers; headerLimit = limit; } void PopClient::setSelectedMails(MailList *list) { selected = TRUE; 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(); - //qDebug(response +" %d", status); 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; - //qDebug( md5Source); -// for( int i = 0; i < md5Source.length(); i++) { -// buff[i] = (QChar)md5Source[i]; -// } md5_buffer( (char const *)md5Source, md5Source.length(),&md5Digest[0]); -// md5_buffer(char const *buffer, unsigned int len, char *digest); - -// MD5_Init( &ctx); -// MD5_Update( &ctx, buff, sizeof( buff) ); -// MD5_Final( md5Digest, &ctx); -// MD5( buff, md5Source.length(), md5Digest); 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; } - //password shhh. don't tell anyone (implement APOP...) + case Pass: { *stream << "PASS " << popPassword << "\r\n"; status = Stat; break; } //ask for number of messages case Stat: { if (response[0] == '+') { *stream << "STAT" << "\r\n"; 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; messageCount = 1; } if (selected) { int *ptr = mailList->first(); if (ptr != 0) { newMessages++; //to ensure no early jumpout messageCount = *(mailList->first()); } 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) { temp.setNum(messageCount); emit updateStatus(tr("Previous message ") + temp); } 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, ""); int x = temp.find(" ", 0); temp = temp.right(temp.length() - ((uint) x + 1) ); mailSize = temp.toInt(); emit currentMailSize(mailSize); status = Retr; } else { //qWarning(response); errorHandling(ErrUnknownResponse); } } } //Read message number x, count upwards to messageCount case Retr: { if (status != Quit) { - if (!preview || mailSize <= headerLimit) { + if (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] == '+') { 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 //complete mail downloaded - if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ + //if ( (!preview ) || ((preview) && (mailSize <= headerLimit)) ){ + if ( mailSize <= headerLimit) + { 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 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 { *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/readmail.cpp b/noncore/unsupported/mailit/readmail.cpp index dc98a6f..4eae7f6 100644 --- a/noncore/unsupported/mailit/readmail.cpp +++ b/noncore/unsupported/mailit/readmail.cpp @@ -1,357 +1,367 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "readmail.h" #include <qimage.h> #include <qmime.h> #include <qaction.h> #include <qpe/resource.h> ReadMail::ReadMail( QWidget* parent, const char* name, WFlags fl ) : QMainWindow(parent, name, fl) { plainTxt = FALSE; init(); viewAtt = new ViewAtt(0, "View Attatchments"); } ReadMail::~ReadMail() { delete emailView->mimeSourceFactory(); delete viewAtt; } void ReadMail::init() { setToolBarsMovable(FALSE); bar = new QToolBar(this); bar->setHorizontalStretchable( TRUE ); menu = new QMenuBar( bar ); viewMenu = new QPopupMenu(menu); menu->insertItem( tr( "&View" ), viewMenu); mailMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Mail" ), mailMenu); bar = new QToolBar(this); //reply dependant on viewing inbox replyButton = new QAction( tr( "Reply" ), Resource::loadPixmap( "mailit/reply" ), QString::null, 0, this, 0 ); connect(replyButton, SIGNAL(activated()), this, SLOT(reply()) ); + replyButton->setWhatsThis(tr("Click here to reply to the selected mail")); forwardButton = new QAction( tr( "Forward" ), Resource::loadPixmap( "mailit/forward" ), QString::null, 0, this, 0 ); connect(forwardButton, SIGNAL(activated()), this, SLOT(forward()) ); + forwardButton->setWhatsThis(tr("Click here to forward the selected mail")); previousButton = new QAction( tr( "Previous" ), Resource::loadPixmap( "back" ), QString::null, 0, this, 0 ); connect( previousButton, SIGNAL( activated() ), this, SLOT( previous() ) ); previousButton->addTo(bar); previousButton->addTo(viewMenu); + previousButton->setWhatsThis(tr("Read the previous mail in the list")); nextButton = new QAction( tr( "Next" ), Resource::loadPixmap( "forward" ), QString::null, 0, this, 0 ); connect( nextButton, SIGNAL( activated() ), this, SLOT( next() ) ); nextButton->addTo(bar); nextButton->addTo(viewMenu); + previousButton->setWhatsThis(tr("Read the next mail in the list")); - attatchmentsButton = new QAction( tr( "Attatchments" ), Resource::loadPixmap( "mailit/attach" ), QString::null, 0, this, 0 ); - connect( attatchmentsButton, SIGNAL( activated() ), this, - SLOT( viewAttatchments() ) ); - attatchmentsButton->addTo(bar); - attatchmentsButton->addTo(viewMenu); + attachmentButton = new QAction( tr( "Attatchments" ), Resource::loadPixmap( "mailit/attach" ), QString::null, 0, this, 0 ); + connect( attachmentButton, SIGNAL( activated() ), this, + SLOT( viewAttachments() ) ); + attachmentButton->addTo(bar); + attachmentButton->addTo(viewMenu); + attachmentButton->setWhatsThis(tr("Click here to add attachments to your mail")); plainTextButton = new QAction( tr( "Text Format" ), Resource::loadPixmap( "DocsIcon" ), QString::null, 0, this, 0, TRUE); connect( plainTextButton, SIGNAL( activated() ), this, SLOT( shiftText() ) ); plainTextButton->addTo(bar); plainTextButton->addTo(viewMenu); + plainTextButton->setWhatsThis(tr("The mail view has 2 modes:\n" + "<LI><B>RichText</B> shows the mail as HTML with reach features (no standard line breaks)</LI>" + "<LI><B>Plain</B> shows the mail as standard plain text</LI>" + "Click here to switch between those view modes" )); deleteButton = new QAction( tr( "Delete" ), Resource::loadPixmap( "trash" ), QString::null, 0, this, 0 ); connect( deleteButton, SIGNAL( activated() ), this, SLOT( deleteItem() ) ); deleteButton->addTo(bar); deleteButton->addTo(mailMenu); + deleteButton->setWhatsThis(tr("Click here to remove the selected mail")); viewMenu->insertItem(Resource::loadPixmap("close"), "Close", this, SLOT(close())); emailView = new QTextView( this, "emailView" ); setCentralWidget(emailView); mime = new QMimeSourceFactory(); emailView->setMimeSourceFactory(mime); } void ReadMail::updateView() { Enclosure *ePtr; QString mailStringSize; QString text, temp; mail->read = TRUE; //mark as read inbox = mail->received; replyButton->removeFrom(mailMenu); replyButton->removeFrom(bar); forwardButton->removeFrom(mailMenu); forwardButton->removeFrom(bar); if (inbox == TRUE) { replyButton->addTo(bar); replyButton->addTo(mailMenu); forwardButton->addTo(bar); forwardButton->addTo(mailMenu); if (!mail->downloaded) { //report currently viewed mail so that it will be //placed first in the queue of new mails to download emit viewingMail(mail); double mailSize = (double) mail->size; if (mailSize < 1024) { mailStringSize.setNum(mailSize); mailStringSize += " Bytes"; } else if (mailSize < 1024*1024) { mailStringSize.setNum( (mailSize / 1024), 'g', 2 ); mailStringSize += " Kb"; } else { mailStringSize.setNum( (mailSize / (1024*1024)), 'g', 3); mailStringSize += " Mb"; } } } QMimeSourceFactory *mime = emailView->mimeSourceFactory(); if (! plainTxt) { //use RichText, inline pics etc. emailView->setTextFormat(QTextView::RichText); text = "<b><big><center><font color=\"blue\">" + mail->subject +"</font></center></big></b><br>"; text += "<b>From: </b>" + mail->from + " <i>" + mail->fromMail + "</i><br>"; text +="<b>To: </b>"; for (QStringList::Iterator it = mail->recipients.begin(); it != mail->recipients.end(); ++it ) { text += *it + " "; } text +="<br><b>CC: </b>"; for (QStringList::Iterator it = mail->carbonCopies.begin(); it != mail->carbonCopies.end(); ++it ) { text += *it + " "; } text += "<br>" + mail->date; if (mail->files.count() > 0) { text += "<br><b>Attatchments: </b>"; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += ePtr->originalName + " "; } text += "<hr><br>" + mail->body; if (inbox) { for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += "<br><hr><b>Attatchment: </b>" + ePtr->originalName + "<hr>"; if (ePtr->contentType == "TEXT") { QFile f(ePtr->path + ePtr->name); if (f.open(IO_ReadOnly) ) { QTextStream t(&f); temp = t.read(); text += temp + "<br>"; f.close(); } else { text += "<b>Could not locate file</b><br>"; } } if (ePtr->contentType == "IMAGE") { // temp.setNum(emailView->width()); //get display width // text += "<img width=" + temp +" src =""" + // ePtr->originalName + """> </img>"; text += "<img src =""" + ePtr->originalName + """> </img>"; mime->setPixmap(ePtr->originalName, QPixmap( (ePtr->path + ePtr->name) )); } } } } else { if (mail->downloaded || !inbox) { text += "<hr><br>" + mail->body; } else { text += "<hr><br><b> Awaiting download </b><br>"; text += "Size of mail: " + mailStringSize; } } emailView->setText(text); } else { // show plain txt mail emailView->setTextFormat(QTextView::PlainText); text = "Subject: " + mail->subject + "\n"; text += "From: " + mail->from + " " + mail->fromMail + "\n"; text += "To: "; for (QStringList::Iterator it = mail->recipients.begin(); it != mail->recipients.end(); ++it ) { text += *it + " "; } text += "\nCC: "; for (QStringList::Iterator it = mail->carbonCopies.begin(); it != mail->carbonCopies.end(); ++it ) { text += *it + " "; } text += "\nDate: " + mail->date + "\n"; if (mail->files.count() > 0) { text += "Attatchments: "; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { text += ePtr->originalName + " "; } text += "\n\n"; } else text += "\n"; if (!inbox) { text += mail->body; } else if (mail->downloaded) { text += mail->bodyPlain; } else { text += "\nAwaiting download\n"; text += "Size of mail: " + mailStringSize; } emailView->setText(text); } if (mail->files.count() == 0) - attatchmentsButton->setEnabled(FALSE); - else attatchmentsButton->setEnabled(TRUE); + attachmentButton->setEnabled(FALSE); + else attachmentButton->setEnabled(TRUE); setCaption("Examining mail: " + mail->subject); } //update view with current EmailListItem (item) void ReadMail::update(QListView *thisView, Email *mailIn) { view = thisView; item = (EmailListItem *) view->selectedItem(); mail = mailIn; updateView(); updateButtons(); } void ReadMail::mailUpdated(Email *mailIn) { if (mailIn == mail) { updateView(); } else { updateButtons(); } } void ReadMail::close() { emit cancelView(); } //gets next item in listview, exits if there is no next void ReadMail::next() { item = (EmailListItem *) item->nextSibling(); if (item != NULL) { mail = item->getMail(); updateView(); } updateButtons(); } //gets previous item in listview, exits if there is no previous void ReadMail::previous() { item = (EmailListItem *) item->itemAbove(); if (item != NULL) { mail = item->getMail(); updateView(); } updateButtons(); } //deletes item, tries bringing up next or previous, exits if unsucessful void ReadMail::deleteItem() { EmailListItem *temp = item; temp = (EmailListItem *) item->nextSibling(); //trybelow if (temp == NULL) temp = (EmailListItem *) item->itemAbove(); //try above emit removeItem(item, inbox); item = temp; if (item != NULL) { //more items in list mail = item->getMail(); updateView(); updateButtons(); } else close(); //no more items to see } void ReadMail::updateButtons() { EmailListItem *temp; temp = item; if ((EmailListItem *) temp->nextSibling() == NULL) nextButton->setEnabled(FALSE); else nextButton->setEnabled(TRUE); temp = item; if ((EmailListItem *) temp->itemAbove() == NULL) previousButton->setEnabled(FALSE); else previousButton->setEnabled(TRUE); } void ReadMail::shiftText() { plainTxt = ! plainTxt; updateView(); } -void ReadMail::viewAttatchments() +void ReadMail::viewAttachments() { viewAtt->update(mail, inbox); viewAtt->showMaximized(); } void ReadMail::reply() { emit replyRequested(*mail, (bool&)TRUE); } void ReadMail::forward() { emit forwardRequested(*mail); } diff --git a/noncore/unsupported/mailit/readmail.h b/noncore/unsupported/mailit/readmail.h index 0fe0646..df32c34 100644 --- a/noncore/unsupported/mailit/readmail.h +++ b/noncore/unsupported/mailit/readmail.h @@ -1,89 +1,89 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef READMAIL_H #define READMAIL_H #include <qaction.h> #include <qmainwindow.h> #include <qmenubar.h> #include <qpopupmenu.h> #include <qlabel.h> #include <qlistview.h> #include <qlayout.h> #include <qtextview.h> #include "emailhandler.h" #include "emaillistitem.h" #include "viewatt.h" class ReadMail : public QMainWindow { Q_OBJECT public: ReadMail( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~ReadMail(); void update(QListView *thisView, Email *mailIn); void updateView(); void mailUpdated(Email *mailIn); signals: void cancelView(); void replyRequested(Email &, bool &); void forwardRequested(Email&); void removeItem(EmailListItem *, bool &); void viewingMail(Email *); public slots: void close(); void next(); void previous(); void deleteItem(); void shiftText(); - void viewAttatchments(); + void viewAttachments(); void reply(); void forward(); private: void init(); void updateButtons(); private: QListView *view; EmailListItem *item; bool plainTxt, inbox; Email *mail; ViewAtt *viewAtt; QToolBar *bar; QMenuBar *menu; QPopupMenu *viewMenu, *mailMenu; QAction *deleteButton; QMimeSourceFactory *mime; QAction *plainTextButton; QAction *nextButton; QTextView *emailView; - QAction *attatchmentsButton; + QAction *attachmentButton; QAction *previousButton; QAction *replyButton; QAction *forwardButton; }; #endif // READMAIL_H diff --git a/noncore/unsupported/mailit/smtpclient.cpp b/noncore/unsupported/mailit/smtpclient.cpp index b2e38e5..8a51a5b 100644 --- a/noncore/unsupported/mailit/smtpclient.cpp +++ b/noncore/unsupported/mailit/smtpclient.cpp @@ -1,171 +1,163 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "smtpclient.h" #include "emailhandler.h" SmtpClient::SmtpClient() { socket = new QSocket(this, "smtpClient"); stream = new QTextStream(socket); mailList.setAutoDelete(TRUE); connect(socket, SIGNAL(error(int)), this, SLOT(errorHandling(int))); connect(socket, SIGNAL(connected()), this, SLOT(connectionEstablished())); connect(socket, SIGNAL(readyRead()), this, SLOT(incomingData())); sending = FALSE; } SmtpClient::~SmtpClient() { delete socket; delete stream; } void SmtpClient::newConnection(QString target, int port) { if (sending) { qWarning("socket in use, connection refused"); return; } status = Init; sending = TRUE; socket->connectToHost(target, port); emit updateStatus(tr("DNS lookup")); } void SmtpClient::addMail(QString from, QString subject, QStringList to, QString body) { RawEmail *mail = new RawEmail; mail->from = from; mail->subject = subject; mail->to = to; mail->body = body; mailList.append(mail); } void SmtpClient::connectionEstablished() { emit updateStatus(tr("Connection established")); } void SmtpClient::errorHandling(int status) { emit errorOccurred(status); socket->close(); mailList.clear(); sending = FALSE; } void SmtpClient::incomingData() { QString response; if (!socket->canReadLine()) return; response = socket->readLine(); - //qDebug(response); switch(status) { case Init: { if (response[0] == '2') { status = From; mailPtr = mailList.first(); *stream << "HELO there\r\n"; - //qDebug("HELO"); } else errorHandling(ErrUnknownResponse); break; } case From: { if (response[0] == '2') { *stream << "MAIL FROM: " << mailPtr->from << "\r\n"; status = Recv; - //qDebug("MAIL FROM: "+mailPtr->from); } else errorHandling(ErrUnknownResponse); break; } case Recv: { if (response[0] == '2') { it = mailPtr->to.begin(); if (it == NULL) errorHandling(ErrUnknownResponse); *stream << "RCPT TO: " << *it << ">\r\n"; - //qDebug("RCPT TO: "+ *it); status = MRcv; } else errorHandling(ErrUnknownResponse); break; } case MRcv: { if (response[0] == '2') { it++; if ( it != mailPtr->to.end() ) { *stream << "RCPT TO: <" << *it << ">\r\n"; - //qDebug("RCPT TO: "+ *it); break; } else { status = Data; } } else errorHandling(ErrUnknownResponse); } case Data: { if (response[0] == '2') { *stream << "DATA\r\n"; status = Body; - //qDebug("DATA"); emit updateStatus(tr("Sending: ") + mailPtr->subject); } else errorHandling(ErrUnknownResponse); break; } case Body: { if (response[0] == '3') { *stream << mailPtr->body << "\r\n.\r\n"; mailPtr = mailList.next(); if (mailPtr != NULL) { status = From; } else { status = Quit; } - //qDebug("BODY"); } else errorHandling(ErrUnknownResponse); break; } case Quit: { if (response[0] == '2') { *stream << "QUIT\r\n"; status = Done; QString temp; temp.setNum(mailList.count()); emit updateStatus(tr("Sent ") + temp + tr(" messages")); emit mailSent(); mailList.clear(); sending = FALSE; socket->close(); - //qDebug("QUIT"); } else errorHandling(ErrUnknownResponse); break; } } } diff --git a/noncore/unsupported/mailit/textparser.cpp b/noncore/unsupported/mailit/textparser.cpp index f082417..3fa5f6e 100644 --- a/noncore/unsupported/mailit/textparser.cpp +++ b/noncore/unsupported/mailit/textparser.cpp @@ -1,181 +1,191 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "textparser.h" TextParser::TextParser(QString in, QString lineBreak) { data = in; lineSep = lineBreak; init(); createSeparators(); split(); } TextParser::TextParser(QString in, QString lineBreak, QString sep) { data = in; lineSep = lineBreak; init(); separators = sep; split(); } void TextParser::init() { lineCount = 0; linePos = 0; totalElmCount = 0; separatorPos = -1; //not initialized wordPos = -1; //not initialized sepAtLine = 0; sepAtPosElm = -1; //such that nextSep equals 0 wordAtLine = 0; wordAtPosElm = -1; //such that nextWord equals 0 atLine = 0; atPosElm = 0; } void TextParser::createSeparators() { separators = " @#,.:;<>*/(){}|'?-+=_"; } /* Returns pos of given search criteria, -1 if not found */ int TextParser::find(QString target, QChar sep, int pos, bool upperCase) { + + t_splitElm parsstr; + QString pString; + int atLine = 0, atPosElm = 0; - for (int x = 0; x < totalElmCount; x++) { - if (x >= pos) { - if (upperCase) { - if ((splitDone[atLine].elm[atPosElm].str.upper() == target) && - (splitDone[atLine].elm[atPosElm].separator == sep)) - return x; - } else { - if ((splitDone[atLine].elm[atPosElm].str == target) && - (splitDone[atLine].elm[atPosElm].separator == sep)) - return x; + getLineReference(pos,&atLine,&atPosElm); + + for (int x = pos; x < totalElmCount; x++) + { + parsstr=splitDone[atLine].elm[atPosElm++]; + + if (upperCase) + { + pString=parsstr.str.upper(); + target=target.upper(); } + else + { + pString=parsstr.str; } - atPosElm++; - if (atPosElm >= splitDone[atLine].elmCount) { //new Line + if ((pString == target) && (parsstr.separator == sep)) + { + return x; + } + if (atPosElm >= splitDone[atLine].elmCount) + { //new Line atLine++; atPosElm = 0; } } - return -1; } int TextParser::elmCount() { return totalElmCount; } QChar TextParser::separatorAt(int pos) { if (getLineReference(pos, &sepAtLine, &sepAtPosElm) == -1) return QChar::null; separatorPos = pos; return splitDone[sepAtLine].elm[sepAtPosElm].separator; } QChar TextParser::nextSeparator() { sepAtPosElm++; if (splitDone[sepAtLine].elmCount <= sepAtPosElm) { sepAtLine++; sepAtPosElm = 0; } separatorPos++; return splitDone[sepAtLine].elm[sepAtPosElm].separator; } bool TextParser::hasNextSeparator() { return ((separatorPos+1) < totalElmCount); } QString TextParser::wordAt(int pos) { if (getLineReference(pos, &wordAtLine, &wordAtPosElm) == -1) return NULL; wordPos = pos; return splitDone[wordAtLine].elm[wordAtPosElm].str; } QString TextParser::nextWord() { wordAtPosElm++; if (splitDone[wordAtLine].elmCount <= wordAtPosElm) { wordAtLine++; wordAtPosElm = 0; } wordPos++; return splitDone[wordAtLine].elm[wordAtPosElm].str; } bool TextParser::hasNextWord() { return ((wordPos + 1) < totalElmCount); } QString TextParser::getString(int *pos, QChar stop, bool lineEnd = false) { QString returnStr = wordAt(*pos); QChar chr = separatorAt(*pos); QString s; if (returnStr == "") return ""; if (chr == stop) return returnStr; if (!lineEnd) { while ((chr != stop) && hasNextWord()) { returnStr.append(chr); returnStr += nextWord(); chr = nextSeparator(); } } else { //copy from pos to end of line getLineReference(*pos, &atLine, &atPosElm); returnStr = ""; while (atPosElm < splitDone[atLine].elmCount) { if (splitDone[atLine].elm[atPosElm].str != "") { returnStr += splitDone[atLine].elm[atPosElm].str; } chr = splitDone[atLine].elm[atPosElm].separator; if (!chr.isNull() && (int) chr != 0) { returnStr.append(splitDone[atLine].elm[atPosElm].separator); } atPosElm++; } } *pos = wordPos; return returnStr; } diff --git a/noncore/unsupported/mailit/viewatt.cpp b/noncore/unsupported/mailit/viewatt.cpp index b6f5015..21885c2 100644 --- a/noncore/unsupported/mailit/viewatt.cpp +++ b/noncore/unsupported/mailit/viewatt.cpp @@ -1,118 +1,121 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 "resource.h" #include "viewatt.h" +#include <qwhatsthis.h> #include <qpe/applnk.h> #include <qpe/mimetype.h> ViewAtt::ViewAtt(QWidget *parent, const char *name, WFlags f) : QMainWindow(parent, name, f) { setCaption("Exploring attatchments"); setToolBarsMovable( FALSE ); bar = new QToolBar(this); installButton = new QAction( tr( "Install" ), Resource::loadPixmap( "exec" ), QString::null, CTRL + Key_C, this, 0 ); connect(installButton, SIGNAL(activated()), this, SLOT(install()) ); + installButton->setWhatsThis(tr("Click here to install the attachment to your Documents")); listView = new QListView(this, "AttView"); listView->addColumn( "Attatchment" ); listView->addColumn( "Type" ); listView->addColumn( "Installed" ); setCentralWidget(listView); + QWhatsThis::add(listView,QWidget::tr("This is an overview about all attachments in the mail")); } void ViewAtt::update(Email *mailIn, bool inbox) { QListViewItem *item; Enclosure *ePtr; listView->clear(); if (inbox) { bar->clear(); installButton->addTo( bar ); bar->show(); } else { bar->hide(); } mail = mailIn; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { QString isInstalled = "No"; if (ePtr->installed) isInstalled = "Yes"; item = new QListViewItem(listView, ePtr->originalName, ePtr->contentType, isInstalled); const QString& mtypeDef=(const QString&) ePtr->contentType+"/"+ePtr->contentAttribute; MimeType mt(mtypeDef); item->setPixmap(0, mt.pixmap()); /* if (ePtr->contentType == "TEXT") { actions = new QAction( tr("View"), Resource::loadPixmap("TextEditor"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); } if (ePtr->contentType == "AUDIO") { actions = new QAction( tr("Play"), Resource::loadPixmap("SoundPlayer"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); item->setPixmap(0, Resource::loadPixmap("play")); } if (ePtr->contentType == "IMAGE") { actions = new QAction( tr("Show"), Resource::loadPixmap("pixmap"), QString::null, CTRL + Key_C, this, 0); actions->addTo(bar); item->setPixmap(0, Resource::loadPixmap("pixmap")); }*/ } } void ViewAtt::install() { Enclosure *ePtr, *selPtr; QListViewItem *item; QString filename; DocLnk d; item = listView->selectedItem(); if (item != NULL) { filename = item->text(0); selPtr = NULL; for ( ePtr=mail->files.first(); ePtr != 0; ePtr=mail->files.next() ) { if (ePtr->originalName == filename) selPtr = ePtr; } if (selPtr == NULL) { qWarning("Internal error, file is not installed to documents"); return; } d.setName(selPtr->originalName); d.setFile(selPtr->path + selPtr->name); d.setType(selPtr->contentType + "/" + selPtr->contentAttribute); d.writeLink(); selPtr->installed = TRUE; item->setText(2, "Yes"); } } diff --git a/noncore/unsupported/mailit/writemail.cpp b/noncore/unsupported/mailit/writemail.cpp index a9dcb02..0336c83 100644 --- a/noncore/unsupported/mailit/writemail.cpp +++ b/noncore/unsupported/mailit/writemail.cpp @@ -1,355 +1,363 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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 <qmessagebox.h> +#include <qwhatsthis.h> #include "writemail.h" #include <qpe/resource.h> WriteMail::WriteMail( QWidget* parent, const char* name, WFlags fl ) : QMainWindow( parent, name, fl ) { showingAddressList = FALSE; init(); - addAtt = new AddAtt(0, "Add Attatchments"); + addAtt = new AddAtt(0, "Add Attachments"); } WriteMail::~WriteMail() { delete addAtt; } void WriteMail::setAddressList(AddressList *list) { Contact *cPtr; addressList = list; addressView->clear(); QList<Contact> *cListPtr = addressList->getContactList(); QListViewItem *item; for (cPtr = cListPtr->first(); cPtr != 0; cPtr = cListPtr->next() ) { item = new QListViewItem(addressView, cPtr->name, cPtr->email); } } void WriteMail::init() { setToolBarsMovable(FALSE); bar = new QToolBar(this); bar->setHorizontalStretchable( TRUE ); menu = new QMenuBar( bar ); mailMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Mail" ), mailMenu); addMenu = new QPopupMenu(menu); menu->insertItem( tr( "&Add" ), addMenu); bar = new QToolBar(this); - attatchButton = new QAction(tr("Attatchment"), Resource::loadPixmap("mailit/attach"), QString::null, 0, this, 0); - attatchButton->addTo(bar); - attatchButton->addTo(addMenu); - connect( attatchButton, SIGNAL( activated() ), this, SLOT( attatchFile() ) ); + attachButton = new QAction(tr("Attachment"), Resource::loadPixmap("mailit/attach"), QString::null, 0, this, 0); + attachButton->addTo(bar); + attachButton->addTo(addMenu); + connect( attachButton, SIGNAL( activated() ), this, SLOT( attachFile() ) ); + attachButton->setWhatsThis(tr("Click here to attach files to your mail")); confirmButton = new QAction(tr("Enque mail"), Resource::loadPixmap("OKButton"), QString::null, 0, this, 0); confirmButton->addTo(bar); confirmButton->addTo(mailMenu); connect( confirmButton, SIGNAL( activated() ), this, SLOT( accept() ) ); + confirmButton->setWhatsThis(tr("This button puts your mail in the send queue")); newButton = new QAction(tr("New mail"), Resource::loadPixmap("new"), QString::null, 0, this, 0); newButton->addTo(mailMenu); connect( newButton, SIGNAL( activated() ), this, SLOT( newMail() ) ); + newButton->setWhatsThis(tr("Click here to create a new mail")); widget = new QWidget(this, "widget"); grid = new QGridLayout( widget ); recipientsBox = new QComboBox( FALSE, widget, "toLabel" ); recipientsBox->insertItem( tr( "To:" ) ); recipientsBox->insertItem( tr( "CC:" ) ); recipientsBox->setCurrentItem(0); grid->addWidget( recipientsBox, 0, 0 ); connect(recipientsBox,SIGNAL(activated(int)),this, SLOT(changeRecipients(int))); - subjetLabel = new QLabel( widget, "subjetLabel" ); subjetLabel->setText( tr( "Subject:" ) ); grid->addWidget( subjetLabel, 1, 0 ); ToolButton13_2 = new QToolButton( widget, "ToolButton13_2" ); ToolButton13_2->setText( tr( "..." ) ); grid->addWidget( ToolButton13_2, 1, 2 ); subjectInput = new QLineEdit( widget, "subjectInput" ); grid->addWidget( subjectInput, 1, 1 ); + QWhatsThis::add(subjectInput,QWidget::tr("The mail subject should be entered here")); toInput = new QLineEdit( widget, "toInput" ); grid->addWidget( toInput, 0, 1 ); + QWhatsThis::add(recipientsBox,QWidget::tr("Recipients can be entered here")); ccInput = new QLineEdit( widget, "ccInput" ); ccInput->hide(); 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")); 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")); 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 attatchedFiles, attatchmentsType; + 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) ) { QMessageBox::warning(this,tr("Incorrect recipient separator"), tr("Recipients must be separated by ;\nand be valid emailaddresses"), tr("OK\n")); return; } if ((ccInput->text()!="") && (! getRecipients(true) )) { QMessageBox::warning(this,tr("Incorrect carbon copy separator"), tr("CC Recipients must be separated by ;\nand be valid emailaddresses"), tr("OK\n")); return; } mail.subject = subjectInput->text(); mail.body = emailInput->text(); mail.sent = false; mail.received = false; mail.rawMail = "To: "; for (QStringList::Iterator it = mail.recipients.begin(); it != mail.recipients.end(); ++it) { mail.rawMail += (*it); mail.rawMail += ",\n"; } mail.rawMail.truncate(mail.rawMail.length()-2); mail.rawMail += "\nCC: "; for (QStringList::Iterator it = mail.carbonCopies.begin(); it != mail.carbonCopies.end(); ++it) { mail.rawMail += (*it); mail.rawMail += ",\n"; } mail.rawMail += mail.from; mail.rawMail += "\nSubject: "; mail.rawMail += mail.subject; mail.rawMail += "\n\n"; - attatchedFiles = addAtt->returnAttatchedFiles(); - attatchmentsType = addAtt->returnFileTypes(); + attachedFiles = addAtt->returnattachedFiles(); + attachmentsType = addAtt->returnFileTypes(); - QStringList::Iterator itType = attatchmentsType.begin(); + QStringList::Iterator itType = attachmentsType.begin(); Enclosure e; - for ( QStringList::Iterator it = attatchedFiles.begin(); it != attatchedFiles.end(); ++it ) { + for ( QStringList::Iterator it = attachedFiles.begin(); it != attachedFiles.end(); ++it ) { e.id = idCount; e.originalName = (*it).latin1(); e.contentType = (*itType).latin1(); e.contentAttribute = (*itType).latin1(); e.saved = TRUE; mail.addEnclosure(&e); itType++; idCount++; } mail.rawMail += mail.body; mail.rawMail += "\n"; mail.rawMail += ".\n"; emit sendMailRequested(mail); addAtt->clear(); } void WriteMail::getAddress() { showingAddressList = !showingAddressList; if (showingAddressList) { emailInput->hide(); addressView->show(); okButton->show(); } else { addressView->hide(); okButton->hide(); emailInput->show(); } } -void WriteMail::attatchFile() +void WriteMail::attachFile() { addAtt->showMaximized(); } void WriteMail::reply(Email replyMail, bool replyAll) { int pos; mail = replyMail; mail.files.clear(); toInput->setText(mail.fromMail); //replyAll ? ccInput->setText(mail.c) addRecipients(replyAll); subjectInput->setText(tr("Re: ") + mail.subject); pos = 0; - mail.body.insert(pos, ">>"); + mail.body.insert(pos, ">"); while (pos != -1) { pos = mail.body.find('\n', pos); if (pos != -1) mail.body.insert(++pos, ">>"); } emailInput->setText(mail.body); } void WriteMail::forward(Email forwMail) { int pos=0; QString fwdBody=tr("======forwarded message from "); fwdBody.append(forwMail.fromMail); fwdBody.append(tr(" starts======\n\n")); mail=forwMail; toInput->setText(""); ccInput->setText(""); subjectInput->setText(tr("FWD: ") + mail.subject); fwdBody+=mail.body; fwdBody+=QString(tr("======end of forwarded message======\n\n")); emailInput->setText(fwdBody); } bool WriteMail::getRecipients(bool ccField) { QString str, temp; int pos = 0; mail.recipients.clear(); ccField ? temp = ccInput->text() : temp=toInput->text() ; while ( (pos = temp.find(';')) != -1) { str = temp.left(pos).stripWhiteSpace(); temp = temp.right(temp.length() - (pos + 1)); if ( str.find('@') == -1) return false; ccField ? mail.carbonCopies.append(str) : mail.recipients.append(str); addressList->addContact(str, ""); } 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); } 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); } else { recipients += "; " + item->text(0); } } item = item->nextSibling(); } ccField ? ccInput->setText(recipients):toInput->setText(recipients); addressView->hide(); okButton->hide(); emailInput->show(); addressButton->setOn(FALSE); showingAddressList = !showingAddressList; } void WriteMail::changeRecipients(int selection) { if (selection==0) { toInput->show(); ccInput->hide(); } else if (selection==1) { diff --git a/noncore/unsupported/mailit/writemail.h b/noncore/unsupported/mailit/writemail.h index f193b13..921f27e 100644 --- a/noncore/unsupported/mailit/writemail.h +++ b/noncore/unsupported/mailit/writemail.h @@ -1,96 +1,96 @@ /********************************************************************** ** Copyright (C) 2001 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** 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. ** **********************************************************************/ #ifndef WRITEMAIL_H #define WRITEMAIL_H #include <qmainwindow.h> #include <qaction.h> #include <qlabel.h> #include <qtoolbar.h> #include <qtoolbutton.h> #include <qmenubar.h> #include <qlayout.h> #include <qlineedit.h> #include <qmultilineedit.h> #include <qlistview.h> #include <qcombobox.h> #include "emailhandler.h" #include "addresslist.h" #include "addatt.h" class WriteMail : public QMainWindow { Q_OBJECT public: WriteMail( QWidget* parent, const char* name, WFlags fl = 0 ); ~WriteMail(); void reply(Email replyMail, bool replyAll); void setRecipient(const QString &recipient); void setAddressList(AddressList *list); void forward(Email forwMail); signals: void sendMailRequested(const Email &mail); void cancelMail(); public slots: void getAddress(); - void attatchFile(); + void attachFile(); void addRecipients(); void newMail(); void accept(); void reject(); void changeRecipients(int); private: bool getRecipients(bool); void init(); void addRecipients(bool); Email mail; AddAtt *addAtt; AddressList *addressList; bool showingAddressList; QToolBar *bar; QMenuBar *menu; QPopupMenu *addMenu, *mailMenu; QListView *addressView; QToolButton *okButton; QWidget *widget; - QAction *attatchButton; + QAction *attachButton; QAction *confirmButton; QAction *newButton; QLabel* subjetLabel; QToolButton* ToolButton13_2; QComboBox* recipientsBox; QLineEdit *subjectInput; QLineEdit *toInput; QLineEdit *ccInput; QToolButton* addressButton; QMultiLineEdit* emailInput; QGridLayout* grid; }; #endif // WRITEMAIL_H |