kmail

kmmessage.h
1 /* kmmessage.h: Mime Message Class
2  *
3  */
4 #ifndef kmmessage_h
5 #define kmmessage_h
6 
9 // for large file support
10 #include <config.h>
11 #include <sys/types.h>
12 
13 #include <mimelib/string.h>
14 #include "kmmsgbase.h"
15 #include "isubject.h"
16 
17 #include <kmime_mdn.h>
18 
19 #include<libemailfunctions/email.h>
20 
21 template <typename T>
22 class TQValueList;
23 
24 class TQStringList;
25 class TQString;
26 class TQTextCodec;
27 class TQStrList;
28 
29 class KMFolder;
30 class KMFolderIndex;
31 class DwMessage;
32 class KMMessagePart;
33 class KMMsgInfo;
34 class KMHeaders;
35 class KMForwardDigestCommand;
36 
37 namespace KMime {
38  class CharFreq;
39  namespace Types {
40  class AddrSpec;
41  class Address;
42  typedef TQValueList<Address> AddressList;
43  typedef TQValueList<AddrSpec> AddrSpecList;
44  }
45 }
46 
47 namespace KMail {
48  class HeaderStrategy;
49 }
50 
51 class DwEntity;
52 class DwBodyPart;
53 class DwMediaType;
54 class DwHeaders;
55 
56 class partNode;
57 
58 namespace KMail {
59  enum ReplyStrategy { ReplySmart = 0,
60  ReplyAuthor,
61  ReplyList,
62  ReplyAll,
63  ReplyNone };
64 }
65 
67 class KMMessage: public KMMsgBase, public KMail::ISubject
68 {
69  friend class ::KMForwardDigestCommand; // needed for MIME Digest forward
70 
71 public:
72  // promote some of KMMsgBase's methods to public:
73  using KMMsgBase::parent;
74  using KMMsgBase::setParent;
75  using KMMsgBase::enableUndo; // KMFolder
76  using KMMsgBase::setEnableUndo; // dto.
77  using KMMsgBase::isRead; // dto.
78  using KMMsgBase::isUnread; // dto.
79  using KMMsgBase::isNew; // dto.
80  using KMMsgBase::isOld;
81  using KMMsgBase::isWatched;
82  using KMMsgBase::isIgnored;
83  using KMMsgBase::setEncryptionStateChar; // KMAcct*
84  using KMMsgBase::setSignatureStateChar; // dto.
85 
87  KMMessage(KMFolder* parent=0);
88 
92  KMMessage(DwMessage*);
93 
95  KMMessage(KMMsgInfo& msgInfo);
96 
98  KMMessage( const KMMessage& other );
99 
100 #if 0 // currently unused
102  const KMMessage& operator=( const KMMessage& other ) {
103  if( &other == this )
104  return *this;
105  assign( other );
106  return *this;
107  }
108 #endif
109 
111  virtual ~KMMessage();
112 
114  KMMsgBase & toMsgBase() { return *this; }
115  const KMMsgBase & toMsgBase() const { return *this; }
116 
118  bool isMessage() const;
119 
123  bool isUrgent() const;
124 
131  void setUnencryptedMsg( KMMessage* unencrypted );
132 
134  bool hasUnencryptedMsg() const { return 0 != mUnencryptedMsg; }
135 
137  KMMessage* unencryptedMsg() const { return mUnencryptedMsg; }
138 
145  {
146  KMMessage* ret = mUnencryptedMsg;
147  mUnencryptedMsg = 0;
148  return ret;
149  }
150 
152  void del() { setStatus(KMMsgStatusDeleted); }
153 
155  void undel() { setStatus(KMMsgStatusOld); }
156 
158  void touch() { setStatus(KMMsgStatusOld); }
159 
163  KMMessage* createReply( KMail::ReplyStrategy replyStrategy = KMail::ReplySmart,
164  TQString selection=TQString(), bool noQuote = false,
165  bool allowDecryption = true,
166  const TQString &tmpl = TQString(),
167  const TQString &originatingAccount = TQString() );
168 
176  KMMessage* createRedirect( const TQString &toStr );
177 
179  TQCString createForwardBody();
180 
184  KMMessage* createForward( const TQString &tmpl = TQString() );
185 
189  KMMessage* createDeliveryReceipt() const;
190 
204  KMMessage* createMDN( KMime::MDN::ActionMode a,
205  KMime::MDN::DispositionType d,
206  bool allowGUI=false,
207  TQValueList<KMime::MDN::DispositionModifier> m=TQValueList<KMime::MDN::DispositionModifier>() );
208 
210  void sanitizeHeaders( const TQStringList& whiteList = TQStringList() );
211 
213  void fromDwString(const DwString& str, bool setStatus=false);
214  void fromString(const TQCString& str, bool setStatus=false);
215  void fromByteArray(const TQByteArray & ba, bool setStatus=false);
216 
221  const DwString& asDwString() const;
222  const DwMessage *asDwMessage();
223 
231  TQCString asString() const;
232 
237  TQByteArray asSendableString() const;
238 
243  TQCString headerAsSendableString() const;
244 
248  void removePrivateHeaderFields();
249 
251  DwMediaType& dwContentType();
252 
254  TQString headerAsString() const;
255 
260  void parseTextStringFromDwPart( partNode * root,
261  TQCString& parsedString,
262  const TQTextCodec*& codec,
263  bool& isHTML ) const;
264 
268  void initHeader(uint identity=0);
269 
272  void initFromMessage(const KMMessage *msg, bool idHeaders = true);
273 
279  uint identityUoid() const;
280 
283  void applyIdentity( uint id );
284 
287  void cleanupHeader();
288 
294  void setAutomaticFields(bool isMultipart=false);
295 
297  TQString dateStr() const;
300  TQCString dateShortStr() const;
301  TQString dateIsoStr() const;
302  time_t date() const;
303  void setDate(const TQCString& str);
304  void setDate(time_t aUnixTime);
305 
307  void setDateToday();
308 
310  TQString to() const;
311  void setTo(const TQString& aStr);
312  TQString toStrip() const;
313 
315  TQString replyTo() const;
316  void setReplyTo( const TQString &aStr );
317  void setReplyTo(KMMessage*);
318 
320  TQString cc() const;
321  void setCc( const TQString &aStr );
322  TQString ccStrip() const;
323 
325  TQString bcc() const;
326  void setBcc( const TQString &aStr );
327 
329  TQString fcc() const;
330  void setFcc( const TQString &aStr );
331 
333  TQString drafts() const { return mDrafts; }
334  void setDrafts( const TQString &aStr );
335 
337  TQString templates() const { return mTemplates; }
338  void setTemplates( const TQString &aStr );
339 
341  TQString from() const;
342  void setFrom(const TQString& aStr);
343  TQString fromStrip() const;
344 
347  TQString sender() const;
348 
352  TQString who() const;
353 
355  TQString subject() const;
356  void setSubject(const TQString& aStr);
357 
360 
362  TQString xmark() const;
363  void setXMark(const TQString& aStr);
364 
366  TQString replyToId() const;
367  void setReplyToId(const TQString& aStr);
368  TQString replyToIdMD5() const;
369 
384  TQString replyToAuxIdMD5() const;
385 
390  TQString strippedSubjectMD5() const;
391 
402  static KPIM::EmailParseResult isValidEmailAddressList( const TQString& aStr,
403  TQString& brokenAddress );
404 
409  TQString subjectMD5() const;
410 
412  bool subjectIsPrefixed() const;
413 
415  TQString msgId() const;
416  void setMsgId(const TQString& aStr);
417  TQString msgIdMD5() const;
418 
420  TQString references() const;
421  void setReferences(const TQCString& aStr);
422 
424  TQCString id() const;
425 
430  void setMsgSerNum(unsigned long newMsgSerNum = 0);
431 
436  TQString headerField(const TQCString& name) const;
437 
438  enum HeaderFieldType { Unstructured, Structured, Address };
439 
444  void setHeaderField( const TQCString& name, const TQString& value,
445  HeaderFieldType type = Unstructured,
446  bool prepend = false );
447 
449  TQStringList headerFields( const TQCString& name ) const;
450 
455  TQCString rawHeaderField( const TQCString & name ) const;
456 
460  TQValueList<TQCString> rawHeaderFields( const TQCString & field ) const;
461 
463  static KMime::Types::AddressList splitAddrField( const TQCString & str );
464 
468  KMime::Types::AddressList headerAddrField(const TQCString& name) const;
469  KMime::Types::AddrSpecList extractAddrSpecs( const TQCString & headerNames ) const;
470 
472  void removeHeaderField(const TQCString& name);
473 
475  void removeHeaderFields(const TQCString& name);
476 
480  TQCString typeStr() const;
481  int type() const;
482  void setTypeStr(const TQCString& aStr);
483  void setType(int aType);
485  TQCString subtypeStr() const;
486  int subtype() const;
487  void setSubtypeStr(const TQCString& aStr);
488  void setSubtype(int aSubtype);
490  static void setDwMediaTypeParam( DwMediaType &mType,
491  const TQCString& attr,
492  const TQCString& val );
494  void setContentTypeParam(const TQCString& attr, const TQCString& val);
495 
499  DwHeaders& headers() const;
500 
505  void setNeedsAssembly();
506 
511  void assembleIfNeeded();
512 
521  TQCString contentTransferEncodingStr() const;
522  int contentTransferEncoding( DwEntity *entity = 0 ) const;
523  void setContentTransferEncodingStr( const TQCString& cteString, DwEntity *entity = 0 );
524  void setContentTransferEncoding( int cte, DwEntity *entity = 0 );
525 
530  TQCString cteStr() const { return contentTransferEncodingStr(); }
531  int cte( DwEntity *entity = 0 ) const { return contentTransferEncoding( entity ); }
532  void setCteStr( const TQCString& aStr, DwEntity *entity = 0 ) {
533  setContentTransferEncodingStr( aStr, entity );
534  }
535  void setCte( int aCte, DwEntity *entity = 0 ) {
536  setContentTransferEncoding( aCte, entity );
537  }
538 
546  void setBodyFromUnicode( const TQString & str, DwEntity *entity = 0 );
547 
550  TQString bodyToUnicode(const TQTextCodec* codec=0) const;
551 
553  TQCString body() const;
554 
556  void setBody(const TQCString& aStr);
557  void setBody(const DwString& aStr);
558  void setBody(const char* aStr); // avoid ambiguous calls
559 
561  void setMultiPartBody( const TQCString & aStr );
562 
572  void setBodyEncoded( const TQCString& aStr, DwEntity *entity = 0 );
573  void setBodyEncodedBinary( const TQByteArray& aStr, DwEntity *entity = 0 );
574 
578  static TQValueList<int> determineAllowedCtes( const KMime::CharFreq& cf,
579  bool allow8Bit,
580  bool willBeSigned );
581 
595  void setBodyAndGuessCte( const TQByteArray& aBuf, TQValueList<int>& allowedCte,
596  bool allow8Bit = false,
597  bool willBeSigned = false,
598  DwEntity *entity = 0 );
599 
600  void setBodyAndGuessCte( const TQCString& aBuf,
601  TQValueList<int>& allowedCte,
602  bool allow8Bit = false,
603  bool willBeSigned = false,
604  DwEntity *entity = 0 );
605 
609  TQCString bodyDecoded() const;
610  TQByteArray bodyDecodedBinary() const;
611 
614  int numBodyParts() const;
615 
618  DwBodyPart * findDwBodyPart( int type, int subtype ) const;
619 
622  DwBodyPart * findDwBodyPart( const TQCString& type, const TQCString& subtype ) const;
623 
626  DwBodyPart* findDwBodyPart( DwBodyPart* part, const TQString & partSpecifier );
627 
630  DwBodyPart * dwBodyPart( int aIdx ) const;
631 
634  int partNumber( DwBodyPart * aDwBodyPart ) const;
635 
638  DwBodyPart * getFirstDwBodyPart() const;
639  DwMessage * getTopLevelPart() const { return mMsg; }
640 
644  static void bodyPart(DwBodyPart* aDwBodyPart, KMMessagePart* aPart,
645  bool withBody = true );
646 
650  void bodyPart(int aIdx, KMMessagePart* aPart) const;
651 
653  DwBodyPart* createDWBodyPart(const KMMessagePart* aPart);
654 
656  void addDwBodyPart(DwBodyPart * aDwPart);
657 
659  void addBodyPart(const KMMessagePart* aPart);
660 
662  void deleteBodyParts();
663 
668  bool deleteBodyPart( int partIndex );
669 
672  void setStatusFields();
673 
678  static TQString generateMessageId( const TQString& addr );
679 
685  static TQCString html2source( const TQCString & src );
686 
689  static TQString encodeMailtoUrl( const TQString& str );
690 
693  static TQString decodeMailtoUrl( const TQString& url );
694 
701  static TQCString stripEmailAddr(const TQCString& emailAddr);
702 
705  static TQString stripEmailAddr(const TQString& emailAddr);
706 
712  static TQString quoteHtmlChars( const TQString& str,
713  bool removeLineBreaks = false );
714 
719  static TQString emailAddrAsAnchor(const TQString& emailAddr,
720  bool stripped=true, const TQString& cssStyle = TQString(), bool link = true);
721 
725  static TQStringList stripAddressFromAddressList( const TQString& address,
726  const TQStringList& addresses );
727 
731  static TQStringList stripMyAddressesFromAddressList( const TQStringList& list );
732 
735  static bool addressIsInAddressList( const TQString& address,
736  const TQStringList& addresses );
737 
741  static TQString expandAliases( const TQString& recipients );
742 
746  static TQString guessEmailAddressFromLoginName( const TQString& userName );
747 
754  static TQString smartQuote( const TQString &msg, int maxLineLength );
755 
757  static TQCString defaultCharset();
758 
760  static const TQStringList &preferredCharsets();
761 
763  TQString replaceHeadersInString( const TQString & s ) const;
764 
766  TQCString charset() const;
767 
776  void setCharset( const TQCString& charset, DwEntity *entity = 0 );
777 
779  const TQTextCodec * codec() const;
780 
782  void setOverrideCodec( const TQTextCodec* codec ) { mOverrideCodec = codec; }
783 
785  void setDecodeHTML(bool aDecodeHTML)
786  { mDecodeHTML = aDecodeHTML; }
787 
790  static void readConfig();
791 
795  TQCString getRefStr() const;
796 
798  off_t folderOffset() const { return mFolderOffset; }
799  void setFolderOffset(off_t offs) { if(mFolderOffset != offs) { mFolderOffset=offs; setDirty(true); } }
800 
802  TQString fileName() const { return mFileName; }
803  void setFileName(const TQString& file) { if(mFileName != file) { mFileName=file; setDirty(true); } }
804 
806  TQString originatingAccountName() const { return mOriginatingAccountName; }
807  void setOriginatingAccountName(const TQString& account) { if(mOriginatingAccountName != account) { mOriginatingAccountName=account; setDirty(true); } }
808 
812  size_t msgSize() const { return mMsgSize; }
813  void setMsgSize(size_t sz) { if(mMsgSize != sz) { mMsgSize = sz; setDirty(true); } }
814 
817  size_t msgLength() const
818  { return (mMsgLength) ? mMsgLength : mMsgSize; }
819  void setMsgLength(size_t sz) { mMsgLength = sz; }
820 
822  size_t msgSizeServer() const;
823  void setMsgSizeServer(size_t sz);
824 
826  ulong UID() const;
827  void setUID(ulong uid);
828 
830  KMMsgStatus status() const { return mStatus; }
832  void setStatus(const KMMsgStatus status, int idx = -1);
833  void setStatus(const char* s1, const char* s2=0) { KMMsgBase::setStatus(s1, s2); }
834 
836  void setEncryptionState(const KMMsgEncryptionState, int idx = -1);
837 
839  void setSignatureState(const KMMsgSignatureState, int idx = -1);
840 
841  void setMDNSentState( KMMsgMDNSentState status, int idx=-1 );
842 
844  KMMsgEncryptionState encryptionState() const { return mEncryptionState; }
845 
847  KMMsgSignatureState signatureState() const { return mSignatureState; }
848 
849  KMMsgMDNSentState mdnSentState() const { return mMDNSentState; }
850 
852  void link(const KMMessage *aMsg, KMMsgStatus aStatus);
855  void getLink(int n, ulong *retMsgSerNum, KMMsgStatus *reStatus) const;
856 
858  TQString formatString(const TQString&) const;
859 
861  void updateBodyPart(const TQString partSpecifier, const TQByteArray & data);
862 
864  DwBodyPart* lastUpdatedPart() { return mLastUpdated; }
865 
867  bool isComplete() const { return mComplete; }
869  void setComplete( bool v ) { mComplete = v; }
870 
872  bool readyToShow() const { return mReadyToShow; }
874  void setReadyToShow( bool v ) { mReadyToShow = v; }
875 
876  void updateAttachmentState( DwBodyPart *part = 0 );
877  void updateInvitationState();
878 
880  bool transferInProgress() const;
882  void setTransferInProgress(bool value, bool force = false);
883 
888  TQCString mboxMessageSeparator();
889 
905  TQString asQuotedString( const TQString & headerStr,
906  const TQString & indentStr,
907  const TQString & selection=TQString(),
908  bool aStripSignature=true,
909  bool allowDecryption=true) const;
910 
913  TQString asPlainText( bool stripSignature, bool allowDecryption ) const;
914 
921  TQString asPlainTextFromObjectTree( partNode *root, bool stripSignature,
922  bool allowDecryption ) const;
923 
925  int getCursorPos() { return mCursorPos; };
927  void setCursorPos(int pos) { mCursorPos = pos; };
928 
930  KMMsgInfo* msgInfo() { return mMsgInfo; }
932  void setMsgInfo( KMMsgInfo* msgInfo ) { mMsgInfo = msgInfo; }
933 
934  /* This is set in kmreaderwin if a message is being parsed to avoid
935  other parts of kmail (e.g. kmheaders) destroying the message.
936  Parsing can take longer and can be async (in case of gpg mails) */
937  bool isBeingParsed() const { return mIsParsed; }
938  void setIsBeingParsed( bool t ) { mIsParsed = t; }
939 
941  void deleteWhenUnused();
942 
943  DwBodyPart* findPart( int index );
944 
945 private:
946 
948  void init( DwMessage* aMsg = 0 );
950  void assign( const KMMessage& other );
951 
952  DwBodyPart* findPartInternal( DwEntity* root, int index, int &accu );
953 
954  TQString mDrafts;
955  TQString mTemplates;
956  mutable DwMessage* mMsg;
957  mutable bool mNeedsAssembly :1;
958  bool mDecodeHTML :1;
959  bool mReadyToShow :1;
960  bool mComplete :1;
961  bool mIsParsed : 1;
962  static const KMail::HeaderStrategy * sHeaderStrategy;
963  static TQString sForwardStr;
964  const TQTextCodec * mOverrideCodec;
965 
966  TQString mFileName;
967  TQString mOriginatingAccountName;
968  off_t mFolderOffset;
969  size_t mMsgSize, mMsgLength;
970  time_t mDate;
971  KMMsgEncryptionState mEncryptionState;
972  KMMsgSignatureState mSignatureState;
973  KMMsgMDNSentState mMDNSentState;
974  KMMessage* mUnencryptedMsg;
975  DwBodyPart* mLastUpdated;
976  int mCursorPos;
977  KMMsgInfo* mMsgInfo; // used to remember the KMMsgInfo object this KMMessage replaced in the KMMsgList
978  static TQValueList<KMMessage*> sPendingDeletes;
979 };
980 
981 
982 #endif /*kmmessage_h*/
A FolderStorage with an index for faster access to often used message properties.
Definition: kmfolderindex.h:38
Mail folder.
Definition: kmfolder.h:69
The widget that shows the contents of folders.
Definition: kmheaders.h:47
This is a Mime Message.
Definition: kmmessage.h:68
TQString originatingAccountName() const
Get/set originating account name.
Definition: kmmessage.h:806
void undel()
Undelete the message.
Definition: kmmessage.h:155
void setReadyToShow(bool v)
Set if the message is ready to be shown.
Definition: kmmessage.h:874
void touch()
Touch the message - mark it as read.
Definition: kmmessage.h:158
TQString templates() const
Get or set the 'Templates' folder.
Definition: kmmessage.h:337
KMMessage * unencryptedMsg() const
Returns an unencrypted copy of this message or 0 if none exists.
Definition: kmmessage.h:137
bool readyToShow() const
Return if the message is ready to be shown.
Definition: kmmessage.h:872
void setOverrideCodec(const TQTextCodec *codec)
Set the charset the user selected for the message to display.
Definition: kmmessage.h:782
void del()
Mark the message as deleted.
Definition: kmmessage.h:152
void setDecodeHTML(bool aDecodeHTML)
Allow decoding of HTML for quoting.
Definition: kmmessage.h:785
TQCString cteStr() const
Cte is short for ContentTransferEncoding.
Definition: kmmessage.h:530
KMMsgEncryptionState encryptionState() const
Encryption status of the message.
Definition: kmmessage.h:844
size_t msgLength() const
Unlike the above function this works also, if the message is not in a folder.
Definition: kmmessage.h:817
KMMsgInfo * msgInfo()
Get the KMMsgInfo object that was set with setMsgInfo().
Definition: kmmessage.h:930
void setComplete(bool v)
Set if the message is a complete message.
Definition: kmmessage.h:869
KMMsgStatus status() const
Status of the message.
Definition: kmmessage.h:830
TQString fileName() const
Get/set filename in mail folder.
Definition: kmmessage.h:802
int getCursorPos()
Get stored cursor position.
Definition: kmmessage.h:925
off_t folderOffset() const
Get/set offset in mail folder.
Definition: kmmessage.h:798
KMMessage(KMFolder *parent=0)
Straight forward initialization.
Definition: kmmessage.cpp:97
size_t msgSize() const
Get/set size of message in the folder including the whole header in bytes.
Definition: kmmessage.h:812
void initStrippedSubjectMD5()
Calculate strippedSubject.
Definition: kmmessage.h:359
TQString drafts() const
Get or set the 'Drafts' folder.
Definition: kmmessage.h:333
KMMsgBase & toMsgBase()
Get KMMsgBase for this object.
Definition: kmmessage.h:114
bool hasUnencryptedMsg() const
Returns TRUE if the message contains an unencrypted copy of itself.
Definition: kmmessage.h:134
bool isComplete() const
Return true if the complete message is available without referring to the backing store.
Definition: kmmessage.h:867
KMMessage * takeUnencryptedMsg()
Returns an unencrypted copy of this message or 0 if none exists.
Definition: kmmessage.h:144
void setMsgInfo(KMMsgInfo *msgInfo)
Set the KMMsgInfo object corresponding to this message.
Definition: kmmessage.h:932
KMMsgSignatureState signatureState() const
Signature status of the message.
Definition: kmmessage.h:847
void setCursorPos(int pos)
Set cursor position as offset from message start.
Definition: kmmessage.h:927
DwBodyPart * lastUpdatedPart()
Returns the last DwBodyPart that was updated.
Definition: kmmessage.h:864
TQString decodeMailtoUrl(const TQString &url)
Decodes a mailto URL.
Definition: stringutil.cpp:38
TQString encodeMailtoUrl(const TQString &str)
Encodes an email address as mailto URL.
Definition: stringutil.cpp:29
folderdiaquotatab.h
Definition: aboutdata.cpp:40