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
13
struct
rfc2047_entry
14
{
15
string
*
pData
;
// 数据内容
16
string
*
pCharset
;
// 字符集
17
char
coding
;
// 编码格式,B 表示 BASE64, Q 表示 QP
18
};
19
20
class
ACL_CPP_API
rfc2047
:
public
noncopyable
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)
acl::mime_code
Definition:
mime_code.hpp:11
acl::rfc2047_entry::pCharset
string * pCharset
Definition:
rfc2047.hpp:16
acl::rfc2047_entry::coding
char coding
Definition:
rfc2047.hpp:17
acl
Definition:
acl_cpp_init.hpp:4
acl::noncopyable
Definition:
noncopyable.hpp:6
acl::rfc2047
Definition:
rfc2047.hpp:20
acl::rfc2047_entry
Definition:
rfc2047.hpp:13
acl::rfc2047_entry::pData
string * pData
Definition:
rfc2047.hpp:15
ACL_CPP_API
#define ACL_CPP_API
Definition:
acl_cpp_define.hpp:16
include
acl_cpp
mime
rfc2047.hpp
生成于 2021年 九月 10日 星期五 11:14:44 , 为 acl使用
1.8.15