www.pudn.com > DSPSample.rar > PPQ.cpp


// PPQ.cpp: implementation of the PPQ class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "PPQ.h" 
//#include "RADIX64.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
PPQ::PPQ() 
{ 
	this->m_lpbuff	=NULL; 
} 
 
PPQ::~PPQ() 
{ 
	if(this->m_lpbuff!=NULL) 
		delete []this->m_lpbuff; 
} 
 
/****************************************************************** 
对象序列化 
bool DSPAct::Serialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp) 
	byClassLevels	--	类的层次 
	byAttrNo		--	属性序号 
	dsp				--	包含序列化或反序化的DSP包 
	返回:	false	--	表示当前对象的属性还没有还原完; 
			true	--	表示当前对象的属性已经还原完啦 
			如果序列化函数后,设置的缓冲区为NULL,则表示出错。 
******************************************************************/ 
bool PPQ::Serialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp) 
{ 
	if(byClassLevels>1) 
		return DSPACT::Serialize(byClassLevels-1,byAttrNo,dsp); 
	else 
	{ 
		switch(byAttrNo) 
		{ 
			case 1:						//序列化第1个属性 
				dsp.Write(this->m_bBOOL); 
				return false; 
			case 2:						//序列化第2个属性 
				dsp.Write(this->m_bBool); 
				return false; 
			case 3: 
				dsp.Write((int)this->m_dwValue); 
				return false; 
			case 4: 
				dsp.Write(this->m_iValue); 
				return false; 
			case 5: 
				dsp.Write(this->m_sValue); 
				return false; 
			case 6: 
				dsp.Write(this->m_wValue); 
				return false; 
			case 7: 
				dsp.Write(this->m_cValue); 
				return false; 
			case 8: 
				dsp.Write(this->m_byValue); 
				return false; 
			case 9: 
				dsp.Write(this->m_hgf,true,true); 
				return false; 
			case 10: 
				dsp.Write(this->m_str); 
				return false; 
			case 11:						//序列化最后一个属性 
				dsp.Write(this->m_chBuff,READ_FILE_SIZE,false); 
		} 
	} 
 
	return true; 
} 
 
/******************************************************************* 
对象反序列化 
bool DSPAct::UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen) 
	byClassLevels	--	类的层次 
	byAttrNo		--	属性序号 
	dsp				--	包含序列化或反序化的DSP包 
	dwLen			--	属性的长度 
	返回:	false	--	表示当前对象的属性还没有还原完; 
			true	--	表示当前对象的属性已经还原完啦 
		如果反序列化函数返回时,设定的缓冲区为NULL或缓冲区的尺寸小于应该设定的尺寸,则表示出错。 
******************************************************************/ 
bool PPQ::UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen) 
{ 
	//反序列化对象 
	if(byClassLevels>1) 
		return DSPACT::UnSerialize(byClassLevels-1,byAttrNo,dsp,dwLen); 
	else 
	{ 
		switch(byAttrNo) 
		{ 
			case 1:						//得到第1个属性 
				dsp.Read(this->m_bBOOL); 
				return false; 
			case 2:						//得到第2个属性 
				dsp.Read(this->m_bBool); 
				return false; 
			case 3: 
				dsp.Read(this->m_dwValue); 
				return false; 
			case 4: 
				dsp.Read(this->m_iValue); 
				return false; 
			case 5: 
				dsp.Read(this->m_sValue); 
				return false; 
			case 6: 
				dsp.Read(this->m_wValue); 
				return false; 
			case 7: 
				dsp.Read(this->m_cValue); 
				return false; 
			case 8: 
				dsp.Read(this->m_byValue); 
				return false; 
			case 9: 
				dsp.Read(this->m_hgf); 
				return false; 
			case 10: 
				dsp.Read(this->m_str,dwLen); 
				return false; 
			case 11:						//序列化最后一个属性 
				dsp.Read(this->m_chBuff,dwLen); 
		} 
	} 
 
	return true; 
} 
 
/******************************************************************* 
接收属性的一个段 
bool DSPACT::AttrSectRecv(BYTE byClassLevels,BYTE byAttrNo,const char* const lpBuff,DWORD dwLen,bool bLast) 
	byClassLevels	--	类的层次 
	byAttrNo		--	属性序号 
	lpBuff			--	保存接收值的缓冲区 
	dwLen			--	缓冲区的长度 
	bLast			--	表示是否接收到的最后一个段; 
						true时,表示这次接收到的数据是最后一段数据; 
						false时,表示这次接收到的数据不是最后一段数据,后面还有数据。 
	返回:	false时,表示失败;true时,表示正常 
******************************************************************/ 
bool PPQ::AttrSectRecv(BYTE byClassLevels,BYTE byAttrNo,const char* const lpBuff,DWORD dwLen,bool bLast) 
{ 
	if(byClassLevels>1) 
		return DSPACT::AttrSectRecv(byClassLevels,byAttrNo,lpBuff,dwLen,bLast); 
	else 
	{ 
		switch(byAttrNo) 
		{ 
			case 11: 
				if(ofs.is_open()==0) 
				{ 
					//如果文件没有被打开,则打开文件 
					ofs.open("ip2.txt",ios::out|ios::binary); 
				} 
				ofs.write(lpBuff,dwLen); 
				if(bLast) 
				{ 
					ofs.flush(); 
					ofs.close(); 
				} 
				break; 
		} 
	} 
 
	return true; 
} 
 
