www.pudn.com > Chat_IO.rar > Buffer.cpp


// Buffer.cpp: implementation of the CBuffer class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Buffer.h" 
#include  
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBuffer::CBuffer() 
{ 
	// Initial size 
	m_nSize = 0; 
 
	m_pPtr = m_pBase = NULL; 
} 
 
CBuffer::~CBuffer() 
{ 
	if (m_pBase) 
		VirtualFree(m_pBase,0,MEM_RELEASE); 
} 
	 
//写数据到缓冲中 
BOOL CBuffer::Write(LPCSTR pData, UINT nSize) 
{ 
	ReAllocateBuffer(nSize + GetBufferLen()); 
 
	CopyMemory(m_pPtr,pData,nSize); 
 
	// Advance Pointer 
	m_pPtr+=nSize; 
 
	return nSize; 
} 
 
BOOL CBuffer::Insert(PCHAR 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; 
} 
 
//从缓存中读入数据,并删掉读出了数据的缓冲空间 
UINT CBuffer::Read(PCHAR pData, UINT nSize) 
{ 
	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; 
} 
 
//返回缓存的空间大小 
UINT CBuffer::GetMemSize()  
{ 
	return m_nSize; 
} 
//返回缓存中数据的空间大小 
UINT CBuffer::GetBufferLen()  
{ 
	if (m_pBase == NULL) 
		return 0; 
 
	int nSize =  
		m_pPtr - m_pBase; 
	return nSize; 
} 
 
//再分配缓存到给定大小,如果小于缓存的物理大小,则不操作 
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 
	PCHAR pNewBuffer = (PCHAR) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE); 
 
	UINT nBufferLen = GetBufferLen(); 
	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; 
} 
 
//释放缓存空间到给定大小,如果给定大小小于缓存的数据空间,则不操作. 
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 
	PCHAR pNewBuffer = (PCHAR) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE); 
 
	UINT nBufferLen = GetBufferLen(); 
	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; 
} 
 
//清空缓存 
void CBuffer::ClearBuffer() 
{ 
	// Force the buffer to be empty 
	m_pPtr = m_pBase; 
 
	DeAllocateBuffer(1024); 
} 
 
//写缓存,从数据块最后开始写 
BOOL CBuffer::Write(CString& strData) 
{ 
	int nSize = strData.GetLength(); 
	return Write((PCHAR) strData.GetBuffer(nSize), nSize); 
} 
 
//从缓存头部插入数据 
BOOL CBuffer::Insert(CString& strData) 
{ 
	int nSize = strData.GetLength(); 
	return Insert((PCHAR) strData.GetBuffer(nSize), nSize); 
} 
 
//拷贝缓存 
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()); 
} 
 
//返回给定位置的缓存 
PCHAR CBuffer::GetBuffer(UINT nPos) 
{ 
	return m_pBase+nPos; 
} 
 
 
//把缓存写入文件 
void CBuffer::FileWrite(const CString& strFileName) 
{ 
	CFile file; 
 
	if (file.Open(strFileName, CFile::modeWrite | CFile::modeCreate)) 
	{ 
		file.Write(m_pBase,GetBufferLen()); 
		file.Close(); 
	} 
} 
 
//从缓存中删除数据 
UINT CBuffer::Delete(UINT nSize) 
{ 
	if (nSize > GetMemSize()) 
		return 0; 
 
	if (nSize > GetBufferLen()) 
		nSize = GetBufferLen(); 
 
	if (nSize) 
	{ 
		//移动内存块 
		MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize); 
 
		m_pPtr -= nSize; 
	} 
		 
	DeAllocateBuffer(GetBufferLen()); 
 
	return nSize; 
} 
 
 
//找到缓存中的子字节,返回位置,没有找到则返回-1 
int CBuffer::Scan(PCHAR pScan,UINT nPos) 
{ 
	if (nPos > GetBufferLen() ) 
		return -1; 
	 
	PCHAR pStr = (PCHAR) strstr((char*)(m_pBase+nPos),(char*)pScan); 
	 
	int nOffset = -1; 
	 
	if (pStr) 
		nOffset = pStr - m_pBase; 
	 
	return nOffset; 
} 
 
int CBuffer::Scan(const CHAR scan, UINT nPos) 
{ 
	if (nPos > GetBufferLen() ) 
		return -1; 
 
	for(UINT i=0;i