최종완료보고 버전
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
#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_
|
||||
Reference in New Issue
Block a user