diff --git a/kmacctexppop.cpp b/kmacctexppop.cpp index ef90134e3..666689985 100644 --- a/kmacctexppop.cpp +++ b/kmacctexppop.cpp @@ -33,6 +33,7 @@ #include #include #include "kmbroadcaststatus.h" +#include "kmfoldermgr.h" #include #include @@ -666,7 +667,7 @@ void KMAcctExpPop::processRemainingQueuedMessagesAndSaveUidList() ":" + QString("%1").arg(mPort) ); KConfig config( seenUidList ); config.writeEntry( "seenUidList", uidsOfNextSeenMsgs ); - config.sync(); + config.sync(); } void KMAcctExpPop::slotGetNextMsg() @@ -683,7 +684,7 @@ void KMAcctExpPop::slotGetNextMsg() if (next == idsOfMsgsPendingDownload.end()) { processRemainingQueuedMessagesAndSaveUidList(); - + kernel->folderMgr()->syncAllFolders(); if (mLeaveOnServer || idsOfMsgsToDelete.isEmpty()) { KURL url = getUrl(); diff --git a/kmacctlocal.cpp b/kmacctlocal.cpp index 21f061ee6..4209f555d 100644 --- a/kmacctlocal.cpp +++ b/kmacctlocal.cpp @@ -12,6 +12,7 @@ #include "kmacctfolder.h" #include "kmglobal.h" #include "kmbroadcaststatus.h" +#include "kmfoldermgr.h" #include #include @@ -173,6 +174,13 @@ void KMAcctLocal::processNewMail(bool) msg->setStatus(msg->headerField("Status").latin1(), msg->headerField("X-Status").latin1()); addedOk = processNewMsg(msg); + /* + if (msg->parent()) { + int count = msg->parent()->count(); + if (count != 1 && msg->parent()->operator[](count - 1) == msg) + msg->parent()->unGetMsg(count - 1); + } + */ if (addedOk) hasNewMail = true; } @@ -188,9 +196,10 @@ void KMAcctLocal::processNewMail(bool) if (addedOk) { - rc = mailFolder.expunge(); - if (rc) - KMessageBox::information( 0, i18n("Cannot remove mail from\nmailbox `%1':\n%2").arg(mailFolder.location()).arg(strerror(rc))); + kernel->folderMgr()->syncAllFolders(); + rc = mailFolder.expunge(); + if (rc) + KMessageBox::information( 0, i18n("Cannot remove mail from\nmailbox `%1':\n%2").arg(mailFolder.location()).arg(strerror(rc))); KMBroadcastStatus::instance()->setStatusMsg( i18n( "Transmission completed." )); } // else warning is written already diff --git a/kmfolder.cpp b/kmfolder.cpp index 2faf7eafe..cf761f4cb 100644 --- a/kmfolder.cpp +++ b/kmfolder.cpp @@ -337,8 +337,8 @@ void KMFolder::close(bool aForced) void KMFolder::sync() { if (mOpenCount > 0) - if (!mStream || !fsync(fileno(mStream)) || - !mIndexStream || !fsync(fileno(mIndexStream))) { + if (!mStream || fsync(fileno(mStream)) || + !mIndexStream || fsync(fileno(mIndexStream))) { kdDebug(5006) << "Error: Could not sync folder" << endl; kdDebug(5006) << "Abnormally terminating to prevent data loss, now." << endl; exit(1); @@ -1462,7 +1462,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret, bool imapQuiet) size = ftell(mStream) - offs; error = ferror(mStream); - if (error || fsync( fileno( mStream ))) { + if (error) { kdDebug(5006) << "Error: Could not add message to folder (No space left on device?)" << endl; if (ftell(mStream) > revert) { kdDebug(5006) << "Undoing changes" << endl; @@ -1527,7 +1527,7 @@ int KMFolder::addMsg(KMMessage* aMsg, int* aIndex_ret, bool imapQuiet) fflush(mIndexStream); error = ferror(mIndexStream); - if (error || fsync( fileno( mIndexStream ))) { + if (error) { kdDebug(5006) << "Error: Could not add message to folder (No space left on device?)" << endl; if (ftell(mIndexStream) > revert) { kdDebug(5006) << "Undoing changes" << endl; diff --git a/kmfolder.h b/kmfolder.h index 9fc927783..afb790b4d 100644 --- a/kmfolder.h +++ b/kmfolder.h @@ -167,7 +167,7 @@ public: others still use it (e.g. other mail reader windows). */ virtual void close(bool force=FALSE); - /* sync buffers to disk */ + /* fsync buffers to disk */ virtual void sync(); /** Test if folder is opened. */ diff --git a/kmfoldermgr.cpp b/kmfoldermgr.cpp index 69f7f83be..fbc4f040e 100644 --- a/kmfoldermgr.cpp +++ b/kmfoldermgr.cpp @@ -88,7 +88,7 @@ void KMFolderMgr::setBasePath(const QString& aBasePath) } else mBasePath = aBasePath; - + dir.setPath(mBasePath); if (!dir.exists()) @@ -111,8 +111,8 @@ KMFolder* KMFolderMgr::createFolder(const QString& fName, bool sysFldr, KMFolderDir *aFolderDir) { KMFolder* fld; - KMFolderDir *fldDir = aFolderDir; - + KMFolderDir *fldDir = aFolderDir; + if (!aFolderDir) fldDir = &mDir; fld = fldDir->createFolder(fName, sysFldr); @@ -156,9 +156,9 @@ KMFolder* KMFolderMgr::findIdString(const QString& folderId, KMFolderDir *dir) } else { folder = static_cast(node); - if (folder->idString()==folderId) + if (folder->idString()==folderId) return folder; - } + } } return 0; } @@ -242,23 +242,23 @@ void KMFolderMgr::reload(void) } //----------------------------------------------------------------------------- -void KMFolderMgr::createFolderList(QStringList *str, +void KMFolderMgr::createFolderList(QStringList *str, QValueList > *folders) { createFolderList( str, folders, 0, "" ); } //----------------------------------------------------------------------------- -void KMFolderMgr::createI18nFolderList(QStringList *str, +void KMFolderMgr::createI18nFolderList(QStringList *str, QValueList > *folders) { createFolderList( str, folders, 0, QString::null, true ); } //----------------------------------------------------------------------------- -void KMFolderMgr::createFolderList(QStringList *str, +void KMFolderMgr::createFolderList(QStringList *str, QValueList > *folders, - KMFolderDir *adir, + KMFolderDir *adir, const QString& prefix, bool i18nized) { @@ -280,5 +280,23 @@ void KMFolderMgr::createFolderList(QStringList *str, } } +//----------------------------------------------------------------------------- +void KMFolderMgr::syncAllFolders( KMFolderDir *adir ) +{ + KMFolderNode* cur; + KMFolderDir* fdir = adir ? adir : &mDir; + + for (cur=fdir->first(); cur; cur=fdir->next()) { + if (cur->isDir()) + continue; + + KMFolder *folder = static_cast(cur); + if (folder->isOpened()) + folder->sync(); + if (folder->child()) + syncAllFolders( folder->child() ); + } +} + //----------------------------------------------------------------------------- #include "kmfoldermgr.moc" diff --git a/kmfoldermgr.h b/kmfoldermgr.h index dff0b77b5..4d46d8d3a 100644 --- a/kmfoldermgr.h +++ b/kmfoldermgr.h @@ -66,6 +66,9 @@ public: virtual void createI18nFolderList( QStringList *str, QValueList > *folders ); + /* fsync all open folders to disk */ + virtual void syncAllFolders( KMFolderDir *adir = 0 ); + public slots: /** Compacts all folders (they know is it needed) */ void compactAll();