xref: /haiku/headers/os/mail/MailComponent.h (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved.
3  * Copyright 2004-2017, Haiku, Inc. All rights reserved.
4  * Distributed under the terms of the MIT License.
5  */
6 #ifndef _MAIL_COMPONENT_H
7 #define _MAIL_COMPONENT_H
8 
9 
10 #include <UTF8.h>
11 #include <Message.h>
12 #include <String.h>
13 
14 #include <mail_encoding.h>
15 
16 
17 class BMimeType;
18 
19 extern const char* kHeaderCharsetString;
20 extern const char* kHeaderEncodingString;
21 // Special field names in the headers which specify the character set (int32)
22 // and encoding (int8) to use when converting the headers from UTF-8 to the
23 // output e-mail format (rfc2047).  For use with SetHeaderField when you pass
24 // it a structured header in a BMessage.
25 
26 
27 enum component_type {
28 	B_MAIL_PLAIN_TEXT_BODY = 0,
29 	B_MAIL_SIMPLE_ATTACHMENT,
30 	B_MAIL_ATTRIBUTED_ATTACHMENT,
31 	B_MAIL_MULTIPART_CONTAINER
32 };
33 
34 
35 class BMailComponent {
36 public:
37 								BMailComponent(
38 									uint32 defaultCharSet = B_MAIL_NULL_CONVERSION);
39 	virtual						~BMailComponent();
40 
41 			uint32				ComponentType();
42 			BMailComponent*		WhatIsThis();
43 			bool				IsAttachment();
44 
45 			void				SetHeaderField(const char *key,
46 									const char *value,
47 									uint32 charset = B_MAIL_NULL_CONVERSION,
48 									mail_encoding encoding = null_encoding,
49 									bool replace_existing = true);
50 			void				SetHeaderField(const char *key,
51 									BMessage *structured_header,
52 									bool replace_existing = true);
53 
54 			const char* 		HeaderAt(int32 index) const;
55 			const char*			HeaderField(const char *key,
56 									int32 index = 0) const;
57 			status_t			HeaderField(const char *key,
58 									BMessage *structured_header,
59 									int32 index = 0) const;
60 
61 			status_t			RemoveHeader(const char *key);
62 
63 	virtual status_t 			GetDecodedData(BPositionIO *data);
64 	virtual status_t 			SetDecodedData(BPositionIO *data);
65 
66 	virtual status_t 			SetToRFC822(BPositionIO *data, size_t length,
67 									bool parse_now = false);
68 	virtual status_t 			RenderToRFC822(BPositionIO *render_to);
69 
70 	virtual status_t 			MIMEType(BMimeType *mime);
71 
72 protected:
73 		uint32 _charSetForTextDecoding;
74 			// This is the character set to be used for decoding text
75 			// components, or if it is B_MAIL_NULL_CONVERSION then the character
76 			// set will be determined automatically.  Since we can't use a
77 			// global variable (different messages might have different values
78 			// of this), and since sub-components can't find their parents,
79 			// this is passed down during construction to some (just Component,
80 			// Container, Message, MIME, Text) child components and ends up
81 			// being used in the text components.
82 
83 private:
84 		virtual void _ReservedComponent1();
85 		virtual void _ReservedComponent2();
86 		virtual void _ReservedComponent3();
87 		virtual void _ReservedComponent4();
88 		virtual void _ReservedComponent5();
89 
90 		BMessage headers;
91 
92 		uint32 _reserved[5];
93 };
94 
95 
96 class BTextMailComponent : public BMailComponent {
97 	public:
98 		BTextMailComponent(const char *text = NULL, uint32 defaultCharSet = B_MAIL_NULL_CONVERSION);
99 		virtual ~BTextMailComponent();
100 
101 		void SetEncoding(mail_encoding encoding, int32 charset);
102 			// encoding: you should always use quoted_printable, base64 is strongly not
103 			//		recommended, see rfc 2047 for the reasons why
104 			// charset: use Conversion flavor constants from UTF8.h
105 
106 		void SetText(const char *text);
107 		void AppendText(const char *text);
108 
109 		const char *Text();
110 		BString *BStringText();
111 
112 		void Quote(const char *message = NULL,
113 				   const char *quote_style = "> ");
114 
115 		virtual status_t GetDecodedData(BPositionIO *data);
116 		virtual status_t SetDecodedData(BPositionIO *data);
117 
118 		virtual status_t SetToRFC822(BPositionIO *data, size_t length, bool parse_now = false);
119 		virtual status_t RenderToRFC822(BPositionIO *render_to);
120 
121 	private:
122 		virtual void _ReservedText1();
123 		virtual void _ReservedText2();
124 
125 		BString text;
126 		BString decoded;
127 
128 		mail_encoding encoding;
129 		uint32 charset; // This character set is used for encoding, not decoding.
130 
131 		status_t ParseRaw();
132 		BPositionIO *raw_data;
133 		size_t raw_length;
134 		off_t raw_offset;
135 
136 		uint32 _reserved[5];
137 };
138 
139 #endif // _MAIL_COMPONENT_H
140