[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kmail-devel
Subject:    Fix bug 48307
From:       Carsten Burghardt <cb () magic-shop ! de>
Date:       2002-10-27 13:23:40
[Download RAW message or body]

Hi,

the attached patch should fix the crash when you select a local folder during 
an imap move/copy-operation.

-- 
Regards,

Carsten Burghardt
["close.diff" (text/x-diff)]

Index: kdenetwork/kmail/kmfolderimap.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmfolderimap.cpp,v
retrieving revision 1.73
diff -u -3 -p -r1.73 kmfolderimap.cpp
--- kdenetwork/kmail/kmfolderimap.cpp	2002/10/15 19:49:02	1.73
+++ kdenetwork/kmail/kmfolderimap.cpp	2002/10/27 13:16:40
@@ -162,7 +162,7 @@ void KMFolderImap::removeMsg(QPtrList<KM
 
 
 //-----------------------------------------------------------------------------
-void KMFolderImap::addMsgQuiet(KMMessage* aMsg)
+void KMFolderImap::addMsgQuiet(KMMessage* aMsg, bool close)
 {
   KMFolder *folder = aMsg->parent();
   if (folder) 
@@ -174,7 +174,9 @@ void KMFolderImap::addMsgQuiet(KMMessage
       aMsg->setEnableUndo(true);
     }
     folder->take(folder->find(aMsg));
+    if (close) folder->close();
   }
+  if (close) this->close();
   delete aMsg;
   aMsg = 0;
   getFolder();
@@ -196,7 +198,9 @@ void KMFolderImap::addMsgQuiet(QPtrList<
       }
     }
     folder->take(msgList);
+    folder->close();
   }
+  close();
   msgList.setAutoDelete(true);
   msgList.clear();
   getFolder();
