00001
00002
00003
00004
00005 #ifndef kmmessage_h
00006 #define kmmessage_h
00007
00008
00009 #include <config.h>
00010 #include <sys/types.h>
00011
00012 #include <mimelib/string.h>
00013 #include "kmmsgbase.h"
00014 #include "isubject.h"
00015
00016 #include <kmime_mdn.h>
00017
00018 template <typename T>
00019 class QValueList;
00020
00021 class QStringList;
00022 class QString;
00023 class QTextCodec;
00024 class QStrList;
00025
00026 class KMFolder;
00027 class KMFolderIndex;
00028 class DwMessage;
00029 class KMMessagePart;
00030 class KMMsgInfo;
00031 class KMHeaders;
00032
00033 namespace KMime {
00034 class CharFreq;
00035 namespace Types {
00036 class AddrSpec;
00037 class Address;
00038 typedef QValueList<Address> AddressList;
00039 typedef QValueList<AddrSpec> AddrSpecList;
00040 }
00041 }
00042
00043 namespace KMail {
00044 class HeaderStrategy;
00045 }
00046
00047 class DwBodyPart;
00048 class DwMediaType;
00049 class DwHeaders;
00050
00051 namespace KMail {
00052 enum ReplyStrategy { ReplySmart = 0,
00053 ReplyAuthor,
00054 ReplyList,
00055 ReplyAll,
00056 ReplyNone };
00057 }
00058
00059 class KMMessage: public KMMsgBase, public KMail::ISubject
00060 {
00061 friend class KMForwardCommand;
00062
00063 public:
00064
00065 using KMMsgBase::parent;
00066 using KMMsgBase::setParent;
00067 using KMMsgBase::enableUndo;
00068 using KMMsgBase::setEnableUndo;
00069 using KMMsgBase::isRead;
00070 using KMMsgBase::isUnread;
00071 using KMMsgBase::isNew;
00072 using KMMsgBase::isOld;
00073 using KMMsgBase::isWatched;
00074 using KMMsgBase::isIgnored;
00075 using KMMsgBase::setEncryptionStateChar;
00076 using KMMsgBase::setSignatureStateChar;
00077
00079 KMMessage(KMFolderIndex* parent=0);
00080
00082 KMMessage(DwMessage*);
00083
00085 KMMessage(KMMsgInfo& msgInfo);
00086
00088 KMMessage( const KMMessage& other );
00089
00090
00091
00092
00093
00094
00095
00096
00098 const KMMessage& operator=( const KMMessage& other ) {
00099
00100
00101
00102
00103
00104
00105
00106 if( &other == this )
00107 return *this;
00108 assign( other ); return *this;
00109 }
00110
00112 virtual ~KMMessage();
00113
00115 KMMsgBase & toMsgBase() { return *this; }
00116 const KMMsgBase & toMsgBase() const { return *this; }
00117
00119 bool isMessage() const;
00120
00124 bool isUrgent() const;
00125
00132 void setUnencryptedMsg( KMMessage* unencrypted );
00133
00135 bool hasUnencryptedMsg() const { return 0 != mUnencryptedMsg; }
00136
00138 KMMessage* unencryptedMsg() const { return mUnencryptedMsg; }
00139
00145 KMMessage* takeUnencryptedMsg()
00146 {
00147 KMMessage* ret = mUnencryptedMsg;
00148 mUnencryptedMsg = 0;
00149 return ret;
00150 }
00151
00153 void del() { setStatus(KMMsgStatusDeleted); }
00154
00156 void undel() { setStatus(KMMsgStatusOld); }
00157
00159 void touch() { setStatus(KMMsgStatusOld); }
00160
00164 KMMessage* createReply( KMail::ReplyStrategy replyStrategy = KMail::ReplySmart,
00165 QString selection=QString::null, bool noQuote=FALSE,
00166 bool allowDecryption=TRUE, bool selectionIsBody=FALSE);
00167
00175 KMMessage* createRedirect();
00176
00181 KMMessage* createBounce( bool withUI );
00182
00184 QCString createForwardBody();
00185
00189 KMMessage* createForward();
00190
00194 KMMessage* createDeliveryReceipt() const;
00195
00209 KMMessage* createMDN( KMime::MDN::ActionMode a,
00210 KMime::MDN::DispositionType d,
00211 bool allowGUI=false,
00212 QValueList<KMime::MDN::DispositionModifier> m=QValueList<KMime::MDN::DispositionModifier>() );
00213
00215 void fromDwString(const DwString& str, bool setStatus=FALSE);
00216 void fromString(const QCString& str, bool setStatus=FALSE);
00217 void fromByteArray( const QByteArray & ba, bool setStatus=false );
00218
00223 const DwString& asDwString() const;
00224 const DwMessage *asDwMessage();
00225
00235 QCString asString() const;
00236
00241 QCString asSendableString() const;
00242
00247 QCString headerAsSendableString() const;
00248
00252 void removePrivateHeaderFields();
00253
00255 DwMediaType& dwContentType();
00256
00258 QString headerAsString() const;
00259
00264 void parseTextStringFromDwPart( DwBodyPart * mainBody,
00265 DwBodyPart * firstBodyPart,
00266 QCString& parsedString,
00267 const QTextCodec*& codec,
00268 bool& isHTML ) const;
00269
00273 void initHeader(uint identity=0);
00274
00277 void initFromMessage(const KMMessage *msg, bool idHeaders = TRUE);
00278
00284 uint identityUoid() const;
00285
00288 void cleanupHeader();
00289
00295 void setAutomaticFields(bool isMultipart=FALSE);
00296
00298 QString dateStr() const;
00299 QCString dateShortStr() const;
00300 QString dateIsoStr() const;
00301 time_t date() const;
00302 void setDate(const QCString& str);
00303 void setDate(time_t aUnixTime);
00304
00306 void setDateToday();
00307
00309 QString to() const;
00310 void setTo(const QString& aStr);
00311 QString toStrip() const;
00312
00314 QString replyTo() const;
00315 void setReplyTo(const QString& aStr);
00316 void setReplyTo(KMMessage*);
00317
00319 QString cc() const;
00320 void setCc(const QString& aStr);
00321 QString ccStrip() const;
00322
00324 QString bcc() const;
00325 void setBcc(const QString& aStr);
00326
00328 QString fcc() const;
00329 void setFcc(const QString& aStr);
00330
00332 QString drafts() const { return mDrafts; }
00333 void setDrafts(const QString& aStr);
00334
00336 QString from() const;
00337 void setFrom(const QString& aStr);
00338 QString fromStrip() const;
00339 QCString fromEmail() const;
00340
00343 QString sender() const;
00344
00348 QString who() const;
00349
00351 QString subject() const;
00352 void setSubject(const QString& aStr);
00353
00355 void initStrippedSubjectMD5() {};
00356
00363 static QString replacePrefixes( const QString& str,
00364 const QStringList& prefixRegExps,
00365 bool replace,
00366 const QString& newPrefix );
00367
00370 static QString stripOffPrefixes( const QString& str );
00371
00378 QString cleanSubject(const QStringList& prefixRegExps, bool replace,
00379 const QString& newPrefix) const;
00380
00383 QString cleanSubject() const;
00384
00386 QString forwardSubject() const;
00387
00389 QString replySubject() const;
00390
00392 QString xmark() const;
00393 void setXMark(const QString& aStr);
00394
00396 QString replyToId() const;
00397 void setReplyToId(const QString& aStr);
00398 QString replyToIdMD5() const;
00399
00414 QString replyToAuxIdMD5() const;
00415
00420 QString strippedSubjectMD5() const;
00421
00426 QString subjectMD5() const;
00427
00429 bool subjectIsPrefixed() const;
00430
00432 QString msgId() const;
00433 void setMsgId(const QString& aStr);
00434 QString msgIdMD5() const;
00435
00437 QString references() const;
00438 void setReferences(const QCString& aStr);
00439
00441 QCString id() const;
00442
00445 void setMsgSerNum(unsigned long newMsgSerNum = 0);
00446
00448 QString headerField(const QCString& name) const;
00449 void setHeaderField(const QCString& name, const QString& value);
00450
00452 QString allHeaderFields(const QCString& aName) const;
00453
00455 QCString rawHeaderField( const QCString & name ) const;
00456
00460 KMime::Types::AddressList headerAddrField(const QCString& name) const;
00461 KMime::Types::AddrSpecList extractAddrSpecs( const QCString & headerNames ) const;
00462
00464 void removeHeaderField(const QCString& name);
00465
00469 QCString typeStr() const;
00470 int type() const;
00471 void setTypeStr(const QCString& aStr);
00472 void setType(int aType);
00474 QCString subtypeStr() const;
00475 int subtype() const;
00476 void setSubtypeStr(const QCString& aStr);
00477 void setSubtype(int aSubtype);
00479 static void setDwMediaTypeParam( DwMediaType &mType,
00480 const QCString& attr,
00481 const QCString& val );
00483 void setContentTypeParam(const QCString& attr, const QCString& val);
00484
00488 DwHeaders& headers() const;
00489
00494 void setNeedsAssembly();
00495
00499 QCString contentTransferEncodingStr() const;
00500 int contentTransferEncoding() const;
00501 void setContentTransferEncodingStr(const QCString& aStr);
00502 void setContentTransferEncoding(int aCte);
00503
00506 QCString cteStr() const { return contentTransferEncodingStr(); }
00507 int cte() const { return contentTransferEncoding(); }
00508 void setCteStr(const QCString& aStr) { setContentTransferEncodingStr(aStr); }
00509 void setCte(int aCte) { setContentTransferEncoding(aCte); }
00510
00514 void setBodyFromUnicode( const QString & str );
00515
00518 QString bodyToUnicode(const QTextCodec* codec=0) const;
00519
00521 QCString body() const;
00522
00524 void setBody(const QCString& aStr);
00525
00527 void setMultiPartBody( const QCString & aStr );
00528
00532 void setBodyEncoded(const QCString& aStr);
00533 void setBodyEncodedBinary(const QByteArray& aStr);
00534
00538 static QValueList<int> determineAllowedCtes( const KMime::CharFreq& cf,
00539 bool allow8Bit,
00540 bool willBeSigned );
00541
00551 void setBodyAndGuessCte( const QByteArray& aBuf,
00552 QValueList<int>& allowedCte,
00553 bool allow8Bit = false,
00554 bool willBeSigned = false );
00555 void setBodyAndGuessCte( const QCString& aBuf,
00556 QValueList<int>& allowedCte,
00557 bool allow8Bit = false,
00558 bool willBeSigned = false );
00559
00563 QCString bodyDecoded() const;
00564 QByteArray bodyDecodedBinary() const;
00565
00568 int numBodyParts() const;
00569
00572 DwBodyPart * findDwBodyPart( int type, int subtype ) const;
00573
00576 DwBodyPart* findDwBodyPart( DwBodyPart* part, const QString & partSpecifier );
00577
00580 DwBodyPart * dwBodyPart( int aIdx ) const;
00581
00584 int partNumber( DwBodyPart * aDwBodyPart ) const;
00585
00588 DwBodyPart * getFirstDwBodyPart() const;
00589
00593 static void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart,
00594 bool withBody = true );
00595
00599 void bodyPart(int aIdx, KMMessagePart* aPart) const;
00600
00602 DwBodyPart* createDWBodyPart(const KMMessagePart* aPart);
00603
00605 void addDwBodyPart(DwBodyPart * aDwPart);
00606
00608 void addBodyPart(const KMMessagePart* aPart);
00609
00611 void deleteBodyParts();
00612
00615 void setStatusFields();
00616
00621 static QString generateMessageId( const QString& addr );
00622
00628 static QCString html2source( const QCString & src );
00629
00632 static QCString lf2crlf( const QCString & src );
00633
00636 static QString encodeMailtoUrl( const QString& str );
00637
00640 static QString decodeMailtoUrl( const QString& url );
00641
00648 static QCString stripEmailAddr(const QCString& emailAddr);
00649
00652 static QString stripEmailAddr(const QString& emailAddr);
00653
00658 static QCString getEmailAddr(const QString& emailAddr);
00659
00665 static QString quoteHtmlChars( const QString& str,
00666 bool removeLineBreaks = false );
00667
00672 static QString emailAddrAsAnchor(const QString& emailAddr,
00673 bool stripped=TRUE);
00674
00676 static QStringList splitEmailAddrList(const QString&);
00677
00681 static QStringList stripAddressFromAddressList( const QString& address,
00682 const QStringList& addresses );
00683
00687 static QStringList stripMyAddressesFromAddressList( const QStringList& list );
00688
00691 static bool addressIsInAddressList( const QString& address,
00692 const QStringList& addresses );
00693
00697 static QString expandAliases( const QString& recipients );
00698
00702 static QString guessEmailAddressFromLoginName( const QString& userName );
00703
00704
00706 static QCString defaultCharset();
00707
00709 static const QStringList &preferredCharsets();
00710
00713 QString replaceHeadersInString( const QString & s ) const;
00714
00716 QCString charset() const;
00717
00719 void setCharset(const QCString& aStr);
00720
00722 const QTextCodec * codec() const;
00723
00725 void setOverrideCodec( const QTextCodec* codec ) { mOverrideCodec = codec; }
00726
00728 void setDecodeHTML(bool aDecodeHTML)
00729 { mDecodeHTML = aDecodeHTML; }
00730
00733 static void readConfig();
00734
00738 QCString getRefStr() const;
00739
00741 off_t folderOffset() const { return mFolderOffset; }
00742 void setFolderOffset(off_t offs) { if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(TRUE); } }
00743
00745 QString fileName() const { return mFileName; }
00746 void setFileName(const QString& file) { if(mFileName != file) { mFileName=file; setDirty(TRUE); } }
00747
00751 size_t msgSize() const { return mMsgSize; }
00752 void setMsgSize(size_t sz) { if(mMsgSize != sz) { mMsgSize = sz; setDirty(TRUE); } }
00753
00756 size_t msgLength() const
00757 { return (mMsgLength) ? mMsgLength : mMsgSize; }
00758 void setMsgLength(size_t sz) { mMsgLength = sz; }
00759
00761 KMMsgStatus status() const { return mStatus; }
00763 void setStatus(const KMMsgStatus status, int idx = -1);
00764 void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); }
00765
00767 void setEncryptionState(const KMMsgEncryptionState, int idx = -1);
00768
00770 void setSignatureState(const KMMsgSignatureState, int idx = -1);
00771
00772 void setMDNSentState( KMMsgMDNSentState status, int idx=-1 );
00773
00775 KMMsgEncryptionState encryptionState() const { return mEncryptionState; }
00776
00778 KMMsgSignatureState signatureState() const { return mSignatureState; }
00779
00780 KMMsgMDNSentState mdnSentState() const { return mMDNSentState; }
00781
00783 void link(const KMMessage *aMsg, KMMsgStatus aStatus);
00786 void getLink(int n, ulong *retMsgSerNum, KMMsgStatus *retStatus) const;
00787
00789 QString formatString(const QString&) const;
00790
00792 void updateBodyPart(const QString partSpecifier, const QByteArray & data);
00793
00795 DwBodyPart* lastUpdatedPart() { return mLastUpdated; }
00796
00797 private:
00813 QString asQuotedString( const QString & headerStr,
00814 const QString & indentStr,
00815 const QString & selection=QString::null,
00816 bool aStripSignature=true,
00817 bool allowDecryption=true) const;
00818
00821 QString asPlainText( bool stripSignature, bool allowDecryption ) const;
00822
00823 void assign( const KMMessage& other );
00824
00825 QString mDrafts;
00826 mutable DwMessage* mMsg;
00827 mutable bool mNeedsAssembly;
00828 bool mDecodeHTML;
00829 static const KMail::HeaderStrategy * sHeaderStrategy;
00830 static QString sForwardStr;
00831 const QTextCodec * mOverrideCodec;
00832
00833 QString mFileName;
00834 off_t mFolderOffset;
00835 size_t mMsgSize, mMsgLength;
00836 time_t mDate;
00837 KMMsgEncryptionState mEncryptionState;
00838 KMMsgSignatureState mSignatureState;
00839 KMMsgMDNSentState mMDNSentState;
00840 KMMessage* mUnencryptedMsg;
00841 DwBodyPart* mLastUpdated;
00842 };
00843
00844
00845 #endif