⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datastorage.cpp

📁 游戏框架
💻 CPP
字号:
// ***************************************************************
//  DataStorage   version:  1.0
//  -------------------------------------------------------------
//	File Name:	DataStorage.cpp
//	Created:	2007/07/18
//	Modified:	2007/07/18   16:47
//	Author:		William.Liang
//  Msn:		lwq49@msn.com
//  Email:		lwq49@21cn.com, lwq49@msn.com
//	Description:
//
//	Purpose:	
//  -------------------------------------------------------------
//  license:
//
//  The contents of this file are subject to the Mozilla Public
//  License Version 1.1 (the "License"); you may not use this file
//  except in compliance with the License. You may obtain a copy
//  of the License at http://www.mozilla.org/MPL/ Software dis-
//  tributed under the License is distributed on an "AS IS" 
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or im-
//  plied. See the License for the specific language governing
//  rights and limitations under the License.
//
//  The Initial Developer of the Original Code is William.Liang .
//  Copyright (C) 2007 - All Rights Reserved.
// ***************************************************************
#include "StdAfx.h"
#include "DataStorage.h"

//////////////////////////////////////////////////////////////////////////

//************************************
// <p>Description: 构造函数</p>
//************************************
CDataStorage::CDataStorage(void)
{
	m_dwDataSize=0;
	m_dwBufferSize=0;
	m_dwInsertPos=0;
	m_dwTerminalPos=0;
	m_dwDataQueryPos=0;
	m_dwDataPacketCount=0;
	m_pDataStorageBuffer=NULL;
}

//************************************
// <p>Description: 析构函数</p>
//************************************
CDataStorage::~CDataStorage(void)
{
	SafeDeleteArray(m_pDataStorageBuffer);
	return;
}

//************************************
// <p>Description: 负荷信息</p>
// <p>Parameters:  </p>
// <p>    tagBurthenInfo & BurthenInfo</p>
//
// <p>Returns:   bool</p>
//************************************
bool CDataStorage::GetBurthenInfo(tagBurthenInfo & BurthenInfo)
{
	//设置变量
	BurthenInfo.dwDataSize=m_dwDataSize;
	BurthenInfo.dwBufferSize=m_dwBufferSize;
	BurthenInfo.dwDataPacketCount=m_dwDataPacketCount;

	return true;
}

//************************************
// <p>Description: 插入数据</p>
// <p>Parameters:  </p>
// <p>    WORD wIdentifier</p>
// <p>    void * const pBuffer</p>
// <p>    WORD wDataSize</p>
//
// <p>Returns:   bool</p>
//************************************
bool CDataStorage::AddData(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
{
	//初始化数据
	tagDataHead DataHead;
	DataHead.wDataSize=wDataSize;
	DataHead.wIdentifier=wIdentifier;
	DataHead.dwInsertTime=(DWORD)time(NULL)/1000L;
	DWORD dwCopySize=sizeof(DataHead)+wDataSize;

	bool	bMustAllocMemory = false;
	try{
		if ((m_dwDataSize+dwCopySize)>m_dwBufferSize) bMustAllocMemory = true;
		else if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwBufferSize)) 
		{
			if (m_dwDataQueryPos>=dwCopySize) m_dwInsertPos=0;
			else bMustAllocMemory = true;
		}
		else if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwDataQueryPos)) bMustAllocMemory = true;
	}
	catch(...){
		return false;
	}

	if(bMustAllocMemory){
		try
		{
			//申请内存
			DWORD dwNewBufferSize=m_dwBufferSize+__max(m_dwBufferSize/2L,(wDataSize+sizeof(tagDataHead))*10L);
			BYTE * pNewQueueServiceBuffer=new BYTE [dwNewBufferSize];
			if (pNewQueueServiceBuffer==NULL) return false;

			//拷贝数据
			if (m_pDataStorageBuffer!=NULL) 
			{
				_ASSERT(m_dwTerminalPos>=m_dwDataSize);
				_ASSERT(m_dwTerminalPos>=m_dwDataQueryPos);
				DWORD dwPartOneSize=m_dwTerminalPos-m_dwDataQueryPos;
				if (dwPartOneSize>0L) CopyMemory(pNewQueueServiceBuffer,m_pDataStorageBuffer+m_dwDataQueryPos,dwPartOneSize);
				if (m_dwDataSize>dwPartOneSize) 
				{
					_ASSERT((m_dwInsertPos+dwPartOneSize)==m_dwDataSize);
					CopyMemory(pNewQueueServiceBuffer+dwPartOneSize,m_pDataStorageBuffer,m_dwInsertPos);
				}
			}

			//调整变量
			m_dwDataQueryPos=0L;
			m_dwInsertPos=m_dwDataSize;
			m_dwTerminalPos=m_dwDataSize;
			m_dwBufferSize=dwNewBufferSize;
			SafeDeleteArray(m_pDataStorageBuffer);
			m_pDataStorageBuffer=pNewQueueServiceBuffer;
		}
		catch (...) { return false; }
	}

	//try
	//{
	//	//效验缓冲区
	//	if ((m_dwDataSize+dwCopySize)>m_dwBufferSize) throw 0;
	//	else if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwBufferSize)) 
	//	{
	//		if (m_dwDataQueryPos>=dwCopySize) m_dwInsertPos=0;
	//		else throw 0;
	//	}
	//	else if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwDataQueryPos)) throw 0;
	//}
	//catch (...)
	//{
	//	try
	//	{
	//		//申请内存
	//		DWORD dwNewBufferSize=m_dwBufferSize+__max(m_dwBufferSize/2L,(wDataSize+sizeof(tagDataHead))*10L);
	//		BYTE * pNewQueueServiceBuffer=new BYTE [dwNewBufferSize];
	//		if (pNewQueueServiceBuffer==NULL) return false;

	//		//拷贝数据
	//		if (m_pDataStorageBuffer!=NULL) 
	//		{
	//			_ASSERT(m_dwTerminalPos>=m_dwDataSize);
	//			_ASSERT(m_dwTerminalPos>=m_dwDataQueryPos);
	//			DWORD dwPartOneSize=m_dwTerminalPos-m_dwDataQueryPos;
	//			if (dwPartOneSize>0L) CopyMemory(pNewQueueServiceBuffer,m_pDataStorageBuffer+m_dwDataQueryPos,dwPartOneSize);
	//			if (m_dwDataSize>dwPartOneSize) 
	//			{
	//				_ASSERT((m_dwInsertPos+dwPartOneSize)==m_dwDataSize);
	//				CopyMemory(pNewQueueServiceBuffer+dwPartOneSize,m_pDataStorageBuffer,m_dwInsertPos);
	//			}
	//		}

	//		//调整变量
	//		m_dwDataQueryPos=0L;
	//		m_dwInsertPos=m_dwDataSize;
	//		m_dwTerminalPos=m_dwDataSize;
	//		m_dwBufferSize=dwNewBufferSize;
	//		SafeDeleteArray(m_pDataStorageBuffer);
	//		m_pDataStorageBuffer=pNewQueueServiceBuffer;
	//	}
	//	catch (...) { return false; }
	//}

	try
	{
		//拷贝数据
		CopyMemory(m_pDataStorageBuffer+m_dwInsertPos,&DataHead,sizeof(DataHead));
		if (wDataSize>0) 
		{
			_ASSERT(pBuffer!=NULL);
			CopyMemory(m_pDataStorageBuffer+m_dwInsertPos+sizeof(DataHead),pBuffer,wDataSize);
		}

		//调整数据
		m_dwDataPacketCount++;
		m_dwDataSize+=dwCopySize;
		m_dwInsertPos+=dwCopySize;
		m_dwTerminalPos=__max(m_dwTerminalPos,m_dwInsertPos);

		return true;
	}
	catch (...) { }

	return false;
}

