diff --git a/Makefile.am b/Makefile.am index 96962fff8..185fee8a4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ SUBDIRS = pics doc -INCLUDES = $(all_includes) -g +INCLUDES = $(all_includes) LDADD = $(all_libraries) -lkhtmlw -ljscript -lkdeui -lkdecore -lqt -lXext -lX11 -lgif $(LIBJPEG) -lmimelib $(LIBSOCKET) bin_PROGRAMS = kmail @@ -17,7 +17,8 @@ kmail_SOURCES = kmmainwin.cpp kmfolderdia.cpp kmfoldertree.cpp \ kmfilteraction.cpp kmidentity.cpp \ kmfolderseldlg.cpp kmfilter.cpp kmfilterdlg.cpp \ kmmsgbase.cpp kmmsglist.cpp kpgp.cpp \ - kfileio.cpp keditcl1.cpp keditcl2.cpp + kfileio.cpp keditcl1.cpp keditcl2.cpp kmaddrbook.cpp \ + kmaddrbookdlg.cpp BUILT_SOURCES = kmmainwin.moc kmfolderdia.moc kmfolder.moc \ kmfoldertree.moc kmsettings.moc kmheaders.moc \ @@ -26,7 +27,8 @@ BUILT_SOURCES = kmmainwin.moc kmfolderdia.moc kmfolder.moc \ kmacctmgr.moc kmfolderdir.moc kmfilteraction.moc \ kmfoldernode.moc kmacctseldlg.moc kmmsgpartdlg.moc \ kmimemagic.moc kmacctpop.moc kmaccount.moc \ - kmfolderseldlg.moc kmfilterdlg.moc kpgp.moc keditcl.moc + kmfolderseldlg.moc kmfilterdlg.moc kpgp.moc keditcl.moc \ + kmaddrbookdlg.moc CLEAN_FILES = $(BUILT_SOURCES) @@ -147,3 +149,7 @@ kmmsgpartdlg.moc: kmmsgpartdlg.h kpgp.cpp:kpgp.moc kpgp.moc: kpgp.h $(MOC) kpgp.h -o kpgp.moc + +kmaddrbookdlg.cpp:kmaddrbookdlg.moc +kmaddrbookdlg.moc: kmaddrbookdlg.h + $(MOC) kmaddrbookdlg.h -o kmaddrbookdlg.moc diff --git a/kmaddrbook.cpp b/kmaddrbook.cpp new file mode 100644 index 000000000..36f69216a --- /dev/null +++ b/kmaddrbook.cpp @@ -0,0 +1,133 @@ +// kmaddrbook.cpp +// Author: Stefan Taferner +// This code is under GPL + +#include "kmaddrbook.h" +#include +#include +#include + +//----------------------------------------------------------------------------- +KMAddrBook::KMAddrBook(): KMAddrBookInherited() +{ + mModified = FALSE; +} + + +//----------------------------------------------------------------------------- +KMAddrBook::~KMAddrBook() +{ + if (mModified) store(); + writeConfig(FALSE); +} + + +//----------------------------------------------------------------------------- +void KMAddrBook::insert(const QString aAddress) +{ + if (find(aAddress)<0) + { + inSort(aAddress); + mModified=TRUE; + } +} + + +//----------------------------------------------------------------------------- +void KMAddrBook::remove(const QString aAddress) +{ + remove(aAddress); + mModified=TRUE; +} + + +//----------------------------------------------------------------------------- +void KMAddrBook::clear(void) +{ + KMAddrBookInherited::clear(); + mModified=TRUE; +} + + +//----------------------------------------------------------------------------- +void KMAddrBook::writeConfig(bool aWithSync) +{ + KConfig* config = kapp->getConfig(); + + config->setGroup("Addressbook"); + config->writeEntry("default", mDefaultFileName); + + if (aWithSync) config->sync(); +} + + +//----------------------------------------------------------------------------- +void KMAddrBook::readConfig(void) +{ + KConfig* config = kapp->getConfig(); + config->setGroup("Addressbook"); + + mDefaultFileName = config->readEntry("default"); + if (mDefaultFileName.isEmpty()) + mDefaultFileName = kapp->localkdedir()+"/share/apps/kmail/addressbook"; + + debug("addressbook: %s", mDefaultFileName.data()); +} + + +//----------------------------------------------------------------------------- +int KMAddrBook::load(const char* aFileName) +{ + char line[256]; + const char* fname = (aFileName ? aFileName : (const char*)mDefaultFileName); + QFile file(fname); + + assert(fname != NULL); + + if (!file.open(IO_ReadOnly)) return file.status(); + clear(); + + while (!file.atEnd()) + { + if (file.readLine(line,255) < 0) return file.status(); + if (line[strlen(line)-1] < ' ') line[strlen(line)-1] = '\0'; + if (line[0]!='#' && line[0]!='\0') inSort(line); + } + file.close(); + + mModified = FALSE; + return IO_Ok; +} + + +//----------------------------------------------------------------------------- +int KMAddrBook::store(const char* aFileName) +{ + char* addr; + const char* fname = (aFileName ? aFileName : (const char*)mDefaultFileName); + QFile file(fname); + + assert(fname != NULL); + + if (!file.open(IO_ReadWrite|IO_Truncate)) return file.status(); + + addr = "# kmail addressbook file\n"; + if (file.writeBlock(addr,strlen(addr)) < 0) return file.status(); + + for (addr=first(); addr; addr=next()) + { + if (file.writeBlock(addr,strlen(addr)) < 0) return file.status(); + file.writeBlock("\n",1); + } + file.close(); + + mModified = FALSE; + return IO_Ok; +} + + +//----------------------------------------------------------------------------- +int KMAddrBook::compareItems(GCI aItem1, GCI aItem2) +{ + return strcasecmp((const char*)aItem1, (const char*)aItem2); +} diff --git a/kmaddrbook.h b/kmaddrbook.h new file mode 100644 index 000000000..0f780309d --- /dev/null +++ b/kmaddrbook.h @@ -0,0 +1,58 @@ +/* Simple Addressbook for KMail + * Author: Stefan Taferner + * This code is under GPL + */ +#ifndef KMAddrBook_h +#define KMAddrBook_h + +#include + +#define KMAddrBookInherited QStrList +class KMAddrBook: protected QStrList +{ +public: + KMAddrBook(); + virtual ~KMAddrBook(); + + /** Insert given address to the addressbook. Sorted. Duplicate + addresses are not inserted. */ + virtual void insert(const QString address); + + /** Remove given address from the addressbook. */ + virtual void remove(const QString address); + + /** Returns first address in addressbook or NULL if addressbook is empty. */ + virtual const char* first(void) { return KMAddrBookInherited::first(); } + + /** Returns next address in addressbook or NULL. */ + virtual const char* next(void) { return KMAddrBookInherited::next(); } + + /** Clear addressbook (remove the contents). */ + virtual void clear(void); + + /** Open addressbook file and read contents. The default addressbook + file is used if no filename is given. + Returns IO_Ok on success and an IO device status on failure -- see + QIODevice::status(). */ + virtual int load(const char* fileName=NULL); + + /** Store addressbook in file or in same file of last load() call + if no filename is given. Returns IO_Ok on success and an IO device + status on failure -- see QIODevice::status(). */ + virtual int store(const char* fileName=NULL); + + /** Read/write configuration options. Uses the group "Addressbook" + in the app's config file. */ + virtual void readConfig(void); + virtual void writeConfig(bool withSync=TRUE); + + /** Test if the addressbook has unsaved changes. */ + virtual bool modified(void) const { return mModified; } + +protected: + virtual int compareItems(GCI item1, GCI item2); + QString mDefaultFileName; + bool mModified; +}; + +#endif /*KMAddrBook_h*/ diff --git a/kmaddrbookdlg.cpp b/kmaddrbookdlg.cpp new file mode 100644 index 000000000..083bbdd25 --- /dev/null +++ b/kmaddrbookdlg.cpp @@ -0,0 +1,196 @@ +// kmaddrbookdlg.cpp +// Author: Stefan Taferner + +#include "kmaddrbookdlg.h" +#include "kmaddrbook.h" +#include +#include +#include + +//----------------------------------------------------------------------------- +KMAddrBookSelDlg::KMAddrBookSelDlg(KMAddrBook* aAddrBook, const char* aCap): + KMAddrBookSelDlgInherited(NULL, aCap, TRUE), mGrid(this, 2, 2), + mListBox(this), + mBtnOk(klocale->translate("Ok"),this), + mBtnCancel(klocale->translate("Cancel"),this) +{ + const char* addr; + + initMetaObject(); + + assert(aAddrBook != NULL); + mAddrBook = aAddrBook; + mAddress = 0; + + mBtnOk.adjustSize(); + mBtnOk.setMinimumSize(mBtnOk.size()); + mBtnCancel.adjustSize(); + mBtnCancel.setMinimumSize(mBtnCancel.size()); + + mGrid.addMultiCellWidget(&mListBox, 0, 0, 0, 1); + mGrid.addWidget(&mBtnOk, 1, 0); + mGrid.addWidget(&mBtnCancel, 1, 1); + + mGrid.setRowStretch(0,10); + mGrid.setRowStretch(1,0); + mGrid.setColStretch(0,10); + mGrid.setColStretch(1,10); + mGrid.activate(); + + connect(&mBtnOk, SIGNAL(clicked()), SLOT(slotOk())); + connect(&mBtnCancel, SIGNAL(clicked()), SLOT(slotCancel())); + + for (addr=mAddrBook->first(); addr; addr=mAddrBook->next()) + { + mListBox.insertItem(addr); + } +} + + +//----------------------------------------------------------------------------- +KMAddrBookSelDlg::~KMAddrBookSelDlg() +{ +} + + +//----------------------------------------------------------------------------- +void KMAddrBookSelDlg::slotOk() +{ + int idx = mListBox.currentItem(); + + if (idx>=0) mAddress = mListBox.text(idx); + else mAddress = 0; + + accept(); +} + + +//----------------------------------------------------------------------------- +void KMAddrBookSelDlg::slotCancel() +{ + mAddress = 0; + reject(); +} + + +//============================================================================= +// +// Class KMAddrBookEditDlg +// +//============================================================================= + +KMAddrBookEditDlg::KMAddrBookEditDlg(KMAddrBook* aAddrBook, const char* aCap): + KMAddrBookEditDlgInherited(NULL, aCap, TRUE), mGrid(this, 3, 4), + mListBox(this), mEdtAddress(this), + mBtnOk(klocale->translate("Ok"),this), + mBtnCancel(klocale->translate("Cancel"),this), + mBtnAdd(klocale->translate("Add"),this), + mBtnRemove(klocale->translate("Remove"),this) +{ + const char* addr; + + initMetaObject(); + + assert(aAddrBook != NULL); + mAddrBook = aAddrBook; + + mEdtAddress.adjustSize(); + mEdtAddress.setMinimumSize(mEdtAddress.size()); + mBtnOk.adjustSize(); + mBtnOk.setMinimumSize(mBtnOk.size()); + mBtnCancel.adjustSize(); + mBtnCancel.setMinimumSize(mBtnCancel.size()); + mBtnAdd.adjustSize(); + mBtnAdd.setMinimumSize(mBtnAdd.size()); + mBtnRemove.adjustSize(); + mBtnRemove.setMinimumSize(mBtnRemove.size()); + + mGrid.addMultiCellWidget(&mListBox, 0, 0, 0, 3); + mGrid.addMultiCellWidget(&mEdtAddress, 1, 1, 0, 3); + mGrid.addWidget(&mBtnOk, 2, 0); + mGrid.addWidget(&mBtnCancel, 2, 1); + mGrid.addWidget(&mBtnAdd, 2, 2); + mGrid.addWidget(&mBtnRemove, 2, 3); + + mGrid.setRowStretch(0,10); + mGrid.setRowStretch(1,0); + mGrid.setRowStretch(2,0); + mGrid.setColStretch(0,10); + mGrid.setColStretch(1,10); + mGrid.setColStretch(2,10); + mGrid.setColStretch(3,10); + mGrid.activate(); + + connect(&mListBox, SIGNAL(highlighted(const char*)), + SLOT(slotLbxHighlighted(const char*))); + connect(&mBtnOk, SIGNAL(clicked()), SLOT(slotOk())); + connect(&mBtnCancel, SIGNAL(clicked()), SLOT(slotCancel())); + connect(&mBtnAdd, SIGNAL(clicked()), SLOT(slotAdd())); + connect(&mBtnRemove, SIGNAL(clicked()), SLOT(slotRemove())); + + for (addr=mAddrBook->first(); addr; addr=mAddrBook->next()) + { + mListBox.insertItem(addr); + } +} + + +//----------------------------------------------------------------------------- +KMAddrBookEditDlg::~KMAddrBookEditDlg() +{ +} + + +//----------------------------------------------------------------------------- +void KMAddrBookEditDlg::slotLbxHighlighted(const char* aItem) +{ + mEdtAddress.setText(aItem); +} + + +//----------------------------------------------------------------------------- +void KMAddrBookEditDlg::slotOk() +{ + int idx, num; + const char* addr; + + mAddrBook->clear(); + num = mListBox.count(); + for(idx=0; idxinsert(addr); + } + mAddrBook->store(); + + accept(); +} + + +//----------------------------------------------------------------------------- +void KMAddrBookEditDlg::slotCancel() +{ + reject(); +} + + +//----------------------------------------------------------------------------- +void KMAddrBookEditDlg::slotAdd() +{ + const char* addr = mEdtAddress.text(); + + if (!addr || !*addr) return; + mListBox.insertItem(addr, mListBox.currentItem()); +} + + +//----------------------------------------------------------------------------- +void KMAddrBookEditDlg::slotRemove() +{ + int idx = mListBox.currentItem(); + if (idx >= 0) mListBox.removeItem(idx); +} + + +//----------------------------------------------------------------------------- +#include "kmaddrbookdlg.moc" diff --git a/kmaddrbookdlg.h b/kmaddrbookdlg.h new file mode 100644 index 000000000..69819a5e7 --- /dev/null +++ b/kmaddrbookdlg.h @@ -0,0 +1,67 @@ +/* KMail Addressbook selection and edit dialog classes + * Author: Stefan Taferner + * This code is under GPL + */ +#ifndef kmaddrbookdlg_h +#define kmaddrbookdlg_h + +#include +#include +#include +#include +#include + +class KMAddrBook; + +#define KMAddrBookSelDlgInherited QDialog +class KMAddrBookSelDlg: public QDialog +{ + Q_OBJECT +public: + KMAddrBookSelDlg(KMAddrBook* addrBook, const char* caption); + virtual ~KMAddrBookSelDlg(); + + /** returns selected address or NULL if none was selected or the cancel + button was pressed. */ + virtual const QString address(void) const { return mAddress; } + +protected slots: + void slotOk(); + void slotCancel(); + +protected: + KMAddrBook* mAddrBook; + QGridLayout mGrid; + QListBox mListBox; + QPushButton mBtnOk, mBtnCancel; + QString mAddress; +}; + + +//----------------------------------------------------------------------------- + +#define KMAddrBookEditDlgInherited QDialog +class KMAddrBookEditDlg: public QDialog +{ + Q_OBJECT +public: + KMAddrBookEditDlg(KMAddrBook* addrBook, const char* caption); + virtual ~KMAddrBookEditDlg(); + +protected slots: + void slotOk(); + void slotCancel(); + void slotAdd(); + void slotRemove(); + void slotLbxHighlighted(const char* item); + +protected: + KMAddrBook* mAddrBook; + QGridLayout mGrid; + QListBox mListBox; + QLineEdit mEdtAddress; + QPushButton mBtnOk, mBtnCancel, mBtnAdd, mBtnRemove; +}; + + +#endif /*kmaddrbookdlg_h*/ diff --git a/kmglobal.h b/kmglobal.h index 6ffa55c70..c2be59403 100644 --- a/kmglobal.h +++ b/kmglobal.h @@ -49,6 +49,10 @@ extern KStdAccel* keys; class KMFilterMgr; extern KMFilterMgr* filterMgr; +/** Addressbook. */ +class KMAddrBook; +extern KMAddrBook* addrBook; + /** Dictionary of available mail filter actions. */ class KMFilterActionDict; extern KMFilterActionDict* filterActionDict; diff --git a/kmheaders.cpp b/kmheaders.cpp index d3e5a4ac5..554947cf5 100644 --- a/kmheaders.cpp +++ b/kmheaders.cpp @@ -25,13 +25,14 @@ KMHeaders::KMHeaders(KMMainWin *aOwner, QWidget *parent=0, { QString kdir = app->kdedir(); KIconLoader* loader = app->getIconLoader(); - static QPixmap pixNew, pixUns, pixDel, pixOld, pixRep, pixSent, pixQueued; + static QPixmap pixNew, pixUns, pixDel, pixOld, pixRep, pixSent, pixQueued, + pixFwd; mOwner = aOwner; mFolder = NULL; getMsgIndex = -1; - setColumn(0, nls->translate("F"), 16, KMHeadersInherited::PixmapColumn); + setColumn(0, nls->translate("F"), 17, KMHeadersInherited::PixmapColumn); setColumn(1, nls->translate("Sender"), 200); setColumn(2, nls->translate("Subject"), 270); setColumn(3, nls->translate("Date"), 300); @@ -44,12 +45,14 @@ KMHeaders::KMHeaders(KMMainWin *aOwner, QWidget *parent=0, pixRep = loader->loadIcon("kmmsgreplied.xpm"); pixQueued= loader->loadIcon("kmmsgqueued.xpm"); pixSent = loader->loadIcon("kmmsgsent.xpm"); + pixFwd = loader->loadIcon("kmmsgforwarded.xpm"); dict().insert(KMMsgBase::statusToStr(KMMsgStatusNew), &pixNew); dict().insert(KMMsgBase::statusToStr(KMMsgStatusUnread), &pixUns); dict().insert(KMMsgBase::statusToStr(KMMsgStatusDeleted), &pixDel); dict().insert(KMMsgBase::statusToStr(KMMsgStatusOld), &pixOld); dict().insert(KMMsgBase::statusToStr(KMMsgStatusReplied), &pixRep); + dict().insert(KMMsgBase::statusToStr(KMMsgStatusForwarded), &pixFwd); dict().insert(KMMsgBase::statusToStr(KMMsgStatusQueued), &pixQueued); dict().insert(KMMsgBase::statusToStr(KMMsgStatusSent), &pixSent); diff --git a/kmmainwin.cpp b/kmmainwin.cpp index 3b7394854..20567fa74 100644 --- a/kmmainwin.cpp +++ b/kmmainwin.cpp @@ -20,6 +20,7 @@ #include "kmfiltermgr.h" #include "kmversion.h" #include "kmsender.h" +#include "kmaddrbookdlg.h" #include #include @@ -241,6 +242,14 @@ void KMMainWin::slotFilter() } +//----------------------------------------------------------------------------- +void KMMainWin::slotAddrBook() +{ + KMAddrBookEditDlg dlg(addrBook, nls->translate("Addressbook")); + dlg.exec(); +} + + //----------------------------------------------------------------------------- void KMMainWin::slotUnimplemented() { @@ -570,6 +579,8 @@ void KMMainWin::setupMenuBar() SLOT(slotSettings())); fileMenu->insertItem(nls->translate("&Filter..."), this, SLOT(slotFilter())); + fileMenu->insertItem(nls->translate("&Addressbook..."), this, + SLOT(slotAddrBook())); fileMenu->insertSeparator(); fileMenu->insertItem(nls->translate("&Close"), this, SLOT(slotClose()), keys->close()); diff --git a/kmmainwin.h b/kmmainwin.h index 4ac3bbf43..697e08013 100644 --- a/kmmainwin.h +++ b/kmmainwin.h @@ -62,6 +62,7 @@ protected slots: void slotNewMailReader(); void slotSettings(); void slotFilter(); + void slotAddrBook(); void slotUnimplemented(); void slotViewChange(); void slotAddFolder(); diff --git a/kmmessage.cpp b/kmmessage.cpp index 912c905ed..7fe27798b 100644 --- a/kmmessage.cpp +++ b/kmmessage.cpp @@ -118,6 +118,7 @@ const QString KMMessage::id(void) const return ""; } +//----------------------------------------------------------------------------- #ifdef KRN const QString KMMessage::refsAsAnchor(const QString references) { @@ -150,7 +151,6 @@ const QString KMMessage::refsAsAnchor(const QString references) return result.data(); } #endif - /* End of functions added by KRN */ @@ -312,7 +312,7 @@ const QString KMMessage::asQuotedString(const QString aHeaderStr, //----------------------------------------------------------------------------- -KMMessage* KMMessage::createReply(bool replyToAll) const +KMMessage* KMMessage::createReply(bool replyToAll) { KMMessage* msg = new KMMessage; QString str, replyStr, loopToStr, replyToStr, toStr; @@ -348,12 +348,14 @@ KMMessage* KMMessage::createReply(bool replyToAll) const msg->setSubject("Re: " + subject()); else msg->setSubject(subject()); + setStatus(KMMsgStatusReplied); + return msg; } //----------------------------------------------------------------------------- -KMMessage* KMMessage::createForward(void) const +KMMessage* KMMessage::createForward(void) { KMMessage* msg = new KMMessage; QString str; @@ -371,6 +373,8 @@ KMMessage* KMMessage::createForward(void) const msg->setSubject("Fwd: " + subject()); else msg->setSubject(subject()); + setStatus(KMMsgStatusForwarded); + return msg; } diff --git a/kmmessage.h b/kmmessage.h index 463022892..297139835 100644 --- a/kmmessage.h +++ b/kmmessage.h @@ -44,13 +44,13 @@ public: /** Create a new message that is a reply to this message, filling all required header fields with the proper values. The returned message - is not stored in any folder. */ - virtual KMMessage* createReply(bool replyToAll=FALSE) const; + is not stored in any folder. Marks this message as replied. */ + virtual KMMessage* createReply(bool replyToAll=FALSE); /** Create a new message that is a forward of this message, filling all required header fields with the proper values. The returned message - is not stored in any folder. */ - virtual KMMessage* createForward(void) const; + is not stored in any folder. Marks this message as forwarded. */ + virtual KMMessage* createForward(void); /** Parse the string and create this message from it. */ virtual void fromString(const QString str); diff --git a/kmmsgbase.h b/kmmsgbase.h index 37efa4290..e233d6946 100644 --- a/kmmsgbase.h +++ b/kmmsgbase.h @@ -16,6 +16,7 @@ typedef enum KMMsgStatusOld='O', KMMsgStatusDeleted='D', KMMsgStatusReplied='A', + KMMsgStatusForwarded='F', KMMsgStatusQueued='Q', KMMsgStatusSent='S' } KMMsgStatus; diff --git a/kmreaderwin.cpp b/kmreaderwin.cpp index 55f0acc15..ce9480060 100644 --- a/kmreaderwin.cpp +++ b/kmreaderwin.cpp @@ -205,15 +205,12 @@ void KMReaderWin::parseMsg(void) { str = msgPart.bodyDecoded(); if (str.size() > 100 && i>0) writePartIcon(&msgPart, i); - else if (stricmp(subtype, "html")==0) - { - if (i>0) mViewer->write("


