![]() |
CircularBuffer Class ReferenceBuffer class containing one read/write circular buffer.
More...
|
Public Member Functions | |
CircularBuffer (Socket &owner, size_t size) | |
~CircularBuffer () | |
bool | Write (const char *p, size_t l) |
append l bytes from p to buffer | |
bool | Read (char *dest, size_t l) |
copy l bytes from buffer to dest | |
bool | Remove (size_t l) |
skip l bytes from buffer | |
std::string | ReadString (size_t l) |
read l bytes from buffer, returns as string. | |
size_t | GetLength () |
total buffer length | |
const char * | GetStart () |
pointer to circular buffer beginning | |
size_t | GetL () |
return number of bytes from circular buffer beginning to buffer physical end | |
size_t | Space () |
return free space in buffer, number of bytes until buffer overrun | |
unsigned long | ByteCounter (bool clear=false) |
return total number of bytes written to this buffer, ever | |
Private Member Functions | |
Socket & | GetOwner () const |
CircularBuffer (const CircularBuffer &s) | |
CircularBuffer & | operator= (const CircularBuffer &) |
Private Attributes | |
Socket & | m_owner |
char * | buf |
size_t | m_max |
size_t | m_q |
size_t | m_b |
size_t | m_t |
unsigned long | m_count |
Definition at line 47 of file CircularBuffer.h.
CircularBuffer::CircularBuffer | ( | Socket & | owner, | |
size_t | size | |||
) |
CircularBuffer::~CircularBuffer | ( | ) |
Definition at line 56 of file CircularBuffer.cpp.
References buf.
00057 { 00058 delete[] buf; 00059 }
CircularBuffer::CircularBuffer | ( | const CircularBuffer & | s | ) | [inline, private] |
bool CircularBuffer::Write | ( | const char * | p, | |
size_t | l | |||
) |
append l bytes from p to buffer
Definition at line 62 of file CircularBuffer.cpp.
References buf, Socket::Handler(), ISocketHandler::LogError(), m_count, m_max, m_owner, m_q, and m_t.
Referenced by TcpSocket::OnRead(), TcpSocket::OnWrite(), and TcpSocket::SendBuf().
00063 { 00064 if (m_q + l > m_max) 00065 { 00066 m_owner.Handler().LogError(&m_owner, "CircularBuffer::Write", -1, "write buffer overflow"); 00067 return false; // overflow 00068 } 00069 m_count += (unsigned long)l; 00070 if (m_t + l > m_max) // block crosses circular border 00071 { 00072 size_t l1 = m_max - m_t; // size left until circular border crossing 00073 // always copy full block to buffer(buf) + top pointer(m_t) 00074 // because we have doubled the buffer size for performance reasons 00075 memcpy(buf + m_t, s, l); 00076 memcpy(buf, s + l1, l - l1); 00077 m_t = l - l1; 00078 m_q += l; 00079 } 00080 else 00081 { 00082 memcpy(buf + m_t, s, l); 00083 memcpy(buf + m_max + m_t, s, l); 00084 m_t += l; 00085 if (m_t >= m_max) 00086 m_t -= m_max; 00087 m_q += l; 00088 } 00089 return true; 00090 }
bool CircularBuffer::Read | ( | char * | dest, | |
size_t | l | |||
) |
copy l bytes from buffer to dest
Definition at line 93 of file CircularBuffer.cpp.
References buf, Socket::Handler(), ISocketHandler::LogError(), m_b, m_max, m_owner, m_q, and m_t.
Referenced by TcpSocket::OnSocks4Read(), ReadString(), and Remove().
00094 { 00095 if (l > m_q) 00096 { 00097 m_owner.Handler().LogError(&m_owner, s ? "CircularBuffer::Read" : "CircularBuffer::Write", -1, "attempt to read beyond buffer"); 00098 return false; // not enough chars 00099 } 00100 if (m_b + l > m_max) // block crosses circular border 00101 { 00102 size_t l1 = m_max - m_b; 00103 if (s) 00104 { 00105 memcpy(s, buf + m_b, l1); 00106 memcpy(s + l1, buf, l - l1); 00107 } 00108 m_b = l - l1; 00109 m_q -= l; 00110 } 00111 else 00112 { 00113 if (s) 00114 { 00115 memcpy(s, buf + m_b, l); 00116 } 00117 m_b += l; 00118 if (m_b >= m_max) 00119 m_b -= m_max; 00120 m_q -= l; 00121 } 00122 if (!m_q) 00123 { 00124 m_b = m_t = 0; 00125 } 00126 return true; 00127 }
bool CircularBuffer::Remove | ( | size_t | l | ) |
skip l bytes from buffer
Definition at line 130 of file CircularBuffer.cpp.
References Read().
Referenced by TcpSocket::OnWrite().
00131 { 00132 return Read(NULL, l); 00133 }
std::string CircularBuffer::ReadString | ( | size_t | l | ) |
read l bytes from buffer, returns as string.
Definition at line 178 of file CircularBuffer.cpp.
References Read().
00179 { 00180 char *sz = new char[l + 1]; 00181 if (!Read(sz, l)) // failed, debug printout in Read() method 00182 { 00183 delete[] sz; 00184 return ""; 00185 } 00186 sz[l] = 0; 00187 std::string tmp = sz; 00188 delete[] sz; 00189 return tmp; 00190 }
size_t CircularBuffer::GetLength | ( | ) |
total buffer length
Definition at line 136 of file CircularBuffer.cpp.
References m_q.
Referenced by TcpSocket::GetInputLength(), TcpSocket::GetOutputLength(), TcpSocket::OnWrite(), and TcpSocket::SendBuf().
00137 { 00138 return m_q; 00139 }
const char * CircularBuffer::GetStart | ( | ) |
pointer to circular buffer beginning
Definition at line 142 of file CircularBuffer.cpp.
Referenced by TcpSocket::OnWrite().
size_t CircularBuffer::GetL | ( | ) |
size_t CircularBuffer::Space | ( | ) |
return free space in buffer, number of bytes until buffer overrun
Definition at line 154 of file CircularBuffer.cpp.
Referenced by TcpSocket::OnWrite(), and TcpSocket::SendBuf().
unsigned long CircularBuffer::ByteCounter | ( | bool | clear = false |
) |
Socket & CircularBuffer::GetOwner | ( | ) | const [private] |
Definition at line 172 of file CircularBuffer.cpp.
References m_owner.
00173 { 00174 return m_owner; 00175 }
CircularBuffer& CircularBuffer::operator= | ( | const CircularBuffer & | ) | [inline, private] |
Socket& CircularBuffer::m_owner [private] |
char* CircularBuffer::buf [private] |
Definition at line 79 of file CircularBuffer.h.
Referenced by GetStart(), Read(), Write(), and ~CircularBuffer().
size_t CircularBuffer::m_max [private] |
size_t CircularBuffer::m_q [private] |
Definition at line 81 of file CircularBuffer.h.
Referenced by GetL(), GetLength(), Read(), Space(), and Write().
size_t CircularBuffer::m_b [private] |
size_t CircularBuffer::m_t [private] |
unsigned long CircularBuffer::m_count [private] |