📄 bitspider.h
字号:
#if !defined(AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_)
#define AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// BitSpider.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// BitSpider window
#include <deque>
#include <math.h>
#include <fstream.h>
#include "SSP.h"
//处理监听的函数的指针
#define LISTENFUNC(varN) bool (*varN)(_SENDTHREADPARAM *phParam,SSP::_SSPPACKET& packet)
class AFX_EXT_CLASS BitSpider : public CWnd
{
// Construction
public:
struct AFX_EXT_CLASS _SENDTHREADPARAM
{
SOCKET sock;
HWND hwnd;
CWinThread* pThread;
WORD wPort;
bool bInternet;
bool bRun;
LISTENFUNC(pFunc); //监听线程处理函数
_SENDTHREADPARAM():pFunc(NULL),bRun(true){};
};
struct AFX_EXT_CLASS _FILEDETAIL
{
CString strPathname; //文件包含路径的名字
CString strFilename; //文件不包含路径的名字
DWORD dwFilesize; //文件的大小字节数
int nFileID; //文件的ID,可以是任意值,标识一个唯一的文件
bool bRun; //是否继续接收或传送的布尔变量
HWND hwnd; //接收消息的窗体的句柄
};
enum
{
//窗体的字模的高度、窗体的高度和按钮的宽度高度
WND_FONT_HEIGHT =11,
WND_BTN_WIDTH =12,
WND_HEIGHT =WND_FONT_HEIGHT*4+4,
FILE_SECT_SIZE =0xFFF, //每次传送的段的最大尺寸
//dwErrorCode的错误代码
ERR_FILE_EXIST =5000, //文件已经存在
ERR_FILE_OUTFAILED, //文件无法写
ERR_FILE_INFAILED, //文件无法读
ERR_RECVING, //当前BitSpider正在下载
ERR_WNDNOTCREATE, //窗体没有创建
ERR_MORETHANTHREADNO, //无法创建更多的线程
ERR_HASTHREADSLEEP, //有线程处于休眠状态
//SSPFile类在传送或接收过程中发出的消息
MSG_GETFILENAME =12356,
//wParam -- _FILEDETAIL结构的指针
//返回时,重新设置包含路径的文件名;如果文件名设置为空,则表示没有文件
MSG_SENDSECT,
MSG_RECVSECT,
//wParam -- _FILEDETAIL结构的指针
//lParam -- 当前段的长度
MSG_SENDCOMPLETE,
//wParam -- _FILEDETAIL结构的指针
//lParam -- 完成的原因,调用SSPFile::GetCompleteInfo(lParam,..)传递该参数,可以得到具体原因的字符串表示
// 如果函数返回true,则表示成功,false表示失败。
MSG_SETFILENAMESIZE,
//wParam -- _FILEDETAIL结构的指针
};
BitSpider();
virtual ~BitSpider();
BOOL IsUDP(){return m_bUDP;};
BOOL AddIP(const char *lpSrvIP,WORD wPort,WORD nPriority=0);
void RemoveIP(const char *lpSrvIP);
BOOL Create(int offx,int offy,int width, CWnd *pParentWnd);
BOOL RunSpider(const char* lpFilename,const char* lpPathname,HWND hWnd,BYTE byThreadCount,int nFileID=0,bool bUDP=false);
static int GetScreenWidth();
static bool GetCompleteInfo(int which,CString& str);
static UINT TCPListenThread(LPVOID lpData);
static UINT UDPListenThread(LPVOID lpData);
DWORD m_dwErrorCode; //错误代码
bool m_bExistQuery; //文件存在时询问
bool m_bCrc; //是否要进行校验
bool m_bInternet; //是否是Internet应用
static BitSpider* pCurrRecvWnd; //当前的作用的窗口
static BitSpider* pCurrSendWnd; //传送文件的窗口
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(BitSpider)
//}}AFX_VIRTUAL
// Generated message map functions
protected:
HWND m_hMsgWnd;
BYTE m_byRunThreadCount;
BYTE m_bySleepThreadCount;
CString m_strFilename;
CString m_strPathname;
ofstream m_ofs;
ifstream m_ifs;
CFont m_font;
CStatic m_staFilesize;
CStatic m_staFilename;
CStatic m_staCurrLen;
CStatic m_staPrompt;
CProgressCtrl m_progress;
CButton m_btnAbort;
void ReviseContent(CRect& rect);
LRESULT OnSendComplete(WPARAM wParam, LPARAM lParam);
LRESULT OnUpdateSect(WPARAM wParam, LPARAM lParam);
LRESULT OnSetFilenameSize(WPARAM wParam, LPARAM lParam);
LRESULT OnAssignNewSect(WPARAM wParam, LPARAM lParam);
LRESULT OnAbort(WPARAM wParam, LPARAM lParam);
LRESULT OnCreateRecvThread(WPARAM wParam, LPARAM lParam);
//{{AFX_MSG(BitSpider)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
struct _SECTFILEHEADER;
struct _SRVIP;
bool m_bWaitIP;
bool m_bUDP;
BYTE m_byThreadCount;
std::deque<_SRVIP*> m_dqSrvIP;
_FILEDETAIL* m_phThreadDetail[10];
_SECTFILEHEADER* m_pSectHeader;
inline void ResetCurrWnd();
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);
static UINT ConnectedUDPThread(LPVOID lpData);
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BITSPIDER_H__E34DC91B_7FDE_48AB_8077_2F9B8197CA04__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -