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

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

On Sunday 27 October 2002 17:30, Carsten Burghardt wrote:
> On Sunday 27 October 2002 14:23, Carsten Burghardt wrote:
> > Hi,
> >
> > the attached patch should fix the crash when you select a local folder
> > during an imap move/copy-operation.
>
> Ignore it, the folders are closed too early when several messages are
> moved, I'm working on it.

OK, here we go, this should work. At lot of stuff to keep the folder from 
closing...

-- 
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 21:05:20
@@ -160,9 +160,8 @@ void KMFolderImap::removeMsg(QPtrList<KM
   KMFolderImapInherited::removeMsg(msgList);
 }
 
-
 //-----------------------------------------------------------------------------
-void KMFolderImap::addMsgQuiet(KMMessage* aMsg)
+void KMFolderImap::addMsgQuiet(KMMessage* aMsg, bool close)
 {
   KMFolder *folder = aMsg->parent();
   if (folder) 
@@ -174,7 +173,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 +197,9 @@ void KMFolderImap::addMsgQuiet(QPtrList<
       }
     }
     folder->take(msgList);
+    folder->close();
   }
+  close();
   msgList.setAutoDelete(true);
   msgList.clear();
   getFolder();
@@ -211,6 +214,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 +226,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())
@@ -233,15 +240,16 @@ int KMFolderImap::addMsg(QPtrList<KMMess
             int idx = msgParent->find(msg);
             assert(idx != -1);
             msg = msgParent->getMsg(idx);
-            imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this);
-            connect(imapJob, SIGNAL(messageCopied(KMMessage*)),
-                SLOT(addMsgQuiet(KMMessage*)));
+            bool close = false;
+            if (msg == msgList.getLast()) close = true;
+            imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this, close);
+            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);
 
@@ -285,9 +293,11 @@ int KMFolderImap::addMsg(QPtrList<KMMess
       assert(idx != -1);
       msg = msgParent->getMsg(idx);
     }
-    imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this);
-    connect(imapJob, SIGNAL(messageStored(KMMessage*)),
-        SLOT(addMsgQuiet(KMMessage*)));
+    bool close = false;
+    if (msg == msgList.getLast()) close = true;
+    imapJob = new KMImapJob(msg, KMImapJob::tPutMessage, this, close);
+    connect(imapJob, SIGNAL(messageStored(KMMessage*, bool)),
+        SLOT(addMsgQuiet(KMMessage*, bool)));
   }
 
   if (aIndex_ret) *aIndex_ret = -1;
@@ -297,16 +307,44 @@ 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);
+
+    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>)));
+  }
+}
 
-    new KMImapJob(temp_msgs, *it, KMImapJob::tCopyMessage, this);
+//-----------------------------------------------------------------------------
+void KMFolderImap::slotPostCopyMsg(QPtrList<KMMessage>& msgList)
+{
+  // close the folders 
+  KMFolder *folder = msgList.first()->parent();
+  if (folder)
+  {
+    folder->close();
   }
+  close();
 }
 
 //-----------------------------------------------------------------------------
@@ -873,7 +911,6 @@ void KMFolderImap::slotGetMessagesData(K
       {
         // assign the sernum from the cache
         const ulong sernum = (ulong) uidmap[uid];
-        kdDebug() << "set sernum:" << sernum << " for " << uid << endl;
         msg->setMsgSerNum(sernum);
         // delete the entry
         uidmap.remove(uid);
@@ -1048,8 +1085,9 @@ QValueList<int> KMFolderImap::splitSets(
 }
 
 //-----------------------------------------------------------------------------
-KMImapJob::KMImapJob(KMMessage *msg, JobType jt, KMFolderImap* folder)
+KMImapJob::KMImapJob(KMMessage *msg, JobType jt, KMFolderImap* folder, bool close)
 {
+  mClose = close;
   mMsg = msg;
   QPtrList<KMMessage> list; list.append(msg);
   init(jt, msg->headerField("X-UID"), folder, list);
@@ -1057,8 +1095,9 @@ KMImapJob::KMImapJob(KMMessage *msg, Job
 
 //-----------------------------------------------------------------------------
 KMImapJob::KMImapJob(QPtrList<KMMessage>& msgList, QString sets, 
-    JobType jt, KMFolderImap* folder)
+    JobType jt, KMFolderImap* folder, bool close)
 {
+  mClose = close;
   mMsg = msgList.first();
   init(jt, sets, folder, msgList);
 }
@@ -1282,11 +1321,17 @@ void KMImapJob::slotPutMessageResult(KIO
   } else {
     if ( !(*it).msgList.isEmpty() )
     {
-      emit messageStored((*it).msgList.last());
+      if (mClose) 
+      {
+        // 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 21:05:21
@@ -44,13 +44,17 @@ class KMImapJob : public QObject
 public:
   enum JobType { tListDirectory, tGetFolder, tCreateFolder, tDeleteMessage,
     tGetMessage, tPutMessage, tCopyMessage, tMoveMessage };
-  KMImapJob(KMMessage *msg, JobType jt = tGetMessage, KMFolderImap *folder = 0);
-  KMImapJob(QPtrList<KMMessage>& msgList, QString sets, JobType jt = tGetMessage, \
KMFolderImap *folder = 0 ); +  KMImapJob(KMMessage *msg, JobType jt = tGetMessage, \
KMFolderImap *folder = 0,  +      bool close = FALSE);
+  KMImapJob(QPtrList<KMMessage>& msgList, QString sets, JobType jt = tGetMessage, 
+      KMFolderImap *folder = 0, bool close = FALSE );
   ~KMImapJob();
   static void ignoreJobsForMessage(KMMessage *msg);
 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();
@@ -75,6 +79,7 @@ private:
   QCString mStrData;
   KMFolderTreeItem *mFti;
   int mTotal, mDone, mOffset;
+  bool mClose;
 };
 
 #define KMFolderImapInherited KMFolderMbox
@@ -243,8 +248,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 +264,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