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 }