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 
00093   const KMMessage& operator=( const KMMessage& other ) {
00094     if( &other == this )
00095       return *this;
00096     assign( other ); return *this;
00097   }
00098 
00100   virtual ~KMMessage();
00101 
00103   KMMsgBase & toMsgBase() { return *this; }
00104   const KMMsgBase & toMsgBase() const { return *this; }
00105 
00107   bool isMessage() const;
00108 
00112   bool isUrgent() const;
00113 
00120   void setUnencryptedMsg( KMMessage* unencrypted );
00121 
00123   bool hasUnencryptedMsg() const { return 0 != mUnencryptedMsg; }
00124 
00126   KMMessage* unencryptedMsg() const { return mUnencryptedMsg; }
00127 
00133   KMMessage* takeUnencryptedMsg()
00134   {
00135     KMMessage* ret = mUnencryptedMsg;
00136     mUnencryptedMsg = 0;
00137     return ret;
00138   }
00139 
00141   void del() { setStatus(KMMsgStatusDeleted); }
00142 
00144   void undel() { setStatus(KMMsgStatusOld); }
00145 
00147   void touch() { setStatus(KMMsgStatusOld); }
00148 
00152   KMMessage* createReply( KMail::ReplyStrategy replyStrategy = KMail::ReplySmart,
00153                           QString selection=QString::null, bool noQuote=FALSE,
00154                           bool allowDecryption=TRUE, bool selectionIsBody=FALSE);
00155 
00163   KMMessage* createRedirect();
00164   // new implementation, ATM only used for redirect filter action
00165   KMMessage* createRedirect2( const QString &toStr ); 
00166 
00171   KMMessage* createBounce( bool withUI );
00172 
00174   QCString createForwardBody();
00175 
00179   KMMessage* createForward();
00180 
00184   KMMessage* createDeliveryReceipt() const;
00185 
00199   KMMessage* createMDN( KMime::MDN::ActionMode a,
00200             KMime::MDN::DispositionType d,
00201             bool allowGUI=false,
00202             QValueList<KMime::MDN::DispositionModifier> m=QValueList<KMime::MDN::DispositionModifier>() );
00203 
00205   void fromDwString(const DwString& str, bool setStatus=FALSE);
00206   void fromString(const QCString& str, bool setStatus=FALSE);
00207   void fromByteArray( const QByteArray & ba, bool setStatus=false );
00208 
00213   const DwString& asDwString() const;
00214   const DwMessage *asDwMessage();
00215 
00225   QCString asString() const;
00226 
00231   QCString asSendableString() const;
00232 
00237   QCString headerAsSendableString() const;
00238 
00242   void removePrivateHeaderFields();
00243 
00245   DwMediaType& dwContentType();
00246 
00248   QString headerAsString() const;
00249 
00254   void parseTextStringFromDwPart( partNode * root,
00255                                           QCString& parsedString,
00256                                           const QTextCodec*& codec,
00257                                           bool& isHTML ) const;
00258 
00262   void initHeader(uint identity=0);
00263 
00266   void initFromMessage(const KMMessage *msg, bool idHeaders = TRUE);
00267 
00273   uint identityUoid() const;
00274 
00277   void cleanupHeader();
00278 
00284   void setAutomaticFields(bool isMultipart=FALSE);
00285 
00287   QString dateStr() const;
00290   QCString dateShortStr() const;
00291   QString dateIsoStr() const;
00292   time_t date() const;
00293   void setDate(const QCString& str);
00294   void setDate(time_t aUnixTime);
00295 
00297   void setDateToday();
00298 
00300   QString to() const;
00301   void setTo(const QString& aStr);
00302   QString toStrip() const;
00303 
00305   QString replyTo() const;
00306   void setReplyTo(const QString& aStr);
00307   void setReplyTo(KMMessage*);
00308 
00310   QString cc() const;
00311   void setCc(const QString& aStr);
00312   QString ccStrip() const;
00313 
00315   QString bcc() const;
00316   void setBcc(const QString& aStr);
00317 
00319   QString fcc() const;
00320   void setFcc(const QString& aStr);
00321 
00323   QString drafts() const { return mDrafts; }
00324   void setDrafts(const QString& aStr);
00325 
00327   QString from() const;
00328   void setFrom(const QString& aStr);
00329   QString fromStrip() const;
00330   QCString fromEmail() const;
00331 
00334   QString sender() const;
00335 
00339   QString who() const;
00340 
00342   QString subject() const;
00343   void setSubject(const QString& aStr);
00344 
00346   void initStrippedSubjectMD5() {};
00347 
00349   QString xmark() const;
00350   void setXMark(const QString& aStr);
00351 
00353   QString replyToId() const;
00354   void setReplyToId(const QString& aStr);
00355   QString replyToIdMD5() const;
00356 
00371   QString replyToAuxIdMD5() const;
00372 
00377   QString strippedSubjectMD5() const;
00378 
00383   QString subjectMD5() const;
00384 
00386   bool subjectIsPrefixed() const;
00387 
00389   QString msgId() const;
00390   void setMsgId(const QString& aStr);
00391   QString msgIdMD5() const;
00392 
00394   QString references() const;
00395   void setReferences(const QCString& aStr);
00396 
00398   QCString id() const;
00399 
00402   void setMsgSerNum(unsigned long newMsgSerNum = 0);
00403 
00408   QString headerField(const QCString& name) const;
00409 
00410   enum HeaderFieldType { Unstructured, Structured, Address };
00411 
00416   void setHeaderField( const QCString& name, const QString& value,
00417                        HeaderFieldType type = Unstructured, 
00418                        bool prepend = false );
00419 
00421   QStringList headerFields( const QCString& name ) const;
00422 
00427   QCString rawHeaderField( const QCString & name ) const;
00428 
00432   QValueList<QCString> rawHeaderFields( const QCString & field ) const;
00433 
00435   static KMime::Types::AddressList splitAddrField( const QCString & str );
00436 
00440   KMime::Types::AddressList headerAddrField(const QCString& name) const;
00441   KMime::Types::AddrSpecList extractAddrSpecs( const QCString & headerNames ) const;
00442 
00444   void removeHeaderField(const QCString& name);
00445 
00449   QCString typeStr() const;
00450   int type() const;
00451   void setTypeStr(const QCString& aStr);
00452   void setType(int aType);
00454   QCString subtypeStr() const;
00455   int subtype() const;
00456   void setSubtypeStr(const QCString& aStr);
00457   void setSubtype(int aSubtype);
00459   static void setDwMediaTypeParam( DwMediaType &mType,
00460                                    const QCString& attr,
00461                                    const QCString& val );
00463   void setContentTypeParam(const QCString& attr, const QCString& val);
00464 
00468   DwHeaders& headers() const;
00469 
00474   void setNeedsAssembly();
00475 
00479   QCString contentTransferEncodingStr() const;
00480   int  contentTransferEncoding() const;
00481   void setContentTransferEncodingStr(const QCString& aStr);
00482   void setContentTransferEncoding(int aCte);
00483 
00486   QCString cteStr() const { return contentTransferEncodingStr(); }
00487   int cte() const { return contentTransferEncoding(); }
00488   void setCteStr(const QCString& aStr) { setContentTransferEncodingStr(aStr); }
00489   void setCte(int aCte) { setContentTransferEncoding(aCte); }
00490 
00494   void setBodyFromUnicode( const QString & str );
00495 
00498   QString bodyToUnicode(const QTextCodec* codec=0) const;
00499 
00501   QCString body() const;
00502 
00504   void setBody(const QCString& aStr);
00505 
00507   void setMultiPartBody( const QCString & aStr );
00508 
00512   void setBodyEncoded(const QCString& aStr);
00513   void setBodyEncodedBinary(const QByteArray& aStr);
00514 
00518   static QValueList<int> determineAllowedCtes( const KMime::CharFreq& cf,
00519                                                bool allow8Bit,
00520                                                bool willBeSigned );
00521 
00531   void setBodyAndGuessCte( const QByteArray& aBuf,
00532                                    QValueList<int>& allowedCte,
00533                                    bool allow8Bit = false,
00534                                    bool willBeSigned = false );
00535   void setBodyAndGuessCte( const QCString& aBuf,
00536                                    QValueList<int>& allowedCte,
00537                                    bool allow8Bit = false,
00538                                    bool willBeSigned = false );
00539 
00543   QCString bodyDecoded() const;
00544   QByteArray bodyDecodedBinary() const;
00545 
00548   int numBodyParts() const;
00549 
00552   DwBodyPart * findDwBodyPart( int type, int subtype ) const;
00553 
00556   DwBodyPart * findDwBodyPart( const QCString& type, const QCString&  subtype ) const;
00557 
00560   DwBodyPart* findDwBodyPart( DwBodyPart* part, const QString & partSpecifier );
00561 
00564   DwBodyPart * dwBodyPart( int aIdx ) const;
00565 
00568   int partNumber( DwBodyPart * aDwBodyPart ) const;
00569 
00572   DwBodyPart * getFirstDwBodyPart() const;
00573   DwMessage * getTopLevelPart() const { return mMsg; }
00574 
00578   static void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart,
00579                bool withBody = true );
00580 
00584   void bodyPart(int aIdx, KMMessagePart* aPart) const;
00585 
00587   DwBodyPart* createDWBodyPart(const KMMessagePart* aPart);
00588 
00590   void addDwBodyPart(DwBodyPart * aDwPart);
00591 
00593   void addBodyPart(const KMMessagePart* aPart);
00594 
00596   void deleteBodyParts();
00597 
00600   void setStatusFields();
00601 
00606   static QString generateMessageId( const QString& addr );
00607 
00613   static QCString html2source( const QCString & src );
00614 
00617   static QCString lf2crlf( const QCString & src );
00618 
00626   static QString normalizedAddress( const QString & displayName,
00627                                     const QString & addrSpec,
00628                                     const QString & comment );
00629 
00632   static QString decodeIDN( const QString & addrSpec );
00633 
00637   static QString encodeIDN( const QString & addrSpec );
00638 
00641   static QString normalizeAddressesAndDecodeIDNs( const QString & str );
00642 
00646   static QString normalizeAddressesAndEncodeIDNs( const QString & str );
00647 
00650   static QString encodeMailtoUrl( const QString& str );
00651 
00654   static QString decodeMailtoUrl( const QString& url );
00655 
00656   enum AddressParseResult { AddressOk, AddressEmpty, NoAddressSpec,
00657                             UnbalancedQuote, UnbalancedParens,
00658                             UnclosedAngleAddr, UnexpectedComma,
00659                             UnexpectedEnd };
00666   static AddressParseResult splitAddress( const QCString& address,
00667                                           QCString & displayName,
00668                                           QCString & addrSpec,
00669                                           QCString & comment );
00670 
00677   static QCString stripEmailAddr(const QCString& emailAddr);
00678 
00681   static QString stripEmailAddr(const QString& emailAddr);
00682 
00688   static QString quoteHtmlChars( const QString& str,
00689                                  bool removeLineBreaks = false );
00690 
00695   static QString emailAddrAsAnchor(const QString& emailAddr,
00696                      bool stripped=TRUE);
00697 
00701   static QStringList stripAddressFromAddressList( const QString& address,
00702                                                   const QStringList& addresses );
00703 
00707   static QStringList stripMyAddressesFromAddressList( const QStringList& list );
00708 
00711   static bool addressIsInAddressList( const QString& address,
00712                                       const QStringList& addresses );
00713 
00717   static QString expandAliases( const QString& recipients );
00718 
00722   static QString guessEmailAddressFromLoginName( const QString& userName );
00723 
00724 
00726   static QCString defaultCharset();
00727 
00729   static const QStringList &preferredCharsets();
00730 
00733   QString replaceHeadersInString( const QString & s ) const;
00734 
00736   QCString charset() const;
00737 
00739   void setCharset(const QCString& aStr);
00740 
00742   const QTextCodec * codec() const;
00743 
00745   void setOverrideCodec( const QTextCodec* codec ) { mOverrideCodec = codec; }
00746 
00748   void setDecodeHTML(bool aDecodeHTML)
00749   { mDecodeHTML = aDecodeHTML; }
00750 
00753   static void readConfig();
00754 
00758   QCString getRefStr() const;
00759 
00761   off_t folderOffset() const { return mFolderOffset; }
00762   void setFolderOffset(off_t offs) { if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(TRUE); } }
00763 
00765   QString fileName() const { return mFileName; }
00766   void setFileName(const QString& file) { if(mFileName != file) { mFileName=file; setDirty(TRUE); } }
00767 
00771   size_t msgSize() const { return mMsgSize; }
00772   void setMsgSize(size_t sz) { if(mMsgSize != sz) { mMsgSize = sz; setDirty(TRUE); } }
00773 
00776   size_t msgLength() const
00777     { return (mMsgLength) ? mMsgLength : mMsgSize; }
00778   void setMsgLength(size_t sz) { mMsgLength = sz; }
00779 
00781   size_t msgSizeServer() const;
00782   void setMsgSizeServer(size_t sz);
00783 
00785   ulong UID() const;
00786   void setUID(ulong uid);
00787 
00789   bool isComplete() const { return mComplete; }
00791   void setComplete(  bool v ) { mComplete = v; setReadyToShow( true ); }
00792 
00794   KMMsgStatus status() const { return mStatus; }
00796   void setStatus(const KMMsgStatus status, int idx = -1);
00797   void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); }
00798 
00800   void setEncryptionState(const KMMsgEncryptionState, int idx = -1);
00801 
00803   void setSignatureState(const KMMsgSignatureState, int idx = -1);
00804 
00805   void setMDNSentState( KMMsgMDNSentState status, int idx=-1 );
00806 
00808   KMMsgEncryptionState encryptionState() const { return mEncryptionState; }
00809 
00811   KMMsgSignatureState signatureState() const { return mSignatureState; }
00812 
00813   KMMsgMDNSentState mdnSentState() const { return mMDNSentState; }
00814 
00816   void link(const KMMessage *aMsg, KMMsgStatus aStatus);
00819   void getLink(int n, ulong *retMsgSerNum, KMMsgStatus *retStatus) const;
00820 
00822   QString formatString(const QString&) const;
00823 
00825   void updateBodyPart(const QString partSpecifier, const QByteArray & data);
00826 
00828   DwBodyPart* lastUpdatedPart() { return mLastUpdated; }
00829 
00830   void updateAttachmentState(DwBodyPart * part = 0);
00831 
00836   QCString mboxMessageSeparator();
00837 
00838 private:
00854   QString asQuotedString( const QString & headerStr,
00855               const QString & indentStr,
00856               const QString & selection=QString::null,
00857               bool aStripSignature=true,
00858               bool allowDecryption=true) const;
00859 
00862   QString asPlainText( bool stripSignature, bool allowDecryption ) const;
00863 
00864   void assign( const KMMessage& other );
00865 
00866   QString mDrafts;
00867   mutable DwMessage* mMsg;
00868   mutable bool       mNeedsAssembly;
00869   bool mDecodeHTML;
00870   static const KMail::HeaderStrategy * sHeaderStrategy;
00871   static QString sForwardStr;
00872   const QTextCodec * mOverrideCodec;
00873 
00874   QString mFileName;
00875   off_t mFolderOffset;
00876   size_t mMsgSize, mMsgLength;
00877   time_t mDate;
00878   KMMsgEncryptionState mEncryptionState;
00879   KMMsgSignatureState mSignatureState;
00880   KMMsgMDNSentState mMDNSentState;
00881   KMMessage* mUnencryptedMsg;
00882   DwBodyPart* mLastUpdated;
00883   bool mComplete;
00884 };
00885 
00886 
00887 #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 Oct 17 09:55:40 2007 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003