00001
00002
00003 #ifdef HAVE_CONFIG_H
00004 #include <config.h>
00005 #endif
00006
00007 #include "kmmsginfo.h"
00008 #include "kmmessage.h"
00009
00010
00011 #include <stdlib.h>
00012 #include <string.h>
00013 #include <stdio.h>
00014 #include <assert.h>
00015 #include <mimelib/datetime.h>
00016
00017 class KMMsgInfo::KMMsgInfoPrivate
00018 {
00019 public:
00020 enum {
00021 SUBJECT_SET = 0x01, TO_SET = 0x02, REPLYTO_SET = 0x04, MSGID_SET=0x08,
00022 DATE_SET = 0x10, OFFSET_SET = 0x20, SIZE_SET = 0x40, SIZESERVER_SET = 0x80,
00023 XMARK_SET=0x100, FROM_SET=0x200, FILE_SET=0x400, ENCRYPTION_SET=0x800,
00024 SIGNATURE_SET=0x1000, MDN_SET=0x2000, REPLYTOAUX_SET = 0x4000,
00025 STRIPPEDSUBJECT_SET = 0x8000, UID_SET = 0x10000,
00026
00027 ALL_SET = 0xFFFFFF, NONE_SET = 0x000000
00028 };
00029 uint modifiers;
00030 QString subject, from, to, replyToIdMD5, replyToAuxIdMD5,
00031 strippedSubjectMD5, msgIdMD5, xmark, file;
00032 off_t folderOffset;
00033 size_t msgSize, msgSizeServer;
00034 time_t date;
00035 KMMsgEncryptionState encryptionState;
00036 KMMsgSignatureState signatureState;
00037 KMMsgMDNSentState mdnSentState;
00038 ulong UID;
00039
00040 KMMsgInfoPrivate() : modifiers(NONE_SET) { }
00041 KMMsgInfoPrivate& operator=(const KMMsgInfoPrivate& other) {
00042 modifiers = NONE_SET;
00043 if (other.modifiers & SUBJECT_SET) {
00044 modifiers |= SUBJECT_SET;
00045 subject = other.subject;
00046 }
00047 if (other.modifiers & STRIPPEDSUBJECT_SET) {
00048 modifiers |= STRIPPEDSUBJECT_SET;
00049 strippedSubjectMD5 = other.strippedSubjectMD5;
00050 }
00051 if (other.modifiers & FROM_SET) {
00052 modifiers |= FROM_SET;
00053 from = other.from;
00054 }
00055 if (other.modifiers & FILE_SET) {
00056 modifiers |= FILE_SET;
00057 file = other.from;
00058 }
00059 if (other.modifiers & TO_SET) {
00060 modifiers |= TO_SET;
00061 to = other.to;
00062 }
00063 if (other.modifiers & REPLYTO_SET) {
00064 modifiers |= REPLYTO_SET;
00065 replyToIdMD5 = other.replyToIdMD5;
00066 }
00067 if (other.modifiers & REPLYTOAUX_SET) {
00068 modifiers |= REPLYTOAUX_SET;
00069 replyToAuxIdMD5 = other.replyToAuxIdMD5;
00070 }
00071
00072 if(other.modifiers & MSGID_SET) {
00073 modifiers |= MSGID_SET;
00074 msgIdMD5 = other.msgIdMD5;
00075 }
00076 if(other.modifiers & XMARK_SET) {
00077 modifiers |= XMARK_SET;
00078 xmark = other.xmark;
00079 }
00080 if(other.modifiers & OFFSET_SET) {
00081 modifiers |= OFFSET_SET;
00082 folderOffset = other.folderOffset;
00083 }
00084 if(other.modifiers & SIZE_SET) {
00085 modifiers |= SIZE_SET;
00086 msgSize = other.msgSize;
00087 }
00088 if(other.modifiers & DATE_SET) {
00089 modifiers |= DATE_SET;
00090 date = other.date;
00091 }
00092 if(other.modifiers & ENCRYPTION_SET) {
00093 modifiers |= ENCRYPTION_SET;
00094 encryptionState = other.encryptionState;
00095 }
00096 if(other.modifiers & SIGNATURE_SET) {
00097 modifiers |= SIGNATURE_SET;
00098 signatureState = other.signatureState;
00099 }
00100 if(other.modifiers & MDN_SET) {
00101 modifiers |= MDN_SET;
00102 mdnSentState = other.mdnSentState;
00103 }
00104 if(other.modifiers & SIZESERVER_SET) {
00105 modifiers |= SIZESERVER_SET;
00106 msgSizeServer = other.msgSizeServer;
00107 }
00108 if(other.modifiers & UID_SET) {
00109 modifiers |= UID_SET;
00110 UID = other.UID;
00111 }
00112 return *this;
00113 }
00114 };
00115
00116
00117 KMMsgInfo::KMMsgInfo(KMFolder* p, off_t off, short len) :
00118 KMMsgBase(p),
00119 kd(0)
00120 {
00121 setIndexOffset(off);
00122 setIndexLength(len);
00123 setEnableUndo(true);
00124 }
00125
00126
00127
00128 KMMsgInfo::~KMMsgInfo()
00129 {
00130 delete kd;
00131 }
00132
00133
00134
00135 KMMsgInfo& KMMsgInfo::operator=(const KMMsgInfo& other)
00136 {
00137 KMMsgBase::assign(&other);
00138 if(other.kd) {
00139 if(!kd)
00140 kd = new KMMsgInfoPrivate;
00141 *kd = *other.kd;
00142 } else {
00143 delete kd;
00144 kd = 0;
00145 }
00146 mStatus = other.status();
00147 return *this;
00148 }
00149
00150
00151
00152 KMMsgInfo& KMMsgInfo::operator=(const KMMessage& msg)
00153 {
00154 KMMsgBase::assign(&msg.toMsgBase());
00155 if(!kd)
00156 kd = new KMMsgInfoPrivate;
00157 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
00158 kd->subject = msg.subject();
00159 kd->from = msg.fromStrip();
00160 kd->to = msg.toStrip();
00161 kd->replyToIdMD5 = msg.replyToIdMD5();
00162 kd->replyToAuxIdMD5 = msg.replyToAuxIdMD5();
00163 kd->strippedSubjectMD5 = msg.strippedSubjectMD5();
00164 kd->msgIdMD5 = msg.msgIdMD5();
00165 kd->xmark = msg.xmark();
00166 mStatus = msg.status();
00167 kd->folderOffset = msg.folderOffset();
00168 kd->msgSize = msg.msgSize();
00169 kd->date = msg.date();
00170 kd->file = msg.fileName();
00171 kd->encryptionState = msg.encryptionState();
00172 kd->signatureState = msg.signatureState();
00173 kd->mdnSentState = msg.mdnSentState();
00174 kd->msgSizeServer = msg.msgSizeServer();
00175 kd->UID = msg.UID();
00176 return *this;
00177 }
00178
00179
00180 void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
00181 const QCString& aTo, time_t aDate,
00182 KMMsgStatus aStatus, const QCString& aXMark,
00183 const QCString& replyToId, const QCString& replyToAuxId,
00184 const QCString& msgId,
00185 KMMsgEncryptionState encryptionState,
00186 KMMsgSignatureState signatureState,
00187 KMMsgMDNSentState mdnSentState,
00188 off_t aFolderOffset, size_t aMsgSize,
00189 size_t aMsgSizeServer, ulong aUID)
00190 {
00191 mIndexOffset = 0;
00192 mIndexLength = 0;
00193 if(!kd)
00194 kd = new KMMsgInfoPrivate;
00195 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
00196 kd->subject = decodeRFC2047String(aSubject);
00197 kd->from = decodeRFC2047String( KMMessage::stripEmailAddr( aFrom ) );
00198 kd->to = decodeRFC2047String( KMMessage::stripEmailAddr( aTo ) );
00199 kd->replyToIdMD5 = base64EncodedMD5( replyToId );
00200 kd->replyToAuxIdMD5 = base64EncodedMD5( replyToAuxId );
00201 kd->strippedSubjectMD5 = base64EncodedMD5( KMMessage::stripOffPrefixes( kd->subject ), true );
00202 kd->msgIdMD5 = base64EncodedMD5( msgId );
00203 kd->xmark = aXMark;
00204 kd->folderOffset = aFolderOffset;
00205 mStatus = aStatus;
00206 kd->msgSize = aMsgSize;
00207 kd->date = aDate;
00208 kd->file = "";
00209 kd->encryptionState = encryptionState;
00210 kd->signatureState = signatureState;
00211 kd->mdnSentState = mdnSentState;
00212 kd->msgSizeServer = aMsgSizeServer;
00213 kd->UID = aUID;
00214 mDirty = FALSE;
00215 }
00216
00217 void KMMsgInfo::init(const QCString& aSubject, const QCString& aFrom,
00218 const QCString& aTo, time_t aDate,
00219 KMMsgStatus aStatus, const QCString& aXMark,
00220 const QCString& replyToId, const QCString& replyToAuxId,
00221 const QCString& msgId,
00222 const QCString& aFileName,
00223 KMMsgEncryptionState encryptionState,
00224 KMMsgSignatureState signatureState,
00225 KMMsgMDNSentState mdnSentState,
00226 size_t aMsgSize,
00227 size_t aMsgSizeServer, ulong aUID)
00228 {
00229
00230 init( aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, replyToAuxId,
00231 msgId, encryptionState, signatureState, mdnSentState,
00232 (unsigned long)0, aMsgSize, aMsgSizeServer, aUID );
00233 kd->file = aFileName;
00234 }
00235
00236
00237
00238 QString KMMsgInfo::subject(void) const
00239 {
00240 if (kd && kd->modifiers & KMMsgInfoPrivate::SUBJECT_SET)
00241 return kd->subject;
00242 return getStringPart(MsgSubjectPart);
00243 }
00244
00245
00246
00247 QString KMMsgInfo::fromStrip(void) const
00248 {
00249 if (kd && kd->modifiers & KMMsgInfoPrivate::FROM_SET)
00250 return kd->from;
00251 return getStringPart(MsgFromPart);
00252 }
00253
00254
00255 QString KMMsgInfo::fileName(void) const
00256 {
00257 if (kd && kd->modifiers & KMMsgInfoPrivate::FILE_SET)
00258 return kd->file;
00259 return getStringPart(MsgFilePart);
00260 }
00261
00262
00263
00264 QString KMMsgInfo::toStrip(void) const
00265 {
00266 if (kd && kd->modifiers & KMMsgInfoPrivate::TO_SET)
00267 return kd->to;
00268 return getStringPart(MsgToPart);
00269 }
00270
00271
00272 QString KMMsgInfo::xmark(void) const
00273 {
00274 if (kd && kd->modifiers & KMMsgInfoPrivate::XMARK_SET)
00275 return kd->xmark;
00276 return getStringPart(MsgXMarkPart);
00277 }
00278
00279
00280
00281 QString KMMsgInfo::replyToIdMD5(void) const
00282 {
00283 if (kd && kd->modifiers & KMMsgInfoPrivate::REPLYTO_SET)
00284 return kd->replyToIdMD5;
00285 return getStringPart(MsgReplyToIdMD5Part);
00286 }
00287
00288
00289 QString KMMsgInfo::replyToAuxIdMD5() const
00290 {
00291 if( kd && kd->modifiers & KMMsgInfoPrivate::REPLYTOAUX_SET )
00292 return kd->replyToAuxIdMD5;
00293 return getStringPart( MsgReplyToAuxIdMD5Part );
00294 }
00295
00296
00297 QString KMMsgInfo::strippedSubjectMD5() const
00298 {
00299 if( kd && kd->modifiers & KMMsgInfoPrivate::STRIPPEDSUBJECT_SET )
00300 return kd->strippedSubjectMD5;
00301 return getStringPart( MsgStrippedSubjectMD5Part );
00302 }
00303
00304
00305
00306 bool KMMsgInfo::subjectIsPrefixed() const
00307 {
00308 return strippedSubjectMD5() != base64EncodedMD5( subject().stripWhiteSpace(), true );
00309 }
00310
00311
00312 QString KMMsgInfo::msgIdMD5(void) const
00313 {
00314 if (kd && kd->modifiers & KMMsgInfoPrivate::MSGID_SET)
00315 return kd->msgIdMD5;
00316 return getStringPart(MsgIdMD5Part);
00317 }
00318
00319
00320
00321 void KMMsgInfo::setSubject(const QString& aSubject)
00322 {
00323 if(aSubject == subject())
00324 return;
00325
00326 if (!kd)
00327 kd = new KMMsgInfoPrivate;
00328 kd->modifiers |= KMMsgInfoPrivate::SUBJECT_SET;
00329 kd->subject = aSubject;
00330 mDirty = TRUE;
00331 }
00332
00333
00334
00335 void KMMsgInfo::setXMark(const QString& aXMark)
00336 {
00337 if (aXMark == xmark())
00338 return;
00339
00340 if (!kd)
00341 kd = new KMMsgInfoPrivate;
00342 kd->modifiers |= KMMsgInfoPrivate::XMARK_SET;
00343 kd->xmark = aXMark;
00344 mDirty = TRUE;
00345 }
00346
00347
00348
00349 void KMMsgInfo::setReplyToIdMD5(const QString& aReplyToIdMD5)
00350 {
00351 if (aReplyToIdMD5 == replyToIdMD5())
00352 return;
00353
00354 if (!kd)
00355 kd = new KMMsgInfoPrivate;
00356 kd->modifiers |= KMMsgInfoPrivate::REPLYTO_SET;
00357 kd->replyToIdMD5 = aReplyToIdMD5;
00358 mDirty = TRUE;
00359 }
00360
00361
00362
00363 void KMMsgInfo::setReplyToAuxIdMD5( const QString& aReplyToAuxIdMD5 )
00364 {
00365 if( aReplyToAuxIdMD5 == replyToAuxIdMD5() )
00366 return;
00367
00368 if( !kd )
00369 kd = new KMMsgInfoPrivate;
00370 kd->modifiers |= KMMsgInfoPrivate::REPLYTOAUX_SET;
00371 kd->replyToAuxIdMD5 = aReplyToAuxIdMD5;
00372 mDirty = TRUE;
00373 }
00374
00375
00376
00377 void KMMsgInfo::initStrippedSubjectMD5()
00378 {
00379 if( kd && kd->modifiers & KMMsgInfoPrivate::STRIPPEDSUBJECT_SET )
00380 return;
00381 QString rawSubject = KMMessage::stripOffPrefixes( subject() );
00382 QString subjectMD5 = base64EncodedMD5( rawSubject, true );
00383 if( !kd )
00384 kd = new KMMsgInfoPrivate;
00385 kd->modifiers |= KMMsgInfoPrivate::STRIPPEDSUBJECT_SET;
00386 kd->strippedSubjectMD5 = subjectMD5;
00387 mDirty = TRUE;
00388 }
00389
00390
00391
00392 void KMMsgInfo::setMsgIdMD5(const QString& aMsgIdMD5)
00393 {
00394 if (aMsgIdMD5 == msgIdMD5())
00395 return;
00396
00397 if (!kd)
00398 kd = new KMMsgInfoPrivate;
00399 kd->modifiers |= KMMsgInfoPrivate::MSGID_SET;
00400 kd->msgIdMD5 = aMsgIdMD5;
00401 mDirty = TRUE;
00402 }
00403
00404
00405 void KMMsgInfo::setEncryptionState( const KMMsgEncryptionState s, int idx )
00406 {
00407 if (s == encryptionState())
00408 return;
00409
00410 if (!kd)
00411 kd = new KMMsgInfoPrivate;
00412 kd->modifiers |= KMMsgInfoPrivate::ENCRYPTION_SET;
00413 kd->encryptionState = s;
00414 KMMsgBase::setEncryptionState(s, idx);
00415 mDirty = TRUE;
00416 }
00417
00418
00419 void KMMsgInfo::setSignatureState( const KMMsgSignatureState s, int idx )
00420 {
00421 if (s == signatureState())
00422 return;
00423
00424 if (!kd)
00425 kd = new KMMsgInfoPrivate;
00426 kd->modifiers |= KMMsgInfoPrivate::SIGNATURE_SET;
00427 kd->signatureState = s;
00428 KMMsgBase::setSignatureState(s, idx);
00429 mDirty = TRUE;
00430 }
00431
00432
00433 void KMMsgInfo::setMDNSentState( const KMMsgMDNSentState s, int idx )
00434 {
00435 if (s == mdnSentState())
00436 return;
00437
00438 if (!kd)
00439 kd = new KMMsgInfoPrivate;
00440 kd->modifiers |= KMMsgInfoPrivate::MDN_SET;
00441 kd->mdnSentState = s;
00442 KMMsgBase::setMDNSentState(s, idx);
00443 mDirty = TRUE;
00444 }
00445
00446
00447 KMMsgStatus KMMsgInfo::status(void) const
00448 {
00449 if (mStatus == KMMsgStatusUnknown) {
00450 KMMsgStatus st = (KMMsgStatus)getLongPart(MsgStatusPart);
00451 if (!st) {
00452
00453
00454 mLegacyStatus = (KMLegacyMsgStatus)getLongPart(MsgLegacyStatusPart);
00455 st = KMMsgStatusRead;
00456 switch (mLegacyStatus) {
00457 case KMLegacyMsgStatusUnknown:
00458 st = KMMsgStatusUnknown;
00459 break;
00460 case KMLegacyMsgStatusNew:
00461 st = KMMsgStatusNew;
00462 break;
00463 case KMLegacyMsgStatusUnread:
00464 st = KMMsgStatusUnread;
00465 break;
00466 case KMLegacyMsgStatusRead:
00467 st = KMMsgStatusRead;
00468 break;
00469 case KMLegacyMsgStatusOld:
00470 st = KMMsgStatusOld;
00471 break;
00472 case KMLegacyMsgStatusDeleted:
00473 st |= KMMsgStatusDeleted;
00474 break;
00475 case KMLegacyMsgStatusReplied:
00476 st |= KMMsgStatusReplied;
00477 break;
00478 case KMLegacyMsgStatusForwarded:
00479 st |= KMMsgStatusForwarded;
00480 break;
00481 case KMLegacyMsgStatusQueued:
00482 st |= KMMsgStatusQueued;
00483 break;
00484 case KMLegacyMsgStatusSent:
00485 st |= KMMsgStatusSent;
00486 break;
00487 case KMLegacyMsgStatusFlag:
00488 st |= KMMsgStatusFlag;
00489 break;
00490 default:
00491 break;
00492 }
00493
00494 }
00495 mStatus = st;
00496 }
00497 return mStatus;
00498 }
00499
00500
00501
00502 KMMsgEncryptionState KMMsgInfo::encryptionState() const
00503 {
00504 if (kd && kd->modifiers & KMMsgInfoPrivate::ENCRYPTION_SET)
00505 return kd->encryptionState;
00506 unsigned long encState = getLongPart(MsgCryptoStatePart) & 0x0000FFFF;
00507 return encState ? (KMMsgEncryptionState)encState : KMMsgEncryptionStateUnknown;
00508 }
00509
00510
00511 KMMsgSignatureState KMMsgInfo::signatureState() const
00512 {
00513 if (kd && kd->modifiers & KMMsgInfoPrivate::SIGNATURE_SET)
00514 return kd->signatureState;
00515 unsigned long sigState = getLongPart(MsgCryptoStatePart) >> 16;
00516 return sigState ? (KMMsgSignatureState)sigState : KMMsgSignatureStateUnknown;
00517 }
00518
00519 KMMsgMDNSentState KMMsgInfo::mdnSentState() const {
00520 if (kd && kd->modifiers & KMMsgInfoPrivate::MDN_SET)
00521 return kd->mdnSentState;
00522 unsigned long mdnState = getLongPart(MsgMDNSentPart);
00523 return mdnState ? (KMMsgMDNSentState)mdnState : KMMsgMDNStateUnknown;
00524 }
00525
00526
00527
00528 off_t KMMsgInfo::folderOffset(void) const
00529 {
00530 if (kd && kd->modifiers & KMMsgInfoPrivate::OFFSET_SET)
00531 return kd->folderOffset;
00532 return getLongPart(MsgOffsetPart);
00533 }
00534
00535
00536 size_t KMMsgInfo::msgSize(void) const
00537 {
00538 if (kd && kd->modifiers & KMMsgInfoPrivate::SIZE_SET)
00539 return kd->msgSize;
00540 return getLongPart(MsgSizePart);
00541 }
00542
00543
00544 time_t KMMsgInfo::date(void) const
00545 {
00546 time_t res;
00547 if (kd && kd->modifiers & KMMsgInfoPrivate::DATE_SET)
00548 res = kd->date;
00549 else
00550 res = getLongPart(MsgDatePart);
00551 return res;
00552 }
00553
00554
00555 size_t KMMsgInfo::msgSizeServer(void) const
00556 {
00557 if (kd && kd->modifiers & KMMsgInfoPrivate::SIZESERVER_SET)
00558 return kd->msgSizeServer;
00559 return getLongPart(MsgSizeServerPart);
00560 }
00561
00562
00563 ulong KMMsgInfo::UID(void) const
00564 {
00565 if (kd && kd->modifiers & KMMsgInfoPrivate::UID_SET)
00566 return kd->UID;
00567 return getLongPart(MsgUIDPart);
00568 }
00569
00570
00571 void KMMsgInfo::setMsgSize(size_t sz)
00572 {
00573 if (sz == msgSize())
00574 return;
00575
00576 if(!kd)
00577 kd = new KMMsgInfoPrivate;
00578 kd->modifiers |= KMMsgInfoPrivate::SIZE_SET;
00579 kd->msgSize = sz;
00580 mDirty = TRUE;
00581 }
00582
00583
00584 void KMMsgInfo::setMsgSizeServer(size_t sz)
00585 {
00586 if (sz == msgSizeServer())
00587 return;
00588
00589 if(!kd)
00590 kd = new KMMsgInfoPrivate;
00591 kd->modifiers |= KMMsgInfoPrivate::SIZESERVER_SET;
00592 kd->msgSizeServer = sz;
00593 mDirty = TRUE;
00594 }
00595
00596
00597 void KMMsgInfo::setUID(ulong uid)
00598 {
00599 if (uid == UID())
00600 return;
00601
00602 if(!kd)
00603 kd = new KMMsgInfoPrivate;
00604 kd->modifiers |= KMMsgInfoPrivate::UID_SET;
00605 kd->UID = uid;
00606 mDirty = TRUE;
00607 }
00608
00609
00610 void KMMsgInfo::setFolderOffset(off_t offs)
00611 {
00612 if (folderOffset() == offs)
00613 return;
00614
00615 if (!kd)
00616 kd = new KMMsgInfoPrivate;
00617 kd->modifiers |= KMMsgInfoPrivate::OFFSET_SET;
00618 kd->folderOffset = offs;
00619 mDirty = TRUE;
00620 }
00621
00622
00623 void KMMsgInfo::setFileName(const QString& file)
00624 {
00625 if (fileName() == file)
00626 return;
00627
00628 if (!kd)
00629 kd = new KMMsgInfoPrivate;
00630 kd->modifiers |= KMMsgInfoPrivate::FILE_SET;
00631 kd->file = file;
00632 mDirty = TRUE;
00633 }
00634
00635
00636 void KMMsgInfo::setStatus(const KMMsgStatus aStatus, int idx)
00637 {
00638 if(aStatus == status())
00639 return;
00640 KMMsgBase::setStatus(aStatus, idx);
00641 }
00642
00643
00644 void KMMsgInfo::setDate(time_t aUnixTime)
00645 {
00646 if(aUnixTime == date())
00647 return;
00648
00649 if(!kd)
00650 kd = new KMMsgInfoPrivate;
00651 kd->modifiers |= KMMsgInfoPrivate::DATE_SET;
00652 kd->date = aUnixTime;
00653 mDirty = TRUE;
00654 }
00655
00656
00657 void KMMsgInfo::compat_fromOldIndexString(const QCString& str, bool toUtf8)
00658 {
00659 char *start, *offset;
00660
00661 if(!kd)
00662 kd = new KMMsgInfoPrivate;
00663 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
00664 kd->xmark = str.mid(33, 3).stripWhiteSpace();
00665 kd->folderOffset = str.mid(2,9).toULong();
00666 kd->msgSize = str.mid(12,9).toULong();
00667 kd->date = (time_t)str.mid(22,10).toULong();
00668 mStatus = (KMMsgStatus)str.at(0);
00669 if (toUtf8) {
00670 kd->subject = str.mid(37, 100).stripWhiteSpace();
00671 kd->from = str.mid(138, 50).stripWhiteSpace();
00672 kd->to = str.mid(189, 50).stripWhiteSpace();
00673 } else {
00674 start = offset = str.data() + 37;
00675 while (*start == ' ' && start - offset < 100) start++;
00676 kd->subject = QString::fromUtf8(str.mid(start - str.data(),
00677 100 - (start - offset)), 100 - (start - offset));
00678 start = offset = str.data() + 138;
00679 while (*start == ' ' && start - offset < 50) start++;
00680 kd->from = QString::fromUtf8(str.mid(start - str.data(),
00681 50 - (start - offset)), 50 - (start - offset));
00682 start = offset = str.data() + 189;
00683 while (*start == ' ' && start - offset < 50) start++;
00684 kd->to = QString::fromUtf8(str.mid(start - str.data(),
00685 50 - (start - offset)), 50 - (start - offset));
00686 }
00687 kd->replyToIdMD5 = str.mid(240, 22).stripWhiteSpace();
00688 kd->msgIdMD5 = str.mid(263, 22).stripWhiteSpace();
00689 mDirty = FALSE;
00690 }
00691
00692 bool KMMsgInfo::dirty(void) const
00693 {
00694 if(KMMsgBase::dirty())
00695 return TRUE;
00696 return kd && kd->modifiers != KMMsgInfoPrivate::NONE_SET;
00697 }