[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