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

List:       kmail-devel
Subject:    [PATCH] increase moveMsg performance
From:       Carsten Burghardt <cb () magic-shop ! de>
Date:       2002-08-25 17:58:19
[Download RAW message or body]

Hi,

at the moment the destination folder of an imap moveMsg is downloaded 
(getFolder) after each operation. This is too time-consuming.
The attached patch does 2 things:
- just increment the cached total-count for the total-column
- the destination-folder is not opened/closed for this because the message is 
only added on the server. This improves performance and is needed because 
otherwise the cached total-count would be overwritten with an old value.

By the way: this is no feature ;-)

-- 
Regards,

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

Index: kmheaders.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmheaders.cpp,v
retrieving revision 1.436
diff -u -3 -p -r1.436 kmheaders.cpp
--- kmheaders.cpp	2002/08/25 13:22:14	1.436
+++ kmheaders.cpp	2002/08/25 17:52:49
@@ -1742,10 +1742,13 @@ void KMHeaders::moveMsgToFolder (KMFolde
 	     this,SLOT(highlightMessage(QListViewItem*)));
   kernel->kbp()->busy();
 
-  if (destFolder && destFolder->open() != 0)
+  if (destFolder && destFolder->protocol() != "imap")
   {
-      kernel->kbp()->idle();
-      return;
+      // no need to open with imap
+      if (destFolder->open() != 0) {
+        kernel->kbp()->idle();
+        return;
+      }
   }
 
   int contentX, contentY;
@@ -1832,7 +1835,9 @@ void KMHeaders::moveMsgToFolder (KMFolde
   connect(this,SIGNAL(currentChanged(QListViewItem*)),
 	     this,SLOT(highlightMessage(QListViewItem*)));
 
-  if (destFolder) {
+  if (destFolder && destFolder->protocol() != "imap") 
+  {
+      // no need for imap
       destFolder->sync();
       destFolder->close();
   }
Index: kmfolder.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmfolder.cpp,v
retrieving revision 1.226
diff -u -3 -p -r1.226 kmfolder.cpp
--- kmfolder.cpp	2002/07/29 09:21:01	1.226
+++ kmfolder.cpp	2002/08/25 17:52:50
@@ -979,15 +979,19 @@ int KMFolder::moveMsg(QPtrList<KMMessage
   assert(aMsg != NULL);
   msgParent = aMsg->parent();
 
-  if (msgParent)
-    msgParent->open();
+  if (protocol() != "imap") {
+    if (msgParent)
+      msgParent->open();
 
-  open();
+    open();
+  }
   rc = static_cast<KMFolderImap*>(this)->addMsg(msglist, aIndex_ret);
-  close();
+  if (protocol() != "imap") {
+    close();
 
-  if (msgParent)
-    msgParent->close();
+    if (msgParent)
+      msgParent->close();
+  }
 
   return rc;
 }
Index: kmfolderimap.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmfolderimap.cpp,v
retrieving revision 1.66
diff -u -3 -p -r1.66 kmfolderimap.cpp
--- kmfolderimap.cpp	2002/08/23 05:37:19	1.66
+++ kmfolderimap.cpp	2002/08/25 17:52:51
@@ -168,12 +168,20 @@ void KMFolderImap::addMsgQuiet(KMMessage
   if (folder) kernel->undoStack()->pushAction( aMsg->getMsgSerNum(), folder, this );
   if (folder) folder->take(folder->find(aMsg));
   delete aMsg;
-  getFolder();
+  if (mIsSelected) {
+    // folder is selected, so we can fetch the (new) content
+    getFolder();
+  } else {
+    // increase the cached count
+    ++mTotalMsgs;
+    emit msgAdded(static_cast<KMFolder*>(this));
+  }
 }
 
 //-----------------------------------------------------------------------------
 void KMFolderImap::addMsgQuiet(QPtrList<KMMessage> msgList)
 {
+  int count = msgList.count();
   KMFolder *folder = msgList.first()->parent();
   for ( KMMessage* msg = msgList.first(); msg; msg = msgList.next() )
   {
@@ -182,7 +190,14 @@ void KMFolderImap::addMsgQuiet(QPtrList<
   if (folder) folder->take(msgList);
   msgList.setAutoDelete(true);
   msgList.clear();
-  getFolder();
+  if (mIsSelected) {
+    // folder is selected, so we can fetch the (new) content
+    getFolder();
+  } else {
+    // increase the cached count
+    mTotalMsgs += count;
+    emit msgAdded(static_cast<KMFolder*>(this));
+  }
 }
 
 //-----------------------------------------------------------------------------
Index: kmfoldertree.cpp
===================================================================
RCS file: /home/kde/kdenetwork/kmail/kmfoldertree.cpp,v
retrieving revision 1.193
diff -u -3 -p -r1.193 kmfoldertree.cpp
--- kmfoldertree.cpp	2002/08/23 05:37:19	1.193
+++ kmfoldertree.cpp	2002/08/25 17:52:51
@@ -450,13 +450,14 @@ void KMFolderTree::reload(bool openFolde
               this,SLOT(slotUpdateCounts(KMFolderImap*, bool)));
           connect(fti->folder(), SIGNAL(folderComplete(KMFolderImap*, bool)),
               this,SLOT(slotUpdateCounts(KMFolderImap*, bool)));
-        } else {
-          // others-only, imap doesn't need this because of the folderComplete-signal
-          disconnect(fti->folder(), SIGNAL(msgAdded(KMFolder*)),
-              this,SLOT(slotUpdateCounts(KMFolder*)));
-          connect(fti->folder(), SIGNAL(msgAdded(KMFolder*)),
-              this,SLOT(slotUpdateCounts(KMFolder*)));
         }
+        // msgAdded
+        disconnect(fti->folder(), SIGNAL(msgAdded(KMFolder*)),
+            this,SLOT(slotUpdateCounts(KMFolder*)));
+        connect(fti->folder(), SIGNAL(msgAdded(KMFolder*)),
+            this,SLOT(slotUpdateCounts(KMFolder*)));
+
+        // msgRemoved
         disconnect(fti->folder(), SIGNAL(msgRemoved(KMFolder*)),
             this,SLOT(slotUpdateCounts(KMFolder*)));
         connect(fti->folder(), SIGNAL(msgRemoved(KMFolder*)),

_______________________________________________
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