1+ /* *
2+ *
3+ * @file BufferNode.h
4+ * @author An Tao
5+ *
6+ * Public header file in trantor lib.
7+ *
8+ * Copyright 2018, An Tao. All rights reserved.
9+ * Use of this source code is governed by a BSD-style license
10+ * that can be found in the License file.
11+ *
12+ *
13+ */
14+
15+ #pragma once
16+ #ifdef _WIN32
17+ #include < stdio.h>
18+ #endif
19+ #include < trantor/utils/MsgBuffer.h>
20+ #include < trantor/utils/NonCopyable.h>
21+ #include < trantor/utils/Logger.h>
22+ #include < functional>
23+ #include < memory>
24+ #include < string>
25+
26+ namespace trantor
27+ {
28+ class BufferNode ;
29+ using BufferNodePtr = std::shared_ptr<BufferNode>;
30+ using StreamCallback = std::function<std::size_t (char *, std::size_t )>;
31+ class BufferNode : public NonCopyable
32+ {
33+ public:
34+ virtual bool isFile () const
35+ {
36+ return false ;
37+ }
38+ virtual ~BufferNode () = default ;
39+ virtual bool isStream () const
40+ {
41+ return false ;
42+ }
43+ virtual void getData (const char *&data, size_t &len) = 0;
44+ virtual void append (const char *, size_t )
45+ {
46+ LOG_FATAL << " Not a memory buffer node" ;
47+ }
48+ virtual void retrieve (size_t len) = 0;
49+ virtual long long remainingBytes () const = 0;
50+ virtual int getFd () const
51+ {
52+ LOG_FATAL << " Not a file buffer node" ;
53+ return -1 ;
54+ }
55+ virtual bool available () const
56+ {
57+ return true ;
58+ }
59+ virtual bool isAsync () const
60+ {
61+ return false ;
62+ }
63+
64+ void done ()
65+ {
66+ isDone_ = true ;
67+ }
68+ static BufferNodePtr newMemBufferNode ();
69+
70+ static BufferNodePtr newStreamBufferNode (StreamCallback &&cb);
71+ #ifdef _WIN32
72+ static BufferNodePtr newFileBufferNode (const wchar_t *fileName,
73+ long long offset,
74+ long long length);
75+ #else
76+ static BufferNodePtr newFileBufferNode (const char *fileName,
77+ long long offset,
78+ long long length);
79+ #endif
80+ static BufferNodePtr newAsyncStreamBufferNode ();
81+
82+ protected:
83+ bool isDone_{false };
84+ };
85+
86+ } // namespace trantor
0 commit comments