You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
210 lines
6.5 KiB
210 lines
6.5 KiB
/* Virtual base class for messages and message infos |
|
* Author: Stefan Taferner <taferner@kde.org> |
|
* This code is under GPL. |
|
*/ |
|
#ifndef kmmsgbase_h |
|
#define kmmsgbase_h |
|
|
|
#include <qstring.h> |
|
#include <time.h> |
|
|
|
class QCString; |
|
class QStringList; |
|
class QTextCodec; |
|
class KMFolder; |
|
|
|
|
|
typedef enum |
|
{ |
|
KMMsgStatusUnknown=' ', |
|
KMMsgStatusNew='N', |
|
KMMsgStatusUnread='U', |
|
KMMsgStatusRead='R', |
|
KMMsgStatusOld='O', |
|
KMMsgStatusDeleted='D', |
|
KMMsgStatusReplied='A', |
|
KMMsgStatusForwarded='F', |
|
KMMsgStatusQueued='Q', |
|
KMMsgStatusSent='S', |
|
KMMsgStatusFlag='G' |
|
} KMMsgStatus; |
|
|
|
|
|
class KMMsgBase |
|
{ |
|
public: |
|
KMMsgBase(KMFolder* p=NULL); |
|
virtual ~KMMsgBase(); |
|
|
|
/** Convert the given message status to a string. */ |
|
static const char* statusToStr(KMMsgStatus aStatus); |
|
|
|
/** Return owning folder. */ |
|
KMFolder* parent(void) const { return mParent; } |
|
|
|
/** Set owning folder. */ |
|
void setParent(KMFolder* p) { mParent=p; } |
|
|
|
/** Returns TRUE if object is a real message (not KMMsgInfo or KMMsgBase) */ |
|
virtual bool isMessage(void) const; |
|
|
|
/** Returns TRUE if status is new or unread. */ |
|
virtual bool isUnread(void) const; |
|
|
|
/** Returns TRUE if status is new. */ |
|
virtual bool isNew(void) const; |
|
|
|
/** Status of the message. */ |
|
virtual KMMsgStatus status(void) const = 0; |
|
|
|
/** Set status and mark dirty. Optional optimization: @p idx may |
|
* specify the index of this message within the parent folder. */ |
|
virtual void setStatus(const KMMsgStatus status, int idx = -1); |
|
virtual void setStatus(const char* statusField, const char* xstatusField=0); |
|
|
|
/** Important header fields of the message that are also kept in the index. */ |
|
virtual QString subject(void) const = 0; |
|
virtual QString fromStrip(void) const = 0; |
|
virtual QString toStrip(void) const = 0; |
|
virtual QString replyToIdMD5(void) const = 0; |
|
virtual QString msgIdMD5(void) const = 0; |
|
virtual time_t date(void) const = 0; |
|
virtual QString dateStr(void) const; |
|
virtual QString xmark(void) const = 0; |
|
|
|
/** Set date. */ |
|
virtual void setDate(const QCString &aStrDate); |
|
virtual void setDate(time_t aUnixTime) = 0; |
|
|
|
/** Returns TRUE if changed since last folder-sync. */ |
|
virtual bool dirty(void) const { return mDirty; } |
|
|
|
/** Change dirty flag. */ |
|
void setDirty(bool b) { mDirty = b; } |
|
|
|
/** Set subject/from/date and xmark. */ |
|
virtual void setSubject(const QString&) = 0; |
|
virtual void setXMark(const QString&) = 0; |
|
|
|
/** Return contents as index string. This string is of indexStringLength() size */ |
|
const uchar *asIndexString(int &len) const; |
|
|
|
/** Get/set offset in mail folder. */ |
|
virtual unsigned long folderOffset(void) const = 0; |
|
virtual void setFolderOffset(unsigned long offs) = 0; |
|
|
|
/** Get/set msg filename */ |
|
virtual QString fileName(void) const = 0; |
|
virtual void setFileName(const QString& filename) = 0; |
|
|
|
/** Get/set size of message including the whole header in bytes. */ |
|
virtual unsigned long msgSize(void) const = 0; |
|
virtual void setMsgSize(unsigned long sz) = 0; |
|
|
|
/** offset into index file */ |
|
virtual void setIndexOffset(long off) { mIndexOffset = off; } |
|
virtual long indexOffset() const { return mIndexOffset; } |
|
|
|
/** size in index file */ |
|
virtual void setIndexLength(short len) { mIndexLength = len; } |
|
virtual short indexLength() const { return mIndexLength; } |
|
|
|
/** Skip leading keyword if keyword has given character at it's end |
|
* (e.g. ':' or ',') and skip the then following blanks (if any) too. |
|
* If keywordFound is specified it will be TRUE if a keyword was skipped |
|
* and FALSE otherwise. */ |
|
static QString skipKeyword(const QString& str, QChar sepChar=':', |
|
bool* keywordFound=NULL); |
|
|
|
/** Return a QTextCodec for the specified charset. |
|
* This function is a bit more tolerant, than QTextCodec::codecForName */ |
|
static QTextCodec* codecForName(const QCString& _str); |
|
|
|
/** Convert all non-ascii characters to question marks |
|
* If ok is non-null, *ok will be set to true if all characters |
|
* where ascii, *ok will be set to false otherwise */ |
|
static const QCString toUsAscii(const QString& _str, bool *ok=0); |
|
|
|
/** Return a list of the supported encodings */ |
|
static QStringList supportedEncodings(bool usAscii); |
|
|
|
/** Copy all values from other to this object. */ |
|
void assign(const KMMsgBase* other); |
|
|
|
/** Assignment operator that simply calls assign(). */ |
|
KMMsgBase& operator=(const KMMsgBase& other); |
|
|
|
/** En-/decode given string to/from quoted-printable. */ |
|
static QCString decodeQuotedPrintable(const QCString& str); |
|
static QCString encodeQuotedPrintable(const QCString& str); |
|
|
|
/** En/-decode given string to/from Base64. */ |
|
static QCString decodeBase64(const QCString& str); |
|
static QCString encodeBase64(const QCString& str); |
|
|
|
/** Helper function for encodeRFC2047String */ |
|
static QCString encodeRFC2047Quoted(const QCString& aStr, bool base64); |
|
|
|
/** This function handles both encodings described in RFC2047: |
|
Base64 ("=?iso-8859-1?b?...?=") and quoted-printable */ |
|
static QString decodeRFC2047String(const QCString& aStr); |
|
|
|
/** Encode given string as described in RFC2047: |
|
using quoted-printable. */ |
|
static QCString encodeRFC2047String(const QString& aStr, |
|
const QCString& charset); |
|
|
|
/** Encode given string as described in RFC2231 |
|
(parameters in MIME headers) */ |
|
static QCString encodeRFC2231String(const QString& aStr, |
|
const QCString& charset); |
|
|
|
/** Decode given string as described in RFC2231 */ |
|
static QString decodeRFC2231String(const QCString& aStr); |
|
|
|
/** |
|
* Find out preferred charset for 'text'. |
|
* First @p encoding is tried and if that one is not suitable, |
|
* the encodings in @p encodingList are tried. |
|
*/ |
|
static QCString autoDetectCharset(const QCString &encoding, const QStringList &encodingList, const QString &text); |
|
|
|
/** Returns the message serial number for the message. */ |
|
virtual unsigned long getMsgSerNum() const; |
|
|
|
protected: |
|
KMFolder* mParent; |
|
bool mDirty; |
|
long mIndexOffset; |
|
short mIndexLength; |
|
|
|
public: |
|
enum MsgPartType |
|
{ |
|
MsgNoPart = 0, |
|
//unicode strings |
|
MsgFromPart = 1, |
|
MsgSubjectPart = 2, |
|
MsgToPart = 3, |
|
MsgReplyToIdMD5Part = 4, |
|
MsgIdMD5Part = 5, |
|
MsgXMarkPart = 6, |
|
//unsigned long |
|
MsgOffsetPart = 7, |
|
MsgStatusPart = 8, |
|
MsgSizePart = 9, |
|
MsgDatePart = 10, |
|
MsgFilePart = 11 |
|
}; |
|
/** access to long msgparts */ |
|
unsigned long getLongPart(MsgPartType) const; |
|
/** access to string msgparts */ |
|
QString getStringPart(MsgPartType) const; |
|
/** sync'ing just one KMMsgBase */ |
|
bool syncIndexString() const; |
|
|
|
}; |
|
|
|
typedef KMMsgBase* KMMsgBasePtr; |
|
|
|
#endif /*kmmsgbase_h*/
|
|
|