www.pudn.com > mini_remote.zip > FileMgrDlg.cpp


// FileMgrDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "MainCtrl.h" 
#include "FileMgrDlg.h" 
#include "UpLoadFileDlg.h" 
#include "DownLoadDlg.h" 
#include "RemoteRunDlg.h" 
 
void ShowDriveList(void *m_Dlg) 
{ 
	CFileMgrDlg *dlg = (CFileMgrDlg *)m_Dlg; 
	SOCKET hSocket = dlg->m_hConnectSocket; 
	COMMAND_MSG msg; 
	memset(&msg,0,sizeof(COMMAND_MSG)); 
	msg.msg_id = CMD_GETDRIVE; 
	while(1) 
	{ 
		int nRet=send(hSocket,(char *)&msg,sizeof(msg),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
			{ 
				return; 
			} 
		} 
		else 
			break; 
	} 
	dlg->m_list.DeleteAllItems(); 
	while(1) 
	{ 
		DRIVE_INFO info; 
		memset(&info,0,sizeof(DRIVE_INFO)); 
		dlg->SetDlgItemText(IDC_SHOW_DIR,"接收驱动器列表"); 
		int nRet=recv(hSocket,(char *)&info,sizeof(DRIVE_INFO),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue;	//阻塞,继续 
			} 
			else 
				return;	 
		} 
		else 
		{ 
			if (info.isEnd) 
				return; 
			int i,nCount = 0; 
			switch (info.nType) 
			{ 
			case DRIVE_FIXED:  
				i = dlg->m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_HARDDRIVE)); 
				dlg->m_list.InsertItem(nCount,info.DriveName,i); 
				dlg->m_list.SetItemData(nCount,0xFFFFFFFF); 
				break; 
				/* 
			case DRIVE_CDROM: 
				i = dlg->m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_CDROM)); 
				dlg->m_list.InsertItem(nCount,info.DriveName,i); 
				dlg->m_list.SetItemData(nCount,0xFFFFFFFF); 
				break; 
				*/ 
			case DRIVE_REMOVABLE: 
				i = dlg->m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_REMOVABLE)); 
				dlg->m_list.InsertItem(nCount,info.DriveName,i); 
				dlg->m_list.SetItemData(nCount,0xFFFFFFFF); 
				break; 
			}//end of switch 
		} 
	}//end of while 
} 
 
