www.pudn.com > UDP文件传输.rar > ZsP2p.h


// ZsP2p.h: interface for the CZsP2p class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_) 
#define AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
////////////////////////////////////////////////////////////////////////////// 
 
 
//文件名		: ZsP2p.h 
 
//功能			: 中搜UDP文件传输上层接口实现示例 
 
//创建			: 2004.11.14 
 
//修改日期		: 2004.11.14 
 
//作者			: 韩国静 
// 
#include "ZsP2pEventHandle.h" 
#include "HFile.h" 
#define P2PHOME "C:\\P2P" 
class CZsP2p :public ZsP2pEventHandle 
{ 
	typedef struct MYDATA 
	{ 
		bool bStart; 
		HFile	file; 
		char		pathName[MAX_PATH_NAME]; 
	}*PMYDATA; 
public: 
	CZsP2p(){}; 
	virtual ~CZsP2p(){}; 
	virtual void UI_UnInitialize(const PUI_FILEINFO pfile,UNI_OUT void * &pExtra) 
	{ 
		PMYDATA pMyData; 
		if(pMyData=(PMYDATA)pExtra) 
		{ 
			pMyData->file.Close(); 
			delete pMyData; 
		} 
	} 
	virtual UNI_BOOL UI_Initialize(const PUI_FILEINFO pfile,UNI_OUT void * &pExtra,char *pathName) 
	{ 
		PMYDATA pMyData; 
		if(pMyData= new MYDATA) 
		{ 
			pExtra=pMyData; 
			pMyData->bStart=false; 
			memset(pMyData->pathName,0,sizeof(pMyData->pathName)); 
			if(pathName) 
				strncpy(pMyData->pathName,pathName,sizeof(pMyData->pathName)); 
			return UNI_TRUE; 
		} 
		return UNI_FALSE; 
	} 
	virtual void UI_OnFileRefuse(const PUI_FILEINFO pfile) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		//服务通知文件不能发送! 
		printf("送给%s的文件%s被对方拒绝\r\n",pfile->sendName,pMyData->pathName); 
	} 
	virtual UNI_BOOL UI_OnFileReq(const PUI_FILEINFO pfile,UNI_OUT UNI_DWORD &dwOffset,UNI_OUT void * &pExtra) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData==UNI_NULL) 
			pMyData= new MYDATA; 
		if(pMyData) 
		{ 
			pExtra=pMyData; 
			dwOffset=0; 
			pMyData->bStart=false; 
			sprintf(pMyData->pathName,"%s\\%s",P2PHOME,pfile->fileName); 
			if(dwOffset==0) 
			{ 
				pMyData->file.CreateNew(pMyData->pathName); 
			} 
			else 
				pMyData->file.OpenForReadWrite(pMyData->pathName); 
			printf("$: %s发来文件%s,另存为%s开始接收......\r\n",pfile->sendName,pfile->fileName,pMyData->pathName); 
			return UNI_TRUE; 
		} 
		printf("$: %s发来文件%s,内存不足以后下载!!!!!!!!!!!!!!!!!!!\r\n",pfile->sendName,pfile->fileName); 
		return UNI_FALSE; 
	} 
	virtual void UI_OnCancelBySend(const PUI_FILEINFO pfile) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		printf("$: 文件%s已被发送方%s取消\r\n",pMyData->pathName,pfile->sendName); 
	} 
	virtual void UI_OnCancelByRecv(const PUI_FILEINFO pfile) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		if(pMyData->bStart==true) 
		{ 
			printf("$: 文件%s已被接收方%s取消\r\n",pMyData->pathName,pfile->sendName); 
		} 
		else 
		{ 
			UI_OnFileRefuse(pfile); 
		} 
	} 
	virtual void UI_OnSendOver(const PUI_FILEINFO pfile) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		printf("给%s的文件%s传输成功结束!\r\n",pfile->sendName,pMyData->pathName); 
 
	} 
	virtual void UI_OnRecvOver(const PUI_FILEINFO pfile) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		printf("来自%s的文件%s传输成功结束!\r\n",pfile->sendName,pMyData->pathName); 
	} 
	virtual void UI_OnRecvTimeOut(const PUI_FILEINFO pfile) 
	{ 
		//只对UDP_FILE_NEXT超时 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		printf("网络超时!来自%s的文件%s传输失败!\r\n",pfile->sendName,pMyData->pathName); 
	} 
	virtual void UI_OnSendTimeOut(const PUI_FILEINFO pfile) 
	{ 
		//只对UDP_CLIENT_FILE_REQ超时 
		// 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		if(pMyData->file.IsOpened()) 
			pMyData->file.Close(); 
		printf("网络超时!给%s的文件%s无法传输!\r\n",pfile->sendName,pMyData->pathName); 
	} 
	virtual UNI_BOOL UI_OnSaveData(const PUI_FILEINFO pfile,UNI_DWORD offset,UNI_DWORD size,void *data) 
	{ 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		pMyData->bStart=true; 
		printf("来自%s的文件%s当前进度为 received %d:%d 字节!\r\n",pfile->sendName,pMyData->pathName,offset+size,size); 
		if(!pMyData->file.IsOpened()) 
		{ 
			pMyData->file.OpenForReadWrite(pMyData->pathName); 
		} 
		if(pMyData->file.IsOpened()) 
		{ 
			if(size!=(UNI_DWORD)pMyData->file.WriteAt(data,size,offset)) 
			{ 
				return UNI_FALSE; 
			} 
		} 
		else 
			return UNI_FALSE; 
		return UNI_TRUE; 
	} 
	virtual int UI_OnReadData(const  PUI_FILEINFO pfile,UNI_DWORD offset,UNI_DWORD size,void *data) 
	{ 
		int ret=-1; 
		PMYDATA pMyData=(PMYDATA)pfile->pExtra; 
		pMyData->bStart=true; 
		if(!pMyData->file.IsOpened()) 
		{ 
			pMyData->file.OpenForRead(pMyData->pathName); 
		} 
		if(pMyData->file.IsOpened()) 
		{ 
			ret= pMyData->file.ReadAt(data,size,offset); 
		} 
		printf("给%s的文件%s当前进度为 sended %d:%d 字节!\r\n",pfile->sendName,pMyData->pathName,offset,ret); 
		return ret; 
	} 
	virtual void UI_OnBadError(const PUI_FILEINFO pfile) 
	{ 
		printf("because memory out\r\n"); 
	} 
}; 
 
#endif // !defined(AFX_HP2P_H__1DDE99F8_A828_4090_9C56_3EF51D14316E__INCLUDED_)