Ensure serial numbes are correctly assigned for messages that are moved

into an imap folder.

As per the "PATCH: KMFolderImap::slotGetMessagesData discrepancy"
discussion on the kmail-devel list.

I've tested it for weeks now without noticing any problems.

svn path=/trunk/kdepim/; revision=365366
wilder-work
Don Sanders 22 years ago
parent fc1f19d76a
commit 26066dd7ee
  1. 5
      kmmessage.cpp
  2. 22
      kmmsgdict.cpp
  3. 4
      kmmsgdict.h

@ -15,6 +15,7 @@ using KMail::MessageProperty;
#include "objecttreeparser.h"
using KMail::ObjectTreeParser;
#include "kmfolderindex.h"
#include "kmmsgdict.h"
#include "undostack.h"
#include "kmversion.h"
#include <libkpimidentities/identity.h>
@ -208,7 +209,11 @@ QCString KMMessage::id() const
//-----------------------------------------------------------------------------
void KMMessage::setMsgSerNum(unsigned long newMsgSerNum)
{
unsigned long oldMsgSerNum = getMsgSerNum();
MessageProperty::setSerialCache( this, newMsgSerNum );
if ( newMsgSerNum && oldMsgSerNum )
kmkernel->msgDict()->replace( newMsgSerNum, this );
}

@ -211,6 +211,28 @@ unsigned long KMMsgDict::insert(const KMMsgBase *msg, int index)
//-----------------------------------------------------------------------------
void KMMsgDict::replace(unsigned long msgSerNum,
const KMMsgBase *msg, int index)
{
KMFolderIndex* folder = static_cast<KMFolderIndex*>( msg->storage() );
if ( folder && index == -1 )
index = folder->find( msg );
remove( msgSerNum );
KMMsgDictEntry *entry = new KMMsgDictEntry( folder->folder(), index );
dict->insert( (long)msgSerNum, entry );
KMMsgDictREntry *rentry = folder->rDict();
if (!rentry) {
rentry = new KMMsgDictREntry();
folder->setRDict(rentry);
}
rentry->set(index, entry);
}
//-----------------------------------------------------------------------------
void KMMsgDict::remove(unsigned long msgSerNum)
{
long key = (long)msgSerNum;

@ -31,6 +31,10 @@ public:
* serial number. */
unsigned long insert(const KMMsgBase *msg, int index = -1);
/** Set the serial number of @p msg to @p msgSerNum */
void replace(unsigned long msgSerNum,
const KMMsgBase *msg, int index = -1);
/** Removes a message. */
void remove(unsigned long msgSerNum);

Loading…
Cancel
Save