/*******************************************************}

{                                                       }

{       File: Buffer.h                                  }

{       Created by Tsviatko Jongov                      }

{       http://tsviatko.jongov.com                      }

{                                                       }

{       CBuffer class.                                  }

{                                                       }

{*******************************************************/

   

#ifndef __BUFFER_H__

#define __BUFFER_H__

   

class CBuffer

{

protected:

    unsigned char * m_Buffer;

    unsigned long   m_Size;

public:

    unsigned long   m_First;

    unsigned long   m_Last;

   

    CBuffer(unsigned long Size):

      m_First(0),

      m_Size(0),

      m_Last(0)

    {

        if (Size > 0)

        {

            m_Buffer = new unsigned char[Size];

            m_Size = Size;

        }

    }

   

    ~CBuffer()

    {

        if (m_Buffer)

        {

            delete [] m_Buffer;

        }

    }

   

    void Add(unsigned char * Data, unsigned long Size)

    {

   

        if (m_Last + Size > m_Size)

        {

            unsigned char * TempBuffer = new unsigned char[m_Size + Size];

            memcpy(TempBuffer, m_Buffer, m_Last);

            m_Size += Size;

            delete [] m_Buffer;

            m_Buffer = TempBuffer;

        }

       

        memcpy(m_Buffer + m_Last, Data, Size);

        m_Last += Size;

    }

   

    unsigned char * Tail()

    {

        return (m_Buffer + m_Last);

    }

   

    void Compact()

    {

        if (m_First > 0)

        {

            unsigned long aLen = m_Last - m_First;

            memcpy(m_Buffer, m_Buffer + m_First, aLen);

            m_First = 0;

            m_Last = aLen;

        }

    }

   

    void Empty()

    {

        m_First = 0;

        m_Last = 0;

    }

   

    unsigned long Size()

    {

        return m_Size;

    }

   

    unsigned char * Head()

    {

        return (m_Buffer + m_First);

    }

   

    unsigned long Len()

    {

        return (m_Last - m_First);

    }

};

   

#endif // __BUFFER_H__