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

List:       kde-commits
Subject:    [kdepim-runtime/KDE/4.12] resources/imap: Close IMAP mailbox before renaming it
From:       Dan_Vrátil <dvratil () redhat ! com>
Date:       2014-01-13 10:29:10
Message-ID: E1W2ela-0003FR-2m () scm ! kde ! org
[Download RAW message or body]

Git commit 066efc7923640201bee5d170dfb78d0c7ecaeda4 by Dan Vrátil.
Committed on 13/01/2014 at 10:24.
Pushed by dvratil into branch 'KDE/4.12'.

Close IMAP mailbox before renaming it

Some IMAP servers don't allow renaming a currently SELECTed
mailbox, so we close it before RENAMEing it.

REVIEW: 114996
CCBUG: 324932
FIXED-IN: 4.12.1

M  +26   -1    resources/imap/movecollectiontask.cpp
M  +3    -0    resources/imap/movecollectiontask.h

http://commits.kde.org/kdepim-runtime/066efc7923640201bee5d170dfb78d0c7ecaeda4

diff --git a/resources/imap/movecollectiontask.cpp b/resources/imap/movecollectiontask.cpp
index 52a5159..8b69cd7 100644
--- a/resources/imap/movecollectiontask.cpp
+++ b/resources/imap/movecollectiontask.cpp
@@ -27,6 +27,7 @@
 #include <kimap/renamejob.h>
 #include <kimap/session.h>
 #include <kimap/subscribejob.h>
+#include <kimap/closejob.h>
 
 MoveCollectionTask::MoveCollectionTask( ResourceStateInterface::Ptr resource, QObject *parent )
   : ResourceTask( DeferIfNoSession, resource, parent )
@@ -63,6 +64,31 @@ void MoveCollectionTask::doStart( KIMAP::Session *session )
     return;
   }
 
+  // Some IMAP servers don't allow renaming an opened mailbox, so make sure
+  // it's not opened (https://bugs.kde.org/show_bug.cgi?id=324932)
+  if ( session->selectedMailBox() != mailBoxForCollection( collection() ) ) {
+    doRename( session );
+    return;
+  }
+
+  KIMAP::CloseJob *close = new KIMAP::CloseJob( session );
+  connect( close, SIGNAL(result(KJob*)),
+           this, SLOT(onCloseDone(KJob*)) );
+  close->start();
+}
+
+void MoveCollectionTask::onCloseDone(KJob* job)
+{
+  if ( job->error() ) {
+    changeProcessed();
+  } else {
+    KIMAP::CloseJob *close = dynamic_cast<KIMAP::CloseJob*>( job );
+    doRename( close->session() );
+  }
+}
+
+void MoveCollectionTask::doRename( KIMAP::Session *session )
+{
   // collection.remoteId() already includes the separator
   const QString oldMailBox = mailBoxForCollection( sourceCollection() )+collection().remoteId();
   const QString newMailBox = mailBoxForCollection( targetCollection() )+collection().remoteId();
@@ -82,7 +108,6 @@ void MoveCollectionTask::doStart( KIMAP::Session *session )
   }
 }
 
-
 void MoveCollectionTask::onRenameDone( KJob *job )
 {
   if ( job->error() ) {
diff --git a/resources/imap/movecollectiontask.h b/resources/imap/movecollectiontask.h
index d762f4a..0237e12 100644
--- a/resources/imap/movecollectiontask.h
+++ b/resources/imap/movecollectiontask.h
@@ -33,6 +33,7 @@ public:
   virtual ~MoveCollectionTask();
 
 private slots:
+  void onCloseDone( KJob *job );
   void onRenameDone( KJob *job );
   void onSubscribeDone( KJob *job );
 
@@ -40,6 +41,8 @@ protected:
   virtual void doStart( KIMAP::Session *session );
 
 private:
+  void doRename( KIMAP::Session *session );
+
   Akonadi::Collection m_collection;
 };
 
[prev in list] [next in list] [prev in thread] [next in thread] 

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