kmail

kmmsginfo.cpp
1// kmmsginfo.cpp
2
3#ifdef HAVE_CONFIG_H
4#include <config.h>
5#endif
6
7#include "kmmsginfo.h"
8#include "kmmessage.h"
9//#include "kmmsgpart.h" // for encode
10
11#include <stdlib.h>
12#include <string.h>
13#include <stdio.h>
14#include <assert.h>
15#include <mimelib/datetime.h>
16
17class KMMsgInfo::KMMsgInfoPrivate
18{
19public:
20 enum {
21 SUBJECT_SET = 0x01, TOSTRIP_SET = 0x02, REPLYTO_SET = 0x04, MSGID_SET=0x08,
22 DATE_SET = 0x10, OFFSET_SET = 0x20, SIZE_SET = 0x40, SIZESERVER_SET = 0x80,
23 XMARK_SET=0x100, FROMSTRIP_SET=0x200, FILE_SET=0x400, ENCRYPTION_SET=0x800,
24 SIGNATURE_SET=0x1000, MDN_SET=0x2000, REPLYTOAUX_SET = 0x4000,
25 STRIPPEDSUBJECT_SET = 0x8000, UID_SET = 0x10000,
26 TO_SET = 0x20000, FROM_SET = 0x40000,
27
28 ALL_SET = 0xFFFFFF, NONE_SET = 0x000000
29 };
30 uint modifiers;
31 TQString subject, fromStrip, toStrip, replyToIdMD5, replyToAuxIdMD5,
32 strippedSubjectMD5, msgIdMD5, xmark, file;
33 off_t folderOffset;
34 size_t msgSize, msgSizeServer;
35 time_t date;
36 KMMsgEncryptionState encryptionState;
37 KMMsgSignatureState signatureState;
38 KMMsgMDNSentState mdnSentState;
39 ulong UID;
40 TQString to, from;
41
42 KMMsgInfoPrivate() : modifiers(NONE_SET) { }
43 KMMsgInfoPrivate& operator=(const KMMsgInfoPrivate& other) {
44 modifiers = NONE_SET;
45 if (other.modifiers & SUBJECT_SET) {
46 modifiers |= SUBJECT_SET;
47 subject = other.subject;
48 }
49 if (other.modifiers & STRIPPEDSUBJECT_SET) {
50 modifiers |= STRIPPEDSUBJECT_SET;
51 strippedSubjectMD5 = other.strippedSubjectMD5;
52 }
53 if (other.modifiers & FROMSTRIP_SET) {
54 modifiers |= FROMSTRIP_SET;
55 fromStrip = other.fromStrip;
56 }
57 if (other.modifiers & FILE_SET) {
58 modifiers |= FILE_SET;
59 file = other.file;
60 }
61 if (other.modifiers & TOSTRIP_SET) {
62 modifiers |= TOSTRIP_SET;
63 toStrip = other.toStrip;
64 }
65 if (other.modifiers & REPLYTO_SET) {
66 modifiers |= REPLYTO_SET;
67 replyToIdMD5 = other.replyToIdMD5;
68 }
69 if (other.modifiers & REPLYTOAUX_SET) {
70 modifiers |= REPLYTOAUX_SET;
71 replyToAuxIdMD5 = other.replyToAuxIdMD5;
72 }
73
74 if(other.modifiers & MSGID_SET) {
75 modifiers |= MSGID_SET;
76 msgIdMD5 = other.msgIdMD5;
77 }
78 if(other.modifiers & XMARK_SET) {
79 modifiers |= XMARK_SET;
80 xmark = other.xmark;
81 }
82 if(other.modifiers & OFFSET_SET) {
83 modifiers |= OFFSET_SET;
84 folderOffset = other.folderOffset;
85 }
86 if(other.modifiers & SIZE_SET) {
87 modifiers |= SIZE_SET;
88 msgSize = other.msgSize;
89 }
90 if(other.modifiers & DATE_SET) {
91 modifiers |= DATE_SET;
92 date = other.date;
93 }
94 if(other.modifiers & ENCRYPTION_SET) {
95 modifiers |= ENCRYPTION_SET;
96 encryptionState = other.encryptionState;
97 }
98 if(other.modifiers & SIGNATURE_SET) {
99 modifiers |= SIGNATURE_SET;
100 signatureState = other.signatureState;
101 }
102 if(other.modifiers & MDN_SET) {
103 modifiers |= MDN_SET;
104 mdnSentState = other.mdnSentState;
105 }
106 if(other.modifiers & SIZESERVER_SET) {
107 modifiers |= SIZESERVER_SET;
108 msgSizeServer = other.msgSizeServer;
109 }
110 if(other.modifiers & UID_SET) {
111 modifiers |= UID_SET;
112 UID = other.UID;
113 }
114 if (other.modifiers & TO_SET) {
115 modifiers |= TO_SET;
116 to = other.to;
117 }
118 if (other.modifiers & FROM_SET) {
119 modifiers |= FROM_SET;
120 from = other.from;
121 }
122 return *this;
123 }
124};
125
126//-----------------------------------------------------------------------------
127KMMsgInfo::KMMsgInfo(KMFolder* p, off_t off, short len) :
128 KMMsgBase(p),
129 kd(0)
130{
131 setIndexOffset(off);
132 setIndexLength(len);
133 setEnableUndo(true);
134}
135
136
137//-----------------------------------------------------------------------------
138KMMsgInfo::~KMMsgInfo()
139{
140 delete kd;
141}
142
143
144#if 0 // currently unused
145//-----------------------------------------------------------------------------
146KMMsgInfo& KMMsgInfo::operator=(const KMMsgInfo& other)
147{
148 KMMsgBase::assign(&other);
149 if(other.kd) {
150 if(!kd)
151 kd = new KMMsgInfoPrivate;
152 *kd = *other.kd;
153 } else {
154 delete kd;
155 kd = 0;
156 }
157 mStatus = other.status();
158 return *this;
159}
160#endif
161
162//-----------------------------------------------------------------------------
163KMMsgInfo& KMMsgInfo::operator=(const KMMessage& msg)
164{
165 KMMsgBase::assign(&msg.toMsgBase());
166 if(!kd)
167 kd = new KMMsgInfoPrivate;
168 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
169 kd->subject = msg.subject();
170 kd->fromStrip = msg.fromStrip();
171 kd->toStrip = msg.toStrip();
172 kd->replyToIdMD5 = msg.replyToIdMD5();
173 kd->replyToAuxIdMD5 = msg.replyToAuxIdMD5();
174 kd->strippedSubjectMD5 = msg.strippedSubjectMD5();
175 kd->msgIdMD5 = msg.msgIdMD5();
176 kd->xmark = msg.xmark();
177 mStatus = msg.status();
178 kd->folderOffset = msg.folderOffset();
179 kd->msgSize = msg.msgSize();
180 kd->date = msg.date();
181 kd->file = msg.fileName();
182 kd->encryptionState = msg.encryptionState();
183 kd->signatureState = msg.signatureState();
184 kd->mdnSentState = msg.mdnSentState();
185 kd->msgSizeServer = msg.msgSizeServer();
186 kd->UID = msg.UID();
187 kd->to = msg.to();
188 kd->from = msg.from();
189 return *this;
190}
191
192//-----------------------------------------------------------------------------
193void KMMsgInfo::init(const TQCString& aSubject, const TQCString& aFrom,
194 const TQCString& aTo, time_t aDate,
195 KMMsgStatus aStatus, const TQCString& aXMark,
196 const TQCString& replyToId, const TQCString& replyToAuxId,
197 const TQCString& msgId,
198 KMMsgEncryptionState encryptionState,
199 KMMsgSignatureState signatureState,
200 KMMsgMDNSentState mdnSentState,
201 const TQCString& prefCharset,
202 off_t aFolderOffset, size_t aMsgSize,
203 size_t aMsgSizeServer, ulong aUID)
204{
205 mIndexOffset = 0;
206 mIndexLength = 0;
207 if(!kd)
208 kd = new KMMsgInfoPrivate;
209 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
210 kd->subject = decodeRFC2047String(aSubject, prefCharset);
211 kd->fromStrip = decodeRFC2047String( KMMessage::stripEmailAddr( aFrom ), prefCharset );
212 kd->toStrip = decodeRFC2047String( KMMessage::stripEmailAddr( aTo ), prefCharset );
213 kd->replyToIdMD5 = base64EncodedMD5( replyToId );
214 kd->replyToAuxIdMD5 = base64EncodedMD5( replyToAuxId );
215 kd->strippedSubjectMD5 = base64EncodedMD5( KMMessage::stripOffPrefixes( kd->subject ), true /*utf8*/ );
216 kd->msgIdMD5 = base64EncodedMD5( msgId );
217 kd->xmark = aXMark;
218 kd->folderOffset = aFolderOffset;
219 mStatus = aStatus;
220 kd->msgSize = aMsgSize;
221 kd->date = aDate;
222 kd->file = "";
223 kd->encryptionState = encryptionState;
224 kd->signatureState = signatureState;
225 kd->mdnSentState = mdnSentState;
226 kd->msgSizeServer = aMsgSizeServer;
227 kd->UID = aUID;
228 kd->to = aTo;
229 kd->from = aFrom;
230 mDirty = false;
231}
232
233void KMMsgInfo::init(const TQCString& aSubject, const TQCString& aFrom,
234 const TQCString& aTo, time_t aDate,
235 KMMsgStatus aStatus, const TQCString& aXMark,
236 const TQCString& replyToId, const TQCString& replyToAuxId,
237 const TQCString& msgId,
238 const TQCString& aFileName,
239 KMMsgEncryptionState encryptionState,
240 KMMsgSignatureState signatureState,
241 KMMsgMDNSentState mdnSentState,
242 const TQCString& prefCharset,
243 size_t aMsgSize,
244 size_t aMsgSizeServer, ulong aUID)
245{
246 // use the "normal" init for most stuff
247 init( aSubject, aFrom, aTo, aDate, aStatus, aXMark, replyToId, replyToAuxId,
248 msgId, encryptionState, signatureState, mdnSentState, prefCharset,
249 (unsigned long)0, aMsgSize, aMsgSizeServer, aUID );
250 kd->file = aFileName;
251}
252
253
254//-----------------------------------------------------------------------------
255TQString KMMsgInfo::subject(void) const
256{
257 if (kd && kd->modifiers & KMMsgInfoPrivate::SUBJECT_SET)
258 return kd->subject;
259 return getStringPart(MsgSubjectPart);
260}
261
262//-----------------------------------------------------------------------------
263TQString KMMsgInfo::fromStrip(void) const
264{
265 if (kd && kd->modifiers & KMMsgInfoPrivate::FROMSTRIP_SET)
266 return kd->fromStrip;
267 return getStringPart(MsgFromStripPart);
268}
269
270//-----------------------------------------------------------------------------
271TQString KMMsgInfo::from() const
272{
273 if (kd && kd->modifiers & KMMsgInfoPrivate::FROM_SET)
274 return kd->from;
275 return getStringPart( MsgFromPart );
276}
277
278
279//-----------------------------------------------------------------------------
280TQString KMMsgInfo::fileName(void) const
281{
282 if (kd && kd->modifiers & KMMsgInfoPrivate::FILE_SET)
283 return kd->file;
284 return getStringPart(MsgFilePart);
285}
286
287
288//-----------------------------------------------------------------------------
289TQString KMMsgInfo::toStrip(void) const
290{
291 if (kd && kd->modifiers & KMMsgInfoPrivate::TOSTRIP_SET)
292 return kd->toStrip;
293 return getStringPart(MsgToStripPart);
294}
295
296//-----------------------------------------------------------------------------
297TQString KMMsgInfo::to() const
298{
299 if (kd && kd->modifiers & KMMsgInfoPrivate::TO_SET)
300 return kd->to;
301 return getStringPart( MsgToPart );
302}
303
304//-----------------------------------------------------------------------------
305TQString KMMsgInfo::xmark(void) const
306{
307 if (kd && kd->modifiers & KMMsgInfoPrivate::XMARK_SET)
308 return kd->xmark;
309 return getStringPart(MsgXMarkPart);
310}
311
312
313//-----------------------------------------------------------------------------
314TQString KMMsgInfo::replyToIdMD5(void) const
315{
316 if (kd && kd->modifiers & KMMsgInfoPrivate::REPLYTO_SET)
317 return kd->replyToIdMD5;
318 return getStringPart(MsgReplyToIdMD5Part);
319}
320
321//-----------------------------------------------------------------------------
322TQString KMMsgInfo::replyToAuxIdMD5() const
323{
324 if( kd && kd->modifiers & KMMsgInfoPrivate::REPLYTOAUX_SET )
325 return kd->replyToAuxIdMD5;
326 return getStringPart( MsgReplyToAuxIdMD5Part );
327}
328
329//-----------------------------------------------------------------------------
330TQString KMMsgInfo::strippedSubjectMD5() const
331{
332 if( kd && kd->modifiers & KMMsgInfoPrivate::STRIPPEDSUBJECT_SET )
333 return kd->strippedSubjectMD5;
334 return getStringPart( MsgStrippedSubjectMD5Part );
335}
336
337
338//-----------------------------------------------------------------------------
339bool KMMsgInfo::subjectIsPrefixed() const
340{
341 return strippedSubjectMD5() != base64EncodedMD5( subject().stripWhiteSpace(), true /*utf8*/ );
342}
343
344//-----------------------------------------------------------------------------
345TQString KMMsgInfo::msgIdMD5(void) const
346{
347 if (kd && kd->modifiers & KMMsgInfoPrivate::MSGID_SET)
348 return kd->msgIdMD5;
349 return getStringPart(MsgIdMD5Part);
350}
351
352
353//-----------------------------------------------------------------------------
354void KMMsgInfo::setSubject(const TQString& aSubject)
355{
356 if(aSubject == subject())
357 return;
358
359 if (!kd)
360 kd = new KMMsgInfoPrivate;
361 kd->modifiers |= KMMsgInfoPrivate::SUBJECT_SET;
362 kd->subject = aSubject;
363 mDirty = true;
364}
365
366
367//-----------------------------------------------------------------------------
368void KMMsgInfo::setXMark(const TQString& aXMark)
369{
370 if (aXMark == xmark())
371 return;
372
373 if (!kd)
374 kd = new KMMsgInfoPrivate;
375 kd->modifiers |= KMMsgInfoPrivate::XMARK_SET;
376 kd->xmark = aXMark;
377 mDirty = true;
378}
379
380
381//-----------------------------------------------------------------------------
382void KMMsgInfo::setReplyToIdMD5(const TQString& aReplyToIdMD5)
383{
384 if (aReplyToIdMD5 == replyToIdMD5())
385 return;
386
387 if (!kd)
388 kd = new KMMsgInfoPrivate;
389 kd->modifiers |= KMMsgInfoPrivate::REPLYTO_SET;
390 kd->replyToIdMD5 = aReplyToIdMD5;
391 mDirty = true;
392}
393
394
395//-----------------------------------------------------------------------------
396void KMMsgInfo::setReplyToAuxIdMD5( const TQString& aReplyToAuxIdMD5 )
397{
398 if( aReplyToAuxIdMD5 == replyToAuxIdMD5() )
399 return;
400
401 if( !kd )
402 kd = new KMMsgInfoPrivate;
403 kd->modifiers |= KMMsgInfoPrivate::REPLYTOAUX_SET;
404 kd->replyToAuxIdMD5 = aReplyToAuxIdMD5;
405 mDirty = true;
406}
407
408
409//-----------------------------------------------------------------------------
410void KMMsgInfo::initStrippedSubjectMD5()
411{
412 if( kd && kd->modifiers & KMMsgInfoPrivate::STRIPPEDSUBJECT_SET )
413 return;
414 TQString rawSubject = KMMessage::stripOffPrefixes( subject() );
415 TQString subjectMD5 = base64EncodedMD5( rawSubject, true /*utf8*/ );
416 if( !kd )
417 kd = new KMMsgInfoPrivate;
418 kd->modifiers |= KMMsgInfoPrivate::STRIPPEDSUBJECT_SET;
419 kd->strippedSubjectMD5 = subjectMD5;
420 mDirty = true;
421}
422
423
424//-----------------------------------------------------------------------------
425void KMMsgInfo::setMsgIdMD5(const TQString& aMsgIdMD5)
426{
427 if (aMsgIdMD5 == msgIdMD5())
428 return;
429
430 if (!kd)
431 kd = new KMMsgInfoPrivate;
432 kd->modifiers |= KMMsgInfoPrivate::MSGID_SET;
433 kd->msgIdMD5 = aMsgIdMD5;
434 mDirty = true;
435}
436
437//-----------------------------------------------------------------------------
438void KMMsgInfo::setEncryptionState( const KMMsgEncryptionState s, int idx )
439{
440 if (s == encryptionState())
441 return;
442
443 if (!kd)
444 kd = new KMMsgInfoPrivate;
445 kd->modifiers |= KMMsgInfoPrivate::ENCRYPTION_SET;
446 kd->encryptionState = s;
447 KMMsgBase::setEncryptionState(s, idx); //base does more "stuff"
448 mDirty = true;
449}
450
451//-----------------------------------------------------------------------------
452void KMMsgInfo::setSignatureState( const KMMsgSignatureState s, int idx )
453{
454 if (s == signatureState())
455 return;
456
457 if (!kd)
458 kd = new KMMsgInfoPrivate;
459 kd->modifiers |= KMMsgInfoPrivate::SIGNATURE_SET;
460 kd->signatureState = s;
461 KMMsgBase::setSignatureState(s, idx); //base does more "stuff"
462 mDirty = true;
463}
464
465//-----------------------------------------------------------------------------
466void KMMsgInfo::setMDNSentState( const KMMsgMDNSentState s, int idx )
467{
468 if (s == mdnSentState())
469 return;
470
471 if (!kd)
472 kd = new KMMsgInfoPrivate;
473 kd->modifiers |= KMMsgInfoPrivate::MDN_SET;
474 kd->mdnSentState = s;
475 KMMsgBase::setMDNSentState(s, idx); //base does more "stuff"
476 mDirty = true;
477}
478
479//-----------------------------------------------------------------------------
480KMMsgStatus KMMsgInfo::status(void) const
481{
482 if (mStatus == KMMsgStatusUnknown) {
483 KMMsgStatus st = (KMMsgStatus)getLongPart(MsgStatusPart);
484 if (!st) {
485 // We are opening an old index for the first time, get the legacy
486 // status and merge it in.
487 mLegacyStatus = (KMLegacyMsgStatus)getLongPart(MsgLegacyStatusPart);
488 st = KMMsgStatusRead;
489 switch (mLegacyStatus) {
490 case KMLegacyMsgStatusUnknown:
491 st = KMMsgStatusUnknown;
492 break;
493 case KMLegacyMsgStatusNew:
494 st = KMMsgStatusNew;
495 break;
496 case KMLegacyMsgStatusUnread:
497 st = KMMsgStatusUnread;
498 break;
499 case KMLegacyMsgStatusRead:
500 st = KMMsgStatusRead;
501 break;
502 case KMLegacyMsgStatusOld:
503 st = KMMsgStatusOld;
504 break;
505 case KMLegacyMsgStatusDeleted:
506 st |= KMMsgStatusDeleted;
507 break;
508 case KMLegacyMsgStatusReplied:
509 st |= KMMsgStatusReplied;
510 break;
511 case KMLegacyMsgStatusForwarded:
512 st |= KMMsgStatusForwarded;
513 break;
514 case KMLegacyMsgStatusQueued:
515 st |= KMMsgStatusQueued;
516 break;
517 case KMLegacyMsgStatusSent:
518 st |= KMMsgStatusSent;
519 break;
520 case KMLegacyMsgStatusFlag:
521 st |= KMMsgStatusFlag;
522 break;
523 default:
524 break;
525 }
526
527 }
528 mStatus = st;
529 }
530 return mStatus;
531}
532
533
534//-----------------------------------------------------------------------------
535KMMsgEncryptionState KMMsgInfo::encryptionState() const
536{
537 if (kd && kd->modifiers & KMMsgInfoPrivate::ENCRYPTION_SET)
538 return kd->encryptionState;
539 unsigned long encState = getLongPart(MsgCryptoStatePart) & 0x0000FFFF;
540 return encState ? (KMMsgEncryptionState)encState : KMMsgEncryptionStateUnknown;
541}
542
543
544KMMsgSignatureState KMMsgInfo::signatureState() const
545{
546 if (kd && kd->modifiers & KMMsgInfoPrivate::SIGNATURE_SET)
547 return kd->signatureState;
548 unsigned long sigState = getLongPart(MsgCryptoStatePart) >> 16;
549 return sigState ? (KMMsgSignatureState)sigState : KMMsgSignatureStateUnknown;
550}
551
552KMMsgMDNSentState KMMsgInfo::mdnSentState() const {
553 if (kd && kd->modifiers & KMMsgInfoPrivate::MDN_SET)
554 return kd->mdnSentState;
555 unsigned long mdnState = getLongPart(MsgMDNSentPart);
556 return mdnState ? (KMMsgMDNSentState)mdnState : KMMsgMDNStateUnknown;
557}
558
559
560//-----------------------------------------------------------------------------
561off_t KMMsgInfo::folderOffset(void) const
562{
563 if (kd && kd->modifiers & KMMsgInfoPrivate::OFFSET_SET)
564 return kd->folderOffset;
565 return getLongPart(MsgOffsetPart);
566}
567
568//-----------------------------------------------------------------------------
569size_t KMMsgInfo::msgSize(void) const
570{
571 if (kd && kd->modifiers & KMMsgInfoPrivate::SIZE_SET)
572 return kd->msgSize;
573 return getLongPart(MsgSizePart);
574}
575
576//-----------------------------------------------------------------------------
577time_t KMMsgInfo::date(void) const
578{
579 time_t res;
580 if (kd && kd->modifiers & KMMsgInfoPrivate::DATE_SET)
581 res = kd->date;
582 else
583 res = getLongPart(MsgDatePart);
584 return res;
585}
586
587//-----------------------------------------------------------------------------
588size_t KMMsgInfo::msgSizeServer(void) const
589{
590 if (kd && kd->modifiers & KMMsgInfoPrivate::SIZESERVER_SET)
591 return kd->msgSizeServer;
592 return getLongPart(MsgSizeServerPart);
593}
594
595//-----------------------------------------------------------------------------
596ulong KMMsgInfo::UID(void) const
597{
598 if (kd && kd->modifiers & KMMsgInfoPrivate::UID_SET)
599 return kd->UID;
600 return getLongPart(MsgUIDPart);
601}
602
603//-----------------------------------------------------------------------------
604void KMMsgInfo::setMsgSize(size_t sz)
605{
606 if (sz == msgSize())
607 return;
608
609 if(!kd)
610 kd = new KMMsgInfoPrivate;
611 kd->modifiers |= KMMsgInfoPrivate::SIZE_SET;
612 kd->msgSize = sz;
613 mDirty = true;
614}
615
616//-----------------------------------------------------------------------------
617void KMMsgInfo::setMsgSizeServer(size_t sz)
618{
619 if (sz == msgSizeServer())
620 return;
621
622 if(!kd)
623 kd = new KMMsgInfoPrivate;
624 kd->modifiers |= KMMsgInfoPrivate::SIZESERVER_SET;
625 kd->msgSizeServer = sz;
626 mDirty = true;
627}
628
629//-----------------------------------------------------------------------------
630void KMMsgInfo::setUID(ulong uid)
631{
632 if (uid == UID())
633 return;
634
635 if(!kd)
636 kd = new KMMsgInfoPrivate;
637 kd->modifiers |= KMMsgInfoPrivate::UID_SET;
638 kd->UID = uid;
639 mDirty = true;
640}
641
642//-----------------------------------------------------------------------------
643void KMMsgInfo::setFolderOffset(off_t offs)
644{
645 if (folderOffset() == offs)
646 return;
647
648 if (!kd)
649 kd = new KMMsgInfoPrivate;
650 kd->modifiers |= KMMsgInfoPrivate::OFFSET_SET;
651 kd->folderOffset = offs;
652 mDirty = true;
653}
654
655//-----------------------------------------------------------------------------
656void KMMsgInfo::setFileName(const TQString& file)
657{
658 if (fileName() == file)
659 return;
660
661 if (!kd)
662 kd = new KMMsgInfoPrivate;
663 kd->modifiers |= KMMsgInfoPrivate::FILE_SET;
664 kd->file = file;
665 mDirty = true;
666}
667
668//-----------------------------------------------------------------------------
669void KMMsgInfo::setStatus(const KMMsgStatus aStatus, int idx)
670{
671 if(aStatus == status())
672 return;
673 KMMsgBase::setStatus(aStatus, idx); //base does more "stuff"
674}
675
676//-----------------------------------------------------------------------------
677void KMMsgInfo::setDate(time_t aUnixTime)
678{
679 if(aUnixTime == date())
680 return;
681
682 if(!kd)
683 kd = new KMMsgInfoPrivate;
684 kd->modifiers |= KMMsgInfoPrivate::DATE_SET;
685 kd->date = aUnixTime;
686 mDirty = true;
687}
688
689void KMMsgInfo::setFrom( const TQString &from )
690{
691 if ( !kd )
692 kd = new KMMsgInfoPrivate;
693 kd->modifiers |= KMMsgInfoPrivate::FROM_SET;
694 kd->from = from;
695 mDirty = true;
696}
697
698void KMMsgInfo::setTo( const TQString &to )
699{
700 if ( !kd )
701 kd = new KMMsgInfoPrivate;
702 kd->modifiers |= KMMsgInfoPrivate::TO_SET;
703 kd->to = to;
704 mDirty = true;
705}
706
707//--- For compatability with old index files
708void KMMsgInfo::compat_fromOldIndexString(const TQCString& str, bool toUtf8)
709{
710 const char *start, *offset;
711
712 if(!kd)
713 kd = new KMMsgInfoPrivate;
714 kd->modifiers = KMMsgInfoPrivate::ALL_SET;
715 kd->xmark = str.mid(33, 3).stripWhiteSpace();
716 kd->folderOffset = str.mid(2,9).toULong();
717 kd->msgSize = str.mid(12,9).toULong();
718 kd->date = (time_t)str.mid(22,10).toULong();
719 mStatus = (KMMsgStatus)str.at(0);
720 if (toUtf8) {
721 kd->subject = str.mid(37, 100).stripWhiteSpace();
722 kd->fromStrip = str.mid(138, 50).stripWhiteSpace();
723 kd->toStrip = str.mid(189, 50).stripWhiteSpace();
724 } else {
725 start = offset = str.data() + 37;
726 while (*start == ' ' && start - offset < 100) start++;
727 kd->subject = TQString::fromUtf8(str.mid(start - str.data(),
728 100 - (start - offset)), 100 - (start - offset));
729 start = offset = str.data() + 138;
730 while (*start == ' ' && start - offset < 50) start++;
731 kd->fromStrip = TQString::fromUtf8(str.mid(start - str.data(),
732 50 - (start - offset)), 50 - (start - offset));
733 start = offset = str.data() + 189;
734 while (*start == ' ' && start - offset < 50) start++;
735 kd->toStrip = TQString::fromUtf8(str.mid(start - str.data(),
736 50 - (start - offset)), 50 - (start - offset));
737 }
738 kd->replyToIdMD5 = str.mid(240, 22).stripWhiteSpace();
739 kd->msgIdMD5 = str.mid(263, 22).stripWhiteSpace();
740 mDirty = false;
741}
742
743bool KMMsgInfo::dirty(void) const
744{
745 if( KMMsgBase::dirty() )
746 return true;
747 return kd && kd->modifiers != KMMsgInfoPrivate::NONE_SET;
748}
Mail folder.
Definition kmfolder.h:69
This is a Mime Message.
Definition kmmessage.h:68
size_t msgSizeServer() const
Get/set size on server.
TQString from() const
Get or set the 'From' header field.
TQString xmark() const
Get or set the 'X-Mark' header field.
TQString replyToAuxIdMD5() const
Get the second to last id from the References header field.
TQString to() const
Get or set the 'To' header field.
TQString subject() const
Get or set the 'Subject' header field.
KMMsgEncryptionState encryptionState() const
Encryption status of the message.
Definition kmmessage.h:844
static TQCString stripEmailAddr(const TQCString &emailAddr)
This function generates a displayable string from a list of email addresses.
KMMsgBase & toMsgBase()
Get KMMsgBase for this object.
Definition kmmessage.h:114
KMMsgStatus status() const
Status of the message.
Definition kmmessage.h:830
TQString fileName() const
Get/set filename in mail folder.
Definition kmmessage.h:802
TQString strippedSubjectMD5() const
Get a hash of the subject with all prefixes such as Re: removed.
off_t folderOffset() const
Get/set offset in mail folder.
Definition kmmessage.h:798
size_t msgSize() const
Get/set size of message in the folder including the whole header in bytes.
Definition kmmessage.h:812
ulong UID() const
Get/set UID.
KMMsgSignatureState signatureState() const
Signature status of the message.
Definition kmmessage.h:847