"); - mViewer->write(str); - } else { if (i>0) mViewer->write("


"); - writeBodyStr(str); + + if (stricmp(subtype, "html")==0) mViewer->write(str); + else writeBodyStr(str); } } else @@ -546,17 +543,34 @@ void KMReaderWin::slotUrlPopup(const char* aUrl, const QPoint& aPos) //----------------------------------------------------------------------------- void KMReaderWin::slotAtmOpen() { - QString str, pname, cmd; - char* fileName; + QString str, pname, cmd, fileName; + char* tmpName; + int c; KMMessagePart msgPart; mMsg->bodyPart(mAtmCurrent, &msgPart); pname = msgPart.name(); if (pname.isEmpty()) pname="unnamed"; - fileName = tempnam("/tmp", NULL); - strcat(fileName, "-"); - strcat(fileName, (const char*)pname); + tmpName = tempnam(NULL, NULL); + if (!tmpName) + { + warning(nls->translate("Could not create temporary file")); + return; + } + fileName = tmpName; + free(tmpName); + fileName += '-'; + fileName += pname; + + // remove quotes from the filename so that the shell does not get confused + c = 0; + while ((c = fileName.find('"', c)) >= 0) + fileName.remove(c, 1); + + c = 0; + while ((c = fileName.find('\'', c)) >= 0) + fileName.remove(c, 1); kbp->busy(); str = msgPart.bodyDecoded(); @@ -564,9 +578,9 @@ void KMReaderWin::slotAtmOpen() warning(nls->translate("Could not save temporary file %s"), (const char*)fileName); kbp->idle(); - cmd = "kfmclient openURL \""; + cmd = "kfmclient openURL \'"; cmd += fileName; - cmd += "\""; + cmd += "\'"; debug(cmd); system(cmd); } diff --git a/kmsender.cpp b/kmsender.cpp index 8cd55c0e3..6a0f78323 100644 --- a/kmsender.cpp +++ b/kmsender.cpp @@ -31,7 +31,7 @@ KMSender::KMSender() KMSender::~KMSender() { if (mMailerProc) delete mMailerProc; - writeConfig(TRUE); + writeConfig(FALSE); } @@ -257,9 +257,8 @@ bool KMSender::sendMail(KMMessage* aMsg) assert(mMailerProc != NULL); mMailerProc->clearArguments(); - *mMailerProc << aMsg->to(); + *mMailerProc << mMailer << aMsg->to(); - mMailerProc->setExecutable(mMailer); mMailerProc->start(KProcess::DontCare, KProcess::Stdin); if (!mMailerProc->writeStdin(msgstr.data(), msgstr.length())) return FALSE; diff --git a/main.cpp b/main.cpp index 3c66c5749..d18999f42 100644 --- a/main.cpp +++ b/main.cpp @@ -15,6 +15,7 @@ #include "kmversion.h" #include "kmmessage.h" #include "kmcomposewin.h" +#include "kmaddrbook.h" #include #include @@ -41,6 +42,8 @@ KMFolder* trashFolder = NULL; KStdAccel* keys = NULL; KMIdentity* identity = NULL; KMFilterActionDict* filterActionDict = NULL; +KMAddrBook* addrBook = NULL; + bool shuttingDown = FALSE; const char* aboutText = "KMail [" KMAIL_VERSION "] by\n\n" @@ -161,6 +164,7 @@ static void init(int argc, char *argv[]) acctMgr = new KMAcctMgr(acctPath); filterMgr = new KMFilterMgr; filterActionDict = new KMFilterActionDict; + addrBook = new KMAddrBook; inboxFolder = (KMFolder*)folderMgr->findOrCreate( cfg->readEntry("inboxFolder", "inbox")); @@ -180,6 +184,8 @@ static void init(int argc, char *argv[]) acctMgr->readConfig(); filterMgr->readConfig(); + addrBook->readConfig(); + addrBook->load(); KMMessage::readConfig(); msgSender = new KMSender; @@ -197,6 +203,7 @@ static void cleanup(void) if (trashFolder) trashFolder->close(TRUE); if (msgSender) delete msgSender; + if (addrBook) delete addrBook; if (filterMgr) delete filterMgr; if (acctMgr) delete acctMgr; if (folderMgr) delete folderMgr; @@ -211,7 +218,6 @@ static void cleanup(void) main(int argc, char *argv[]) { KMMainWin* mainWin; - KMComposeWin* comp; init(argc, argv);