[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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.