@@ -211,6 +215,8 @@ int KMFolderImap::addMsg(KMMessage* aMsg
 
 int KMFolderImap::addMsg(QPtrList<KMMessage>& msgList, int* aIndex_ret)
 {
+  // we need an open folder
+  open();
   KMMessage *aMsg = msgList.getFirst();
   KMFolder *msgParent = aMsg->parent();
 
@@ -221,6 +227,8 @@ int KMFolderImap::addMsg(QPtrList<KMMess
   KMImapJob *imapJob = 0;
   if (msgParent)
   {
+    // we need an open folder
+    msgParent->open();
     if (msgParent->protocol() == "imap")
     {
       if (static_cast<KMFolderImap*>(msgParent)->account() == account())
@@ -234,14 +242,13 @@ int KMFolderImap::addMsg(QPtrList<KMMess
             assert(idx != -1);
             msg = msgParent->getMsg(idx);
             imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this);
-            connect(imapJob, SIGNAL(messageCopied(KMMessage*)),
-                SLOT(addMsgQuiet(KMMessage*)));
+            connect(imapJob, SIGNAL(messageCopied(KMMessage*, bool)),
+                SLOT(addMsgQuiet(KMMessage*, bool)));
           }
 
         } else {
 
-          /* get the messages and the uids
-             don't unGet the messages because we need to access the serial number in addMsgQuiet */
+          // get the messages and the uids
           QValueList<int> uids;
           getUids(msgList, uids);
 
@@ -286,8 +293,8 @@ int KMFolderImap::addMsg(QPtrList<KMMess
       msg = msgParent->getMsg(idx);
     }
     imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this);
-    connect(imapJob, SIGNAL(messageStored(KMMessage*)),
-        SLOT(addMsgQuiet(KMMessage*)));
+    connect(imapJob, SIGNAL(messageStored(KMMessage*, bool)),
+        SLOT(addMsgQuiet(KMMessage*, bool)));
   }
 
   if (aIndex_ret) *aIndex_ret = -1;
@@ -297,19 +304,47 @@ int KMFolderImap::addMsg(QPtrList<KMMess
 //-----------------------------------------------------------------------------
 void KMFolderImap::copyMsg(QPtrList<KMMessage>& msgList)
 {
+  // we need an open folder
+  open();
+  KMMessage *aMsg = msgList.getFirst();
+  if (aMsg)
+  {
+    KMFolder* parent = aMsg->parent();
+    if (parent) parent->open();
+  }
+
   QValueList<int> uids;
   getUids(msgList, uids);
   QStringList sets = makeSets(uids, false);
+  KMImapJob* imapJob = 0;
   for ( QStringList::Iterator it = sets.begin(); it != sets.end(); ++it )
   {
     // we need the messages that belong to the current set to pass them to the ImapJob
     QPtrList<KMMessage> temp_msgs = splitMessageList(*it, msgList);
 
-    new KMImapJob(temp_msgs, *it, KMImapJob::tCopyMessage, this);
+    imapJob = new KMImapJob(temp_msgs, *it, KMImapJob::tCopyMessage, this);
+  }
+  if (imapJob)
+  {
+    // close folders after the last transfer
+    connect(imapJob, SIGNAL(messageCopied(QPtrList<KMMessage>)),
+        SLOT(slotPostCopyMsg(QPtrList<KMMessage>)));
   }
 }
 
 //-----------------------------------------------------------------------------
+void KMFolderImap::slotPostCopyMsg(QPtrList<KMMessage>& msgList)
+{
+  // close the folders 
+  KMFolder *folder = msgList.first()->parent();
+  if (folder)
+  {
+    folder->close();
+  }
+  close();
+}
+
+//-----------------------------------------------------------------------------
 QPtrList<KMMessage> KMFolderImap::splitMessageList(QString set, QPtrList<KMMessage>& msgList)
 {
   int lastcomma = set.findRev(",");
@@ -1282,11 +1317,17 @@ void KMImapJob::slotPutMessageResult(KIO
   } else {
     if ( !(*it).msgList.isEmpty() )
     {
-      emit messageStored((*it).msgList.last());
+      if ( (*it).msgList.count() == 1) 
+      {
+        // close the folder
+        emit messageStored((*it).msgList.last(), true);
+      } else {
+        emit messageStored((*it).msgList.last(), false);
+      }
       (*it).msgList.removeLast();
     } else if (mMsg)
     {
-      emit messageStored(mMsg);
+      emit messageStored(mMsg, true);
     }
     mMsg = 0;
   }
Index: kdenetwork/kmail/kmfolderimap.h
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmfolderimap.h,v
retrieving revision 1.32
diff -u -3 -p -r1.32 kmfolderimap.h
--- kdenetwork/kmail/kmfolderimap.h	2002/10/15 19:49:02	1.32
+++ kdenetwork/kmail/kmfolderimap.h	2002/10/27 13:16:40
@@ -51,6 +51,8 @@ public:
 signals:
   void messageRetrieved(KMMessage *);
   void messageStored(KMMessage *);
+  /** close the folder afterwards if close is true */
+  void messageStored(KMMessage *, bool close);
   void messageCopied(KMMessage *);
   void messageCopied(QPtrList<KMMessage>);
   void finished();
@@ -243,8 +245,10 @@ signals:
   void deleted(KMFolderImap*);
 
 public slots:
-  /** Add a message to a folder after is has been added on an IMAP server */
-  virtual void addMsgQuiet(KMMessage *);
+  /** Add a message to a folder after is has been added on an IMAP server
+   * The bool is needed to find out if the folder can be closed  
+   */
+  virtual void addMsgQuiet(KMMessage *, bool close);
   virtual void addMsgQuiet(QPtrList<KMMessage>);
 
   /** Add the given message to the folder. Usually the message
@@ -257,7 +261,9 @@ public slots:
   int addMsg(QPtrList<KMMessage>&, int* index_return = 0);
 
   /** Copy the messages to this folder */
-  void copyMsg(QPtrList<KMMessage>& msgList/*, KMFolder* parent*/);
+  void copyMsg(QPtrList<KMMessage>& msgList);
+  /** Is called after the copy-operation */
+  void slotPostCopyMsg(QPtrList<KMMessage>& msgList);
 
   QPtrList<KMMessage> splitMessageList(QString set, QPtrList<KMMessage>& msgList);
 

_______________________________________________
KMail Developers mailing list
kmail@mail.kde.org
http://mail.kde.org/mailman/listinfo/kmail

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic