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

📄 fwpackdata.h

📁 一个用HLA编写的聊天程序
💻 H
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************************

						欢迎使用FFB-MOT对象模板V1.1
						设计者:龚建兴
						Email:fj_gjx@yahoo.com
						Phone:0731-4574996
						日期 :2003.8.25

**********************************************************************************/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef	FWPACKDATA_H_
#define FWPACKDATA_H_
#include <string>
#include <vector>

class CFWPackData
{
protected:
	enum{sizeOfBuffer = 4096};				//预定义的缓冲区大小单位
	unsigned long curSize;					//当前分配的缓冲区大小
	unsigned long sizeOfData;				//实际包的数据大小
	unsigned long offset;					//当前写过的指针位置与缓冲区起始位置的偏移量
	std::vector<void*> BufferArray;			//存储所有已分配的缓冲区的指针
	std::vector<unsigned long> usedSize;	//存储所有已使用的缓冲区大小
	char* pCurBuffer;						//当前缓冲区的写指针
	char* pOutBuffer;						//输出包的缓冲区指针

public:
	CFWPackData();
	~CFWPackData();

	//member functions
	virtual void PackBasicData(void *packData, unsigned long lenOfData);
	virtual void UnpackBasicData(char *in, void *unpackData, unsigned long lenOfData);
	virtual char *PackStringData(std::string packData);
	virtual char *PackMulStringData(std::vector<std::string> packData);
	virtual char *PackMulStringData(std::string packData[], unsigned long num);
	virtual void UnpackMulStringData(char *in, std::vector<std::string> &unpackData, unsigned long lenOfData);
	virtual void UnpackMulStringData(char *in, std::string unpackData[], unsigned long lenOfData, unsigned long num);
	virtual void ReAllocBuffer(unsigned long lenOfData);
	virtual bool IfReAlloc(unsigned long lenOfData);
	virtual void ClearPack();
	virtual char *GetBufData();
	virtual unsigned long GetDirtySize();
	virtual void SaveDirty();
};

#endif //FWPACKDATA_H_
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//{{FW_DATA_PACKING_BEGIN
#define DECLARE_PACKINGANDUNPACKING_CLASS_OFOBJECT \
		CFWPackData			m_Pack;
#define DECLARE_PACKINGANDUNPACKING_CLASS_OFINTERACTION \
		CFWPackData			m_Pack;
#define DECLARE_PACKINGANDUNPACKING_CLASS_OFCOMPLEX \
		CFWPackData			m_Pack; \
		inline unsigned long GetSizeOfData() \
		{ \
			return m_Pack.GetDirtySize(); \
		} \
		inline void ClearPack() \
		{ \
			m_Pack.ClearPack(); \
		}

