acl  3.5.3.0
rfc2047.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include <list>
5 
6 #if !defined(ACL_MIME_DISABLE)
7 
8 namespace acl {
9 
10 class string;
11 class mime_code;
12 
14 {
15  string* pData; // 数据内容
16  string* pCharset; // 字符集
17  char coding; // 编码格式,B 表示 BASE64, Q 表示 QP
18 };
19 
21 {
22 public:
23  /**
24  * 构造函数
25  * @param strip_sp {bool} 在解码过程中是否去掉回车换行符及每行开头的
26  * 空格及TAB
27  * @param addCrlf {bool} 在编码过程中当数据比较长时是否自动添加 "\r\n"
28  */
29  rfc2047(bool strip_sp = true, bool addCrlf = true);
30  ~rfc2047(void);
31 
32  /**
33  * 流式解析数据, 可以循环调用此函数, 每次添加部分数据
34  * 直至添加完毕
35  * @param in {const char*} 输入源字符串
36  * @param n {int} in 输入串的长度
37  */
38  void decode_update(const char* in, int n);
39 
40  /**
41  * 将 rfc2047 解析结果转换成指定的字符集字符串, 如果不能
42  * 正确转换则保留源串内容
43  * @param to_charset {const char*} 目标字符集
44  * @param out {string*} 存储转换结果
45  * @param addInvalid {bool} 当为 true 时,则转码过程中如果遇到了
46  * 非法字符集,则直接拷贝,否则则跳过,默认情况下是直接拷贝
47  * @return {bool} 转换是否成功
48  */
49  bool decode_finish(const char* to_charset, string* out,
50  bool addInvalid = true);
51 
52  /**
53  * rfc2047 编码过程中添加数据
54  * @param in {const char*} 输入数据
55  * @param n {int} in 数据长度
56  * @param out {string*} 存储编码结果
57  * @param charset {const char*} 输入数据的字符集类型
58  * @param coding {char} 编码类型,支持的编码类型有:
59  * B: base64, Q: quoted_printable
60  * @return {bool} 检查输入参数是否正确且编码是否成功
61  */
62  bool encode_update(const char* in, int n, string* out,
63  const char* charset = "gb2312", char coding = 'B');
64 
65  /**
66  * 将 encode_update 添加的数据进行编码后存储于用户指定缓冲区
67  * @param out {string*} 存储编码结果的用户缓冲区
68  * @return {bool} 是否成功
69  */
70  bool encode_finish(string* out);
71 
72  /**
73  * 静态编码器
74  * @param in {const char*} 输入数据地址
75  * @param n {int} 数据长度
76  * @param out {string*} 存储编码结果的缓冲区
77  * @param charset {const char*} 输入数据的字符集
78  * @param coding {char} 编码类型,支持的编码类型有:
79  * B: base64, Q: quoted_printable
80  * @param addCrlf {bool} 在编码过程中当数据比较长时是否自动添加 "\r\n"
81  * @return {bool} 编码是否成功
82  */
83  static bool encode(const char* in, int n, string* out,
84  const char* charset = "gb2312", char coding = 'B',
85  bool addCrlf = true);
86 
87  /**
88  * 静态解码器
89  * @param in {const char*} 输入数据地址
90  * @param n {int} 数据长度
91  * @param out {string*} 存储解码结果的缓冲区
92  * @param to_charset {const char*} 目标字符集
93  * @param strip_sp {bool} 是否去掉回车换行符及每行开头的空格及TAB
94  * @param addInvalid {bool} 当为 true 时,则转码过程中如果遇到了
95  * 非法字符集,则直接拷贝,否则则跳过,默认情况下是直接拷贝
96  * @return {bool} 解码是否成功
97  */
98  static bool decode(const char* in, int n, string* out,
99  const char* to_charset = "gb2312", bool strip_sp = false,
100  bool addInvalid = true);
101 
102  /**
103  * 将解析结果以链表的形式给出
104  * @return {const std::list<rfc2047_entry*>&}
105  */
106  const std::list<rfc2047_entry*>& get_list(void) const;
107 
108  /**
109  * 重置解析器状态后, 该解析器可再次使用
110  * @param strip_sp {bool} 是否去掉回车换行符及每行开头的空格及TAB
111  */
112  void reset(bool strip_sp = true);
113 
114  /**
115  * 调试输出解析结果
116  */
117  void debug_rfc2047(void) const;
118 
119 private:
120  std::list<rfc2047_entry*> m_List;
121  rfc2047_entry* m_pCurrentEntry;
122  mime_code* m_coder;
123  int m_status;
124  bool m_stripSp;
125  bool m_addCrlf;
126  char m_lastCh;
127 
128 public:
129  // 以下函数仅内部使用
130 
131  int status_next(const char* s, int n);
132  int status_data(const char* s, int n);
133  int status_charset(const char* s, int n);
134  int status_coding(const char* s, int n);
135  int status_equal_question(const char* s, int n);
136  int status_question_first(const char* s, int n);
137  int status_question_second(const char* s, int n);
138  int status_question_equal(const char* s, int n);
139 };
140 
141 } // namespace acl
142 
143 #endif // !defined(ACL_MIME_DISABLE)
string * pCharset
Definition: rfc2047.hpp:16
string * pData
Definition: rfc2047.hpp:15
#define ACL_CPP_API