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


// FileSendDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "FileSendDlg.h" 
#include "DSPFile.h" 
#include "DSPSpider.h" 
#include "SpiderWnd.h" 
#include "ListenType.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// FileSendDlg dialog 
 
 
FileSendDlg::FileSendDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(FileSendDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(FileSendDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	this->m_phListenThreadParam	=NULL; 
	this->m_sockConnect			=INVALID_SOCKET; 
} 
 
 
void FileSendDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(FileSendDlg) 
	DDX_Control(pDX, IDC_STATIC_FILESIZE, m_strFilesize); 
	DDX_Control(pDX, IDC_STATIC_FILENAME, m_strFilename); 
	DDX_Control(pDX, IDC_STATIC_CURRLEN, m_strCurrLen); 
	DDX_Control(pDX, IDC_PROGRESS1, m_progress); 
	DDX_Control(pDX, IDC_COMBOIP, m_comboIP); 
	DDX_Control(pDX, IDC_CHECKNET, m_checkNet); 
	DDX_Control(pDX, IDC_CHECKCRC, m_checkCrc); 
	DDX_Control(pDX, IDC_BTNSEND, m_btnSend); 
	DDX_Control(pDX, IDC_BTNLISTEN, m_btnListen); 
	DDX_Control(pDX, IDC_BTNCONNECT, m_btnConnect); 
	DDX_Control(pDX, IDC_BTNCLOSE, m_btnClose); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(FileSendDlg, CDialog) 
	//{{AFX_MSG_MAP(FileSendDlg) 
	ON_BN_CLICKED(IDC_BTNCLOSE, OnBtnclose) 
	ON_BN_CLICKED(IDC_BTNCONNECT, OnBtnconnect) 
	ON_BN_CLICKED(IDC_BTNLISTEN, OnBtnlisten) 
	ON_BN_CLICKED(IDC_BTNSEND, OnBtnsend) 
	ON_BN_CLICKED(IDC_BTNSPIDERRECV, OnBtnspiderrecv) 
	ON_BN_CLICKED(IDC_BTNJOIN, OnBtnjoin) 
	ON_BN_CLICKED(IDC_BTNHELP, OnBtnhelp) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(DSPFile::MSG_SENDSECT,OnSendSect) 
	ON_MESSAGE(DSPFile::MSG_RECVSECT,OnRecvSect) 
	ON_MESSAGE(DSPFile::MSG_SENDCOMPLETE,OnSendComplete) 
	ON_MESSAGE(DSPFile::MSG_SETFILENAMESIZE,OnSetFilenameSize) 
	ON_MESSAGE(DSPSpider::MSG_GETFILENAME,OnGetFilename) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// FileSendDlg message handlers 
 
BOOL FileSendDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	this->m_btnClose.EnableWindow(FALSE); 
	this->m_btnSend.EnableWindow(FALSE); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void FileSendDlg::OnBtnclose()  
{ 
	// TODO: Add your control notification handler code here 
	if(this->m_bRun) 
	{ 
		this->m_bRun	=false; 
 
		//禁止放弃、传送按钮 
		this->m_btnClose.EnableWindow(FALSE); 
		this->m_btnSend.EnableWindow(FALSE); 
 
		//允许连接按钮、IP选择和校验选择 
		this->m_btnConnect.EnableWindow(); 
		this->m_comboIP.EnableWindow(); 
 
		if(this->m_btnListen.IsWindowEnabled()) 
		{ 
			//如果没有按下监听按钮,则允许连接类型选择 
			this->m_checkNet.EnableWindow(); 
		} 
 
		::closesocket(this->m_sockConnect); 
		this->m_sockConnect	=INVALID_SOCKET; 
	} 
} 
 
void FileSendDlg::OnBtnconnect()  
{ 
	// TODO: Add your control notification handler code here 
	if(this->m_sockConnect!=INVALID_SOCKET) 
	{ 
		::AfxMessageBox("连接已创建,必需先断开后,才能再次连接。"); 
		return; 
	} 
 
	CString str; 
	int	nSel	=this->m_comboIP.GetCurSel(); 
	if(nSel<0) 
	{ 
		//如果没有选择 
		this->m_comboIP.GetWindowText(str); 
		if(str=="") 
		{ 
			//如果输入了IP 
			::AfxMessageBox("请首先选择一个IP"); 
			return; 
		} 
	} 
	else 
	{ 
		//如果选择了一个IP 
		this->m_comboIP.GetLBText(nSel,str); 
	} 
	if(str=="") 
	{ 
		::AfxMessageBox("请首行输入连接方的IP!"); 
	} 
	else 
	{ 
		//连接指定的IP 
		SOCKET sock	=DSP::ConnectTo(str,LISTENPORT,(this->m_checkNet.GetCheck())?false:true); 
		if(sock!=INVALID_SOCKET) 
		{ 
			if(nSel<0) 
			{ 
				//如果没有选择一个IP,则将这个成功的IP加入下拉列表中 
				this->m_comboIP.AddString(str); 
			} 
			 
			this->m_bRun		=true; 
 
			this->m_bSendType	=true; 
 
			this->m_sockConnect	=sock; 
 
			//禁止选择连接类型 
			this->m_checkNet.EnableWindow(FALSE); 
 
			//禁止连接按钮 
			this->m_btnConnect.EnableWindow(FALSE); 
 
			//禁止选择IP 
			this->m_comboIP.EnableWindow(FALSE); 
 
			//允许传送、放弃按钮 
			this->m_btnSend.EnableWindow(); 
			this->m_btnClose.EnableWindow(); 
		} 
		else 
		{ 
			::AfxMessageBox("连接失败,请检查IP后重试!"); 
		} 
	} 
} 
 
void FileSendDlg::OnBtnsend()  
{ 
	// TODO: Add your control notification handler code here 
	//禁止传送按钮和校验选择 
	::AfxBeginThread(FileSendDlg::SendFileThread,(LPVOID)this); 
} 
 
UINT FileSendDlg::SendFileThread(LPVOID lpDlg) 
{ 
	FileSendDlg* pDlg	=(FileSendDlg*)lpDlg; 
	 
	//是否需要CRC校验 
	bool	bCrc		=(pDlg->m_checkCrc.GetCheck())?false:true; 
 
	if(pDlg->m_sockConnect!=INVALID_SOCKET) 
	{ 
		//设置等待时间为1分钟 
		DSP::_DSPPACKET packet(pDlg->m_bRun); 
		packet.Timeout.tv_sec	=60; 
		packet.SetParameter(false,false); 
		 
		//允许传送 
		pDlg->m_bRun	=true; 
 
		if(pDlg->m_bSendType) 
		{ 
			//设置希望监听方SOCKET所执行的动作 
			ListenType	lt; 
			lt.m_dwID	=0; 
			lt.m_wType	=ListenType::OTHER; 
 
			//传送ListenType对象 
			if(packet.WriteObject(pDlg->m_sockConnect,lt)==false) 
			{ 
				//如果传送对象失败,则关闭连接 
				::closesocket(pDlg->m_sockConnect); 
				pDlg->m_sockConnect	=INVALID_SOCKET; 
 
				//允许CRC校验,禁止断开按钮 
				pDlg->m_checkCrc.EnableWindow(); 
				pDlg->m_btnClose.EnableWindow(FALSE); 
 
				//允许选择连接类型 
				pDlg->m_checkNet.EnableWindow(); 
 
				//允许连接按钮 
				pDlg->m_btnConnect.EnableWindow(); 
 
				pDlg->m_bRun	=false; 
			} 
 
			//不需要再传送类型 
			pDlg->m_bSendType	=false; 
		} 
 
		if(pDlg->m_bRun) 
		{ 
			//创建一个对象 
			DSPFile	dspFile; 
			if(dspFile.ReadySendFile(pDlg->m_bRun,pDlg->m_sockConnect,bCrc,packet,pDlg->m_hWnd)) 
			{ 
				//如果传送成功,则允许传送按钮和校验选择 
				pDlg->m_btnSend.EnableWindow(); 
				pDlg->m_checkCrc.EnableWindow(); 
			} 
		} 
	} 
	::AfxEndThread(0); 
	return 0; 
} 
 
void FileSendDlg::OnBtnlisten()  
{ 
	// TODO: Add your control notification handler code here 
	//禁止重新选择连接类型 
	this->m_checkNet.EnableWindow(FALSE); 
 
	//禁止监听按钮 
	this->m_btnListen.EnableWindow(FALSE); 
 
	this->m_phListenThreadParam	=new DSPSpider::_SENDTHREADPARAM(); 
	this->m_phListenThreadParam->pCWnd		=this; 
	this->m_phListenThreadParam->hwnd		=this->m_hWnd; 
	this->m_phListenThreadParam->bInternet	=(this->m_checkNet.GetCheck())?false:true; 
	this->m_phListenThreadParam->pFunc		=FileSendDlg::ListenProcessFunc; 
	::AfxBeginThread(DSPSpider::ListenThread,(LPVOID)this->m_phListenThreadParam); 
} 
 
 
LRESULT FileSendDlg::OnSendComplete(WPARAM wParam, LPARAM lParam) 
{ 
	//允许重新选择是否校验 
	this->m_checkCrc.EnableWindow(); 
 
	CString str; 
	if(DSPFile::GetCompleteInfo(lParam,str)) 
	{ 
		//如果成功 
		::AfxMessageBox(str); 
 
		//允许传送按钮 
		this->m_btnConnect.EnableWindow(); 
	} 
	else 
	{ 
		//如果失败 
		::AfxMessageBox(str); 
		this->OnBtnclose(); 
	} 
 
	return 0; 
}; 
 
LRESULT FileSendDlg::OnRecvSect(WPARAM wParam, LPARAM lParam) 
{ 
	this->m_progress.StepIt(); 
	DSPFile::_FILEDETAIL* lphfd	=(DSPFile::_FILEDETAIL*)wParam; 
	CString str; 
	str.Format("(%dK) %d",lphfd->nCurrLen/1024,lphfd->nCurrLen); 
	this->m_strCurrLen.SetWindowText(str); 
	return 0; 
}; 
 
LRESULT FileSendDlg::OnSendSect(WPARAM wParam, LPARAM lParam) 
{ 
	this->m_progress.StepIt(); 
	DSPFile::_FILEDETAIL* lphfd	=(DSPFile::_FILEDETAIL*)wParam; 
	CString str; 
	str.Format("(%dK) %d",lphfd->nCurrLen/1024,lphfd->nCurrLen); 
	this->m_strCurrLen.SetWindowText(str); 
	return 0; 
} 
 
LRESULT FileSendDlg::OnSetFilenameSize(WPARAM wParam, LPARAM lParam) 
{ 
	//设置文件的名字和大小 
	DSPFile::_FILEDETAIL* lphfd	=(DSPFile::_FILEDETAIL*)wParam; 
 
	if(lphfd->nCurrLen>0) 
	{ 
		//显示文件名 
		this->m_strFilename.SetWindowText(lphfd->strPathname); 
 
		//显示总的长度 
		CString str; 
		str.Format("/ %d (%dK)",lphfd->nFilesize,lphfd->nFilesize/1024); 
		this->m_strFilesize.SetWindowText(str); 
 
		//初始化当前接收的长度 
		this->m_strCurrLen.SetWindowText("0K"); 
 
		//初始化进度显示 
		this->m_progress.SetRange32(0,lphfd->nFilesize); 
		this->m_progress.SetStep(lphfd->nCurrLen); 
		this->m_progress.SetPos(0); 
 
		//禁止传送按钮和校验选择 
		this->m_btnSend.EnableWindow(FALSE); 
		this->m_checkCrc.EnableWindow(FALSE); 
	} 
	else 
	{ 
		//显示文件名 
		this->m_strFilename.SetWindowText(lphfd->strPathname); 
	} 
	return 0; 
} 
 
LRESULT FileSendDlg::OnGetFilename(WPARAM wParam, LPARAM lParam) 
{ 
	//打开对话框,选择需要被传送的文件名 
 
	DSPSpider::_FILEDETAIL& fd	=*(DSPSpider::_FILEDETAIL*)wParam; 
	CFileDialog fileDialog(TRUE,NULL,fd.strFilename,OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST); 
	if(fileDialog.DoModal()==IDOK) 
	{ 
		//得到被选择的文件名 
		CString str		=fileDialog.GetPathName(); 
		DSPSpider::SetFilename(wParam,str); 
		fd.dwFilesize	=DSP::GetFileSize(fd.strPathname); 
	} 
	return 0; 
}; 
 
void FileSendDlg::OnBtnspiderrecv()  
{ 
	// TODO: Add your control notification handler code here 
	POINT point; 
	CWnd* pWnd; 
	int	row		=15; 
	int delta	=SpiderWnd::WND_HEIGHT+5; 
	point.x		=850; 
	for(;row<500;row+=delta) 
	{ 
		point.y	=row; 
		pWnd	=CWnd::WindowFromPoint(point); 
		if(pWnd!=NULL) 
		{ 
			if(pWnd->GetParent()==this) 
				continue; 
		} 
 
		//如果找到了一个空的位置 
		SpiderWnd*	bs	=new SpiderWnd; 
		SpiderWnd::pLastWnd	=bs; 
 
		bs->Create(800,row,170,this); 
		bs->ShowWindow(SW_SHOW); 
		bs->m_spider.m_bInternet	=(this->m_checkNet.GetCheck())?false:true; 
 
		//打开对话框,选择需要下载的文件名 
		CFileDialog fileDialog(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST); 
		if(fileDialog.DoModal()==IDOK) 
		{ 
			//得到被选择的文件名 
			bs->m_spider.RunSpider(fileDialog.GetFileName(),fileDialog.GetPathName(),bs->m_hWnd,3); 
		} 
		break; 
	} 
} 
 
 
bool FileSendDlg::ListenProcessFunc(DSPSpider::_SENDTHREADPARAM *phParam,DSP::_DSPPACKET& packet) 
{ 
	FileSendDlg* pDlg	=(FileSendDlg*)phParam->pCWnd; 
	 
	//准备接收文件 
	//允许断开按钮 
	pDlg->m_btnClose.EnableWindow(); 
 
	//禁止连接按钮 
	pDlg->m_btnConnect.EnableWindow(FALSE); 
 
	//保存连接的SOCKET 
	pDlg->m_sockConnect	=phParam->sock; 
 
	DSPFile	dspFile; 
	dspFile.ReadyRecvFile(pDlg->m_bRun,phParam->sock,packet,pDlg->m_hWnd); 
	return true; 
}; 
 
void FileSendDlg::OnBtnjoin()  
{ 
	// TODO: Add your control notification handler code here 
	if(SpiderWnd::pLastWnd!=NULL) 
	{ 
		CString str; 
		this->m_comboIP.GetWindowText(str); 
		if(str=="") 
		{ 
			::AfxMessageBox("请首先选择一个IP或者输入一个新的IP,然后再点击加入按钮。"); 
			return; 
		} 
		SpiderWnd::pLastWnd->m_spider.AddIP(str,34567); 
	} 
} 
 
void FileSendDlg::OnBtnhelp()  
{ 
	// TODO: Add your control notification handler code here 
	CString str; 
	str.Format("在点击[多线程接收]接钮后,必需要选择或输入一个IP,然后点击[加入多线程IP]按钮,加入一个IP,程序会自动与新加入的IP建立连接,并开始下载。\r\n传送方将根据接收方传送的文件名,选择一个文件准备传送。\r\n可以选择多个IP加入,但是当IP超过设置的线程个数时,则将不起作用。"); 
	::AfxMessageBox(str); 
}