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
namespace KMail {
00052
enum ReplyStrategy { ReplySmart = 0,
00053 ReplyAuthor,
00054 ReplyList,
00055 ReplyAll,
00056 ReplyNone };
00057 }
00058
00059
class KMMessage:
public KMMsgBase,
public KMail::ISubject
00060 {
00061
friend class KMForwardCommand;
00062
00063
public:
00064
00065
using KMMsgBase::parent;
00066
using KMMsgBase::setParent;
00067
using KMMsgBase::enableUndo;
00068
using KMMsgBase::setEnableUndo;
00069
using KMMsgBase::isRead;
00070
using KMMsgBase::isUnread;
00071
using KMMsgBase::isNew;
00072
using KMMsgBase::isOld;
00073
using KMMsgBase::isWatched;
00074
using KMMsgBase::isIgnored;
00075
using KMMsgBase::setEncryptionStateChar;
00076
using KMMsgBase::setSignatureStateChar;
00077
00079 KMMessage(KMFolderIndex* parent=0);
00080
00082 KMMessage(DwMessage*);
00083
00085 KMMessage(KMMsgInfo& msgInfo);
00086
00088 KMMessage(
const KMMessage& other );
00089
00090
00091
00092
00093
00094
00095
00096
00098
const KMMessage& operator=(
const KMMessage& other ) {
00099
00100
00101
00102
00103
00104
00105
00106
if( &other ==
this )
00107
return *
this;
00108 assign( other );
return *
this;
00109 }
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 QString selection=QString::null,
bool noQuote=FALSE,
00166
bool allowDecryption=TRUE,
bool selectionIsBody=FALSE);
00167
00175 KMMessage* createRedirect();
00176
00181 KMMessage* createBounce(
bool withUI );
00182
00184 QCString createForwardBody();
00185
00189 KMMessage* createForward();
00190
00194 KMMessage* createDeliveryReceipt() const;
00195
00209 KMMessage* createMDN( KMime::MDN::ActionMode a,
00210 KMime::MDN::DispositionType d,
00211
bool allowGUI=false,
00212 QValueList<KMime::MDN::DispositionModifier> m=QValueList<KMime::MDN::DispositionModifier>() );
00213
00215
void fromDwString(const DwString& str,
bool setStatus=FALSE);
00216
void fromString(const QCString& str,
bool setStatus=FALSE);
00217
void fromByteArray( const QByteArray & ba,
bool setStatus=false );
00218
00223 const DwString& asDwString() const;
00224 const DwMessage *asDwMessage();
00225
00235 QCString asString() const;
00236
00241 QCString asSendableString() const;
00242
00247 QCString headerAsSendableString() const;
00248
00252
void removePrivateHeaderFields();
00253
00255 DwMediaType& dwContentType();
00256
00258 QString headerAsString() const;
00259
00264
void parseTextStringFromDwPart( DwBodyPart * mainBody,
00265 DwBodyPart * firstBodyPart,
00266 QCString& parsedString,
00267 const QTextCodec*& codec,
00268
bool& isHTML ) const;
00269
00273
void initHeader(uint identity=0);
00274
00277
void initFromMessage(const KMMessage *msg,
bool idHeaders = TRUE);
00278
00284 uint identityUoid() const;
00285
00288
void cleanupHeader();
00289
00295
void setAutomaticFields(
bool isMultipart=FALSE);
00296
00298 QString dateStr() const;
00299 QCString dateShortStr() const;
00300 QString dateIsoStr() const;
00301 time_t date() const;
00302
void setDate(const QCString& str);
00303
void setDate(time_t aUnixTime);
00304
00306
void setDateToday();
00307
00309 QString to() const;
00310
void setTo(const QString& aStr);
00311 QString toStrip() const;
00312
00314 QString replyTo() const;
00315
void setReplyTo(const QString& aStr);
00316
void setReplyTo(KMMessage*);
00317
00319 QString cc() const;
00320
void setCc(const QString& aStr);
00321 QString ccStrip() const;
00322
00324 QString bcc() const;
00325
void setBcc(const QString& aStr);
00326
00328 QString fcc() const;
00329
void setFcc(const QString& aStr);
00330
00332 QString drafts()
const {
return mDrafts; }
00333
void setDrafts(
const QString& aStr);
00334
00336 QString from() const;
00337
void setFrom(const QString& aStr);
00338 QString fromStrip() const;
00339 QCString fromEmail() const;
00340
00343 QString sender() const;
00344
00348 QString who() const;
00349
00351 QString subject() const;
00352
void setSubject(const QString& aStr);
00353
00355
void initStrippedSubjectMD5() {};
00356
00363
static QString replacePrefixes(
const QString& str,
00364
const QStringList& prefixRegExps,
00365
bool replace,
00366
const QString& newPrefix );
00367
00370
static QString stripOffPrefixes(
const QString& str );
00371
00378 QString cleanSubject(
const QStringList& prefixRegExps,
bool replace,
00379
const QString& newPrefix)
const;
00380
00383 QString cleanSubject() const;
00384
00386 QString forwardSubject() const;
00387
00389 QString replySubject() const;
00390
00392 QString xmark() const;
00393
void setXMark(const QString& aStr);
00394
00396 QString replyToId() const;
00397
void setReplyToId(const QString& aStr);
00398 QString replyToIdMD5() const;
00399
00414 QString replyToAuxIdMD5() const;
00415
00420 QString strippedSubjectMD5() const;
00421
00426 QString subjectMD5() const;
00427
00429
bool subjectIsPrefixed() const;
00430
00432 QString msgId() const;
00433
void setMsgId(const QString& aStr);
00434 QString msgIdMD5() const;
00435
00437 QString references() const;
00438
void setReferences(const QCString& aStr);
00439
00441 QCString
id() const;
00442
00445
void setMsgSerNum(
unsigned long newMsgSerNum = 0);
00446
00448 QString headerField(const QCString& name) const;
00449
void setHeaderField(const QCString& name, const QString& value);
00450
00452 QString allHeaderFields(const QCString& aName) const;
00453
00455 QCString rawHeaderField( const QCString & name ) const;
00456
00460 KMime::Types::AddressList headerAddrField(const QCString& name) const;
00461 KMime::Types::AddrSpecList extractAddrSpecs( const QCString & headerNames ) const;
00462
00464
void removeHeaderField(const QCString& name);
00465
00469 QCString typeStr() const;
00470
int type() const;
00471
void setTypeStr(const QCString& aStr);
00472
void setType(
int aType);
00474 QCString subtypeStr() const;
00475
int subtype() const;
00476
void setSubtypeStr(const QCString& aStr);
00477
void setSubtype(
int aSubtype);
00479 static
void setDwMediaTypeParam( DwMediaType &mType,
00480 const QCString& attr,
00481 const QCString& val );
00483
void setContentTypeParam(const QCString& attr, const QCString& val);
00484
00488 DwHeaders& headers() const;
00489
00494
void setNeedsAssembly();
00495
00499 QCString contentTransferEncodingStr() const;
00500
int contentTransferEncoding() const;
00501
void setContentTransferEncodingStr(const QCString& aStr);
00502
void setContentTransferEncoding(
int aCte);
00503
00506 QCString cteStr()
const {
return contentTransferEncodingStr(); }
00507
int cte()
const {
return contentTransferEncoding(); }
00508
void setCteStr(
const QCString& aStr) { setContentTransferEncodingStr(aStr); }
00509
void setCte(
int aCte) { setContentTransferEncoding(aCte); }
00510
00514
void setBodyFromUnicode(
const QString & str );
00515
00518 QString bodyToUnicode(
const QTextCodec* codec=0)
const;
00519
00521 QCString body() const;
00522
00524
void setBody(const QCString& aStr);
00525
00527
void setMultiPartBody( const QCString & aStr );
00528
00532
void setBodyEncoded(const QCString& aStr);
00533
void setBodyEncodedBinary(const QByteArray& aStr);
00534
00538 static QValueList<
int> determineAllowedCtes( const KMime::CharFreq& cf,
00539
bool allow8Bit,
00540
bool willBeSigned );
00541
00551
void setBodyAndGuessCte( const QByteArray& aBuf,
00552 QValueList<
int>& allowedCte,
00553
bool allow8Bit = false,
00554
bool willBeSigned = false );
00555
void setBodyAndGuessCte( const QCString& aBuf,
00556 QValueList<
int>& allowedCte,
00557
bool allow8Bit = false,
00558
bool willBeSigned = false );
00559
00563 QCString bodyDecoded() const;
00564 QByteArray bodyDecodedBinary() const;
00565
00568
int numBodyParts() const;
00569
00572 DwBodyPart * findDwBodyPart(
int type,
int subtype ) const;
00573
00576 DwBodyPart* findDwBodyPart( DwBodyPart* part, const QString & partSpecifier );
00577
00580 DwBodyPart * dwBodyPart(
int aIdx ) const;
00581
00584
int partNumber( DwBodyPart * aDwBodyPart ) const;
00585
00588 DwBodyPart * getFirstDwBodyPart() const;
00589
00593 static
void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart,
00594
bool withBody = true );
00595
00599
void bodyPart(
int aIdx, KMMessagePart* aPart) const;
00600
00602 DwBodyPart* createDWBodyPart(const KMMessagePart* aPart);
00603
00605
void addDwBodyPart(DwBodyPart * aDwPart);
00606
00608
void addBodyPart(const KMMessagePart* aPart);
00609
00611
void deleteBodyParts();
00612
00615
void setStatusFields();
00616
00621 static QString generateMessageId( const QString& addr );
00622
00628 static QCString html2source( const QCString & src );
00629
00632 static QCString lf2crlf( const QCString & src );
00633
00636 static QString encodeMailtoUrl( const QString& str );
00637
00640 static QString decodeMailtoUrl( const QString& url );
00641
00648 static QCString stripEmailAddr(const QCString& emailAddr);
00649
00652 static QString stripEmailAddr(const QString& emailAddr);
00653
00658 static QCString getEmailAddr(const QString& emailAddr);
00659
00665 static QString quoteHtmlChars( const QString& str,
00666
bool removeLineBreaks = false );
00667
00672 static QString emailAddrAsAnchor(const QString& emailAddr,
00673
bool stripped=TRUE);
00674
00676 static QStringList splitEmailAddrList(const QString&);
00677
00681 static QStringList stripAddressFromAddressList( const QString& address,
00682 const QStringList& addresses );
00683
00687 static QStringList stripMyAddressesFromAddressList( const QStringList& list );
00688
00691 static
bool addressIsInAddressList( const QString& address,
00692 const QStringList& addresses );
00693
00697 static QString expandAliases( const QString& recipients );
00698
00702 static QString guessEmailAddressFromLoginName( const QString& userName );
00703
00704
00706 static QCString defaultCharset();
00707
00709 static const QStringList &preferredCharsets();
00710
00713 QString replaceHeadersInString( const QString & s ) const;
00714
00716 QCString charset() const;
00717
00719
void setCharset(const QCString& aStr);
00720
00722 const QTextCodec * codec() const;
00723
00725
void setOverrideCodec( const QTextCodec* codec ) { mOverrideCodec = codec; }
00726
00728
void setDecodeHTML(
bool aDecodeHTML)
00729 { mDecodeHTML = aDecodeHTML; }
00730
00733
static void readConfig();
00734
00738 QCString getRefStr() const;
00739
00741 off_t folderOffset()
const {
return mFolderOffset; }
00742
void setFolderOffset(off_t offs) {
if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(TRUE); } }
00743
00745 QString fileName()
const {
return mFileName; }
00746
void setFileName(
const QString& file) {
if(mFileName != file) { mFileName=file; setDirty(TRUE); } }
00747
00751 size_t msgSize()
const {
return mMsgSize; }
00752
void setMsgSize(size_t sz) {
if(mMsgSize != sz) { mMsgSize = sz; setDirty(TRUE); } }
00753
00756 size_t msgLength()
const
00757
{
return (mMsgLength) ? mMsgLength : mMsgSize; }
00758
void setMsgLength(size_t sz) { mMsgLength = sz; }
00759
00761 KMMsgStatus status()
const {
return mStatus; }
00763
void setStatus(
const KMMsgStatus status,
int idx = -1);
00764
void setStatus(
const char* s1,
const char* s2=0) { KMMsgBase::setStatus(s1, s2); }
00765
00767
void setEncryptionState(
const KMMsgEncryptionState,
int idx = -1);
00768
00770
void setSignatureState(
const KMMsgSignatureState,
int idx = -1);
00771
00772
void setMDNSentState( KMMsgMDNSentState status,
int idx=-1 );
00773
00775 KMMsgEncryptionState encryptionState()
const {
return mEncryptionState; }
00776
00778 KMMsgSignatureState signatureState()
const {
return mSignatureState; }
00779
00780 KMMsgMDNSentState mdnSentState()
const {
return mMDNSentState; }
00781
00783
void link(
const KMMessage *aMsg, KMMsgStatus aStatus);
00786
void getLink(
int n, ulong *retMsgSerNum, KMMsgStatus *retStatus)
const;
00787
00789 QString formatString(
const QString&) const;
00790
00792
void updateBodyPart(const QString partSpecifier, const QByteArray & data);
00793
00795 DwBodyPart* lastUpdatedPart() {
return mLastUpdated; }
00796
00797
private:
00813 QString asQuotedString(
const QString & headerStr,
00814
const QString & indentStr,
00815
const QString & selection=QString::null,
00816
bool aStripSignature=
true,
00817
bool allowDecryption=
true)
const;
00818
00821 QString asPlainText(
bool stripSignature,
bool allowDecryption )
const;
00822
00823
void assign(
const KMMessage& other );
00824
00825 QString mDrafts;
00826
mutable DwMessage* mMsg;
00827
mutable bool mNeedsAssembly;
00828
bool mDecodeHTML;
00829
static const KMail::HeaderStrategy * sHeaderStrategy;
00830
static QString sForwardStr;
00831
const QTextCodec * mOverrideCodec;
00832
00833 QString mFileName;
00834 off_t mFolderOffset;
00835 size_t mMsgSize, mMsgLength;
00836 time_t mDate;
00837 KMMsgEncryptionState mEncryptionState;
00838 KMMsgSignatureState mSignatureState;
00839 KMMsgMDNSentState mMDNSentState;
00840 KMMessage* mUnencryptedMsg;
00841 DwBodyPart* mLastUpdated;
00842 };
00843
00844
00845
#endif