//************************************
// <p>Description: 获取数据</p>
// <p>Parameters:  </p>
// <p>    tagDataHead & DataHead</p>
// <p>    void * pBuffer</p>
// <p>    WORD wBufferSize</p>
//
// <p>Returns:   bool</p>
//************************************
bool CDataStorage::GetData(tagDataHead & DataHead, void * pBuffer, WORD wBufferSize)
{
	//效验变量
	_ASSERT(m_dwDataSize>0L);
	_ASSERT(m_dwDataPacketCount>0);
	_ASSERT(m_pDataStorageBuffer!=NULL);
	if (m_dwDataSize==0L) return false;
	if (m_dwDataPacketCount==0L) return false;

	//调整参数
	if (m_dwDataQueryPos==m_dwTerminalPos)
	{
		m_dwDataQueryPos=0L;
		m_dwTerminalPos=m_dwInsertPos;
	}

	//获取数据指针
	_ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+sizeof(tagDataHead)));
	// 由m_dwDataQueryPos控制,返回指定位置的起始指针
	tagDataHead * pDataHead=(tagDataHead *)(m_pDataStorageBuffer+m_dwDataQueryPos);
	_ASSERT(wBufferSize>=pDataHead->wDataSize);

	//获取包大小
	WORD wPacketSize=sizeof(DataHead)+pDataHead->wDataSize;
	_ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+wPacketSize));

	//判断缓冲
	WORD wCopySize=0;
	_ASSERT(wBufferSize>=pDataHead->wDataSize);
	if (wBufferSize>=pDataHead->wDataSize) wCopySize=pDataHead->wDataSize;

	//拷贝数据
	DataHead=*pDataHead;
	if (DataHead.wDataSize>0)
	{
		if (wBufferSize<pDataHead->wDataSize) DataHead.wDataSize=0;
		// 拷贝数据队列中的当前项的数据缓冲(pDataHead+1为排除数据项头说明的偏移)至返回缓冲区
		else CopyMemory(pBuffer,pDataHead+1,DataHead.wDataSize);
	}

	//效验参数
	_ASSERT(wPacketSize<=m_dwDataSize);
	_ASSERT(m_dwBufferSize>=(m_dwDataQueryPos+wPacketSize));

	//设置变量
	m_dwDataPacketCount--;
	m_dwDataSize-=wPacketSize;
	m_dwDataQueryPos+=wPacketSize;

	return true;
}

//************************************
// <p>Description: 删除数据</p>
// <p>Parameters:  </p>
// <p>    bool bFreeMemroy</p>
//
// <p>Returns:   void</p>
//************************************
void CDataStorage::RemoveData(bool bFreeMemroy)
{
	//设置变量
	m_dwDataSize=0;
	m_dwInsertPos=0;
	m_dwTerminalPos=0;
	m_dwDataQueryPos=0;
	m_dwDataPacketCount=0;

	//删除内存
	if (bFreeMemroy==true) 
	{
		m_dwBufferSize=0;
		SafeDeleteArray(m_pDataStorageBuffer);
	}

	return;
}

//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -