diff options
author | Diego Elio Pettenò <flameeyes@gentoo.org> | 2006-11-07 00:23:30 +0000 |
---|---|---|
committer | Diego Elio Pettenò <flameeyes@gentoo.org> | 2006-11-07 00:23:30 +0000 |
commit | 0afacb4e5e6747a8e55d00fc8c7bd8ab809c6de8 (patch) | |
tree | f7703d42e18dcb623006be42bb43620a66cc50e2 /kde-base/kmail/files | |
parent | Marked stable on amd64 for bug #151151 (diff) | |
download | gentoo-2-0afacb4e5e6747a8e55d00fc8c7bd8ab809c6de8.tar.gz gentoo-2-0afacb4e5e6747a8e55d00fc8c7bd8ab809c6de8.tar.bz2 gentoo-2-0afacb4e5e6747a8e55d00fc8c7bd8ab809c6de8.zip |
Add patch to fix downloaded imap mail loss.
(Portage version: 2.1.2_rc1-r4)
Diffstat (limited to 'kde-base/kmail/files')
-rw-r--r-- | kde-base/kmail/files/digest-kmail-3.5.5-r1 | 3 | ||||
-rw-r--r-- | kde-base/kmail/files/kmail-3.5.5-dimap-mail-loss.patch | 269 |
2 files changed, 272 insertions, 0 deletions
diff --git a/kde-base/kmail/files/digest-kmail-3.5.5-r1 b/kde-base/kmail/files/digest-kmail-3.5.5-r1 new file mode 100644 index 000000000000..a119724eb257 --- /dev/null +++ b/kde-base/kmail/files/digest-kmail-3.5.5-r1 @@ -0,0 +1,3 @@ +MD5 3f2127f74cb496899bb3f1f6f702353b kdepim-3.5.5.tar.bz2 12908968 +RMD160 5bdcf98909f450ce3839fa72a404571f6cde22f6 kdepim-3.5.5.tar.bz2 12908968 +SHA256 82887df2c2ff00cb60dcfb8aa04527988123b9a4ed70f4c9082a7a0eb9f1f047 kdepim-3.5.5.tar.bz2 12908968 diff --git a/kde-base/kmail/files/kmail-3.5.5-dimap-mail-loss.patch b/kde-base/kmail/files/kmail-3.5.5-dimap-mail-loss.patch new file mode 100644 index 000000000000..3aad70855c32 --- /dev/null +++ b/kde-base/kmail/files/kmail-3.5.5-dimap-mail-loss.patch @@ -0,0 +1,269 @@ +Index: kmail/kmfoldercachedimap.cpp +=================================================================== +--- kmail/kmfoldercachedimap.cpp (revision 597658) ++++ kmail/kmfoldercachedimap.cpp (revision 597659) +@@ -75,6 +75,7 @@ + #include <globalsettings.h> + + #define UIDCACHE_VERSION 1 ++#define MAIL_LOSS_DEBUGGING 0 + + static QString incidencesForToString( KMFolderCachedImap::IncidencesFor r ) { + switch (r) { +@@ -150,10 +151,22 @@ + mFolderRemoved( false ), + /*mHoldSyncs( false ),*/ mRecurse( true ), + mStatusChangedLocally( false ), mAnnotationFolderTypeChanged( false ), +- mIncidencesForChanged( false ), mPersonalNamespacesCheckDone( true ) ++ mIncidencesForChanged( false ), mPersonalNamespacesCheckDone( true ), ++ mFoundAnIMAPDigest( false ) + { + setUidValidity(""); +- readUidCache(); ++ // if we fail to read a uid file but there is one, nuke it ++ if ( readUidCache() == -1 ) { ++ if ( QFile::exists( uidCacheLocation() ) ) { ++ KMessageBox::error( 0, ++ i18n( "The UID cache file for folder %1 could not be read. There " ++ "could be a problem with file system permission, or it is corrupted." ++ ).arg( folder->prettyURL() ) ); ++ // try to unlink it, in case it was corruped. If it couldn't be read ++ // because of permissions, this will fail, which is fine ++ unlink( QFile::encodeName( uidCacheLocation() ) ); ++ } ++ } + + mProgress = 0; + } +@@ -306,7 +319,7 @@ + if( uidValidity().isEmpty() || uidValidity() == "INVALID" ) { + // No info from the server yet, remove the file. + if( QFile::exists( uidCacheLocation() ) ) +- unlink( QFile::encodeName( uidCacheLocation() ) ); ++ return unlink( QFile::encodeName( uidCacheLocation() ) ); + return 0; + } + +@@ -317,17 +330,23 @@ + str << uidValidity() << endl; + str << lastUid() << endl; + uidcache.flush(); +- fsync( uidcache.handle() ); /* this is probably overkill */ +- uidcache.close(); +- return 0; +- } else { +- return errno; /* does QFile set errno? */ ++ if ( uidcache.status() == IO_Ok ) { ++ fsync( uidcache.handle() ); /* this is probably overkill */ ++ uidcache.close(); ++ if ( uidcache.status() == IO_Ok ) ++ return 0; ++ } + } ++ KMessageBox::error( 0, ++ i18n( "The UID cache file for folder %1 could not be written. There " ++ "could be a problem with file system permission." ).arg( folder()->prettyURL() ) ); ++ ++ return -1; + } + + void KMFolderCachedImap::reloadUidMap() + { +- kdDebug(5006) << "Reloading Uid Map " << endl; ++ //kdDebug(5006) << "Reloading Uid Map " << endl; + uidMap.clear(); + open(); + for( int i = 0; i < count(); ++i ) { +@@ -448,7 +467,8 @@ + { + killTimer( uidWriteTimer ); + uidWriteTimer = -1; +- writeUidCache(); ++ if ( writeUidCache() == -1 ) ++ unlink( QFile::encodeName( uidCacheLocation() ) ); + } + + ulong KMFolderCachedImap::lastUid() +@@ -467,10 +487,22 @@ + QMap<ulong,int>::Iterator it = uidMap.find( uid ); + if( it != uidMap.end() ) { + KMMsgBase *msg = getMsgBase( *it ); ++#ifdef MAIL_LOSS_DEBUGGING ++ kdDebug(5006) << "UID " << uid << " is supposed to be in the map" << endl; ++ kdDebug(5006) << "UID's index is to be " << *it << endl; ++ kdDebug(5006) << "There is a message there? " << (msg != 0) << endl; ++ if ( msg ) { ++ kdDebug(5006) << "Its UID is: " << msg->UID() << endl; ++ } ++#endif ++ + if( msg && msg->UID() == uid ) + return msg; ++ kdDebug(5006) << "########## Didn't find uid: " << uid << "in cache athough it's supposed to be there!" << endl; + } else { ++#ifdef MAIL_LOSS_DEBUGGING + kdDebug(5006) << "Didn't find uid: " << uid << "in cache!" << endl; ++#endif + } + // Not found by now + // if( mapReloaded ) +@@ -482,8 +514,10 @@ + if( it != uidMap.end() ) + // Since the uid map is just rebuilt, no need for the sanity check + return getMsgBase( *it ); ++#ifdef MAIL_LOSS_DEBUGGING + else + kdDebug(5006) << "Reloaded, but stil didn't find uid: " << uid << endl; ++#endif + // Then it's not here + return 0; + } +@@ -841,9 +875,14 @@ + to be deleted on the server has been deleted, adjust our local notion of the + highes uid seen thus far. */ + slotUpdateLastUid(); +- if( mLastUid == 0 && uidWriteTimer == -1 ) ++ if( mLastUid == 0 && uidWriteTimer == -1 ) { + // This is probably a new and empty folder. Write the UID cache +- writeUidCache(); ++ if ( writeUidCache() == -1 ) { ++ resetSyncState(); ++ emit folderComplete( this, false ); ++ return; ++ } ++ } + } + } + +@@ -1209,9 +1248,10 @@ + void KMFolderCachedImap::slotImapStatusChanged(KMFolder* folder, const QString&, bool cont) + { + if ( mSyncState == SYNC_STATE_INITIAL ){ +- kdDebug(5006) << "IMAP status changed but reset " << endl; ++ //kdDebug(5006) << "IMAP status changed but reset " << endl; + return; // we were reset + } ++ //kdDebug(5006) << "IMAP status changed for folder: " << folder->prettyURL() << endl; + if ( folder->storage() == this ) { + --mStatusFlagsJobs; + if ( mStatusFlagsJobs == 0 || !cont ) // done or aborting +@@ -1220,6 +1260,7 @@ + if ( mStatusFlagsJobs == 0 && cont ) { + mProgress += 5; + serverSyncInternal(); ++ //kdDebug(5006) << "Proceeding with mailcheck." << endl; + } + } + } +@@ -1288,15 +1329,24 @@ + // them one by one because the index list can get resized under + // us. So use msg pointers instead + ++ QStringList uids; + QMap<ulong,int>::const_iterator it = uidMap.constBegin(); + for( ; it != uidMap.end(); it++ ) { + ulong uid ( it.key() ); +- if( uid!=0 && !uidsOnServer.find( uid ) ) ++ if( uid!=0 && !uidsOnServer.find( uid ) ) { ++ uids << QString::number( uid ); + msgsForDeletion.append( getMsg( *it ) ); ++ } + } + + if( !msgsForDeletion.isEmpty() ) { +- removeMsg( msgsForDeletion ); ++#ifdef MAIL_LOSS_DEBUGGING ++ if ( KMessageBox::warningYesNo( ++ 0, i18n( "<qt><p>Mails on the server in folder <b>%1</b> were deleted. " ++ "Do you want to delete them locally?<br>UIDs: %2</p></qt>" ) ++ .arg( folder()->prettyURL() ).arg( uids.join(",") ) ) == KMessageBox::Yes ) ++#endif ++ removeMsg( msgsForDeletion ); + } + + /* Delete messages from the server that we dont have anymore */ +@@ -1370,6 +1420,8 @@ + uidsForDeletionOnServer.clear(); + mMsgsForDownload.clear(); + mUidsForDownload.clear(); ++ // listing is only considered successful if saw a syntactically correct imapdigest ++ mFoundAnIMAPDigest = false; + + CachedImapJob* job = new CachedImapJob( FolderJob::tListMessages, this ); + connect( job, SIGNAL( result(KMail::FolderJob *) ), +@@ -1415,6 +1467,7 @@ + setReadOnly( access == "Read only" ); + } + (*it).cdata.remove(0, pos); ++ mFoundAnIMAPDigest = true; + } + pos = (*it).cdata.find("\r\n--IMAPDIGEST", 1); + // Start with something largish when rebuilding the cache +@@ -1432,7 +1485,7 @@ + if( uid != 0 ) { + if ( uidsOnServer.count() == uidsOnServer.size() ) { + uidsOnServer.resize( KMail::nextPrime( uidsOnServer.size() * 2 ) ); +- kdDebug( 5006 ) << "Resizing to: " << uidsOnServer.size() << endl; ++ //kdDebug( 5006 ) << "Resizing to: " << uidsOnServer.size() << endl; + } + uidsOnServer.insert( uid, &v ); + } +@@ -1451,7 +1504,9 @@ + KMMsgBase *existingMessage = findByUID(uid); + if( !existingMessage ) { + if ( mUserRights <= 0 || ( mUserRights & KMail::ACLJobs::Delete ) ) { +- // kdDebug(5006) << "message with uid " << uid << " is gone from local cache. Must be deleted on server!!!" << endl; ++#ifdef MAIL_LOSS_DEBUGGING ++ kdDebug(5006) << "message with uid " << uid << " is gone from local cache. Must be deleted on server!!!" << endl; ++#endif + uidsForDeletionOnServer << uid; + } else { + redownload = true; +@@ -1490,6 +1545,13 @@ + void KMFolderCachedImap::getMessagesResult( KMail::FolderJob *job, bool lastSet ) + { + mProgress += 10; ++ if ( !job->error() && !mFoundAnIMAPDigest ) { ++ kdWarning(5006) << "######## Folderlisting did not complete, but there was no error! " ++ "Aborting sync of folder: " << folder()->prettyURL() << endl; ++#ifdef MAIL_LOSS_DEBUGGING ++ kmkernel->emergencyExit( i18n("Folder listing failed in interesting ways." ) ); ++#endif ++ } + if( job->error() ) { // error listing messages but the user chose to continue + mContentState = imapNoInformation; + mSyncState = SYNC_STATE_HANDLE_INBOX; // be sure not to continue in this folder +@@ -1741,7 +1803,7 @@ + KMFolderNode *node; + bool root = ( this == mAccount->rootFolder() ); + if ( root && !mAccount->hasInbox() ) { +- kdDebug(5006) << "check INBOX" << endl; ++ //kdDebug(5006) << "check INBOX" << endl; + // create the INBOX + for (node = folder()->child()->first(); node; node = folder()->child()->next()) + if (!node->isDir() && node->name() == "INBOX") break; +@@ -2216,7 +2278,7 @@ + void + KMFolderCachedImap::slotAnnotationChanged( const QString& entry, const QString& attribute, const QString& value ) + { +- kdDebug(5006) << k_funcinfo << entry << " " << attribute << " " << value << endl; ++ //kdDebug(5006) << k_funcinfo << entry << " " << attribute << " " << value << endl; + if ( entry == KOLAB_FOLDERTYPE ) + mAnnotationFolderTypeChanged = false; + else if ( entry == KOLAB_INCIDENCESFOR ) { +Index: kmail/kmfoldercachedimap.h +=================================================================== +--- kmail/kmfoldercachedimap.h (revision 597658) ++++ kmail/kmfoldercachedimap.h (revision 597659) +@@ -445,6 +445,11 @@ + mLastUid. See above for details. */ + ulong mTentativeHighestUid; + ++ /** Used to determine whether listing messages yielded a sensible result. ++ * Only then is the deletion o messages (which relies on succesful ++ * listing) attempted, during the sync. */ ++ bool mFoundAnIMAPDigest; ++ + int mUserRights; + ACLList mACLList; + |