131 lines
2.3 KiB
C++
131 lines
2.3 KiB
C++
#ifndef STREAM_BUFFER__H_
|
|
#define STREAM_BUFFER__H_
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
class HStreamBuffer : public HObject
|
|
{
|
|
public:
|
|
HStreamBuffer(size_t nSize)
|
|
{
|
|
m_pBuffer = (char *)malloc(nSize); //...??? 2048 : because of openssl buffer overflow?
|
|
m_nBufferSize = nSize;
|
|
|
|
m_pBufferHead = m_pBuffer;
|
|
m_pBufferTail = m_pBuffer;
|
|
m_nStoredSize = 0;
|
|
m_nRemainSize = m_nBufferSize;
|
|
}
|
|
|
|
~HStreamBuffer()
|
|
{
|
|
free(m_pBuffer);
|
|
}
|
|
|
|
inline char * Head() { return m_pBufferHead; }
|
|
inline char * Tail() { return m_pBufferTail; }
|
|
inline size_t Size() { return m_nBufferSize; }
|
|
inline size_t StoredSize() { return m_nStoredSize; }
|
|
inline size_t RemainSize() { return m_nRemainSize; }
|
|
|
|
inline bool MoveTail(size_t nSize)
|
|
{
|
|
if (nSize > m_nRemainSize)
|
|
return false;
|
|
|
|
m_pBufferTail += nSize;
|
|
m_nStoredSize += nSize;
|
|
m_nRemainSize -= nSize;
|
|
|
|
return true;
|
|
}
|
|
|
|
inline bool Pop(size_t nSize)
|
|
{
|
|
if (nSize > m_nStoredSize)
|
|
return false;
|
|
|
|
m_nStoredSize -= nSize;
|
|
|
|
if (m_nStoredSize == 0)
|
|
{
|
|
m_pBufferHead = m_pBuffer;
|
|
m_pBufferTail = m_pBuffer;
|
|
m_nRemainSize = m_nBufferSize;
|
|
}
|
|
else
|
|
{
|
|
m_pBufferHead += nSize;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
inline bool PopAndRewind(size_t nSize)
|
|
{
|
|
if (nSize > m_nStoredSize)
|
|
return false;
|
|
|
|
m_nStoredSize -= nSize;
|
|
memcpy(m_pBufferHead, m_pBufferHead + nSize, m_nStoredSize);
|
|
m_pBufferTail = m_pBufferHead + m_nStoredSize;
|
|
m_nRemainSize += nSize;
|
|
|
|
return true;
|
|
}
|
|
|
|
inline bool Store(const char * pData, size_t nSize)
|
|
{
|
|
if (nSize > m_nRemainSize)
|
|
return false;
|
|
|
|
memcpy(m_pBufferTail, pData, nSize);
|
|
m_pBufferTail += nSize;
|
|
m_nStoredSize += nSize;
|
|
m_nRemainSize -= nSize;
|
|
|
|
return true;
|
|
}
|
|
|
|
inline void Reset()
|
|
{
|
|
m_pBufferHead = m_pBuffer;
|
|
m_pBufferTail = m_pBuffer;
|
|
m_nStoredSize = 0;
|
|
m_nRemainSize = m_nBufferSize;
|
|
}
|
|
|
|
inline int MemCmp(const void * p, size_t n)
|
|
{
|
|
return memcmp(m_pBufferHead, p, n);
|
|
}
|
|
|
|
inline int Find(const char ch, size_t offset, size_t n = 0)
|
|
{
|
|
if (n == 0)
|
|
n = m_nStoredSize;
|
|
|
|
for (size_t i = offset; i < n; i++)
|
|
{
|
|
if (m_pBufferHead[i] == ch)
|
|
return (int)i;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
protected:
|
|
char * m_pBuffer;
|
|
char * m_pBufferHead;
|
|
char * m_pBufferTail;
|
|
|
|
size_t m_nBufferSize;
|
|
size_t m_nStoredSize;
|
|
size_t m_nRemainSize;
|
|
};
|
|
|
|
#endif // STREAM_BUFFER__H_
|