[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