Add the UID the msgSize on server to the index.

You don't need getMsg anymore for the UID and LOD can check the size without loading the header.
I updated the online imap folder but dimap should also use the new code.

svn path=/trunk/kdepim/; revision=288206
wilder-work
Carsten Burghardt 22 years ago
parent 09722d1331
commit ccfd5ab1e0
  1. 11
      cachedimapjob.cpp
  2. 8
      imapaccountbase.cpp
  3. 30
      imapjob.cpp
  4. 33
      kmfolderimap.cpp
  5. 20
      kmfoldermbox.cpp
  6. 14
      kmheaders.cpp
  7. 25
      kmmessage.cpp
  8. 8
      kmmessage.h
  9. 5
      kmmsgbase.cpp
  10. 12
      kmmsgbase.h
  11. 79
      kmmsginfo.cpp
  12. 10
      kmmsginfo.h
  13. 3
      kmreaderwin.cpp

@ -212,10 +212,11 @@ void CachedImapJob::slotGetNextMessage(KIO::Job * job)
ulong size = 0;
if ((*it).data.size() > 0) {
QString uid = mMsg->headerField("X-UID");
size = mMsg->headerField("X-Length").toULong();
ulong uid = mMsg->UID();
size = mMsg->msgSizeServer();
mMsg->fromByteArray( (*it).data );
mMsg->setHeaderField("X-UID",uid);
mMsg->setUID(uid);
mMsg->setMsgSizeServer(size);
mMsg->setTransferInProgress( false );
mMsg->setComplete( true );
mFolder->addMsgInternal( mMsg, true );
@ -238,8 +239,8 @@ void CachedImapJob::slotGetNextMessage(KIO::Job * job)
MsgForDownload mfd = mMsgsForDownload.front(); mMsgsForDownload.pop_front();
mMsg = new KMMessage;
mMsg->setHeaderField("X-UID",QString::number(mfd.uid));
mMsg->setHeaderField("X-Length",QString::number(mfd.size));
mMsg->setUID(mfd.uid);
mMsg->setMsgSizeServer(mfd.size);
if( mfd.flags > 0 )
KMFolderCachedImap::flagsToStatus(mMsg, mfd.flags);
KURL url = mAccount->getUrl();

@ -544,14 +544,6 @@ namespace KMail {
kdWarning(5006) << "ImapAccountBase::handleBodyStructure - found no attachment strategy!" << endl;
return;
}
// check the size, if the message is smaller than 5KB then load it in one go
if ( msg->msgLength() < 5000 )
{
FolderJob *job = msg->parent()->createJob(
msg, FolderJob::tGetMessage, 0, "TEXT" );
job->start();
return;
}
// download parts according to attachmentstrategy
BodyVisitor *visitor = BodyVisitorFactory::getVisitor( as );

@ -109,9 +109,9 @@ void ImapJob::init( JobType jt, QString sets, KMFolderImap* folder,
jd.total = 1; jd.done = 0;
jd.msgList.append(msg);
QCString cstr( msg->asString() );
int a = cstr.find( "\nX-UID: " );
int b = cstr.find( "\n", a );
if ( a != -1 && b != -1 && cstr.find( "\n\n" ) > a ) cstr.remove( a, b-a );
int a = cstr.find("\nX-UID: ");
int b = cstr.find('\n', a);
if (a != -1 && b != -1 && cstr.find("\n\n") > a) cstr.remove(a, b-a);
mData.resize( cstr.length() + cstr.contains( "\n" ) - cstr.contains( "\r\n" ) );
unsigned int i = 0;
char prevChar = '\0';
@ -222,7 +222,7 @@ void ImapJob::slotGetNextMessage()
KMMessage *msg = mMsgList.first();
KMFolderImap *msgParent = static_cast<KMFolderImap*>(msg->storage());
KMAcctImap *account = msgParent->account();
if ( msg->headerField("X-UID").isEmpty() )
if ( msg->UID() == 0 )
{
emit messageRetrieved( msg );
account->mJobList.remove( this );
@ -230,7 +230,7 @@ void ImapJob::slotGetNextMessage()
return;
}
KURL url = account->getUrl();
QString path = msgParent->imapPath() + ";UID=" + msg->headerField("X-UID");
QString path = msgParent->imapPath() + ";UID=" + QString::number(msg->UID());
ImapAccountBase::jobData jd;
jd.parent = 0; jd.offset = 0;
jd.total = 1; jd.done = 0;
@ -248,8 +248,8 @@ void ImapJob::slotGetNextMessage()
}
} else {
path += ";SECTION=BODY.PEEK[]";
uint size = msg->headerField("X-Length").toUInt();
if (size > 0) jd.total = size;
if (msg->msgSizeServer() > 0)
jd.total = msg->msgSizeServer();
}
url.setPath( path );
// kdDebug(5006) << "ImapJob::slotGetNextMessage - retrieve " << url.path() << endl;
@ -308,14 +308,16 @@ void ImapJob::slotGetMessageResult( KIO::Job * job )
if ( mPartSpecifier.isEmpty() ||
mPartSpecifier == "HEADER" )
{
uint size = msg->headerField("X-Length").toUInt();
uint size = msg->msgSizeServer();
if ( size > 0 && mPartSpecifier.isEmpty() )
(*it).done = size;
QString uid = msg->headerField("X-UID");
ulong uid = msg->UID();
msg->fromByteArray( (*it).data );
msg->setHeaderField("X-UID",uid);
// set correct size
if ( size > 0 ) msg->setMsgLength(size);
// reconstruct as it may be overwritten above
msg->setUID(uid);
if ( size > 0 && msg->msgSizeServer() == 0 )
msg->setMsgSizeServer(size);
if ( mPartSpecifier.isEmpty() )
msg->setComplete( true );
else
@ -473,7 +475,7 @@ void ImapJob::slotCopyMessageInfoData(KIO::Job * job, const QString & data)
KMMessage * msg;
for ( msg = (*it).msgList.first(); msg; msg = (*it).msgList.next() )
{
uint uid = msg->headerField("X-UID").toInt();
ulong uid = msg->UID();
index = olduids.findIndex(uid);
if (index > -1)
{
@ -483,7 +485,7 @@ void ImapJob::slotCopyMessageInfoData(KIO::Job * job, const QString & data)
}
}
} else if (mMsgList.first()) {
uint uid = mMsgList.first()->headerField("X-UID").toInt();
ulong uid = mMsgList.first()->UID();
index = olduids.findIndex(uid);
if (index > -1)
{

@ -464,7 +464,7 @@ QPtrList<KMMessage> KMFolderImap::splitMessageList(QString set, QPtrList<KMMessa
{
// append the msg to the new list and delete it from the old
temp_msgs.append(msg);
uid = msg->headerField("X-UID");
uid = msg->UID();
// remove modifies the current
msgList.remove(msg);
if (uid == last_uid) break;
@ -672,10 +672,8 @@ ulong KMFolderImap::lastUid()
open();
if (count() > 0)
{
bool unget = !isMessage(count() - 1);
KMMessage *msg = getMsg(count() - 1);
mLastUid = msg->headerField("X-UID").toULong();
if (unget) unGetMsg(count() - 1);
KMMsgBase * base = getMsgBase(count()-1);
mLastUid = base->UID();
}
close();
return mLastUid;
@ -1002,7 +1000,7 @@ void KMFolderImap::slotGetMessagesData(KIO::Job * job, const QByteArray & data)
KMMessage *msg = new KMMessage;
msg->fromString((*it).cdata.mid(16, pos - 16));
flags = msg->headerField("X-Flags").toInt();
ulong uid = msg->headerField("X-UID").toULong();
ulong uid = msg->UID();
if (flags & 8 || uid <= lastUid()) {
delete msg;
msg = 0;
@ -1031,7 +1029,8 @@ void KMFolderImap::slotGetMessagesData(KIO::Job * job, const QByteArray & data)
// Merge with the flags from the server.
flagsToStatus((KMMsgBase*)msg, flags);
// set the correct size
msg->setMsgLength( msg->headerField("X-Length").toUInt() );
msg->setMsgSizeServer( msg->headerField("X-Length").toUInt() );
msg->setUID(uid);
close();
if (count() > 1) unGetMsg(count() - 1);
@ -1053,6 +1052,7 @@ KMFolderImap::doCreateJob( KMMessage *msg, FolderJob::JobType jt,
KMFolderImap* kmfi = folder? dynamic_cast<KMFolderImap*>(folder->storage()) : 0;
if ( jt == FolderJob::tGetMessage && partSpecifier == "STRUCTURE" &&
mAccount && mAccount->loadOnDemand() &&
( msg->msgSizeServer() > 5000 || msg->msgSizeServer() == 0 ) &&
( msg->signatureState() == KMMsgNotSigned ||
msg->signatureState() == KMMsgSignatureStateUnknown ) )
{
@ -1212,16 +1212,16 @@ void KMFolderImap::deleteMessage(KMMessage * msg)
{
KURL url = mAccount->getUrl();
KMFolderImap *msg_parent = static_cast<KMFolderImap*>(msg->storage());
QString uid = msg->headerField("X-UID");
ulong uid = msg->UID();
/* If the uid is empty the delete job below will nuke all mail in the
folder, so we better safeguard against that. See ::expungeFolder, as
to why. :( */
if ( uid.isEmpty() ) {
if ( uid == 0 ) {
kdDebug( 5006 ) << "KMFolderImap::deleteMessage: Attempt to delete "
"an empty UID. Aborting." << endl;
return;
}
url.setPath(msg_parent->imapPath() + ";UID=" + uid );
url.setPath(msg_parent->imapPath() + ";UID=" + QString::number(uid) );
if ( mAccount->makeConnection() != ImapAccountBase::Connected )
return;
KIO::SimpleJob *job = KIO::file_delete(url, FALSE);
@ -1288,7 +1288,7 @@ void KMFolderImap::setStatus(QValueList<int>& ids, KMMsgStatus status, bool togg
if (!msg) continue;
QString flags = statusToFlags(msg->status());
// Collect uids for each type of flags.
groups[flags].append(msg->headerField("X-UID"));
groups[flags].append(QString::number(msg->UID()));
if (unget) unGetMsg(*it);
}
QMapIterator< QString, QStringList > dit;
@ -1369,15 +1369,13 @@ QStringList KMFolderImap::makeSets(QValueList<int>& uids, bool sort)
//-----------------------------------------------------------------------------
void KMFolderImap::getUids(QValueList<int>& ids, QValueList<int>& uids)
{
KMMessage *msg = 0;
KMMsgBase *msg = 0;
// get the uids
for ( QValueList<int>::Iterator it = ids.begin(); it != ids.end(); ++it )
{
bool unget = !isMessage(*it);
msg = getMsg(*it);
msg = getMsgBase(*it);
if (!msg) continue;
uids.append(msg->headerField("X-UID").toInt());
if (unget) unGetMsg(*it);
uids.append(msg->UID());
}
}
@ -1390,8 +1388,7 @@ void KMFolderImap::getUids(QPtrList<KMMessage>& msgList, QValueList<int>& uids,
if (!msgParent) return;
for ( msg = msgList.first(); msg; msg = msgList.next() )
if ( !msg->headerField("X-UID").isEmpty() )
uids.append(msg->headerField("X-UID").toInt());
uids.append(msg->UID());
}
//-----------------------------------------------------------------------------

@ -507,6 +507,7 @@ int KMFolderMbox::createIndexFromContents()
char status[8], xstatus[8];
QCString subjStr, dateStr, fromStr, toStr, xmarkStr, *lastStr=0;
QCString replyToIdStr, replyToAuxIdStr, referencesStr, msgIdStr;
QCString sizeServerStr, uidStr;
bool atEof = false;
bool inHeader = true;
KMMsgInfo* mi;
@ -536,6 +537,8 @@ int KMFolderMbox::createIndexFromContents()
referencesStr = "";
msgIdStr = "";
needStatus = 3;
size_t sizeServer = 0;
ulong uid = 0;
while (!atEof)
@ -613,7 +616,7 @@ int KMFolderMbox::createIndexFromContents()
xmarkStr.stripWhiteSpace(),
replyToIdStr, replyToAuxIdStr, msgIdStr,
KMMsgEncryptionStateUnknown, KMMsgSignatureStateUnknown,
KMMsgMDNStateUnknown, offs, size );
KMMsgMDNStateUnknown, offs, size, sizeServer, uid );
mi->setStatus(status, xstatus);
mi->setDate( dateStr.stripWhiteSpace() );
mi->setDirty(false);
@ -630,6 +633,8 @@ int KMFolderMbox::createIndexFromContents()
dateStr = "";
fromStr = "";
subjStr = "";
sizeServer = 0;
uid = 0;
}
else num--,numStatus++;
}
@ -705,6 +710,19 @@ int KMFolderMbox::createIndexFromContents()
subjStr = QCString(line+8);
lastStr = &subjStr;
}
else if (strncasecmp(line,"X-Length:",9)==0)
{
sizeServerStr = QCString(line+9);
sizeServer = sizeServerStr.toULong();
kdDebug() << "mbox got length " << sizeServer << endl;
lastStr = &sizeServerStr;
}
else if (strncasecmp(line,"X-UID:",6)==0)
{
uidStr = QCString(line+6);
uid = uidStr.toULong();
lastStr = &uidStr;
}
}
if (mAutoCreateIndex)

@ -286,13 +286,7 @@ public:
&& headers->paintInfo()->showSize) {
if ( mMsgBase->parent()->folderType() == KMFolderTypeImap )
{
QCString cstr;
headers->folder()->getMsgString(mMsgId, cstr);
int a = cstr.find("\nX-Length: ") + 11;
if(a != 10) {
int b = cstr.find('\n', a);
tmp = KIO::convertSize(cstr.mid(a, b-a).toULong());
}
tmp = KIO::convertSize( mMsgBase->msgSizeServer() );
} else tmp = KIO::convertSize(mMsgBase->msgSize());
}
return tmp;
@ -463,11 +457,7 @@ public:
QString len;
if ( msg->parent()->folderType() == KMFolderTypeImap )
{
QCString cstr;
headers->folder()->getMsgString(id, cstr);
int a = cstr.find("\nX-Length: ") + 11;
int b = cstr.find('\n', a);
len = QString::fromLatin1( cstr.data() + a, b - a );
len = QString::number( msg->msgSizeServer() );
} else {
len = QString::number( msg->msgSize() );
}

@ -2148,6 +2148,31 @@ void KMMessage::setMsgId(const QString& aStr)
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
size_t KMMessage::msgSizeServer() const {
return headerField( "X-Length" ).toULong();
}
//-----------------------------------------------------------------------------
void KMMessage::setMsgSizeServer(size_t size)
{
setHeaderField("X-Length", QCString().setNum(size));
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
ulong KMMessage::UID() const {
return headerField( "X-UID" ).toULong();
}
//-----------------------------------------------------------------------------
void KMMessage::setUID(ulong uid)
{
setHeaderField("X-UID", QCString().setNum(uid));
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
AddressList KMMessage::headerAddrField( const QCString & aName ) const {

@ -759,6 +759,14 @@ public:
{ return (mMsgLength) ? mMsgLength : mMsgSize; }
void setMsgLength(size_t sz) { mMsgLength = sz; }
/** Get/set size on server */
size_t msgSizeServer() const;
void setMsgSizeServer(size_t sz);
/** Get/set UID */
ulong UID() const;
void setUID(ulong uid);
/** Status of the message. */
KMMsgStatus status() const { return mStatus; }
/** Set status and mark dirty. */

@ -1303,6 +1303,11 @@ const uchar *KMMsgBase::asIndexString(int &length) const
tmp = status();
STORE_DATA(MsgStatusPart, tmp);
tmp = msgSizeServer();
STORE_DATA(MsgSizeServerPart, tmp);
tmp = UID();
STORE_DATA(MsgUIDPart, tmp);
return ret;
}
#undef STORE_DATA_LEN

@ -260,6 +260,14 @@ public:
virtual size_t msgSize(void) const = 0;
virtual void setMsgSize(size_t sz) = 0;
/** Get/set size of message on server */
virtual size_t msgSizeServer(void) const = 0;
virtual void setMsgSizeServer(size_t sz) = 0;
/** Get/set UID for IMAP */
virtual ulong UID(void) const = 0;
virtual void setUID(ulong uid) = 0;
/** offset into index file */
virtual void setIndexOffset(off_t off) { mIndexOffset = off; }
virtual off_t indexOffset() const { return mIndexOffset; }
@ -387,7 +395,9 @@ public:
MsgReplyToAuxIdMD5Part = 14,
MsgStrippedSubjectMD5Part = 15,
// and another unsigned long
MsgStatusPart = 16
MsgStatusPart = 16,
MsgSizeServerPart = 17,
MsgUIDPart = 18
};
/** access to long msgparts */
off_t getLongPart(MsgPartType) const;

@ -19,22 +19,23 @@ class KMMsgInfo::KMMsgInfoPrivate
public:
enum {
SUBJECT_SET = 0x01, TO_SET = 0x02, REPLYTO_SET = 0x04, MSGID_SET=0x08,
DATE_SET = 0x10, OFFSET_SET = 0x20, SIZE_SET = 0x40,
DATE_SET = 0x10, OFFSET_SET = 0x20, SIZE_SET = 0x40, SIZESERVER_SET = 0x80,
XMARK_SET=0x100, FROM_SET=0x200, FILE_SET=0x400, ENCRYPTION_SET=0x800,
SIGNATURE_SET=0x1000, MDN_SET=0x2000, REPLYTOAUX_SET = 0x4000,
STRIPPEDSUBJECT_SET = 0x8000,
STRIPPEDSUBJECT_SET = 0x8000, UID_SET = 0x10000,
ALL_SET = 0xFFFF, NONE_SET = 0x0000
ALL_SET = 0xFFFFFF, NONE_SET = 0x000000
};
uint modifiers;
QString subject, from, to, replyToIdMD5, replyToAuxIdMD5,
strippedSubjectMD5, msgIdMD5, xmark, file;
off_t folderOffset;
size_t msgSize;
size_t msgSize, msgSizeServer;
time_t date;
KMMsgEncryptionState encryptionState;
KMMsgSignatureState signatureState;
KMMsgMDNSentState mdnSentState;
ulong UID;
KMMsgInfoPrivate() : modifiers(NONE_SET) { }
KMMsgInfoPrivate& operator=(const KMMsgInfoPrivate& other) {
@ -96,18 +97,18 @@ public:
modifiers |= SIGNATURE_SET;
signatureState = other.signatureState;
}
if(other.modifiers & ENCRYPTION_SET) {
modifiers |= ENCRYPTION_SET;
encryptionState = other.encryptionState;
}
if(other.modifiers & SIGNATURE_SET) {
modifiers |= SIGNATURE_SET;
signatureState = other.signatureState;
}
if(other.modifiers & MDN_SET) {
modifiers |= MDN_SET;
mdnSentState = other.mdnSentState;
}
if(other.modifiers & SIZESERVER_SET) {
modifiers |= SIZESERVER_SET;
msgSizeServer = other.msgSizeServer;
}
if(other.modifiers & UID_SET) {
modifiers |= UID_SET;
UID = other.UID;
}
return *this;
}
};
@ -170,6 +171,8 @@ KMMsgInfo& KMMsgInfo::operator=(const KMMessage& msg)
kd->encryptionState = msg.encryptionState();
kd->signatureState = msg.signatureState();
kd->mdnSentState = msg.mdnSentState();
kd->msgSizeServer = msg.msgSizeServer();
kd->UID = msg.UID();
return *this;
}
@ -182,7 +185,8 @@ void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
KMMsgEncryptionState encryptionState,
KMMsgSignatureState signatureState,
KMMsgMDNSentState mdnSentState,
off_t aFolderOffset, size_t aMsgSize)
off_t aFolderOffset, size_t aMsgSize,
size_t aMsgSizeServer, ulong aUID)
{
mIndexOffset = 0;
mIndexLength = 0;
@ -205,6 +209,8 @@ void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
kd->encryptionState = encryptionState;
kd->signatureState = signatureState;
kd->mdnSentState = mdnSentState;
kd->msgSizeServer = aMsgSizeServer;
kd->UID = aUID;
mDirty = FALSE;
}
@ -217,12 +223,13 @@ void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
KMMsgEncryptionState encryptionState,
KMMsgSignatureState signatureState,
KMMsgMDNSentState mdnSentState,
unsigned long aMsgSize)
size_t aMsgSize,
size_t aMsgSizeServer, ulong aUID)
{
// use the "normal" init for most stuff
init( aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, replyToAuxId,
msgId, encryptionState, signatureState, mdnSentState,
(unsigned long)0, aMsgSize );
(unsigned long)0, aMsgSize, aMsgSizeServer, aUID );
kd->file = aFileName;
}
@ -544,6 +551,22 @@ time_t KMMsgInfo::date(void) const
return res;
}
//-----------------------------------------------------------------------------
size_t KMMsgInfo::msgSizeServer(void) const
{
if (kd && kd->modifiers & KMMsgInfoPrivate::SIZESERVER_SET)
return kd->msgSizeServer;
return getLongPart(MsgSizeServerPart);
}
//-----------------------------------------------------------------------------
ulong KMMsgInfo::UID(void) const
{
if (kd && kd->modifiers & KMMsgInfoPrivate::UID_SET)
return kd->UID;
return getLongPart(MsgUIDPart);
}
//-----------------------------------------------------------------------------
void KMMsgInfo::setMsgSize(size_t sz)
{
@ -557,6 +580,32 @@ void KMMsgInfo::setMsgSize(size_t sz)
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
void KMMsgInfo::setMsgSizeServer(size_t sz)
{
if (sz == msgSizeServer())
return;
if(!kd)
kd = new KMMsgInfoPrivate;
kd->modifiers |= KMMsgInfoPrivate::SIZESERVER_SET;
kd->msgSizeServer = sz;
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
void KMMsgInfo::setUID(ulong uid)
{
if (uid == UID())
return;
if(!kd)
kd = new KMMsgInfoPrivate;
kd->modifiers |= KMMsgInfoPrivate::UID_SET;
kd->UID = uid;
mDirty = TRUE;
}
//-----------------------------------------------------------------------------
void KMMsgInfo::setFolderOffset(off_t offs)
{

@ -31,7 +31,8 @@ public:
KMMsgEncryptionState encryptionState,
KMMsgSignatureState signatureState,
KMMsgMDNSentState mdnSentState,
off_t folderOffset=0, size_t msgSize=0);
off_t folderOffset=0, size_t msgSize=0,
size_t msgSizeServer = 0, ulong UID = 0);
/** Initialize with given values and set dirty flag to FALSE. */
virtual void init(const QCString& subject, const QCString& from,
@ -44,7 +45,8 @@ public:
KMMsgEncryptionState encryptionState,
KMMsgSignatureState signatureState,
KMMsgMDNSentState mdnSentState,
unsigned long msgSize=0);
size_t msgSize=0,
size_t msgSizeServer = 0, ulong UID = 0);
/** Inherited methods (see @ref KMMsgBase for description): */
virtual QString subject(void) const;
@ -63,8 +65,11 @@ public:
virtual KMMsgMDNSentState mdnSentState() const;
virtual off_t folderOffset(void) const;
virtual size_t msgSize(void) const;
virtual size_t msgSizeServer(void) const;
virtual time_t date(void) const;
virtual ulong UID(void) const;
void setMsgSize(size_t sz);
void setMsgSizeServer(size_t sz);
void setFolderOffset(off_t offs);
void setFileName(const QString& file);
virtual void setStatus(const KMMsgStatus status, int idx = -1);
@ -78,6 +83,7 @@ public:
virtual void setEncryptionState( const KMMsgEncryptionState, int idx = -1 );
virtual void setSignatureState( const KMMsgSignatureState, int idx = -1 );
virtual void setMDNSentState( const KMMsgMDNSentState, int idx = -1 );
virtual void setUID(ulong);
/** Grr.. c++! */
virtual void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); }

@ -1557,8 +1557,7 @@ void KMReaderWin::atmViewMsg(KMMessagePart* aMsgPart)
assert(msg != 0);
// some information that is needed for imap messages with LOD
msg->setParent( message()->parent() );
if ( !message()->headerField("X-UID").isEmpty() )
msg->setHeaderField("X-UID", message()->headerField("X-UID"));
msg->setUID(message()->UID());
msg->setReadyToShow(true);
KMReaderMainWin *win = new KMReaderMainWin();
win->showMsg( overrideCodec(), msg );

Loading…
Cancel
Save