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.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 22:43:52 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003