#define PackStringArray(theAdd, data, id); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	charbuffer = m_Pack.PackMulStringData(data); \
	numOfData = m_Pack.GetDirtySize(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackStringArray(theGets, data, index); \
{ \
	unsigned long numOfData = 0; \
	unsigned long num = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	m_Pack.UnpackMulStringData(charbuffer, data, numOfData); \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackStringFixedSet(theAdd, data, id, num); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	charbuffer = m_Pack.PackMulStringData(data, num); \
	numOfData = m_Pack.GetDirtySize(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackStringFixedSet(theGets, data, index, num); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(i); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(i, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	m_Pack.UnpackMulStringData(charbuffer, data, numOfData, num); \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackString(theAdd, data, id); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	charbuffer = m_Pack.PackStringData(data); \
	numOfData = m_Pack.GetDirtySize(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackString(theGets, data, index); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	data = charbuffer; \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackStruct(theAdd, data, id); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	charbuffer = data.PackData(); \
	numOfData = data.GetSizeOfData(); \
	m_Pack.ClearPack(); \
	m_Pack.PackBasicData((void*)charbuffer, numOfData); \
	data.ClearPack(); \
	m_Pack.SaveDirty(); \
	charbuffer = m_Pack.GetBufData(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackStruct(theGets, data, index); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	data.UnpackData(charbuffer); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackStructFixedSet(theAdd, data, id, num); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	m_Pack.ClearPack(); \
	for(int k = 0; k < num; k++) { \
		charbuffer = data[k].PackData(); \
		numOfData = data[k].GetSizeOfData(); \
		m_Pack.PackBasicData(&numOfData, sizeof(unsigned long)); \
		m_Pack.PackBasicData((void*)charbuffer, numOfData); \
		data[k].ClearPack(); \
	} \
	m_Pack.SaveDirty(); \
	numOfData = m_Pack.GetDirtySize(); \
	charbuffer = m_Pack.GetBufData(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackStructFixedSet(theGets, data, index, num); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	for(int k = 0; k < num; k++) { \
		m_Pack.UnpackBasicData(charbuffer, &numOfData, sizeof(unsigned long)); \
		char* buffer = new char[numOfData]; \
		m_Pack.UnpackBasicData(charbuffer, (void*)buffer, numOfData); \
		data[k].UnpackData(buffer); \
		delete[] buffer; \
		buffer = NULL; \
	} \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackStructArray(theAdd, data, id); \
{ \
	unsigned long numOfData = 0; \
	unsigned long num = 0; \
	char* charbuffer = NULL; \
	num = data.size(); \
	m_Pack.ClearPack(); \
	m_Pack.PackBasicData(&num, sizeof(unsigned long)); \
	for(int k = 0; k < num; k++) { \
		charbuffer = data[k].PackData(); \
		numOfData = data[k].GetSizeOfData(); \
		m_Pack.PackBasicData(&numOfData, sizeof(unsigned long)); \
		m_Pack.PackBasicData((void*)charbuffer, numOfData); \
		data[k].ClearPack(); \
	} \
	m_Pack.SaveDirty(); \
	numOfData = m_Pack.GetDirtySize(); \
	charbuffer = m_Pack.GetBufData(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackStructArray(theGets, data, index); \
{ \
	unsigned long numOfData = 0; \
	unsigned long num = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	m_Pack.UnpackBasicData(charbuffer, &num, sizeof(unsigned long)); \
	data.resize(num); \
	for(int k = 0; k < num; k++) { \
		m_Pack.UnpackBasicData(charbuffer, &numOfData, sizeof(unsigned long)); \
		char* buffer = new char[numOfData]; \
		m_Pack.UnpackBasicData(charbuffer, (void*)buffer, numOfData); \
		data[k].UnpackData(buffer); \
		delete[] buffer; \
		buffer = NULL; \
	} \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
} 

#define PackBasicFixedSet(theAdd, data, id, num, sizeType); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	m_Pack.ClearPack(); \
	for(int k = 0; k < num; k++) { \
		m_Pack.PackBasicData(&data[k], sizeType); \
	} \
	m_Pack.SaveDirty(); \
	numOfData = m_Pack.GetDirtySize(); \
	charbuffer = m_Pack.GetBufData(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackBasicFixedSet(theGets, data, index, num, sizeType); \
{ \
	unsigned long numOfData = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	for(int k = 0; k < num; k++) { \
		m_Pack.UnpackBasicData(charbuffer, &data[k], sizeType); \
	} \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackBasicArray(theAdd, data, id, sizeType); \
{ \
	unsigned long numOfData = 0; \
	unsigned long num = 0; \
	char* charbuffer = NULL; \
	num = data.size(); \
	m_Pack.ClearPack(); \
	for(int k = 0; k < num; k++) { \
		m_Pack.PackBasicData(&data[k], sizeType); \
	} \
	m_Pack.SaveDirty(); \
	numOfData = m_Pack.GetDirtySize(); \
	charbuffer = m_Pack.GetBufData(); \
	theAdd->add(id, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
}

#define UnpackBasicArray(theGets, data, index, sizeType); \
{ \
	unsigned long numOfData = 0; \
	unsigned long num = 0; \
	char* charbuffer = NULL; \
	numOfData = theGets->getValueLength(index); \
	charbuffer = new char[numOfData]; \
	theGets->getValue(index, charbuffer, numOfData); \
	m_Pack.ClearPack(); \
	num = numOfData / sizeType; \
	data.resize(num); \
	for(int k = 0; k < num; k++) { \
		m_Pack.UnpackBasicData(charbuffer, &data[k], sizeType); \
	} \
	m_Pack.ClearPack(); \
	delete[] charbuffer; \
	charbuffer = NULL; \
}

#define PackBasic(theAdd, data, id, sizeType); \
{ \
	theAdd->add(id, (const char*)&data, sizeType); \
}

#define UnpackBasic(theGets, data, index); \
{ \
	unsigned long valueLength = 0; \
	theGets->getValue(index, (char*)&data, valueLength); \
}

#define BEGIN_PACKING_ATTRIBUTES_DATA(pAttributes, theAttrNames) \
{ \
	RTI::AttributeHandle theHandle = ATTRNOHANDLE; \
	RTI::AttributeHandleValuePairSet*  theAdds = pAttributes; \
	CString	theName = ""; \
	ASSERT(theAdds != NULL); \
	for(int i = 0; i < theAttrNames.GetSize(); i++) { \
		theName = theAttrNames.GetAt(i);
#define PACKING_BASIC_ATTRIBUTEDATA(data, dataName, updateFlag, sizeType) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \
			ASSERT(theHandle != ATTRNOHANDLE); \
			PackBasic(theAdds, data, theHandle, sizeType); \
		}
#define PACKING_BASICARRAY_ATTRIBUTEDATA(data, dataName, updateFlag, sizeType) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \
			ASSERT(theHandle != ATTRNOHANDLE); \
			PackBasicArray(theAdds, data, theHandle, sizeType); \
		}
#define PACKING_BASICFIXEDSET_ATTRIBUTEDATA(data, dataName, updateFlag, num, sizeType) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \
			ASSERT(theHandle != ATTRNOHANDLE); \
			PackBasicFixedSet(theAdds, data, theHandle, num, sizeType); \
		}
#define PACKING_STRUCT_ATTRIBUTEDATA(data, dataName, updateFlag) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \
			ASSERT(theHandle != ATTRNOHANDLE); \
			PackStruct(theAdds, data, theHandle); \
		}
#define PACKING_STRUCTARRAY_ATTRIBUTEDATA(data, dataName, updateFlag) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \
			ASSERT(theHandle != ATTRNOHANDLE); \
			PackStructArray(theAdds, data, theHandle); \
		}
#define PACKING_STRUCTFIXEDSET_ATTRIBUTEDATA(data, dataName, updateFlag, num) \
		if(theName == dataName && updateFlag) { \
			theHandle = FindAttributeHandle(dataName); \

⌨️ 快捷键说明

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