void ShowFileList(void *m_Dlg) 
{ 
	CFileMgrDlg *dlg = (CFileMgrDlg *)m_Dlg; 
	SOCKET hSocket = dlg->m_hConnectSocket; 
	COMMAND_MSG msg; 
	memset(&msg,0,sizeof(COMMAND_MSG)); 
	msg.msg_id = CMD_SHOWFILELIST; 
	strcpy(msg.wParam,dlg->strCurPath.GetBuffer(0)); 
	while(1) 
	{ 
		int nRet=send(hSocket,(char *)&msg,sizeof(msg),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
			{ 
				return; 
			} 
		} 
		else break; 
	} 
	//接收数据的大小 
	DWORD dwDataSize=0; 
	while(1) 
	{ 
		int nRet=recv(hSocket,(char *)&dwDataSize,sizeof(DWORD),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
			{ 
				return; 
			} 
		} 
		else break; 
	} 
	dlg->m_list.DeleteAllItems(); 
	if (dwDataSize==0) 
		return; 
	//接收数据 
	CByteArray		m_ArrayBuffer; 
	m_ArrayBuffer.SetSize(dwDataSize); 
	DWORD dwLeft=dwDataSize; 
	DWORD dwPoint=0; 
	while(dwLeft>0) 
	{ 
		int nRet=recv(hSocket,(char*)m_ArrayBuffer.GetData()+dwPoint,dwLeft,NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				break; 
		} 
		dwPoint+=nRet; 
		dwLeft-=nRet; 
	} 
	//分解数据 
	dwPoint=0; 
	DWORD nCount = 0; 
	int i; 
	while(dwPointm_ImageList.Add(AfxGetApp()->LoadIcon(IDI_FOLDER)); 
			dlg->m_list.InsertItem(nCount,info.FileName,i); 
			dlg->m_list.SetItemData(nCount,0xFFFFFFFF); 
		} 
		else 
		{ 
			SHFILEINFO shFileInfo; 
			SHGetFileInfo(info.FileName,FILE_ATTRIBUTE_NORMAL,&shFileInfo,sizeof(SHFILEINFO), 
				SHGFI_USEFILEATTRIBUTES|SHGFI_DISPLAYNAME|SHGFI_ICON|SHGFI_SMALLICON|SHGFI_TYPENAME); 
			i = dlg->m_ImageList.Add(shFileInfo.hIcon); 
			dlg->m_list.InsertItem(nCount,info.FileName,i); 
		} 
		nCount++; 
 
		dwPoint+=sizeof(FILE_INFO); 
	} 
} 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileMgrDlg dialog 
 
 
CFileMgrDlg::CFileMgrDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CFileMgrDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CFileMgrDlg) 
	//}}AFX_DATA_INIT 
} 
 
 
void CFileMgrDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CFileMgrDlg) 
	DDX_Control(pDX, IDC_UPLOADFILE, m_btn_6); 
	DDX_Control(pDX, IDC_REMOTERUN, m_btn_5); 
	DDX_Control(pDX, IDC_REFLASHFILE, m_btn_4); 
	DDX_Control(pDX, IDC_FILEDEL, m_btn_3); 
	DDX_Control(pDX, IDC_DOWNFILE, m_btn_2); 
	DDX_Control(pDX, IDC_BACKUP, m_btn_1); 
	DDX_Control(pDX, IDC_LIST1, m_list); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CFileMgrDlg, CDialog) 
	//{{AFX_MSG_MAP(CFileMgrDlg) 
	ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList) 
	ON_BN_CLICKED(IDC_BACKUP, OnBackup) 
	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeydownList) 
	ON_BN_CLICKED(IDC_UPLOADFILE, OnUploadfile) 
	ON_BN_CLICKED(IDC_REFLASHFILE, OnReflashfile) 
	ON_BN_CLICKED(IDC_DOWNFILE, OnDownfile) 
	ON_BN_CLICKED(IDC_REMOTERUN, OnRemoterun) 
	ON_BN_CLICKED(IDC_FILEDEL, OnFiledel) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFileMgrDlg message handlers 
 
BOOL CFileMgrDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	m_btn_1.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_1.SetFontColor(RGB(100,50,280)); 
	m_btn_2.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_2.SetFontColor(RGB(100,50,280)); 
	m_btn_3.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_3.SetFontColor(RGB(100,50,280)); 
	m_btn_4.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_4.SetFontColor(RGB(100,50,280)); 
	m_btn_5.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_5.SetFontColor(RGB(100,50,280)); 
	m_btn_6.LoadBitmaps(IDB_BITMAP1,5, 5, 5, 5, 4); 
	m_btn_6.SetFontColor(RGB(100,50,280)); 
 
	CString str = "在远程主机: "+strIP+" 上"; 
	SetWindowText(str); 
	m_ImageList.Create(16,16,ILC_COLOR8|ILC_MASK,2,1); 
	//m_ImageList.Create(32,32,ILC_COLOR32,10,30); 
 
	m_list.SetImageList(&m_ImageList,LVSIL_SMALL); 
 
	LONG lStyle = m_list.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE); 
	lStyle |= LVS_EX_FULLROWSELECT; 
	m_list.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,(LPARAM)lStyle); 
	 
	LV_COLUMN lvc; 
	lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH; 
	lvc.iSubItem = 0; 
	lvc.pszText = (char *)"文件名"; 
	lvc.cx = 300; 
	m_list.InsertColumn(0,&lvc); 
 
	strCurPath = ""; 
	AfxBeginThread((AFX_THREADPROC) ShowDriveList,this); 
	return TRUE; 
} 
 
void CFileMgrDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
	if (m_list.GetItemData(pNMListView->iItem) != 0xFFFFFFFF) 
		return; 
	strCurPath += m_list.GetItemText(pNMListView->iItem,pNMListView->iSubItem); 
	strCurPath += "\\"; 
	SetDlgItemText(IDC_SHOW_DIR,strCurPath); 
	AfxBeginThread((AFX_THREADPROC) ShowFileList,this); 
	*pResult = 0; 
} 
 
