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 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;
00064
00065 public:
00066
00067 using KMMsgBase::parent;
00068 using KMMsgBase::setParent;
00069 using KMMsgBase::enableUndo;
00070 using KMMsgBase::setEnableUndo;
00071 using KMMsgBase::isRead;
00072 using KMMsgBase::isUnread;
00073 using KMMsgBase::isNew;
00074 using KMMsgBase::isOld;
00075 using KMMsgBase::isWatched;
00076 using KMMsgBase::isIgnored;
00077 using KMMsgBase::setEncryptionStateChar;
00078 using KMMsgBase::setSignatureStateChar;
00079
00081 KMMessage(KMFolder* parent=0);
00082
00084 KMMessage(DwMessage*);
00085
00087 KMMessage(KMMsgInfo& msgInfo);
00088
00090 KMMessage( const KMMessage& other );
00091
00092
00093
00094
00095
00096
00097
00098
00100 const KMMessage& operator=( const KMMessage& other ) {
00101
00102
00103
00104
00105
00106
00107
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
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