Buffer.cpp
资源名称:smpplib.zip [点击查看]
上传用户:hkcoast
上传日期:2007-01-12
资源大小:979k
文件大小:12k
源码类别:
手机短信编程
开发平台:
Visual 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
- static int nTest = 0;
- //////////////////////////////////////////////////////////////////////
- // 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()
- {
- m_nSize = 0;
- m_bSustainSize = false;
- m_pBase = NULL;
- m_nPtrSize = 0;
- }
- void CBuffer::Initialize(UINT nInitsize, bool bSustain)
- {
- m_bSustainSize = bSustain;
- ReAllocateBuffer(nInitsize);
- }
- ////////////////////////////////////////////////////////////////////////////////
- //
- // 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_pBase + m_nPtrSize,pData,nSize);
- // Advance Pointer
- m_nPtrSize += 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_nPtrSize += 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)
- {
- nTest++;
- // 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_nPtrSize -= 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;
- return m_nPtrSize;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //
- // 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
- TRACE("ReAllocateBuffer %dn",nRequestedSize);
- SYSTEM_INFO si;
- GetSystemInfo(&si);
- UINT nNewSize = (UINT) ((nRequestedSize / si.dwPageSize) * si.dwPageSize) + si.dwPageSize;
- // New Copy Data Over
- PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
- ASSERT(si.dwPageSize);
- ASSERT(m_nPtrSize < nNewSize);
- if (m_pBase)
- {
- CopyMemory(pNewBuffer,m_pBase,m_nPtrSize);
- VirtualFree(m_pBase,0,MEM_RELEASE);
- }
- // Hand over the pointer
- m_pBase = pNewBuffer;
- 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 (m_bSustainSize)
- return 0;
- if (nRequestedSize < GetBufferLen())
- return 0;
- TRACE("DeAllocateBuffer %dn",nRequestedSize);
- SYSTEM_INFO si;
- GetSystemInfo(&si);
- UINT nNewSize = (UINT) ((nRequestedSize / si.dwPageSize) * si.dwPageSize) + si.dwPageSize;
- // New Copy Data Over
- PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
- if (m_nPtrSize)
- CopyMemory(pNewBuffer, m_pBase, m_nPtrSize);
- if (m_pBase)
- VirtualFree(m_pBase,0,MEM_RELEASE);
- // Hand over the pointer
- m_pBase = pNewBuffer;
- 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 pPtr = (PBYTE) strstr((char*)(m_pBase+nPos),(char*)pScan);
- if (pPtr > m_pBase + m_nPtrSize)
- return -1;
- int nOffset = -1;
- if (pPtr)
- nOffset = (pPtr - 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
- m_nPtrSize = 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_nPtrSize = nReSize;
- 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_nPtrSize -= nSize;
- }
- DeAllocateBuffer(GetBufferLen());
- return nSize;
- }
- const CBuffer& CBuffer::operator=(CBuffer& buff)
- {
- this->Write(buff.GetBuffer(), buff.GetBufferLen());
- return* this;
- }
- UINT CBuffer::DeleteEnd(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
- m_nPtrSize -= nSize;
- }
- DeAllocateBuffer(GetBufferLen());
- return nSize;
- }