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