/******************************************************************* 
传送属性的一个段 
bool DSPACT::AttrSectSend(BYTE byClassLevels,BYTE byAttrNo,char** const lpBuff,DWORD& dwLen,bool& bContinue) 
	byClassLevels	--	类的层次 
	byAttrNo		--	属性序号 
	lpBuff			--	保存传送缓冲区的首址的变量的指针 
	wLen			--	保存缓冲区的长度的变量的指针 
	bContinue		--	表示是否是传送的最后一个段的变量的地址; 
						true时,表示这次传送的数据是最后一段数据; 
						false时,表示这次传送的数据不是最后一段数据,后面还有数据。 
	返回:	false	--	表示失败; 
			true	--	表示正常 
******************************************************************/ 
bool PPQ::AttrSectSend(BYTE byClassLevels,BYTE byAttrNo,char** const lpBuff,DWORD& dwLen,bool& bContinue) 
{ 
	if(byClassLevels>1) 
		return DSPACT::AttrSectSend(byClassLevels,byAttrNo,lpBuff,dwLen,bContinue); 
	else 
	{ 
		switch(byAttrNo) 
		{ 
			case 11: 
				if(ifs.is_open()==0) 
				{ 
					//如果文件没有被打开,则打开文件 
					ifs.open("ip1.txt",ios::in|ios::binary); 
 
					//保存接收的长度 
					dwLen	=READ_FILE_SIZE; 
 
					//保存接收的缓冲区首址 
					*lpBuff	=this->m_chBuff; 
				} 
				ifs.read(*lpBuff,dwLen); 
				if(ifs.eof()) 
				{ 
					//如果文件已经结束 
					//得到文件的大小 
					int size	=ifs.tellg(); 
 
					//得到最后读取的文件尺寸,设定最后接收的字节数 
					dwLen		=size%dwLen; 
 
					//设定不需要再继续接收 
					bContinue	=false; 
 
					//关闭文件 
					ifs.close(); 
				} 
				break; 
		} 
	} 
 
	return true; 
} 
 
/****************************************************************** 
压缩 
bool DSPACT::Compress(char** const lpBuff,DWORD& dwLen) 
	lpBuff	--	在调用时,指向要压缩的数据缓冲区的指针,压缩后指向压缩数据的缓冲区的首址 
	dwLen	--	在调用时,为要压缩的数据的字节个数,压缩后为压缩后的数据的字节数 
		返回:true--压缩程序有效;false--压缩程序无效; 
			当压缩有效时,必需修改lpBuff为保存压缩后数据的缓冲区的指针, 
			dwLen地址内保存为压缩后的数据的长度 
 
  			如果设定缓冲区为NULL,则表示压缩程序失败。 
******************************************************************/ 
/*bool PPQ::Compress(char** const lpBuff,DWORD& dwLen) 
{ 
	RADIX64::_CODER	coder; 
	int size	=coder.GetEncodeLen(dwLen); 
	if(this->m_lpbuff!=NULL) 
		delete []this->m_lpbuff; 
	this->m_lpbuff	=new char[size]; 
	coder.Encode(*lpBuff,dwLen,this->m_lpbuff); 
	*lpBuff	=this->m_lpbuff; 
	dwLen	=size; 
	return true; 
//	return false; 
}; 
*/ 
/****************************************************************** 
解压缩 
bool DSPACT::UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart) 
	lpBuff	--	bStart==false时,需要将接收被压缩的数据缓冲区的首址保存在该地址中; 
				bStart==true时,保存被压缩的数据缓冲区的首址 
	dwLen	--	被压缩数据的缓冲区的长度 
	lpUnBuff--	bStart==true时,接收解压缩数据的缓冲区的首址 
	dwUnLen	--	bStart==true时,接收解压缩数据的缓冲区的长度,在解压缩完成后,保存为解压缩数据的长度 
	bStart	--	true,表示可以开始进行解压缩数据; 
				false,表示该次调用只是指定填充数据的缓冲区,缓冲区的长度不能小于dwLen; 
		返回:true	--解压缩程序有效; 
			 false	--解压缩程序无效 
			如果设定缓冲区为NULL,则表示解压缩程序失败。 
******************************************************************/ 
/*bool PPQ::UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart) 
{ 
	if(bStart) 
	{ 
		//解压缩程序 
		RADIX64::_CODER	coder; 
		wUnLen	=coder.GetDecodeLen(dwLen,*lpBuff); 
		coder.Decode(*lpBuff,dwLen,lpUnBuff); 
	} 
	else 
	{ 
		//设定解压缩程序的接收压缩数据的缓冲区的地址 
		if(this->m_lpbuff!=NULL) 
			delete []this->m_lpbuff; 
		this->m_lpbuff	=new char[dwLen]; 
		*lpBuff	=this->m_lpbuff; 
	} 
	return true; 
//	return false; 
}; 
*/