532 lines
11 KiB
C++
532 lines
11 KiB
C++
// Buffer.cpp: implementation of the CBuffer class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "..\stdafx.h"
|
|
#include "Buffer.h"
|
|
#include "Math.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: CBuffer
|
|
//
|
|
// DESCRIPTION: Constructs the buffer with a default size
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
CBuffer::CBuffer()
|
|
{
|
|
// Initial size
|
|
m_nSize = 0;
|
|
|
|
m_pPtr = m_pBase = NULL;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: ~CBuffer
|
|
//
|
|
// DESCRIPTION: Deallocates the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
CBuffer::~CBuffer()
|
|
{
|
|
if (m_pBase)
|
|
VirtualFree(m_pBase,0,MEM_RELEASE);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Write
|
|
//
|
|
// DESCRIPTION: Writes data into the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBuffer::Write(PBYTE pData, UINT nSize)
|
|
{
|
|
ReAllocateBuffer(nSize + GetBufferLen());
|
|
|
|
CopyMemory(m_pPtr,pData,nSize);
|
|
|
|
// Advance Pointer
|
|
m_pPtr+=nSize;
|
|
|
|
return nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Insert
|
|
//
|
|
// DESCRIPTION: Insert data into the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBuffer::Insert(PBYTE pData, UINT nSize)
|
|
{
|
|
ReAllocateBuffer(nSize + GetBufferLen());
|
|
|
|
MoveMemory(m_pBase+nSize,m_pBase,GetMemSize() - nSize);
|
|
CopyMemory(m_pBase,pData,nSize);
|
|
|
|
// Advance Pointer
|
|
m_pPtr+=nSize;
|
|
|
|
return nSize;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Read
|
|
//
|
|
// DESCRIPTION: Reads data from the buffer and deletes what it reads
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::Read(PBYTE pData, UINT nSize)
|
|
{
|
|
// Trying to byte off more than ya can chew - eh?
|
|
if (nSize > GetMemSize())
|
|
return 0;
|
|
|
|
// all that we have
|
|
if (nSize > GetBufferLen())
|
|
nSize = GetBufferLen();
|
|
|
|
|
|
if (nSize)
|
|
{
|
|
// Copy over required amount and its not up to us
|
|
// to terminate the buffer - got that!!!
|
|
CopyMemory(pData,m_pBase,nSize);
|
|
|
|
// Slide the buffer back - like sinking the data
|
|
MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
|
|
|
|
m_pPtr -= nSize;
|
|
}
|
|
|
|
DeAllocateBuffer(GetBufferLen());
|
|
|
|
return nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: GetMemSize
|
|
//
|
|
// DESCRIPTION: Returns the phyical memory allocated to the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::GetMemSize()
|
|
{
|
|
return m_nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: GetBufferLen
|
|
//
|
|
// DESCRIPTION: Get the buffer 'data' length
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::GetBufferLen()
|
|
{
|
|
if (m_pBase == NULL)
|
|
return 0;
|
|
|
|
int nSize =
|
|
m_pPtr - m_pBase;
|
|
return nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: ReAllocateBuffer
|
|
//
|
|
// DESCRIPTION: ReAllocateBuffer the Buffer to the requested size
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::ReAllocateBuffer(UINT nRequestedSize)
|
|
{
|
|
if (nRequestedSize < GetMemSize())
|
|
return 0;
|
|
|
|
// Allocate new size
|
|
UINT nNewSize = (UINT) ceil(nRequestedSize / 1024.0) * 1024;
|
|
|
|
// New Copy Data Over
|
|
PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
|
|
if (pNewBuffer == NULL)
|
|
return -1;
|
|
UINT nBufferLen = GetBufferLen();
|
|
if(nBufferLen > 0)
|
|
CopyMemory(pNewBuffer,m_pBase,nBufferLen);
|
|
|
|
if (m_pBase)
|
|
VirtualFree(m_pBase,0,MEM_RELEASE);
|
|
|
|
|
|
// Hand over the pointer
|
|
m_pBase = pNewBuffer;
|
|
|
|
// Realign position pointer
|
|
m_pPtr = m_pBase + nBufferLen;
|
|
|
|
m_nSize = nNewSize;
|
|
|
|
return m_nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: DeAllocateBuffer
|
|
//
|
|
// DESCRIPTION: DeAllocates the Buffer to the requested size
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::DeAllocateBuffer(UINT nRequestedSize)
|
|
{
|
|
if (nRequestedSize < GetBufferLen())
|
|
return 0;
|
|
|
|
// Allocate new size
|
|
UINT nNewSize = (UINT) ceil(nRequestedSize / 1024.0) * 1024;
|
|
|
|
if (nNewSize < GetMemSize())
|
|
return 0;
|
|
|
|
// New Copy Data Over
|
|
PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
|
|
if (pNewBuffer == NULL)
|
|
return -1;
|
|
UINT nBufferLen = GetBufferLen();
|
|
if(nBufferLen > 0 )
|
|
CopyMemory(pNewBuffer,m_pBase,nBufferLen);
|
|
|
|
VirtualFree(m_pBase,0,MEM_RELEASE);
|
|
|
|
// Hand over the pointer
|
|
m_pBase = pNewBuffer;
|
|
|
|
// Realign position pointer
|
|
m_pPtr = m_pBase + nBufferLen;
|
|
|
|
m_nSize = nNewSize;
|
|
|
|
return m_nSize;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Scan
|
|
//
|
|
// DESCRIPTION: Scans the buffer for a given byte sequence
|
|
//
|
|
// RETURNS: Logical offset
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int CBuffer::Scan(PBYTE pScan,UINT nPos)
|
|
{
|
|
if (nPos > GetBufferLen() )
|
|
return -1;
|
|
|
|
PBYTE pStr = (PBYTE) strstr((char*)(m_pBase+nPos),(char*)pScan);
|
|
|
|
int nOffset = 0;
|
|
|
|
if (pStr)
|
|
nOffset = (pStr - m_pBase) + strlen((char*)pScan);
|
|
|
|
return nOffset;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: ClearBuffer
|
|
//
|
|
// DESCRIPTION: Clears/Resets the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
void CBuffer::ClearBuffer()
|
|
{
|
|
// Force the buffer to be empty
|
|
if (m_pBase)
|
|
VirtualFree(m_pBase,0,MEM_RELEASE);
|
|
|
|
m_pPtr = m_pBase = NULL;
|
|
m_nSize = 0;
|
|
|
|
// DeAllocateBuffer(1024);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Write
|
|
//
|
|
// DESCRIPTION: Writes a string a the end of the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBuffer::Write(CString& strData)
|
|
{
|
|
int nSize = strData.GetLength();
|
|
return Write((PBYTE) strData.GetBuffer(nSize), nSize);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Insert
|
|
//
|
|
// DESCRIPTION: Insert a string at the beginning of the buffer
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
BOOL CBuffer::Insert(CString& strData)
|
|
{
|
|
int nSize = strData.GetLength();
|
|
return Insert((PBYTE) strData.GetBuffer(nSize), nSize);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Copy
|
|
//
|
|
// DESCRIPTION: Copy from one buffer object to another...
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
void CBuffer::Copy(CBuffer& buffer)
|
|
{
|
|
int nReSize = buffer.GetMemSize();
|
|
int nSize = buffer.GetBufferLen();
|
|
ClearBuffer();
|
|
ReAllocateBuffer(nReSize);
|
|
|
|
m_pPtr = m_pBase + nSize;
|
|
|
|
CopyMemory(m_pBase,buffer.GetBuffer(),buffer.GetBufferLen());
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: GetBuffer
|
|
//
|
|
// DESCRIPTION: Returns a pointer to the physical memory determined by the offset
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
PBYTE CBuffer::GetBuffer(UINT nPos)
|
|
{
|
|
return m_pBase+nPos;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: GetBuffer
|
|
//
|
|
// DESCRIPTION: Returns a pointer to the physical memory determined by the offset
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void CBuffer::FileWrite(const CString& strFileName)
|
|
{
|
|
CFile file;
|
|
|
|
if (file.Open(strFileName, CFile::modeWrite | CFile::modeCreate))
|
|
{
|
|
file.Write(m_pBase,GetBufferLen());
|
|
file.Close();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FUNCTION: Delete
|
|
//
|
|
// DESCRIPTION: Delete data from the buffer and deletes what it reads
|
|
//
|
|
// RETURNS:
|
|
//
|
|
// NOTES:
|
|
//
|
|
// MODIFICATIONS:
|
|
//
|
|
// Name Date Version Comments
|
|
// N T ALMOND 270400 1.0 Origin
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
UINT CBuffer::Delete(UINT nSize)
|
|
{
|
|
// Trying to byte off more than ya can chew - eh?
|
|
if (nSize > GetMemSize())
|
|
return 0;
|
|
|
|
// all that we have
|
|
if (nSize > GetBufferLen())
|
|
nSize = GetBufferLen();
|
|
|
|
|
|
if (nSize)
|
|
{
|
|
// Slide the buffer back - like sinking the data
|
|
MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
|
|
|
|
m_pPtr -= nSize;
|
|
}
|
|
|
|
DeAllocateBuffer(GetBufferLen());
|
|
|
|
return nSize;
|
|
} |