acl  3.5.3.0
stream.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/string.hpp"
4 #include "../stdlib/noncopyable.hpp"
5 #include <map>
6 
7 struct ACL_VSTREAM;
8 
9 namespace acl {
10 
11 /**
12  * 时间单位类型
13  */
14 typedef enum {
15  time_unit_s, // 秒
16  time_unit_ms, // 毫秒
17  time_unit_us, // 微秒
18  time_unit_ns, // 纳秒
19 } time_unit_t;
20 
21 class stream_hook;
22 class dbuf_pool;
23 
25 {
26 public:
27  stream(void);
28  virtual ~stream(void) = 0;
29 
30  /**
31  * 调用本函数关闭流连接
32  * @return {bool} true: 关闭成功; false: 关闭失败
33  */
34  bool close(void);
35 
36  /**
37  * 判断流是否已经结束
38  * @return {bool} true: 流已经结束; false: 流未结束
39  */
40  bool eof(void) const;
41 
42  /**
43  * 清除流结束标志位,即将 eof_ 标志位置为 false
44  */
45  void clear_eof(void);
46 
47  /**
48  * 当前流是否处理打开状态
49  * @return {bool} true: 流已经打开; false: 流未打开
50  */
51  bool opened(void) const;
52 
53  /**
54  * 获得当前流的 ACL_VSTREAM 流对象
55  * @return {ACL_VSTREAM*}
56  */
57  ACL_VSTREAM* get_vstream(void) const;
58 
59  /**
60  * 解绑 ACL_VSTREAM 与流对象的绑定关系,同时将 ACL_VSTREAM 返回
61  * 给用户,即将该 ACL_VSTREAM的管理权交给用户,本流对象在释放时
62  * 不会关闭该 ACL_VSTREAM ,但用户接管该 ACL_VSTREAM 后用完后
63  * 必须将其关闭;解绑后除了 close/open 的调用有意义外,其它的调用
64  * (包括流对象读写在内)都无意义
65  * @return {ACL_VSTREAM} 返回 NULL 表示流对象已经将 ACL_VSTREAM 解绑
66  */
67  ACL_VSTREAM* unbind(void);
68 
69  /**
70  * 设置流的绑定对象
71  * @param ctx {void*}
72  * @param key {const char* } 标识该 ctx 的键
73  * @param replace {bool} 当对应的 KEY 存在时是否允许覆盖
74  * @return {bool} 当 replace 为 false 且 key 已经存在时则返回 false
75  */
76  bool set_ctx(void* ctx, const char* key = NULL, bool replace = true);
77 
78  /**
79  * 获得与流绑定的对象
80  * @param key {const char* key} 非空时使用该 key 查询对应的 ctx 对象,
81  * 否则返回缺省的 ctx 对象
82  * @return {void*}
83  */
84  void* get_ctx(const char* key = NULL) const;
85 
86  /**
87  * 删除流中绑定的对象
88  * @param key {const char*} 非空时删除对应该 key 的 ctx 对象,否则删除
89  * 缺省的 ctx 对象
90  * @return {void*} 当对象不存在时返回 NULL,成功删除后返回该对象
91  */
92  void* del_ctx(const char* key = NULL);
93 
94  /**
95  * 设置流的读写超时时间,只有当内部流对象建立后调用本方法才有效
96  * @param n {int} 超时时间,该值 > 0 则启用超时检测过程,否则将会一直阻塞直到
97  * 可读或出错,该值的单位取决 于第二个参数
98  */
99  void set_rw_timeout(int n);
100 
101  /**
102  * 设置内部超时时间单位类型,只有当内部流对象建立后调用本方法才有效
103  * @param unit {time_unit_t} 时间单位类型
104  */
105  void set_time_unit(time_unit_t unit);
106 
107  /**
108  * 获得当前流的读写超时时间
109  * @return {int} 获得流的读写超时时间(秒)
110  */
111  int get_rw_timeout(void) const;
112 
113  /**
114  * 注册读写流对象,内部会自动调用 hook->open 过程,如果成功,则返回之前注册的对象
115  * (可能为NULL),若失败则返回与输入参数相同的指针,应用可以通过判断返回值与输入值
116  * 是否相同来判断注册流对象是否成功
117  * xxx: 在调用此方法前必须保证流连接已经创建
118  * @param hook {stream_hook*} 非空对象指针
119  * @return {stream_hook*} 返回值与输入值不同则表示成功
120  */
121  stream_hook* setup_hook(stream_hook* hook);
122 
123  /**
124  * 获得当前注册的流读写对象
125  * @return {stream_hook*}
126  */
127  stream_hook* get_hook(void) const;
128 
129  /**
130  * 删除当前注册的流读写对象并返回该对象,恢复缺省的读写过程
131  * @return {stream_hook*}
132  */
133  stream_hook* remove_hook(void);
134 
135 public:
136  /**
137  * 因为 stream 的生命周期较长,使用者使用 stream 对象中的内部缓存区可以
138  * 适当减少缓存区的频繁创建与释放
139  * @return {string&}
140  */
141  string& get_buf(void);
142 
143  /**
144  * 获得与 stream 生命周期相同的 dbuf 内存分配器
145  * @return {dbuf_pool&}
146  */
147  dbuf_pool& get_dbuf(void);
148 
149 protected:
150  /**
151  * 打开流对象,如果流已经打开,则不会重复打开
152  */
153  void open_stream(bool is_file = false);
154 
155  /**
156  * 重新打开流对象,如果流已经打开则先释放流对象再打开
157  */
158  void reopen_stream(bool is_file = false);
159 
160 protected:
163  string* buf_;
165 
167  std::map<string, void*>* ctx_table_;
168 
169  bool eof_;
170  bool opened_;
171 
172 private:
173 #if defined(_WIN32) || defined(_WIN64)
174  static int read_hook(SOCKET fd, void *buf, size_t len,
175  int timeout, ACL_VSTREAM* stream, void *ctx);
176  static int send_hook(SOCKET fd, const void *buf, size_t len,
177  int timeout, ACL_VSTREAM* stream, void *ctx);
178 
179  static int fread_hook(HANDLE fd, void *buf, size_t len,
180  int timeout, ACL_VSTREAM* stream, void *ctx);
181  static int fsend_hook(HANDLE fd, const void *buf, size_t len,
182  int timeout, ACL_VSTREAM* stream, void *ctx);
183 #else
184  static int read_hook(int fd, void *buf, size_t len,
185  int timeout, ACL_VSTREAM* stream, void *ctx);
186  static int send_hook(int fd, const void *buf, size_t len,
187  int timeout, ACL_VSTREAM* stream, void *ctx);
188 
189  static int fread_hook(int fd, void *buf, size_t len,
190  int timeout, ACL_VSTREAM* stream, void *ctx);
191  static int fsend_hook(int fd, const void *buf, size_t len,
192  int timeout, ACL_VSTREAM* stream, void *ctx);
193 #endif
194 };
195 
196 } // namespace acl
string * buf_
Definition: stream.hpp:163
ACL_VSTREAM * stream_
Definition: stream.hpp:162
void * default_ctx_
Definition: stream.hpp:166
std::map< string, void * > * ctx_table_
Definition: stream.hpp:167
time_unit_t
Definition: stream.hpp:14
bool eof_
Definition: stream.hpp:169
bool opened_
Definition: stream.hpp:170
stream_hook * hook_
Definition: stream.hpp:161
#define ACL_CPP_API
dbuf_pool * dbuf_
Definition: stream.hpp:164