00001
00002
00003
00004
00005 #ifndef kmmessage_h
00006 #define kmmessage_h
00007
00010
00011 #include <config.h>
00012 #include <sys/types.h>
00013
00014 #include <mimelib/string.h>
00015 #include "kmmsgbase.h"
00016 #include "isubject.h"
00017
00018 #include <kmime_mdn.h>
00019
00020 #include<libemailfunctions/email.h>
00021
00022 template <typename T>
00023 class TQValueList;
00024
00025 class TQStringList;
00026 class TQString;
00027 class TQTextCodec;
00028 class TQStrList;
00029
00030 class KMFolder;
00031 class KMFolderIndex;
00032 class DwMessage;
00033 class KMMessagePart;
00034 class KMMsgInfo;
00035 class KMHeaders;
00036 class KMForwardDigestCommand;
00037
00038 namespace KMime {
00039 class CharFreq;
00040 namespace Types {
00041 class AddrSpec;
00042 class Address;
00043 typedef TQValueList<Address> AddressList;
00044 typedef TQValueList<AddrSpec> AddrSpecList;
00045 }
00046 }
00047
00048 namespace KMail {
00049 class HeaderStrategy;
00050 }
00051
00052 class DwEntity;
00053 class DwBodyPart;
00054 class DwMediaType;
00055 class DwHeaders;
00056
00057 class partNode;
00058
00059 namespace KMail {
00060 enum ReplyStrategy { ReplySmart = 0,
00061 ReplyAuthor,
00062 ReplyList,
00063 ReplyAll,
00064 ReplyNone };
00065 }
00066
00068 class KMMessage: public KMMsgBase, public KMail::ISubject
00069 {
00070 friend class ::KMForwardDigestCommand;
00071
00072 public:
00073
00074 using KMMsgBase::parent;
00075 using KMMsgBase::setParent;
00076 using KMMsgBase::enableUndo;
00077 using KMMsgBase::setEnableUndo;
00078 using KMMsgBase::isRead;
00079 using KMMsgBase::isUnread;
00080 using KMMsgBase::isNew;
00081 using KMMsgBase::isOld;
00082 using KMMsgBase::isWatched;
00083 using KMMsgBase::isIgnored;
00084 using KMMsgBase::setEncryptionStateChar;
00085 using KMMsgBase::setSignatureStateChar;
00086
00088 KMMessage(KMFolder* parent=0);
00089
00093 KMMessage(DwMessage*);
00094
00096 KMMessage(KMMsgInfo& msgInfo);
00097
00099 KMMessage( const KMMessage& other );
00100
00101 #if 0 // currently unused
00102
00103 const KMMessage& operator=( const KMMessage& other ) {
00104 if( &other == this )
00105 return *this;
00106 assign( other );
00107 return *this;
00108 }
00109 #endif
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 TQString selection=TQString(), bool noQuote = false,
00166 bool allowDecryption = true,
00167 const TQString &tmpl = TQString(),
00168 const TQString &originatingAccount = TQString() );
00169
00177 KMMessage* createRedirect( const TQString &toStr );
00178
00180 TQCString createForwardBody();
00181
00185 KMMessage* createForward( const TQString &tmpl = TQString() );
00186
00190 KMMessage* createDeliveryReceipt() const;
00191
00205 KMMessage* createMDN( KMime::MDN::ActionMode a,
00206 KMime::MDN::DispositionType d,
00207 bool allowGUI=false,
00208 TQValueList<KMime::MDN::DispositionModifier> m=TQValueList<KMime::MDN::DispositionModifier>() );
00209
00211 void sanitizeHeaders( const TQStringList& whiteList = TQStringList() );
00212
00214 void fromDwString(const DwString& str, bool setStatus=false);
00215 void fromString(const TQCString& str, bool setStatus=false);
00216 void fromByteArray(const TQByteArray & ba, bool setStatus=false);
00217
00222 const DwString& asDwString() const;
00223 const DwMessage *asDwMessage();
00224
00232 TQCString asString() const;
00233
00238 TQByteArray asSendableString() const;
00239
00244 TQCString headerAsSendableString() const;
00245
00249 void removePrivateHeaderFields();
00250
00252 DwMediaType& dwContentType();
00253
00255 TQString headerAsString() const;
00256
00261 void parseTextStringFromDwPart( partNode * root,
00262 TQCString& parsedString,
00263 const TQTextCodec*& codec,
00264 bool& isHTML ) const;
00265
00269 void initHeader(uint identity=0);
00270
00273 void initFromMessage(const KMMessage *msg, bool idHeaders = true);
00274
00280 uint identityUoid() const;
00281
00284 void applyIdentity( uint id );
00285
00288 void cleanupHeader();
00289
00295 void setAutomaticFields(bool isMultipart=false);
00296
00298 TQString dateStr() const;
00301 TQCString dateShortStr() const;
00302 TQString dateIsoStr() const;
00303 time_t date() const;
00304 void setDate(const TQCString& str);
00305 void setDate(time_t aUnixTime);
00306
00308 void setDateToday();
00309
00311 TQString to() const;
00312 void setTo(const TQString& aStr);
00313 TQString toStrip() const;
00314
00316 TQString replyTo() const;
00317 void setReplyTo( const TQString &aStr );
00318 void setReplyTo(KMMessage*);
00319
00321 TQString cc() const;
00322 void setCc( const TQString &aStr );
00323 TQString ccStrip() const;
00324
00326 TQString bcc() const;
00327 void setBcc( const TQString &aStr );
00328
00330 TQString fcc() const;
00331 void setFcc( const TQString &aStr );
00332
00334 TQString drafts() const { return mDrafts; }
00335 void setDrafts( const TQString &aStr );
00336
00338 TQString templates() const { return mTemplates; }
00339 void setTemplates( const TQString &aStr );
00340
00342 TQString from() const;
00343 void setFrom(const TQString& aStr);
00344 TQString fromStrip() const;
00345
00348 TQString sender() const;
00349
00353 TQString who() const;
00354
00356 TQString subject() const;
00357 void setSubject(const TQString& aStr);
00358
00360 void initStrippedSubjectMD5() {};
00361
00363 TQString xmark() const;
00364 void setXMark(const TQString& aStr);
00365
00367 TQString replyToId() const;
00368 void setReplyToId(const TQString& aStr);
00369 TQString replyToIdMD5() const;
00370
00385 TQString replyToAuxIdMD5() const;
00386
00391 TQString strippedSubjectMD5() const;
00392
00403 static KPIM::EmailParseResult isValidEmailAddressList( const TQString& aStr,
00404 TQString& brokenAddress );
00405
00410 TQString subjectMD5() const;
00411
00413 bool subjectIsPrefixed() const;
00414
00416 TQString msgId() const;
00417 void setMsgId(const TQString& aStr);
00418 TQString msgIdMD5() const;
00419
00421 TQString references() const;
00422 void setReferences(const TQCString& aStr);
00423
00425 TQCString id() const;
00426
00431 void setMsgSerNum(unsigned long newMsgSerNum = 0);
00432
00437 TQString headerField(const TQCString& name) const;
00438
00439 enum HeaderFieldType { Unstructured, Structured, Address };
00440
00445 void setHeaderField( const TQCString& name, const TQString& value,
00446 HeaderFieldType type = Unstructured,
00447 bool prepend = false );
00448
00450 TQStringList headerFields( const TQCString& name ) const;
00451
00456 TQCString rawHeaderField( const TQCString & name ) const;
00457
00461 TQValueList<TQCString> rawHeaderFields( const TQCString & field ) const;
00462
00464 static KMime::Types::AddressList splitAddrField( const TQCString & str );
00465
00469 KMime::Types::AddressList headerAddrField(const TQCString& name) const;
00470 KMime::Types::AddrSpecList extractAddrSpecs( const TQCString & headerNames ) const;
00471
00473 void removeHeaderField(const TQCString& name);
00474
00476 void removeHeaderFields(const TQCString& name);
00477
00481 TQCString typeStr() const;
00482 int type() const;
00483 void setTypeStr(const TQCString& aStr);
00484 void setType(int aType);
00486 TQCString subtypeStr() const;
00487 int subtype() const;
00488 void setSubtypeStr(const TQCString& aStr);
00489 void setSubtype(int aSubtype);
00491 static void setDwMediaTypeParam( DwMediaType &mType,
00492 const TQCString& attr,
00493 const TQCString& val );
00495 void setContentTypeParam(const TQCString& attr, const TQCString& val);
00496
00500 DwHeaders& headers() const;
00501
00506 void setNeedsAssembly();
00507
00512 void assembleIfNeeded();
00513
00522 TQCString contentTransferEncodingStr() const;
00523 int contentTransferEncoding( DwEntity *entity = 0 ) const;
00524 void setContentTransferEncodingStr( const TQCString& cteString, DwEntity *entity = 0 );
00525 void setContentTransferEncoding( int cte, DwEntity *entity = 0 );
00526
00531 TQCString cteStr() const { return contentTransferEncodingStr(); }
00532 int cte( DwEntity *entity = 0 ) const { return contentTransferEncoding( entity ); }
00533 void setCteStr( const TQCString& aStr, DwEntity *entity = 0 ) {
00534 setContentTransferEncodingStr( aStr, entity );
00535 }
00536 void setCte( int aCte, DwEntity *entity = 0 ) {
00537 setContentTransferEncoding( aCte, entity );
00538 }
00539
00547 void setBodyFromUnicode( const TQString & str, DwEntity *entity = 0 );
00548
00551 TQString bodyToUnicode(const TQTextCodec* codec=0) const;
00552
00554 TQCString body() const;
00555
00557 void setBody(const TQCString& aStr);
00558 void setBody(const DwString& aStr);
00559 void setBody(const char* aStr);
00560
00562 void setMultiPartBody( const TQCString & aStr );
00563
00573 void setBodyEncoded( const TQCString& aStr, DwEntity *entity = 0 );
00574 void setBodyEncodedBinary( const TQByteArray& aStr, DwEntity *entity = 0 );
00575
00579 static TQValueList<int> determineAllowedCtes( const KMime::CharFreq& cf,
00580 bool allow8Bit,
00581 bool willBeSigned );
00582
00596 void setBodyAndGuessCte( const TQByteArray& aBuf, TQValueList<int>& allowedCte,
00597 bool allow8Bit = false,
00598 bool willBeSigned = false,
00599 DwEntity *entity = 0 );
00600
00601 void setBodyAndGuessCte( const TQCString& aBuf,
00602 TQValueList<int>& allowedCte,
00603 bool allow8Bit = false,
00604 bool willBeSigned = false,
00605 DwEntity *entity = 0 );
00606
00610 TQCString bodyDecoded() const;
00611 TQByteArray bodyDecodedBinary() const;
00612
00615 int numBodyParts() const;
00616
00619 DwBodyPart * findDwBodyPart( int type, int subtype ) const;
00620
00623 DwBodyPart * findDwBodyPart( const TQCString& type, const TQCString& subtype ) const;
00624
00627 DwBodyPart* findDwBodyPart( DwBodyPart* part, const TQString & partSpecifier );
00628
00631 DwBodyPart * dwBodyPart( int aIdx ) const;
00632
00635 int partNumber( DwBodyPart * aDwBodyPart ) const;
00636
00639 DwBodyPart * getFirstDwBodyPart() const;
00640 DwMessage * getTopLevelPart() const { return mMsg; }
00641
00645 static void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart,
00646 bool withBody = true );
00647
00651 void bodyPart(int aIdx, KMMessagePart* aPart) const;
00652
00654 DwBodyPart* createDWBodyPart(const KMMessagePart* aPart);
00655
00657 void addDwBodyPart(DwBodyPart * aDwPart);
00658
00660 void addBodyPart(const KMMessagePart* aPart);
00661
00663 void deleteBodyParts();
00664
00669 bool deleteBodyPart( int partIndex );
00670
00673 void setStatusFields();
00674
00679 static TQString generateMessageId( const TQString& addr );
00680
00686 static TQCString html2source( const TQCString & src );
00687
00690 static TQString encodeMailtoUrl( const TQString& str );
00691
00694 static TQString decodeMailtoUrl( const TQString& url );
00695
00702 static TQCString stripEmailAddr(const TQCString& emailAddr);
00703
00706 static TQString stripEmailAddr(const TQString& emailAddr);
00707
00713 static TQString quoteHtmlChars( const TQString& str,
00714 bool removeLineBreaks = false );
00715
00720 static TQString emailAddrAsAnchor(const TQString& emailAddr,
00721 bool stripped=true, const TQString& cssStyle = TQString(), bool link = true);
00722
00726 static TQStringList stripAddressFromAddressList( const TQString& address,
00727 const TQStringList& addresses );
00728
00732 static TQStringList stripMyAddressesFromAddressList( const TQStringList& list );
00733
00736 static bool addressIsInAddressList( const TQString& address,
00737 const TQStringList& addresses );
00738
00742 static TQString expandAliases( const TQString& recipients );
00743
00747 static TQString guessEmailAddressFromLoginName( const TQString& userName );
00748
00755 static TQString smartQuote( const TQString &msg, int maxLineLength );
00756
00758 static TQCString defaultCharset();
00759
00761 static const TQStringList &preferredCharsets();
00762
00764 TQString replaceHeadersInString( const TQString & s ) const;
00765
00767 TQCString charset() const;
00768
00777 void setCharset( const TQCString& charset, DwEntity *entity = 0 );
00778
00780 const TQTextCodec * codec() const;
00781
00783 void setOverrideCodec( const TQTextCodec* codec ) { mOverrideCodec = codec; }
00784
00786 void setDecodeHTML(bool aDecodeHTML)
00787 { mDecodeHTML = aDecodeHTML; }
00788
00791 static void readConfig();
00792
00796 TQCString getRefStr() const;
00797
00799 off_t folderOffset() const { return mFolderOffset; }
00800 void setFolderOffset(off_t offs) { if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(true); } }
00801
00803 TQString fileName() const { return mFileName; }
00804 void setFileName(const TQString& file) { if(mFileName != file) { mFileName=file; setDirty(true); } }
00805
00807 TQString originatingAccountName() const { return mOriginatingAccountName; }
00808 void setOriginatingAccountName(const TQString& account) { if(mOriginatingAccountName != account) { mOriginatingAccountName=account; setDirty(true); } }
00809
00813 size_t msgSize() const { return mMsgSize; }
00814 void setMsgSize(size_t sz) { if(mMsgSize != sz) { mMsgSize = sz; setDirty(true); } }
00815
00818 size_t msgLength() const
00819 { return (mMsgLength) ? mMsgLength : mMsgSize; }
00820 void setMsgLength(size_t sz) { mMsgLength = sz; }
00821
00823 size_t msgSizeServer() const;
00824 void setMsgSizeServer(size_t sz);
00825
00827 ulong UID() const;
00828 void setUID(ulong uid);
00829
00831 KMMsgStatus status() const { return mStatus; }
00833 void setStatus(const KMMsgStatus status, int idx = -1);
00834 void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); }
00835
00837 void setEncryptionState(const KMMsgEncryptionState, int idx = -1);
00838
00840 void setSignatureState(const KMMsgSignatureState, int idx = -1);
00841
00842 void setMDNSentState( KMMsgMDNSentState status, int idx=-1 );
00843
00845 KMMsgEncryptionState encryptionState() const { return mEncryptionState; }
00846
00848 KMMsgSignatureState signatureState() const { return mSignatureState; }
00849
00850 KMMsgMDNSentState mdnSentState() const { return mMDNSentState; }
00851
00853 void link(const KMMessage *aMsg, KMMsgStatus aStatus);
00856 void getLink(int n, ulong *retMsgSerNum, KMMsgStatus *reStatus) const;
00857
00859 TQString formatString(const TQString&) const;
00860
00862 void updateBodyPart(const TQString partSpecifier, const TQByteArray & data);
00863
00865 DwBodyPart* lastUpdatedPart() { return mLastUpdated; }
00866
00868 bool isComplete() const { return mComplete; }
00870 void setComplete( bool v ) { mComplete = v; }
00871
00873 bool readyToShow() const { return mReadyToShow; }
00875 void setReadyToShow( bool v ) { mReadyToShow = v; }
00876
00877 void updateAttachmentState( DwBodyPart *part = 0 );
00878 void updateInvitationState();
00879
00881 bool transferInProgress() const;
00883 void setTransferInProgress(bool value, bool force = false);
00884
00889 TQCString mboxMessageSeparator();
00890
00906 TQString asQuotedString( const TQString & headerStr,
00907 const TQString & indentStr,
00908 const TQString & selection=TQString(),
00909 bool aStripSignature=true,
00910 bool allowDecryption=true) const;
00911
00914 TQString asPlainText( bool stripSignature, bool allowDecryption ) const;
00915
00922 TQString asPlainTextFromObjectTree( partNode *root, bool stripSignature,
00923 bool allowDecryption ) const;
00924
00926 int getCursorPos() { return mCursorPos; };
00928 void setCursorPos(int pos) { mCursorPos = pos; };
00929
00931 KMMsgInfo* msgInfo() { return mMsgInfo; }
00933 void setMsgInfo( KMMsgInfo* msgInfo ) { mMsgInfo = msgInfo; }
00934
00935
00936
00937
00938 bool isBeingParsed() const { return mIsParsed; }
00939 void setIsBeingParsed( bool t ) { mIsParsed = t; }
00940
00942 void deleteWhenUnused();
00943
00944 DwBodyPart* findPart( int index );
00945
00946 private:
00947
00949 void init( DwMessage* aMsg = 0 );
00951 void assign( const KMMessage& other );
00952
00953 DwBodyPart* findPartInternal( DwEntity* root, int index, int &accu );
00954
00955 TQString mDrafts;
00956 TQString mTemplates;
00957 mutable DwMessage* mMsg;
00958 mutable bool mNeedsAssembly :1;
00959 bool mDecodeHTML :1;
00960 bool mReadyToShow :1;
00961 bool mComplete :1;
00962 bool mIsParsed : 1;
00963 static const KMail::HeaderStrategy * sHeaderStrategy;
00964 static TQString sForwardStr;
00965 const TQTextCodec * mOverrideCodec;
00966
00967 TQString mFileName;
00968 TQString mOriginatingAccountName;
00969 off_t mFolderOffset;
00970 size_t mMsgSize, mMsgLength;
00971 time_t mDate;
00972 KMMsgEncryptionState mEncryptionState;
00973 KMMsgSignatureState mSignatureState;
00974 KMMsgMDNSentState mMDNSentState;
00975 KMMessage* mUnencryptedMsg;
00976 DwBodyPart* mLastUpdated;
00977 int mCursorPos;
00978 KMMsgInfo* mMsgInfo;
00979 static TQValueList<KMMessage*> sPendingDeletes;
00980 };
00981
00982
00983 #endif