acl  3.5.3.0
mime_node.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <stdlib.h>
4 #include <map>
5 #include "../stdlib/noncopyable.hpp"
6 #include "../stdlib/string.hpp"
7 
8 #if !defined(ACL_MIME_DISABLE)
9 
10 struct MIME_NODE;
11 
12 namespace acl {
13 
14 class pipe_manager;
15 class ostream;
16 class ifstream;
17 
19 {
20 public:
21  /**
22  * 构造函数
23  * @param emailFile {const char*} 存储邮件内容的源文件,可以
24  * 为空,但当为空时在调用 save_body 函数时,则不能指定源文件
25  * @param node {const MIME_NODE*} 邮件中的某个结点对象
26  * @param enableDecode {bool} 当邮件内容为 base64/qp 等编码格式
27  * 时是否需要自动进行解码
28  * @param toCharset {const char*} 缺省的目标字符集,如果目标
29  * 字符集与源字符集不同,则进行字符集转换
30  * @param off {off_t} 邮件内容在整个数据中的起始位置中附加的
31  * 相对偏移量,以便于用户可以在邮件内容前面加自己的私有数据
32  */
33  mime_node(const char* emailFile, const MIME_NODE* node,
34  bool enableDecode = true, const char* toCharset = "gb2312",
35  off_t off = 0);
36  virtual ~mime_node(void);
37 
38  /**
39  * 获得 MIME 结点中 Content-Type 值中的 name 字段值
40  * @return {const char*} 如果为空则表示没有该字段值
41  */
42  const char* get_name(void) const
43  {
44  if (m_name.empty())
45  return NULL;
46  return m_name.c_str();
47  }
48 
49  /**
50  * 获得 Content-Type 中的主类型,如: Content-Type: image/jpeg, 则本
51  * 函数返回 MIME_CTYPE_IMAGE (在 mime_define.hpp 中定义)
52  * @return {int} 返回 mime_define.hpp 中定义的 MIME_CTYPE_XXX
53  */
54  int get_ctype(void) const
55  {
56  return m_ctype;
57  }
58 
59  /**
60  * 获得 Content-Type 中的从类型,如: Content-Type: image/jpeg, 则本
61  * 函数返回 MIME_STYPE_JPEG (在 mime_define.hpp 中定义)
62  * @return {int} 返回 mime_define.hpp 中定义的 MIME_STYPE_XXX
63  */
64  int get_stype(void) const
65  {
66  return m_stype;
67  }
68 
69  /**
70  * 获得 Content-Type 中的主类型,以字符串方式表示
71  * @return {const char*} 返回 "" 表示不存在
72  */
73  const char* get_ctype_s(void) const;
74 
75  /**
76  * 获得 Content-Type 中的从类型,以字符串方式表示
77  * @return {const char*} 返回 "" 表示不存在
78  */
79  const char* get_stype_s(void) const;
80 
81  /**
82  * 获得传输编码类型 (对应于 Content-Transfer-Encoding)
83  * @return {int} 返回 mime_define.hpp 中定义的 MIME_ENC_XXX
84  */
85  int get_encoding(void) const
86  {
87  return m_encoding;
88  }
89 
90  /**
91  * 获得结点字符集字符串(对应于 Content-Type 中的 charset 字段)
92  * @return {const char*} 为空则表示没有该字段
93  */
94  const char* get_charset(void) const
95  {
96  return m_charset;
97  }
98 
99  /**
100  * 获得目标字符集, 由用户在构造函数中传入
101  * @return {const char*} 为空则表示用户未设置
102  */
103  const char* get_toCharset(void) const
104  {
105  if (m_toCharset[0])
106  return m_toCharset;
107  else
108  return NULL;
109  }
110 
111  /**
112  * 获得本结点在邮件中的起始偏移量
113  * @return {off_t}
114  */
115  off_t get_bodyBegin(void) const
116  {
117  return m_bodyBegin;
118  }
119 
120  /**
121  * 获得本结点在邮件中的结束偏移量
122  * @return {off_t}
123  */
124  off_t get_bodyEnd(void) const
125  {
126  return m_bodyEnd;
127  }
128 
129  /**
130  * 获得本结点头部中某个字段的值
131  * @param name {const char*} 字段名, 如: Content-Type
132  * @return {const char*} 为空则表示不存在
133  */
134  const char* header_value(const char* name) const;
135 
136  /**
137  * 取得该结点的所有头部字段集合
138  * @return {const std::map<string, string>&}
139  */
140  const std::map<string, string>& get_headers(void) const;
141 
142  /**
143  * 转储本结点内容于指定的管道流中
144  * @param out {pipe_manager&}
145  * @return {bool} 是否成功
146  */
147  bool save(pipe_manager& out) const;
148 
149  /**
150  * 转储本结点内容于指定的管道流中
151  * @param out {pipe_manager&}
152  * @param src {const char*} 邮件内容的起始地址,如果为空指针,
153  * 则从构造函数中所提供的 emailFile 的文件中提取邮件内容
154  * @param len {int} 邮件内容的数据长度,如果为0,则从构造
155  * 函数中所提供的 emailFile 的文件中提取邮件内容
156  * @return {bool} 是否成功
157  */
158  bool save(pipe_manager& out, const char* src, int len) const;
159 
160  /**
161  * 转储本结点内容于指定的输出流中
162  * @param out {ostream&} 流出流
163  * @param src {const char*} 邮件内容的起始地址,如果为空指针,
164  * 则从构造函数中所提供的 emailFile 的文件中提取邮件内容
165  * @param len {int} 邮件内容的数据长度,如果为0,则从构造
166  * 函数中所提供的 emailFile 的文件中提取邮件内容
167  * @return {bool} 是否成功
168  */
169  bool save(ostream& out, const char* src = NULL, int len = 0) const;
170 
171  /**
172  * 转储本结点内容于指定的文件中
173  * @param outFile {const char*} 目标文件名
174  * @param src {const char*} 邮件内容的起始地址,如果为空指针,
175  * 则从构造函数中所提供的 emailFile 的文件中提取邮件内容
176  * @param len {int} 邮件内容的数据长度,如果为0,则从构造
177  * 函数中所提供的 emailFile 的文件中提取邮件内容
178  * @return {bool} 是否成功
179  */
180  bool save(const char* outFile, const char* src = NULL, int len = 0) const;
181 
182  /**
183  * 转储本结点内容于缓冲区中
184  * @param out {string&} 缓冲区
185  * @param src {const char*} 邮件内容的起始地址,如果为空指针,
186  * 则从构造函数中所提供的 emailFile 的文件中提取邮件内容
187  * @param len {int} 邮件内容的数据长度,如果为0,则从构造
188  * 函数中所提供的 emailFile 的文件中提取邮件内容
189  * @return {bool} 是否成功
190  */
191  bool save(string& out, const char* src, int len) const;
192 
193  /**
194  * 获得本结点对应的父结点对象
195  * @return {mime_node*} 为空则表示本结点没有父结点(则说明
196  * 本结点为邮件的根结点); 否则则返回的父结点需要在用完后
197  * delete 掉以释放相应内存
198  */
199  mime_node* get_parent(void) const;
200 
201  /**
202  * 判断本结点是否有父结点
203  * @return {bool} true 则表示有父结点, 否则表示没有
204  */
205  bool has_parent(void) const;
206 
207  /**
208  * 获得父结点的主类型 (MIME_CTYPE_XXX), 如果为 MIME_CTYPE_OTHER
209  * 则说明父结点不存在或父结点的主类型未知
210  * @return {int} MIME_CTYPE_XXX
211  */
212  int parent_ctype(void) const;
213  const char* parent_ctype_s(void) const;
214 
215  /**
216  * 获得父结点的从类型 (MIME_STYPE_XXX), 如果为 MIME_STYPE_OTHER
217  * 则说明父结点不存在或父结点的从类型未知
218  * @return {int} MIME_STYPE_XXX
219  */
220  int parent_stype(void) const;
221  const char* parent_stype_s(void) const;
222 
223  /**
224  * 获得父结点的编码类型 (MIME_ENC_XXX), 如果返回值为 MIME_ENC_OTHER
225  * 则说明父结点不存在或父结点的编码类型未知
226  * @return {int} MIME_ENC_XXX
227  */
228  int parent_encoding(void) const;
229 
230  /**
231  * 获得父结点的字符集类型, 如果返回值为空则说明父结点不存在或父结点
232  * 中没有字符集类型
233  * @return {const char*}
234  */
235  char* parent_charset(void) const;
236 
237  /**
238  * 获得父结点的数据体起始偏移量
239  * @return {off_t} 返回值为 -1 表示父结点不存在
240  */
241  off_t parent_bodyBegin(void) const;
242 
243  /**
244  * 获得父结点的数据体结束偏移量
245  * @return {off_t} 返回值为 -1 表示父结点不存在
246  */
247  off_t parent_bodyEnd(void) const;
248 
249  /**
250  * 获得父结点头部中某个字段名对应的字段值, 如: Content-Type
251  * @param name {const char*} 字段名
252  * @return {const char*} 字段值, 返回空则说明父结点不存在
253  * 或父结点头部中不存在该字段
254  */
255  const char* parent_header_value(const char* name) const;
256 
257 protected:
259  string m_name;
260  string m_emailFile;
261  int m_ctype; // mime_define.hpp
262  int m_stype; // mime_define.hpp
263  int m_encoding; // mime_define.hpp
264  char m_charset[32];
265  char m_toCharset[32];
266  off_t m_bodyBegin;
267  off_t m_bodyEnd;
268  std::map<string, string>* m_headers_;
269  const MIME_NODE* m_pMimeNode;
271 };
272 
273 } // namespace acl
274 
275 #endif // !defined(ACL_MIME_DISABLE)
const MIME_NODE * m_pMimeNode
Definition: mime_node.hpp:269
int get_stype(void) const
Definition: mime_node.hpp:64
const char * get_charset(void) const
Definition: mime_node.hpp:94
HTTP_API void const char * name
Definition: lib_http.h:620
const char * get_toCharset(void) const
Definition: mime_node.hpp:103
int get_ctype(void) const
Definition: mime_node.hpp:54
string m_emailFile
Definition: mime_node.hpp:260
int get_encoding(void) const
Definition: mime_node.hpp:85
mime_node * m_pParent
Definition: mime_node.hpp:270
off_t get_bodyEnd(void) const
Definition: mime_node.hpp:124
const char * get_name(void) const
Definition: mime_node.hpp:42
#define ACL_CPP_API
off_t get_bodyBegin(void) const
Definition: mime_node.hpp:115
std::map< string, string > * m_headers_
Definition: mime_node.hpp:268