#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_