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
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
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