acl  3.5.3.0
mime_code.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/pipe_stream.hpp"
4 
5 #if !defined(ACL_MIME_DISABLE)
6 
7 namespace acl {
8 
9 class string;
10 
12 {
13 public:
14  /**
15  * 构造函数
16  * @param addCrlf {bool} 非流式编码时是否在末尾添加 "\r\n"
17  * @param addInvalid {bool} 流式解码时是否遇到非法字符是否原样拷贝
18  * @param encoding_type {const char*} 编码类型标识符
19  */
20  mime_code(bool addCrlf, bool addInvalid, const char* encoding_type);
21  virtual ~mime_code(void) = 0;
22 
23  /**
24  * 获得编码类型标识符
25  * @return {const char*}
26  */
27  const char* get_encoding_type(void) const
28  {
29  return encoding_type_;
30  }
31 
32  /* 流式编码函数,使用方法: encode_update->encode_update->...->encode_finish */
33 
34  /**
35  * 编码过程, 添加源数据, 结果存于 out 中, 如果输入的
36  * 数据不满足编码时缓存条件, 则内部仅临时缓存而不做编码
37  * @param src {const char*} 源数据地址
38  * @param n {int} 源数据长度
39  * @param out {string*} 存储编码结果, 可以通过比较
40  * 调用此函数前后的 out->length() 来判断该函数是进行了
41  * 编码过程还是临时缓存过程; 如果使用了 out 中的结果数据,
42  * 则用完后应该调用 out->clear() 清空用过的数据
43  */
44  virtual void encode_update(const char *src, int n,
45  string* out);
46 
47  /**
48  * 编码结束后需要调用此函数来对可能存在于临时缓存中的
49  * 源数据进行最后的编码
50  * @param out {string*} 存储编码结果, 可以通过比较
51  * 调用此函数前后的 out->length() 来判断该函数是进行了
52  * 编码过程还是临时缓存过程; 如果使用了 out 中的结果数据,
53  * 则用完后应该调用 out->clear() 清空用过的数据
54  */
55  virtual void encode_finish(string* out);
56 
57  /* 流式解码函数,使用方法: decode_update->decode_update->...->decode_finish */
58 
59  /**
60  * 解码过程, 添加经过编码的数据, 经本函数后进行解码, 如果
61  * 输入的数据不满足解码时的字节数条件, 则内部仅是临时缓存
62  * 该数据, 等满足解码条件时才进行解码
63  * @param src {const char*} 经过编码后的数据
64  * @param n {int} 数据长度
65  * @param out {string*} 存储解码结果, 可以通过比较
66  * 调用此函数前后的 out->length() 来判断该函数是进行了
67  * 解码过程还是临时缓存过程; 如果使用了 out 中的结果数据,
68  * 则用完后应该调用 out->clear() 清空用过的数据
69  */
70  virtual void decode_update(const char *src, int n, string* out);
71 
72  /**
73  * 解码结束后需要调用此函数来对可能存在于临时缓存中的
74  * 源数据进行最后的解码
75  * @param out {string*} 存储解码结果, 可以通过比较
76  * 调用此函数前后的 out->length() 来判断该函数是进行了
77  * 解码过程还是临时缓存过程; 如果使用了 out 中的结果数据,
78  * 则用完后应该调用 out->clear() 清空用过的数据
79  */
80  virtual void decode_finish(string* out);
81 
82  /**
83  * 重置内部缓冲区
84  */
85  virtual void reset(void);
86 
87  /**
88  * 在编码过程中设置是否自动在每个编码段添加 "\r\n"
89  * @param on {bool}
90  */
91  virtual void add_crlf(bool on);
92 
93  /**
94  * 在解码过程中如果遇到非法字符是否将其添加在解码结果中
95  * @param on {bool}
96  */
97  virtual void add_invalid(bool on);
98 
99  /**
100  * 根据输入的编码表生成相应的解码表
101  * @param toTab {const unsigned char*} 编码表字符串
102  * @param out {string*} 存储结果
103  */
104  static void create_decode_tab(const unsigned char *toTab, string *out);
105 
106  /**
107  * 如果子类未重载以上虚函数而因此使用基类的以上默认虚函数时
108  * 则子类必须调用此函数设置自己的编码表, 解码表及填充字符
109  * @param toTab {const unsigned char*} 编码表
110  * @param unTab {const unsigned char*} 解码表
111  * @param fillChar {unsigned char} 填充字符
112  */
113  void init(const unsigned char* toTab,
114  const unsigned char* unTab, unsigned char fillChar);
115 
116  /**
117  * 设置转码器的工作状态,因为该转码器由编码器和解码器组成,
118  * 所以在使用 pipe_stream 方式工作时必须指定该转码器的状态
119  * 以指定是处于编码器状态还是解码器状态
120  * @param encoding {bool} 如果为 true 表示为编码器状态,否则
121  * 为解码器状态
122  */
123  void set_status(bool encoding = true);
124 
125  // pipe_stream 虚函数重载
126 
127  virtual int push_pop(const char* in, size_t len,
128  string* out, size_t max = 0);
129  virtual int pop_end(string* out, size_t max = 0);
130  virtual void clear(void);
131 
132  /**
133  * 静态函数,根据编码类型 MIME_ENC_XXX (参见:mime_define.hpp) 获得
134  * 对应的编解码对象,当有当 encoding 类型为 MIME_ENC_QP,
135  * MIME_ENC_BASE64, MIME_ENC_UUCODE, MIME_ENC_XXCODE
136  * @param encoding {int} 编码类型,只能为 MIME_ENC_QP, MIME_ENC_BASE64,
137  * MIME_ENC_UUCODE, MIME_ENC_XXCODE
138  * @param warn_unsupport {bool} 当未找到匹配的编码对象时是否记录警告信息
139  * @return {mime_code*} 编码对象,当未找到匹配的编码类型时返回 NULL
140  */
141  static mime_code* create(int encoding, bool warn_unsupport = true);
142 
143 private:
144  void encode(string* out);
145  void decode(string* out);
146 
147  char m_encodeBuf[57];
148  int m_encodeCnt;
149  char m_decodeBuf[76];
150  int m_decodeCnt;
151  bool m_addCrLf;
152  bool m_addInvalid;
153  bool m_encoding;
154  const unsigned char *m_toTab;
155  const unsigned char *m_unTab;
156  unsigned char m_fillChar;
157  string* m_pBuf;
158  char* encoding_type_;
159 };
160 
161 } // namespace acl
162 
163 #endif // !defined(ACL_MIME_DISABLE)
const char * get_encoding_type(void) const
Definition: mime_code.hpp:27
#define ACL_CPP_API