kmail Library API Documentation

kmmessage.h

00001 // -*- mode: C++; c-file-style: "gnu" -*- 00002 /* kmmessage.h: Mime Message Class 00003 * 00004 */ 00005 #ifndef kmmessage_h 00006 #define kmmessage_h 00007 00008 // for large file support 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 class partNode; 00052 00053 namespace KMail { 00054 enum ReplyStrategy { ReplySmart = 0, 00055 ReplyAuthor, 00056 ReplyList, 00057 ReplyAll, 00058 ReplyNone }; 00059 } 00060 00061 class KMMessage: public KMMsgBase, public KMail::ISubject 00062 { 00063 friend class KMForwardCommand; // needed for MIME Digest forward 00064 00065 public: 00066 // promote some of KMMsgBase's methods to public: 00067 using KMMsgBase::parent; 00068 using KMMsgBase::setParent; 00069 using KMMsgBase::enableUndo; // KMFolder 00070 using KMMsgBase::setEnableUndo; // dto. 00071 using KMMsgBase::isRead; // dto. 00072 using KMMsgBase::isUnread; // dto. 00073 using KMMsgBase::isNew; // dto. 00074 using KMMsgBase::isOld; 00075 using KMMsgBase::isWatched; 00076 using KMMsgBase::isIgnored; 00077 using KMMsgBase::setEncryptionStateChar; // KMAcct* 00078 using KMMsgBase::setSignatureStateChar; // dto. 00079 00081 KMMessage(KMFolder* parent=0); 00082 00084 KMMessage(DwMessage*); 00085 00087 KMMessage(KMMsgInfo& msgInfo); 00088 00090 KMMessage( const KMMessage& other ); 00091 //KMMessage( const KMMessage& other, 00092 // bool preserveArrivalTime=false ); 00093 // note: By setting preserveArrivalTime true you get 00094 // a message containing the arrival time of the 00095 // old one - this is useful if this new message 00096 // is to replace the old one in the same folder 00097 // note2: temporarily uncommented this again (khz) 00098 00100 const KMMessage& operator=( const KMMessage& other ) { 00101 //const KMMessage& operator=( const KMMessage& other, 00102 // bool preserveArrivalTime=false ) { 00103 // note: By setting preserveArrivalTime true you get 00104 // a message containing the arrival time of the 00105 // old one - this is useful if this new message 00106 // is to replace the old one in the same folder 00107 // note2: temporarily uncommented this again (khz) 00108 if( &other == this ) 00109 return *this; 00110 assign( other ); return *this; 00111 } 00112 00114 virtual ~KMMessage(); 00115 00117 KMMsgBase & toMsgBase() { return *this; } 00118 const KMMsgBase & toMsgBase() const { return *this; } 00119 00121 bool isMessage() const; 00122 00126 bool isUrgent() const; 00127 00134 void setUnencryptedMsg( KMMessage* unencrypted ); 00135 00137 bool hasUnencryptedMsg() const { return 0 != mUnencryptedMsg; } 00138 00140 KMMessage* unencryptedMsg() const { return mUnencryptedMsg; } 00141 00147 KMMessage* takeUnencryptedMsg() 00148 { 00149 KMMessage* ret = mUnencryptedMsg; 00150 mUnencryptedMsg = 0; 00151 return ret; 00152 } 00153 00155 void del() { setStatus(KMMsgStatusDeleted); } 00156 00158 void undel() { setStatus(KMMsgStatusOld); } 00159 00161 void touch() { setStatus(KMMsgStatusOld); } 00162 00166 KMMessage* createReply( KMail::ReplyStrategy replyStrategy = KMail::ReplySmart, 00167 QString selection=QString::null, bool noQuote=FALSE, 00168 bool allowDecryption=TRUE, bool selectionIsBody=FALSE); 00169 00177 KMMessage* createRedirect(); 00178 // new implementation, ATM only used for redirect filter action 00179 KMMessage* createRedirect2( const QString &toStr ); 00180 00185 KMMessage* createBounce( bool withUI ); 00186 00188 QCString createForwardBody(); 00189 00193 KMMessage* createForward(); 00194 00198 KMMessage* createDeliveryReceipt() const; 00199 00213 KMMessage* createMDN( KMime::MDN::ActionMode a, 00214 KMime::MDN::DispositionType d, 00215 bool allowGUI=false, 00216 QValueList<KMime::MDN::DispositionModifier> m=QValueList<KMime::MDN::DispositionModifier>() ); 00217 00219 void fromDwString(const DwString& str, bool setStatus=FALSE); 00220 void fromString(const QCString& str, bool setStatus=FALSE); 00221 void fromByteArray( const QByteArray & ba, bool setStatus=false ); 00222 00227 const DwString& asDwString() const; 00228 const DwMessage *asDwMessage(); 00229 00239 QCString asString() const; 00240 00245 QCString asSendableString() const; 00246 00251 QCString headerAsSendableString() const; 00252 00256 void removePrivateHeaderFields(); 00257 00259 DwMediaType& dwContentType(); 00260 00262 QString headerAsString() const; 00263 00268 void parseTextStringFromDwPart( partNode * root, 00269 QCString& parsedString, 00270 const QTextCodec*& codec, 00271 bool& isHTML ) const; 00272 00276 void initHeader(uint identity=0); 00277 00280 void initFromMessage(const KMMessage *msg, bool idHeaders = TRUE); 00281 00287 uint identityUoid() const; 00288 00291 void cleanupHeader(); 00292 00298 void setAutomaticFields(bool isMultipart=FALSE); 00299 00301 QString dateStr() const; 00304 QCString dateShortStr() const; 00305 QString dateIsoStr() const; 00306 time_t date() const; 00307 void setDate(const QCString& str); 00308 void setDate(time_t aUnixTime); 00309 00311 void setDateToday(); 00312 00314 QString to() const; 00315 void setTo(const QString& aStr); 00316 QString toStrip() const; 00317 00319 QString replyTo() const; 00320 void setReplyTo(const QString& aStr); 00321 void setReplyTo(KMMessage*); 00322 00324 QString cc() const; 00325 void setCc(const QString& aStr); 00326 QString ccStrip() const; 00327 00329 QString bcc() const; 00330 void setBcc(const QString& aStr); 00331 00333 QString fcc() const; 00334 void setFcc(const QString& aStr); 00335 00337 QString drafts() const { return mDrafts; } 00338 void setDrafts(const QString& aStr); 00339 00341 QString from() const; 00342 void setFrom(const QString& aStr); 00343 QString fromStrip() const; 00344 QCString fromEmail() const; 00345 00348 QString sender() const; 00349 00353 QString who() const; 00354 00356 QString subject() const; 00357 void setSubject(const QString& aStr); 00358 00360 void initStrippedSubjectMD5() {}; 00361 00363 QString xmark() const; 00364 void setXMark(const QString& aStr); 00365 00367 QString replyToId() const; 00368 void setReplyToId(const QString& aStr); 00369 QString replyToIdMD5() const; 00370 00385 QString replyToAuxIdMD5() const; 00386 00391 QString strippedSubjectMD5() const; 00392 00397 QString subjectMD5() const; 00398 00400 bool subjectIsPrefixed() const; 00401 00403 QString msgId() const; 00404 void setMsgId(const QString& aStr); 00405 QString msgIdMD5() const; 00406 00408 QString references() const; 00409 void setReferences(const QCString& aStr); 00410 00412 QCString id() const; 00413 00416 void setMsgSerNum(unsigned long newMsgSerNum = 0); 00417 00422 QString headerField(const QCString& name) const; 00423 00424 enum HeaderFieldType { Unstructured, Structured, Address }; 00425 00430 void setHeaderField( const QCString& name, const QString& value, 00431 HeaderFieldType type = Unstructured, 00432 bool prepend = false ); 00433 00435 QStringList headerFields( const QCString& name ) const; 00436 00441 QCString rawHeaderField( const QCString & name ) const; 00442 00446 QValueList<QCString> rawHeaderFields( const QCString & field ) const; 00447 00449 static KMime::Types::AddressList splitAddrField( const QCString & str ); 00450 00454 KMime::Types::AddressList headerAddrField(const QCString& name) const; 00455 KMime::Types::AddrSpecList extractAddrSpecs( const QCString & headerNames ) const; 00456 00458 void removeHeaderField(const QCString& name); 00459 00463 QCString typeStr() const; 00464 int type() const; 00465 void setTypeStr(const QCString& aStr); 00466 void setType(int aType); 00468 QCString subtypeStr() const; 00469 int subtype() const; 00470 void setSubtypeStr(const QCString& aStr); 00471 void setSubtype(int aSubtype); 00473 static void setDwMediaTypeParam( DwMediaType &mType, 00474 const QCString& attr, 00475 const QCString& val ); 00477 void setContentTypeParam(const QCString& attr, const QCString& val); 00478 00482 DwHeaders& headers() const; 00483 00488 void setNeedsAssembly(); 00489 00493 QCString contentTransferEncodingStr() const; 00494 int contentTransferEncoding() const; 00495 void setContentTransferEncodingStr(const QCString& aStr); 00496 void setContentTransferEncoding(int aCte); 00497 00500 QCString cteStr() const { return contentTransferEncodingStr(); } 00501 int cte() const { return contentTransferEncoding(); } 00502 void setCteStr(const QCString& aStr) { setContentTransferEncodingStr(aStr); } 00503 void setCte(int aCte) { setContentTransferEncoding(aCte); } 00504 00508 void setBodyFromUnicode( const QString & str ); 00509 00512 QString bodyToUnicode(const QTextCodec* codec=0) const; 00513 00515 QCString body() const; 00516 00518 void setBody(const QCString& aStr); 00519 00521 void setMultiPartBody( const QCString & aStr ); 00522 00526 void setBodyEncoded(const QCString& aStr); 00527 void setBodyEncodedBinary(const QByteArray& aStr); 00528 00532 static QValueList<int> determineAllowedCtes( const KMime::CharFreq& cf, 00533 bool allow8Bit, 00534 bool willBeSigned ); 00535 00545 void setBodyAndGuessCte( const QByteArray& aBuf, 00546 QValueList<int>& allowedCte, 00547 bool allow8Bit = false, 00548 bool willBeSigned = false ); 00549 void setBodyAndGuessCte( const QCString& aBuf, 00550 QValueList<int>& allowedCte, 00551 bool allow8Bit = false, 00552 bool willBeSigned = false ); 00553 00557 QCString bodyDecoded() const; 00558 QByteArray bodyDecodedBinary() const; 00559 00562 int numBodyParts() const; 00563 00566 DwBodyPart * findDwBodyPart( int type, int subtype ) const; 00567 00570 DwBodyPart* findDwBodyPart( DwBodyPart* part, const QString & partSpecifier ); 00571 00574 DwBodyPart * dwBodyPart( int aIdx ) const; 00575 00578 int partNumber( DwBodyPart * aDwBodyPart ) const; 00579 00582 DwBodyPart * getFirstDwBodyPart() const; 00583 DwMessage * getTopLevelPart() const { return mMsg; } 00584 00588 static void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart, 00589 bool withBody = true ); 00590 00594 void bodyPart(int aIdx, KMMessagePart* aPart) const; 00595 00597 DwBodyPart* createDWBodyPart(const KMMessagePart* aPart); 00598 00600 void addDwBodyPart(DwBodyPart * aDwPart); 00601 00603 void addBodyPart(const KMMessagePart* aPart); 00604 00606 void deleteBodyParts(); 00607 00610 void setStatusFields(); 00611 00616 static QString generateMessageId( const QString& addr ); 00617 00623 static QCString html2source( const QCString & src ); 00624 00627 static QCString lf2crlf( const QCString & src ); 00628 00636 static QString normalizedAddress( const QString & displayName, 00637 const QString & addrSpec, 00638 const QString & comment ); 00639 00642 static QString decodeIDN( const QString & addrSpec ); 00643 00647 static QString encodeIDN( const QString & addrSpec ); 00648 00651 static QString normalizeAddressesAndDecodeIDNs( const QString & str ); 00652 00656 static QString normalizeAddressesAndEncodeIDNs( const QString & str ); 00657 00660 static QString encodeMailtoUrl( const QString& str ); 00661 00664 static QString decodeMailtoUrl( const QString& url ); 00665 00666 enum AddressParseResult { AddressOk, AddressEmpty, NoAddressSpec, 00667 UnbalancedQuote, UnbalancedParens, 00668 UnclosedAngleAddr, UnexpectedComma, 00669 UnexpectedEnd }; 00676 static AddressParseResult splitAddress( const QCString& address, 00677 QCString & displayName, 00678 QCString & addrSpec, 00679 QCString & comment ); 00680 00687 static QCString stripEmailAddr(const QCString& emailAddr); 00688 00691 static QString stripEmailAddr(const QString& emailAddr); 00692 00698 static QString quoteHtmlChars( const QString& str, 00699 bool removeLineBreaks = false ); 00700 00705 static QString emailAddrAsAnchor(const QString& emailAddr, 00706 bool stripped=TRUE); 00707 00711 static QStringList stripAddressFromAddressList( const QString& address, 00712 const QStringList& addresses ); 00713 00717 static QStringList stripMyAddressesFromAddressList( const QStringList& list ); 00718 00721 static bool addressIsInAddressList( const QString& address, 00722 const QStringList& addresses ); 00723 00727 static QString expandAliases( const QString& recipients ); 00728 00732 static QString guessEmailAddressFromLoginName( const QString& userName ); 00733 00734 00736 static QCString defaultCharset(); 00737 00739 static const QStringList &preferredCharsets(); 00740 00743 QString replaceHeadersInString( const QString & s ) const; 00744 00746 QCString charset() const; 00747 00749 void setCharset(const QCString& aStr); 00750 00752 const QTextCodec * codec() const; 00753 00755 void setOverrideCodec( const QTextCodec* codec ) { mOverrideCodec = codec; } 00756 00758 void setDecodeHTML(bool aDecodeHTML) 00759 { mDecodeHTML = aDecodeHTML; } 00760 00763 static void readConfig(); 00764 00768 QCString getRefStr() const; 00769 00771 off_t folderOffset() const { return mFolderOffset; } 00772 void setFolderOffset(off_t offs) { if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(TRUE); } } 00773 00775 QString fileName() const { return mFileName; } 00776 void setFileName(const QString& file) { if(mFileName != file) { mFileName=file; setDirty(TRUE); } } 00777 00781 size_t msgSize() const { return mMsgSize; } 00782 void setMsgSize(size_t sz) { if(mMsgSize != sz) { mMsgSize = sz; setDirty(TRUE); } } 00783 00786 size_t msgLength() const 00787 { return (mMsgLength) ? mMsgLength : mMsgSize; } 00788 void setMsgLength(size_t sz) { mMsgLength = sz; } 00789 00791 size_t msgSizeServer() const; 00792 void setMsgSizeServer(size_t sz); 00793 00795 ulong UID() const; 00796 void setUID(ulong uid); 00797 00799 KMMsgStatus status() const { return mStatus; } 00801 void setStatus(const KMMsgStatus status, int idx = -1); 00802 void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); } 00803 00805 void setEncryptionState(const KMMsgEncryptionState, int idx = -1); 00806 00808 void setSignatureState(const KMMsgSignatureState, int idx = -1); 00809 00810 void setMDNSentState( KMMsgMDNSentState status, int idx=-1 ); 00811 00813 KMMsgEncryptionState encryptionState() const { return mEncryptionState; } 00814 00816 KMMsgSignatureState signatureState() const { return mSignatureState; } 00817 00818 KMMsgMDNSentState mdnSentState() const { return mMDNSentState; } 00819 00821 void link(const KMMessage *aMsg, KMMsgStatus aStatus); 00824 void getLink(int n, ulong *retMsgSerNum, KMMsgStatus *retStatus) const; 00825 00827 QString formatString(const QString&) const; 00828 00830 void updateBodyPart(const QString partSpecifier, const QByteArray & data); 00831 00833 DwBodyPart* lastUpdatedPart() { return mLastUpdated; } 00834 00835 void updateAttachmentState(DwBodyPart * part = 0); 00836 00841 QCString mboxMessageSeparator(); 00842 00843 private: 00859 QString asQuotedString( const QString & headerStr, 00860 const QString & indentStr, 00861 const QString & selection=QString::null, 00862 bool aStripSignature=true, 00863 bool allowDecryption=true) const; 00864 00867 QString asPlainText( bool stripSignature, bool allowDecryption ) const; 00868 00869 void assign( const KMMessage& other ); 00870 00871 QString mDrafts; 00872 mutable DwMessage* mMsg; 00873 mutable bool mNeedsAssembly; 00874 bool mDecodeHTML; 00875 static const KMail::HeaderStrategy * sHeaderStrategy; 00876 static QString sForwardStr; 00877 const QTextCodec * mOverrideCodec; 00878 00879 QString mFileName; 00880 off_t mFolderOffset; 00881 size_t mMsgSize, mMsgLength; 00882 time_t mDate; 00883 KMMsgEncryptionState mEncryptionState; 00884 KMMsgSignatureState mSignatureState; 00885 KMMsgMDNSentState mMDNSentState; 00886 KMMessage* mUnencryptedMsg; 00887 DwBodyPart* mLastUpdated; 00888 }; 00889 00890 00891 #endif /*kmmessage_h*/
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 1 15:19:23 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003