void CFileMgrDlg::OnBackup() 
{ 
	int Index = strCurPath.ReverseFind('\\'); 
	if (Index == -1) 
	{ 
		return; 
	} 
	CString str = strCurPath.Left(Index); 
	Index = str.ReverseFind('\\'); 
	if (Index == -1) 
	{ 
		AfxBeginThread((AFX_THREADPROC) ShowDriveList,this); 
		strCurPath=""; 
		return; 
	} 
	strCurPath = str.Left(Index); 
 
	if(strCurPath.Right(1) != "\\") 
	   strCurPath += "\\"; 
	AfxBeginThread((AFX_THREADPROC) ShowFileList,this); 
	SetDlgItemText(IDC_SHOW_DIR,strCurPath); 
} 
 
 
void CFileMgrDlg::OnKeydownList(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;	 
	*pResult = 0; 
	UINT nChar=pLVKeyDow->wVKey; 
	switch(nChar) 
	{ 
		case VK_BACK: 
		{ 
			OnBackup();//调用TreeView的响应函数	 
			break; 
		} 
	} 
} 
 
void CFileMgrDlg::OnUploadfile()  
{ 
	if (strCurPath.IsEmpty()) 
		return; 
	CUpLoadFileDlg dlg; 
	dlg.m_remotefile=strCurPath; 
	dlg.m_hConnectSocket = m_hConnectSocket; 
	dlg.DoModal(); 
} 
 
void CFileMgrDlg::OnReflashfile()  
{ 
	if (strCurPath.IsEmpty()) 
		return; 
	AfxBeginThread((AFX_THREADPROC) ShowFileList,this); 
} 
 
void CFileMgrDlg::OnDownfile()  
{ 
	POSITION pos; 
	pos = m_list.GetFirstSelectedItemPosition(); 
	if (pos == NULL) 
	{ 
		return; 
	} 
	int Index = m_list.GetNextSelectedItem(pos); 
	if (m_list.GetItemData(Index) == 0xFFFFFFFF) 
		return; 
	CDownLoadDlg dlg; 
	dlg.m_hConnectSocket=m_hConnectSocket; 
	dlg.m_remotefile = strCurPath+m_list.GetItemText(Index,0); 
	dlg.DoModal(); 
} 
 
void CFileMgrDlg::OnRemoterun()  
{	 
	POSITION pos; 
	pos = m_list.GetFirstSelectedItemPosition(); 
	if (pos == NULL) 
	{ 
		return; 
	} 
	int Index = m_list.GetNextSelectedItem(pos); 
	if (m_list.GetItemData(Index) == 0xFFFFFFFF) 
		return; 
	CRemoteRunDlg dlg; 
	dlg.m_hConnectSocket=m_hConnectSocket; 
	dlg.m_cmd = strCurPath+m_list.GetItemText(Index,0); 
	dlg.DoModal(); 
} 
 
void CFileMgrDlg::OnFiledel()  
{ 
	POSITION pos; 
	pos = m_list.GetFirstSelectedItemPosition(); 
	if (pos == NULL) 
		return; 
	int Index = m_list.GetNextSelectedItem(pos); 
	if (m_list.GetItemData(Index) == 0xFFFFFFFF) 
		return; 
	CString filename = strCurPath+m_list.GetItemText(Index,0); 
	COMMAND_MSG msg; 
	memset(&msg,0,sizeof(COMMAND_MSG)); 
	msg.msg_id = CMD_FILEDEL; 
	strcpy(msg.wParam,filename.GetBuffer(0)); 
	while(1) 
	{ 
		int nRet=send(m_hConnectSocket,(char *)&msg,sizeof(msg),NULL); 
		if(nRet==SOCKET_ERROR) 
		{ 
			if(WSAGetLastError()==WSAEWOULDBLOCK) 
			{ 
				Sleep(50); 
				continue; 
			} 
			else 
				return; 
		} 
		else 
			return; 
	} 
}