www.pudn.com > DSPSample.rar > DSPSpider.h


// DSPSpider.h: interface for the DSPSpider class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_) 
#define AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
 
#include  
#include  
#include  
#include "DSP.h" 
 
#define	LISTENPORT	34567 
 
//处理监听的函数的指针 
#define LISTENFUNC(varN)	bool (*varN)(_SENDTHREADPARAM *phParam,DSP::_DSPPACKET& packet) 
 
class AFX_EXT_CLASS DSPSpider   
{ 
public: 
	DSPSpider(); 
	virtual ~DSPSpider(); 
 
	struct AFX_EXT_CLASS _SENDTHREADPARAM 
	{ 
		SOCKET		sock; 
		HWND		hwnd; 
		CWnd*		pCWnd; 
		bool		bInternet; 
		LISTENFUNC(pFunc);			//监听线程处理函数 
		_SENDTHREADPARAM():pFunc(NULL){}; 
	}; 
 
	struct AFX_EXT_CLASS _FILEDETAIL 
	{ 
		CString		strPathname;	//文件包含路径的名字 
		CString		strFilename;	//文件不包含路径的名字 
		DWORD		dwFilesize;		//文件的大小字节数 
		int			nFileID;		//文件的ID,可以是任意值,标识一个唯一的文件 
		bool		bRun;			//是否继续接收或传送的布尔变量 
		HWND		hwnd;			//接收消息的窗体的句柄 
	}; 
 
	enum 
	{ 
		FILE_SECT_SIZE		=0xFFF,			//每次传送的段的最大尺寸 
 
		 
		//dwErrorCode的错误代码 
		ERR_FILE_EXIST		=5000,			//文件已经存在 
		ERR_FILE_OUTFAILED,					//文件无法写 
		ERR_FILE_INFAILED,					//文件无法读 
		ERR_RECVING,						//当前BitSpider正在下载 
		ERR_WNDNOTCREATE,					//窗体没有创建 
		ERR_MORETHANTHREADNO,				//无法创建更多的线程 
		ERR_HASTHREADSLEEP,					//有线程处于休眠状态 
 
 
		//提示信息的种类 
		PROMPT_RECVSLEEP	=10000, 
		PROMPT_MORETHAN, 
		PROMPT_NOIP, 
		PROMPT_CONNECTNEWIP, 
		PROMPT_CANNOTCONNECT, 
		PROMPT_RECVABORT, 
		PROMPT_RECVEND, 
 
 
		//DSPFile类在传送或接收过程中发出的消息 
		MSG_GETFILENAME		=12356, 
			//wParam	--	_FILEDETAIL结构的指针 
			//返回时,重新设置包含路径的文件名;如果文件名设置为空,则表示没有文件 
 
		MSG_SENDSECT, 
		MSG_RECVSECT, 
			//wParam	--	_FILEDETAIL结构的指针 
			//lParam	--	当前段的长度 
		MSG_SENDCOMPLETE, 
			//wParam	--	_FILEDETAIL结构的指针 
			//lParam	--	完成的原因,调用DSPFile::GetCompleteInfo(lParam,..)传递该参数,可以得到具体原因的字符串表示 
			//				如果函数返回true,则表示成功,false表示失败。 
		MSG_SETFILENAMESIZE, 
			//wParam	--	_FILEDETAIL结构的指针 
		MSG_SHOWPROMPT, 
			//wParam	--	提示信息的种类 
	}; 
 
	void	SafeRelease(); 
	BOOL	AddIP(const char *lpSrvIP,WORD wPort,WORD nPriority=0); 
	void	RemoveIP(const char *lpSrvIP); 
	BOOL	RunSpider(const char* lpFilename,const char* lpPathname,HWND hWnd,BYTE byThreadCount,int nFileID=0); 
	DWORD	GetProgressStep(); 
	DWORD	GetCurrSize(); 
	LRESULT OnSendComplete(WPARAM wParam, LPARAM lParam); 
	LRESULT OnUpdateSect(WPARAM wParam, LPARAM lParam); 
	LRESULT OnAssignNewSect(WPARAM wParam, LPARAM lParam); 
	LRESULT OnAbort(WPARAM wParam, LPARAM lParam); 
	LRESULT OnCreateRecvThread(WPARAM wParam, LPARAM lParam); 
 
 
	static void	SetFilename(WPARAM wParam,CString& strPathname); 
	static bool GetCompleteInfo(int which,CString& str); 
	static UINT ListenThread(LPVOID lpData); 
 
	DWORD				m_dwErrorCode;				//错误代码 
	bool				m_bExistQuery;				//文件存在时询问 
	bool				m_bCrc;						//是否要进行校验 
	bool				m_bInternet;				//是否是Internet应用 
 
protected: 
	HWND			m_hMsgWnd; 
	BYTE			m_byRunThreadCount; 
	BYTE			m_bySleepThreadCount; 
	CString			m_strFilename; 
	CString			m_strPathname; 
	ofstream		m_ofs; 
	ifstream		m_ifs; 
 
private: 
	struct _SECTFILEHEADER; 
	struct _SRVIP; 
	struct _MINSECT; 
	bool	m_bWaitIP; 
	BYTE	m_byThreadCount; 
 
	std::deque<_SRVIP*>			m_dqSrvIP; 
	_FILEDETAIL*				m_phThreadDetail[10]; 
	_SECTFILEHEADER*			m_pSectHeader; 
 
	inline void		ReleaseIP(int nSrvIPNo); 
	inline int		GetSrvIP(); 
	inline void		ShowPromptMessage(WORD which,const char* lpIP=NULL); 
	inline BOOL		InitRecvSpider(BYTE byThreadCount,int nFileID); 
	inline BOOL		RunAnRecvThread(); 
 
	static UINT		ConnectedSocketThread(LPVOID lpData); 
}; 
 
#endif // !defined(AFX_DSPSPIDER_H__563AE7C8_78D7_45C0_BA2E_2596100F6D64__INCLUDED_)