kmail

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