[Bug 126715] Crash after fresh startup and selecting mail
Stephan Kulow <[email protected]>
| Newsgroups | gmane.comp.kde.devel.kmail |
|---|---|
| Message-ID | <[email protected]> |
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
http://bugs.kde.org/show_bug.cgi?id=126715
coolo kde org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|REOPENED |RESOLVED
Resolution| |FIXED
------- Additional Comments From coolo kde org 2007-03-21 07:57 -------
SVN commit 644873 by coolo:
fixing imap folder reference counting for real
BUG: 126715
M +1 -0 kmailicalifaceimpl.cpp
M +4 -4 kmcomposewin.cpp
M +10 -7 kmfolderimap.cpp
M +6 -0 kmheaders.cpp
M +12 -1 kmmainwidget.cpp
M +1 -0 kmmainwidget.h
--- branches/KDE/3.5/kdepim/kmail/kmailicalifaceimpl.cpp #644872:644873
@ -555,6 +555,7 @
#endif
}
}
+ f->close();
return aMap;
}
--- branches/KDE/3.5/kdepim/kmail/kmcomposewin.cpp #644872:644873
@ -3928,12 +3928,11 @
if ( imapTheFolder && imapTheFolder->noContent() )
imapTheFolder = 0;
- if ( theFolder == 0 ) {
+ if ( theFolder == 0 )
theFolder = ( mSaveIn==KMComposeWin::Drafts ?
kmkernel->draftsFolder() : kmkernel->templatesFolder() );
- } else {
- theFolder->open();
- }
+
+ theFolder->open();
kdDebug(5006) << k_funcinfo << "theFolder=" << theFolder->name() << endl;
if ( imapTheFolder )
kdDebug(5006) << k_funcinfo << "imapTheFolder=" << imapTheFolder->name() << endl;
@ -3951,6 +3950,7 @
(static_cast<KMFolderImap*>( imapTheFolder->storage() ))->getFolder();
}
+ theFolder->close();
return sentOk;
}
--- branches/KDE/3.5/kdepim/kmail/kmfolderimap.cpp #644872:644873
@ -695,7 +695,6 @
KMFolderImap* f = static_cast<KMFolderImap*> ( fld->storage() );
f->initializeFrom( this, mAccount->addPathToNamespace( name ),
"inode/directory" );
- f->close();
if ( !mAccount->listOnlyOpenFolders() )
{
f->slotListResult( subfolderNames, subfolderPaths,
@ -811,7 +810,6 @
KMFolder *fld = folder()->child()->createFolder(subfolderNames[i]);
if ( fld ) {
f = static_cast<KMFolderImap*> ( fld->storage() );
- f->close();
settingsChanged = true;
} else {
kdWarning(5006) << "can't create folder " << subfolderNames[i] << endl;
@ -876,7 +874,6 @
if ( f )
{
f->folder()->setLabel( i18n("inbox") );
- f->close();
}
kmkernel->imapFolderMgr()->contentsChanged();
}
@ -996,7 +993,6 @
{
if (!mAccount) {
emit folderComplete(this, false);
- close();
return;
}
KURL url = mAccount->getUrl();
@ -1012,7 +1008,6 @
kdDebug(5006) << "KMFolderImap::checkValidity - got no connection" << endl;
emit folderComplete(this, FALSE);
mContentState = imapNoInformation;
- close();
return;
} else if ( connectionState == ImapAccountBase::Connecting ) {
// We'll wait for the connectionResult signal from the account. If it
@ -1025,7 +1020,6 @
// Only check once at a time.
if (mCheckingValidity) {
kdDebug(5006) << "KMFolderImap::checkValidity - already checking" << endl;
- close();
return;
}
// otherwise we already are inside a mailcheck
@ -1045,6 +1039,7 @
if ( account()->mailCheckProgressItem() ) {
account()->mailCheckProgressItem()->setStatus( folder()->prettyURL() );
}
+ open();
ImapAccountBase::jobData jd( url.url() );
KIO::SimpleJob *job = KIO::get(url, FALSE, FALSE);
KIO::Scheduler::assignJobToSlave(mAccount->slave(), job);
@ -1144,6 +1139,7 @
mMailCheckProgressItem->setCompletedItems( 0 );
}
reallyGetFolder(startUid);
+ close();
}
}
@ -1178,6 +1174,7 @
mCheckFlags = TRUE;
}
checkValidity();
+ close();
}
@ -1189,7 +1186,6 @
{
mContentState = imapNoInformation;
emit folderComplete(this, FALSE);
- close();
return;
}
quiet(true);
@ -1199,6 +1195,7 @
mMailCheckProgressItem->setStatus( i18n("Retrieving message status") );
url.setPath(imapPath() + ";SECTION=UID FLAGS");
KIO::SimpleJob *job = KIO::listDir(url, FALSE);
+ open();
KIO::Scheduler::assignJobToSlave(mAccount->slave(), job);
ImapAccountBase::jobData jd( url.url(), folder() );
jd.cancellable = true;
@ -1218,6 +1215,7 @
KIO::Scheduler::assignJobToSlave(mAccount->slave(), newJob);
ImapAccountBase::jobData jd( url.url(), folder() );
jd.cancellable = true;
+ open();
mAccount->insertJob(newJob, jd);
connect(newJob, SIGNAL(result(KIO::Job *)),
this, SLOT(slotGetLastMessagesResult(KIO::Job *)));
@ -1310,6 +1308,9 @
else sets = makeSets( (*it).items );
mAccount->removeJob(it); // don't use *it below
+ if ( sets.isEmpty() )
+ close();
+
// Now kick off the getting of envelopes for the new mails in the folder
for (QStringList::Iterator i = sets.begin(); i != sets.end(); ++i)
{
@ -1812,6 +1813,7 @
void KMFolderImap::setStatus(QValueList<int>& ids, KMMsgStatus status, bool toggle)
{
+ open();
FolderStorage::setStatus(ids, status, toggle);
if (mReadOnly) return;
@ -1855,6 +1857,7 @
quiet( false );
reallyGetFolder( QString::null );
}
+ close();
}
//-----------------------------------------------------------------------------
--- branches/KDE/3.5/kdepim/kmail/kmheaders.cpp #644872:644873
@ -15,6 +15,7 @
#include "kmmsgdict.h"
#include "kmdebug.h"
#include "kmfoldertree.h"
+#include "kmfolderimap.h"
#include "folderjob.h"
using KMail::FolderJob;
#include "actionscheduler.h"
@ -215,6 +216,11 @
{
writeFolderConfig();
writeSortOrder();
+ if (mFolder->folderType() == KMFolderTypeImap)
+ {
+ KMFolderImap *imap = static_cast<KMFolderImap*>(mFolder->storage());
+ imap->setSelected( false );
+ }
mFolder->close();
}
writeConfig();
--- branches/KDE/3.5/kdepim/kmail/kmmainwidget.cpp #644872:644873
@ -164,6 +164,7 @
mJob = 0;
mConfig = config;
mGUIClient = aGUIClient;
+ mOpenedImapFolder = false;
mCustomReplyActionMenu = 0;
mCustomReplyAllActionMenu = 0;
@ -1875,8 +1876,11 @
folderSelected( mFolder );
updateFolderMenu();
// opened() before the getAndCheckFolder() in folderSelected
- if ( mFolder && mFolder->folderType() == KMFolderTypeImap )
+ if ( mFolder && mFolder->folderType() == KMFolderTypeImap && mOpenedImapFolder )
+ {
mFolder->close();
+ mOpenedImapFolder = false;
+ }
}
//-----------------------------------------------------------------------------
@ -1930,7 +1934,13 @
this, SLOT( updateMarkAsReadAction() ) );
disconnect( mFolder, SIGNAL( msgRemoved( KMFolder * ) ),
this, SLOT( updateMarkAsReadAction() ) );
+ if ( mOpenedImapFolder && newFolder && mFolder->folderType() == KMFolderTypeImap ) {
+ mFolder->close();
+ KMFolderImap *imap = static_cast<KMFolderImap*>(mFolder->storage());
+ imap->setSelected( false );
+ mOpenedImapFolder = false;
}
+ }
mFolder = aFolder;
@ -1944,6 +1954,7 @
if ( newFolder && !mFolder->noContent() )
{
imap->open(); // will be closed in the folderSelected slot
+ mOpenedImapFolder = true;
// first get new headers before we select the folder
imap->setSelected( true );
connect( imap, SIGNAL( folderComplete( KMFolderImap*, bool ) ),
--- branches/KDE/3.5/kdepim/kmail/kmmainwidget.h #644872:644873
@ -531,6 +531,7 @
KXMLGUIClient *mGUIClient;
static QValueList<KMMainWidget*>* s_mainWidgetList;
+ bool mOpenedImapFolder;
};
#endif