From 44f28defa2c699a00b382e6b30b8f735c4fb3fe9 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sat, 28 Jun 2025 22:26:45 +0800 Subject: [PATCH] Plugin: Add another file management module --- common/commands.h | 52 +- server/2015Remote/2015Remote.rc | Bin 80880 -> 85406 bytes server/2015Remote/2015RemoteDlg.cpp | 33 + server/2015Remote/2015RemoteDlg.h | 1 + server/2015Remote/2015Remote_vs2015.vcxproj | 6 + .../2015Remote_vs2015.vcxproj.filters | 185 ++ server/2015Remote/file/CFileListCtrl.cpp | 24 + server/2015Remote/file/CFileListCtrl.h | 14 + server/2015Remote/file/CFileManagerDlg.cpp | 2505 +++++++++++++++++ server/2015Remote/file/CFileManagerDlg.h | 197 ++ .../2015Remote/file/CFileTransferModeDlg.cpp | 111 + server/2015Remote/file/CFileTransferModeDlg.h | 31 + server/2015Remote/res/file/FILE.ico | Bin 0 -> 894 bytes server/2015Remote/res/file/Icon_A.ico | Bin 0 -> 25214 bytes server/2015Remote/res/file/Icon_C.ico | Bin 0 -> 24190 bytes server/2015Remote/res/file/Icon_D.ico | Bin 0 -> 45110 bytes server/2015Remote/res/file/Icon_E.ico | Bin 0 -> 25214 bytes server/2015Remote/res/file/Icon_F.ico | Bin 0 -> 25214 bytes server/2015Remote/res/file/Icon_G.ico | Bin 0 -> 25214 bytes server/2015Remote/resource.h | Bin 39262 -> 41158 bytes server/2015Remote/stdafx.h | 2 + 21 files changed, 3160 insertions(+), 1 deletion(-) create mode 100644 server/2015Remote/2015Remote_vs2015.vcxproj.filters create mode 100644 server/2015Remote/file/CFileListCtrl.cpp create mode 100644 server/2015Remote/file/CFileListCtrl.h create mode 100644 server/2015Remote/file/CFileManagerDlg.cpp create mode 100644 server/2015Remote/file/CFileManagerDlg.h create mode 100644 server/2015Remote/file/CFileTransferModeDlg.cpp create mode 100644 server/2015Remote/file/CFileTransferModeDlg.h create mode 100644 server/2015Remote/res/file/FILE.ico create mode 100644 server/2015Remote/res/file/Icon_A.ico create mode 100644 server/2015Remote/res/file/Icon_C.ico create mode 100644 server/2015Remote/res/file/Icon_D.ico create mode 100644 server/2015Remote/res/file/Icon_E.ico create mode 100644 server/2015Remote/res/file/Icon_F.ico create mode 100644 server/2015Remote/res/file/Icon_G.ico diff --git a/common/commands.h b/common/commands.h index d15a0e2..9255f1d 100644 --- a/common/commands.h +++ b/common/commands.h @@ -80,6 +80,12 @@ typedef void* LPVOID, * HANDLE; #define GET_FILEPATH(dir,file) [](char*d,const char*f){char*p=d;while(*p)++p;while('\\'!=*p&&p!=d)--p;strcpy(p+1,f);return d;}(dir,file) #endif +inline int isValid_60s() { + static time_t tm = time(nullptr); + int span = int(time(nullptr) - tm); + return span <= 60; +} + inline int isValid_30s() { static time_t tm = time(nullptr); int span = int(time(nullptr) - tm); @@ -226,7 +232,8 @@ enum TOKEN_KEYFRAME=134, // 关键帧 TOKEN_BITMAPINFO_HIDE, // 虚拟屏幕 TOKEN_SCREEN_SIZE, // 屏幕大小 - + TOKEN_DRIVE_LIST_PLUGIN = 150, // 文件管理(插件) + TOKEN_DECRYPT = 199, TOKEN_REGEDIT = 200, // 注册表 COMMAND_REG_FIND, // 注册表 管理标识 @@ -382,6 +389,49 @@ enum ChatManager { COMMAND_CHAT_SCREEN_UNLOCK, }; +// 文件管理 +enum FileManager { + COMMAND_COMPRESS_FILE_PARAM=220, + COMMAND_FILES_SEARCH_START, + COMMAND_FILES_SEARCH_STOP, + COMMAND_FILE_EXCEPTION, + COMMAND_SEARCH_FILE, + COMMAND_FILE_GETNETHOOD, + COMMAND_FILE_RECENT, + COMMAND_FILE_INFO, + COMMAND_FILE_Encryption, + COMMAND_FILE_Decrypt, + COMMAND_FILE_ENFOCE, + COMMAND_FILE_CopyFile, + COMMAND_FILE_PasteFile, + COMMAND_FILE_zip, + COMMAND_FILE_zip_stop, + COMMAND_FILE_NO_ENFORCE, + COMMAND_FILE_GETINFO, + + COMMAND_FILE_SEARCHPLUS_LIST, + + TOKEN_SEARCH_FILE_LIST, + TOKEN_SEARCH_FILE_FINISH, + TOKEN_CFileManagerDlg_DATA_CONTINUE, + TOKEN_COMPRESS_FINISH, + TOKEN_SEARCH_ADD, + TOKEN_SEARCH_END, + TOKEN_FILE_GETNETHOOD, + TOKEN_FILE_RECENT, + TOKEN_FILE_INFO, + TOKEN_FILE_REFRESH, + TOKEN_FILE_ZIPOK, + TOKEN_FILE_GETINFO, + + TOKEN_FILE_SEARCHPLUS_LIST, + TOKEN_FILE_SEARCHPLUS_NONTFS, + TOKEN_FILE_SEARCHPLUS_HANDLE, + TOKEN_FILE_SEARCHPLUS_INITUSN, + TOKEN_FILE_SEARCHPLUS_GETUSN, + TOKEN_FILE_SEARCHPLUS_NUMBER, +}; + enum { CLIENT_TYPE_DLL = 0, // 客户端代码以DLL运行 diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index a26ba025fe3b38829cded95fe42b19657e92facf..83d8e89b54ac81542cbc754be748b8e48baa9587 100644 GIT binary patch delta 1572 zcmah}OHUI~6h4!Hlp;a}DTY@&6R5Fh+G$J6!_t=0+F;t!76`FPsoq#NTe;*VFGg#q*UeXO?|@UYuZor4JyFAfQOenG19fCrq=4HkO4z=J!3Bk1Tq zgtuEn49xoRVX6tcJ#oC_a|jk(_gU$GhyVY6AmOg>vCTsHJ>cdTvWn#bpE{Ch$HVq; z&TB)l>jb{>Hd`&Us#RsRT{M%`E_^)ND%@*XG zgJ;O#rF@3srasu)N%LAT;?&(!XEJ1fGz>!!Qe>F3G|te7MfK?Nm0nn$g2YA?gNve- zn2WK>v^|qN&wA*cO|D`O9p7r-isW z6jf;CRh7^*)Vg>2rBTRznq=%tYleseGrpb|VQd9US5<{M#LLlSs#QEy*)NV}lhc<=J1xa$vkd8zZEVKk={BocD4EQ2Y+cKIXO(dEiILnux2cV-D{+cn*u7=Z zy}XKP(4OCF6)YVJuvayeW;PAjiR2))QixbnIY+t>789HFp;mX8A%_z=LY iug1da_V%>)VXFD}VS;qt)Fq_zyA{I5X7fqmv*|Amz$uXc delta 46 zcmbO?oAtwYmJMBE)7LmMZrJQ29nn3RZ`X#+QJX`QC+*_e{NVbrB#^-NBi4+!1OW{L B7J~o) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index ef9182c..ee78719 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -37,6 +37,7 @@ #include "DecryptDlg.h" #include "adapter.h" #include "client/MemoryModule.h" +#include #ifdef _DEBUG #define new DEBUG_NEW @@ -384,6 +385,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_MESSAGE(WM_OPENMACHINEMGRDLG, OnOpenMachineManagerDialog) ON_MESSAGE(WM_OPENCHATDIALOG, OnOpenChatDialog) ON_MESSAGE(WM_OPENDECRYPTDIALOG, OnOpenDecryptDialog) + ON_MESSAGE(WM_OPENFILEMGRDIALOG, OnOpenFileMgrDialog) ON_MESSAGE(WM_UPXTASKRESULT, UPXProcResult) ON_WM_HELPINFO() ON_COMMAND(ID_ONLINE_SHARE, &CMy2015RemoteDlg::OnOnlineShare) @@ -1723,6 +1725,11 @@ VOID CALLBACK CMy2015RemoteDlg::NotifyProc(CONTEXT_OBJECT* ContextObject) Dlg->OnReceiveComplete(); break; } + case FILEMGR_DLG: { + file::CFileManagerDlg* Dlg = (file::CFileManagerDlg*)ContextObject->hDlg; + Dlg->OnReceiveComplete(); + break; + } default: { HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { @@ -1875,6 +1882,11 @@ VOID CMy2015RemoteDlg::MessageHandle(CONTEXT_OBJECT* ContextObject) Sleep(10); break; } + case TOKEN_DRIVE_LIST_PLUGIN: // 鏂囦欢绠$悊 + { + g_2015RemoteDlg->SendMessage(WM_OPENFILEMGRDIALOG, 0, (LPARAM)ContextObject); + break; + } case TOKEN_BITMAPINFO_HIDE: { // 铏氭嫙妗岄潰 g_2015RemoteDlg->SendMessage(WM_OPENHIDESCREENDLG, 0, (LPARAM)ContextObject); break; @@ -2126,6 +2138,12 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) delete Dlg; break; } + case FILEMGR_DLG: + { + file::CFileManagerDlg* Dlg = (file::CFileManagerDlg*)p->hDlg; + ::PostMessageA(Dlg->GetSafeHwnd(), WM_CLOSE, 0, 0); + break; + } default:break; } delete p; @@ -2450,6 +2468,21 @@ LRESULT CMy2015RemoteDlg::OnOpenDecryptDialog(WPARAM wParam, LPARAM lParam) return 0; } +LRESULT CMy2015RemoteDlg::OnOpenFileMgrDialog(WPARAM wParam, LPARAM lParam) +{ + CONTEXT_OBJECT* ContextObject = (CONTEXT_OBJECT*)lParam; + + file::CFileManagerDlg* Dlg = new file::CFileManagerDlg(this, m_iocpServer, ContextObject); + + Dlg->Create(IDD_FILE_WINOS, GetDesktopWindow()); + Dlg->ShowWindow(SW_SHOW); + + ContextObject->v1 = FILEMGR_DLG; + ContextObject->hDlg = Dlg; + + return 0; +} + BOOL CMy2015RemoteDlg::OnHelpInfo(HELPINFO* pHelpInfo) { MessageBox("Copyleft (c) FTU 2025", "鍏充簬"); diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index 7aab795..f417bb2 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -231,6 +231,7 @@ public: afx_msg LRESULT OnOpenProxyDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenChatDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnOpenDecryptDialog(WPARAM wParam, LPARAM lParam); + afx_msg LRESULT OnOpenFileMgrDialog(WPARAM wParam, LPARAM lParam); afx_msg LRESULT UPXProcResult(WPARAM wParam, LPARAM lParam); afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo); virtual BOOL PreTranslateMessage(MSG* pMsg); diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 3c86b3b..25f67c0 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -269,6 +269,9 @@ + + + @@ -326,6 +329,9 @@ + + + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters new file mode 100644 index 0000000..52e682e --- /dev/null +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -0,0 +1,185 @@ +锘 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file + + + file + + + file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file + + + file + + + file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {17217547-dc35-4a87-859c-e8559529a909} + + + \ No newline at end of file diff --git a/server/2015Remote/file/CFileListCtrl.cpp b/server/2015Remote/file/CFileListCtrl.cpp new file mode 100644 index 0000000..2a3d216 --- /dev/null +++ b/server/2015Remote/file/CFileListCtrl.cpp @@ -0,0 +1,24 @@ +#include "StdAfx.h" +#include "2015Remote.h" +#include "CFileListCtrl.h" +#include "CFileManagerDlg.h" + +using namespace file; + +BEGIN_MESSAGE_MAP(CFileListCtrl, CListCtrl) + ON_WM_DROPFILES() +END_MESSAGE_MAP() + +void CFileListCtrl::SetParenDlg(VOID* p_CFileManagerDlg) +{ + m_pCFileManagerDlg = p_CFileManagerDlg; +} + +void CFileListCtrl::OnDropFiles(HDROP hDropInfo) +{ + TCHAR filePath[MAX_PATH] = { 0 }; + DragQueryFile(hDropInfo, 0, filePath, sizeof(filePath) * 2 + 2); + ((CFileManagerDlg*)m_pCFileManagerDlg)->TransferSend(filePath); + ::DragFinish(hDropInfo); + CListCtrl::OnDropFiles(hDropInfo); +} diff --git a/server/2015Remote/file/CFileListCtrl.h b/server/2015Remote/file/CFileListCtrl.h new file mode 100644 index 0000000..d57332c --- /dev/null +++ b/server/2015Remote/file/CFileListCtrl.h @@ -0,0 +1,14 @@ +#pragma once +#include + + +class CFileListCtrl :public CListCtrl +{ + DECLARE_MESSAGE_MAP() + + +public: + void* m_pCFileManagerDlg; + void SetParenDlg(VOID* p_CFileManagerDlg); + afx_msg void OnDropFiles(HDROP hDropInfo); +}; diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp new file mode 100644 index 0000000..9ff0559 --- /dev/null +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -0,0 +1,2505 @@ +// FileManagerDlg.cpp : implementation file +#include "stdafx.h" +#include "2015Remote.h" +#include "CFileManagerDlg.h" +#include "CFileTransferModeDlg.h" + +#include "InputDlg.h" +#include +#include + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif +#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32)) + +static UINT indicators[] = { + ID_SEPARATOR, // status line indicator + ID_SEPARATOR, + ID_SEPARATOR +}; + +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg dialog + +using namespace file; + +CFileManagerDlg::CFileManagerDlg(CWnd* pParent, ISocketBase* pIOCPServer, ClientContext* pContext) + : DialogBase(CFileManagerDlg::IDD, pParent, pIOCPServer, pContext, 0) +{ + m_ProgressCtrl = nullptr; + m_SearchStr = _T(""); + m_bSubFordle = FALSE; + m_bOnClose = 0; + id_search_result = 0; + m_iocpServer = pIOCPServer; + m_pContext = pContext; + m_IPAddress = m_pContext->PeerName.c_str(); + m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_File)); //窗口图标 + // 保存远程驱动器列表 + m_bCanAdmin = (*m_pContext->m_DeCompressionBuffer.GetBuffer(1)) == 0x01; + m_strDesktopPath = (TCHAR*)m_pContext->m_DeCompressionBuffer.GetBuffer(2); + memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList)); + memcpy(m_bRemoteDriveList, m_pContext->m_DeCompressionBuffer.GetBuffer(1 + 1 + (m_strDesktopPath.GetLength() + 1) * sizeof(TCHAR)), + m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1 - 1 - (m_strDesktopPath.GetLength() + 1) * sizeof(TCHAR)); + + m_bUseAdmin = false; + m_hFileSend = INVALID_HANDLE_VALUE; + m_hFileRecv = INVALID_HANDLE_VALUE; + m_nTransferMode = TRANSFER_MODE_NORMAL; + m_nOperatingFileLength = 0; + m_nCounter = 0; + m_bIsStop = false; + + DRIVE_Sys = FALSE; + DRIVE_CAZ = FALSE; + Bf_nCounters = 0;// 备份计数器 由于比较用 + Bf_dwOffsetHighs = 0; + Bf_dwOffsetLows = 0; + + m_bDragging = FALSE; +} + +void CFileManagerDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox); + DDX_Control(pDX, IDC_LIST_REMOTE, m_list_remote); + DDX_Control(pDX, IDC_LIST_REMOTE_DRIVER, m_list_remote_driver); + + DDX_Control(pDX, IDC_BTN_SEARCH, m_BtnSearch); + DDX_Text(pDX, IDC_EDT_SEARCHSTR, m_SearchStr); + DDX_Check(pDX, IDC_CK_SUBFORDLE, m_bSubFordle); + DDX_Control(pDX, IDC_LIST_REMOTE_SEARCH, m_list_remote_search); +} + +BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog) + ON_WM_QUERYDRAGICON() + ON_WM_SIZE() + ON_WM_MOUSEMOVE() + ON_WM_LBUTTONUP() + ON_WM_TIMER() + ON_WM_CLOSE() + + ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE_DRIVER, OnDblclkListRemotedriver) //主1 双击 + ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote) //主 双击 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_DRIVER, OnRclickListRemotedriver) //主1 右键 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote) //主 右键 + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE_SEARCH, OnRclickListSearch) //搜索 右键 + + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_DRIVER, OnclkListRemotedriver) //主1 单击 + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE, OnclkListRemote) //主 单击 + ON_NOTIFY(NM_CLICK, IDC_LIST_REMOTE_SEARCH, OnclickListSearch) //搜索 单击 + + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_REMOTE, OnEndLabelEditListRemote) + ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_REMOTE, OnBeginDragListRemote) + + ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView) //显示方式 + ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev) //向上 + ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop) //取消 + ON_BN_CLICKED(IDC_BUTTON_GO, OnGo) + ON_COMMAND(IDM_RENAME, OnRename) + ON_COMMAND(IDM_DELETE, OnDelete) + ON_COMMAND(IDM_DELETE_ENFORCE, OnDeleteEnforce) + ON_COMMAND(IDM_NEWFOLDER, OnNewFolder) + ON_COMMAND(IDM_USE_ADMIN, OnUseAdmin) + ON_COMMAND(IDM_REMOTE_OPEN_SHOW, OnRemoteOpenShow) + ON_COMMAND(IDM_REMOTE_OPEN_HIDE, OnRemoteOpenHide) + ON_COMMAND(IDM_GET_FILEINFO, OnRemoteInfo) + ON_COMMAND(ID_FILEMANGER_Encryption, OnRemoteEncryption) + ON_COMMAND(ID_FILEMANGER_decrypt, OnRemoteDecrypt) + ON_COMMAND(ID_FILEMANGER_COPY, OnRemoteCopyFile) + ON_COMMAND(ID_FILEMANGER_PASTE, OnRemotePasteFile) + ON_COMMAND(ID_FILEMANGER_ZIP, OnRemotezip) + ON_COMMAND(ID_FILEMANGER_ZIP_STOP, OnRemotezipstop) + + ON_COMMAND(IDM_COMPRESS, OnCompress) + ON_COMMAND(IDM_UNCOMPRESS, OnUncompress) + ON_COMMAND(IDM_REFRESH, OnRefresh) + ON_COMMAND(IDM_TRANSFER_S, OnTransferSend) + ON_COMMAND(IDM_TRANSFER_R, OnTransferRecv) + ON_CBN_SETFOCUS(IDC_REMOTE_PATH, OnSetfocusRemotePath) + ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch) + ON_BN_CLICKED(ID_SEARCH_STOP, OnBnClickedSearchStop) + ON_BN_CLICKED(ID_SEARCH_RESULT, OnBnClickedSearchResult) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg message handlers + +BOOL CFileManagerDlg::MyShell_GetImageLists() +{ + I_ImageList0.DeleteImageList(); + I_ImageList0.Create(32, 32, ILC_COLOR32 | ILC_MASK, 2, 2); + I_ImageList0.SetBkColor(::GetSysColor(COLOR_BTNFACE)); + + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_A)); + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_C)); + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_D)); + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_E)); + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_F)); + I_ImageList0.Add(AfxGetApp()->LoadIcon(IDI_MGICON_G)); + + I_ImageList1.DeleteImageList(); + I_ImageList1.Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 2); + I_ImageList1.SetBkColor(::GetSysColor(COLOR_BTNFACE)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_A)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_C)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_D)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_E)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_F)); + I_ImageList1.Add(AfxGetApp()->LoadIcon(IDI_MGICON_G)); + m_list_remote_driver.SetImageList(&I_ImageList0, LVSIL_NORMAL); + m_list_remote_driver.SetImageList(&I_ImageList1, LVSIL_SMALL); + return TRUE; +} + +BOOL CFileManagerDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + RECT rect; + GetClientRect(&rect); + + // 设置标题 + CString str; + str.Format(_T("文件管理 - %s"), m_pContext->PeerName.c_str()), SetWindowText(str); + + // 创建带进度条的状态栏 + if (!m_wndStatusBar.Create(this) || + !m_wndStatusBar.SetIndicators(indicators, + sizeof(indicators) / sizeof(UINT))) { + TRACE0("Failed to create status bar\n"); + return -1; // fail to create + } + + m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL); + m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_NORMAL, 100); + m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 210); + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏 + + m_wndStatusBar.GetItemRect(1, &rect); + m_ProgressCtrl = new CProgressCtrl; + m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, rect, &m_wndStatusBar, 1); + m_ProgressCtrl->SetRange(0, 100); //设置进度条范围 + m_ProgressCtrl->SetPos(0); //设置进度条当前位置 + + SHAutoComplete(GetDlgItem(IDC_REMOTE_PATH)->GetWindow(GW_CHILD)->m_hWnd, SHACF_FILESYSTEM); + + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + MyShell_GetImageLists(); + + m_list_remote_driver.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS); + m_list_remote.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS); + m_list_remote_search.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_SHAREIMAGELISTS); + + //设置列表控件的大小图标 + static bool init = false; + static CImageList m_pImageList_Large; //系统大图标 + static CImageList m_pImageList_Small; //系统小图标 + if (!init) { + init = true; + SHFILEINFO sfi = {}; + HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T(""), 0, &sfi, sizeof(SHFILEINFO), SHGFI_LARGEICON | SHGFI_SYSICONINDEX); + m_pImageList_Large.Attach(hImageList); + hImageList = (HIMAGELIST)SHGetFileInfo((LPCTSTR)_T(""), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_SYSICONINDEX); + m_pImageList_Small.Attach(hImageList); + } + + m_list_remote.SetImageList(&m_pImageList_Large, LVSIL_NORMAL); + m_list_remote.SetImageList(&m_pImageList_Small, LVSIL_SMALL); + + m_list_remote_search.SetImageList(&m_pImageList_Large, LVSIL_NORMAL); + m_list_remote_search.SetImageList(&m_pImageList_Small, LVSIL_SMALL); + + m_list_remote_driver.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 50); + m_list_remote_driver.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 38); + m_list_remote_driver.InsertColumn(2, _T("总大小"), LVCFMT_LEFT, 70); + m_list_remote_driver.InsertColumn(3, _T("可用空间"), LVCFMT_LEFT, 70); + + m_list_remote.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 250); + m_list_remote.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 70); + m_list_remote.InsertColumn(2, _T("类型"), LVCFMT_LEFT, 120); + m_list_remote.InsertColumn(3, _T("修改日期"), LVCFMT_LEFT, 115); + m_list_remote.SetParenDlg(this); + + //设置搜索list表头 + m_list_remote_search.ShowWindow(SW_HIDE); + m_list_remote_search.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 130); + m_list_remote_search.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumn(2, _T("修改日期"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumn(3, _T("文件路径"), LVCFMT_LEFT, 450); + SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE); + + FixedRemoteDriveList(); + + return TRUE; +} + +void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) +{ + CDialog::OnSize(nType, cx, cy); + + // TODO: Add your message handler code here + // 状态栏还没有创建 + if (m_wndStatusBar.m_hWnd == NULL) + return; + // 定位状态栏 + RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示工具栏 + RECT rect; + m_wndStatusBar.GetItemRect(1, &rect); + m_ProgressCtrl->MoveWindow(&rect); +} + +void CFileManagerDlg::OnBeginDragListRemote(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + //We will call delete later (in LButtonUp) to clean this up + + if (m_list_remote.GetSelectedCount() > 1) //选择了列表中的超过 1 个项目 + m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG); + else + m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG); + + ASSERT(m_hCursor); + m_bDragging = TRUE; + SetCapture(); + *pResult = 0; +} + +void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) +{ + if (m_bDragging) { + m_bDragging = FALSE; + BOOL bDownload = FALSE; + SetCursor(LoadCursor(NULL, IDC_NO)); + + TCHAR str[1024] = TEXT("c:\\"); + HWND hwnd = NULL; + POINT pNow = { 0,0 }; + if (GetCursorPos(&pNow)) // 获取鼠标当前位置 + mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, pNow.x, pNow.y, 0, 0); + mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, pNow.x, pNow.y, 0, 0); + Sleep(150); + HWND hwndPointNow = NULL; + hwndPointNow = ::WindowFromPoint(pNow); // 获取鼠标所在窗口的句柄 + TCHAR szBuf_class[MAX_PATH]; + TCHAR szBuf_title[MAX_PATH]; + ::GetWindowText(hwndPointNow, szBuf_title, MAX_PATH); + GetClassName(hwndPointNow, szBuf_class, MAX_PATH); + if ((lstrcmp(szBuf_class, _T("SysListView32")) == 0) && (lstrcmp(szBuf_title, _T("FolderView")) == 0)) { + TCHAR DeskTopPath[255]; + SHGetSpecialFolderPath(0, DeskTopPath, CSIDL_DESKTOPDIRECTORY, 0); + strLpath = DeskTopPath; + bDownload = TRUE; + } else { + GetClassName(hwndPointNow, szBuf_class, MAX_PATH); + if ((lstrcmp(szBuf_class, _T("DirectUIHWND")) == 0)) { + hwnd = ::FindWindowEx(NULL, NULL, TEXT("CabinetWClass"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("WorkerW"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL); + + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ComboBoxEx32"), NULL); //XP + if (hwnd == NULL) { + hwnd = ::FindWindowEx(NULL, NULL, TEXT("CabinetWClass"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("WorkerW"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ReBarWindow32"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("Address Band Root"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("msctls_progress32"), NULL); + + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("Breadcrumb Parent"), NULL); + hwnd = ::FindWindowEx(hwnd, NULL, TEXT("ToolbarWindow32"), NULL); + } + + if (hwnd == NULL) { + ::MessageBox(NULL, _T("请拖拽到文件管理器选定目录中"), TEXT("错误"), 0); + } else { + ::SendMessage(hwnd, WM_GETTEXT, 1024, (LPARAM)str); + strLpath = str + 4; + bDownload = TRUE; + } + } + } + if (bDownload) { + m_bIsUpload = false; + // 禁用文件管理窗口 + EnableControl(FALSE); + + CString file; + m_Remote_Download_Job.RemoveAll(); + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list_remote.GetNextSelectedItem(pos); + file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + // 如果是目录 + if (m_list_remote.GetItemData(nItem)) + file += '\\'; + m_Remote_Download_Job.AddTail(file); + } + if (file.IsEmpty()) { + EnableControl(TRUE); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + + if (strLpath == _T("")) { + EnableControl(TRUE); + return; + } + if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\')) + strLpath += _T("\\"); + m_nTransferMode = TRANSFER_MODE_NORMAL; + // 发送第一个下载任务 + SendDownloadJob(); + } + } + CDialog::OnLButtonUp(nFlags, point); +} + + +BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) +{ + if (pMsg->message == WM_KEYDOWN) { + if (pMsg->wParam == VK_ESCAPE) + return true; + if (pMsg->wParam == VK_RETURN) { + if (pMsg->hwnd == m_list_remote.m_hWnd || + pMsg->hwnd == ((CEdit*)m_Remote_Directory_ComboBox.GetWindow(GW_CHILD))->m_hWnd) { + GetRemoteFileList(); + } + return TRUE; + } + } + // 单击除了窗口标题栏以外的区域使窗口移动 + if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd) { + pMsg->message = WM_NCLBUTTONDOWN; + pMsg->wParam = HTCAPTION; + } + + return CDialog::PreTranslateMessage(pMsg); +} + +void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent) +{ + // TODO: Add your message handler code here and/or call default + m_ProgressCtrl->StepIt(); + CDialog::OnTimer(nIDEvent); +} + +void CFileManagerDlg::FixedRemoteDriveList() +{ + // 加载系统统图标列表 设置驱动器图标列表 + //加载系统图标 + + DRIVE_Sys = FALSE; + BYTE* pDrive = NULL; + pDrive = (BYTE*)m_bRemoteDriveList; + int count = 0; + int AmntMB = 0; // 总大小 + int FreeMB = 0; // 剩余空间 + + /* + 6 DRIVE_FLOPPY + 7 DRIVE_REMOVABLE + 8 DRIVE_FIXED + 9 DRIVE_REMOTE + 10 DRIVE_REMOTE_DISCONNECT + 11 DRIVE_CDROM + */ + int nIconIndex = -1; + //用一个循环遍历所有发送来的信息,先是到列表中 + for (int i = 0; pDrive[i] != '\0';) { + //由驱动器名判断图标的索引 + if (pDrive[i] == _T('A') || pDrive[i] == _T('B')) { + nIconIndex = 0; + } else { + switch (pDrive[i + 2]) { + case DRIVE_REMOVABLE: + nIconIndex = 3; + break; + case DRIVE_FIXED: + if (!DRIVE_Sys) { + DRIVE_Sys = TRUE; + nIconIndex = 1; + } else + nIconIndex = 2; + break; + case DRIVE_REMOTE: + nIconIndex = 4; + break; + case DRIVE_CDROM: + nIconIndex = 5; + break; + default: + nIconIndex = 2; + break; + } + } + //显示驱动器名 + CString str; + str.Format(_T("%c:\\"), pDrive[i]); + int nItem = m_list_remote_driver.InsertItem(i, str, nIconIndex); + m_list_remote_driver.SetItemData(nItem, 1); + //显示驱动器大小 + memcpy(&AmntMB, pDrive + i + 4, 4); + memcpy(&FreeMB, pDrive + i + 8, 4); + str.Format(_T("%0.1f GB"), (float)AmntMB / 1024); + m_list_remote_driver.SetItemText(nItem, 2, str); + str.Format(_T("%0.1f GB"), (float)FreeMB / 1024); + m_list_remote_driver.SetItemText(nItem, 3, str); + + i += 12; + + TCHAR* lpFileSystemName = NULL; + TCHAR* lpTypeName = NULL; + + lpTypeName = (TCHAR*)(pDrive + i); + i += (lstrlen(lpTypeName) + 1) * sizeof(TCHAR); + lpFileSystemName = (TCHAR*)(pDrive + i); + + // 磁盘类型, 为空就显示磁盘名称 + if (lstrlen(lpFileSystemName) == 0) { + m_list_remote_driver.SetItemText(nItem, 1, lpTypeName); + } else { + m_list_remote_driver.SetItemText(nItem, 1, lpFileSystemName); + } + + i += (lstrlen(lpFileSystemName) + 1) * sizeof(TCHAR); + count++; + } + + m_list_remote_driver.InsertItem(0, _T("桌面"), nIconIndex); + m_list_remote_driver.InsertItem(0, _T("最近"), nIconIndex); + count += 2; + + // 重置远程当前路径 + m_Remote_Path = ""; + m_Remote_Directory_ComboBox.ResetContent(); + + DRIVE_CAZ = FALSE; + DWORD_PTR dwResult; + ShowMessage(_T("远程计算机:磁盘列表")); + SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + + BYTE bPacket = COMMAND_FILE_GETNETHOOD; + m_iocpServer->Send(m_pContext, &bPacket, 1); +} + +void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) +{ + CString str; + TCHAR* pszFileName = NULL; + int strsize; + DWORD dwOffset = 0; // 位移指针 + for (int i = 0; dwOffset < buffersize - sizeof(int);) { + memcpy(&strsize, pbuffer + dwOffset, sizeof(int)); + pszFileName = (TCHAR*)(pbuffer + dwOffset + sizeof(int)); + str = pszFileName; + int nItem = m_list_remote_driver.InsertItem(m_list_remote_driver.GetItemCount(), str, DRIVE_REMOTE); + m_list_remote_driver.SetItemData(nItem, 1); + m_list_remote_driver.SetItemText(nItem, 1, _T("共享")); + m_list_remote_driver.SetItemText(nItem, 2, _T("")); + m_list_remote_driver.SetItemText(nItem, 3, _T("")); + dwOffset += (strsize + sizeof(int)); + } +} + +void CFileManagerDlg::OnClose() +{ + if (m_bOnClose) return; + m_bOnClose = TRUE; + CancelIo((HANDLE)m_ContextObject->sClientSocket); + closesocket(m_ContextObject->sClientSocket); + + DestroyIcon(m_hIcon); + + DestroyCursor(m_hCursor); + + if (m_hFileSend != INVALID_HANDLE_VALUE) { + CloseHandle(m_hFileSend); + m_hFileSend = INVALID_HANDLE_VALUE; + } + if (m_hFileRecv != INVALID_HANDLE_VALUE) { + CloseHandle(m_hFileRecv); + m_hFileRecv = INVALID_HANDLE_VALUE; + } + + int iImageCount = I_ImageList0.GetImageCount(); + for (int i = 0; i < iImageCount; i++) { + I_ImageList0.Remove(-1); + } + iImageCount = I_ImageList1.GetImageCount(); + + for (int i = 0; i < iImageCount; i++) { + I_ImageList1.Remove(-1); + } + + m_wndStatusBar.DestroyWindow(); + m_ProgressCtrl->DestroyWindow(); + SAFE_DELETE(m_ProgressCtrl); + + if (IsWindow(m_hWnd)) + DestroyWindow(); +} + +CString CFileManagerDlg::GetParentDirectory(CString strPath) +{ + CString strCurPath = strPath; + int Index = strCurPath.ReverseFind(_T('\\')); + if (Index == -1) { + return strCurPath; + } + CString str = strCurPath.Left(Index); + Index = str.ReverseFind(_T('\\')); + if (Index == -1) { + strCurPath = _T(""); + return strCurPath; + } + strCurPath = str.Left(Index); + + if (strCurPath.Right(1) != _T("\\")) + strCurPath += _T("\\"); + return strCurPath; +} + +void CFileManagerDlg::OnReceiveComplete() +{ + if (m_bOnClose) return; + switch (m_pContext->m_DeCompressionBuffer.GetBuffer(0)[0]) { + case TOKEN_FILE_LIST: // 文件列表 + FixedRemoteFileList(m_pContext->m_DeCompressionBuffer.GetBuffer(0), m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1); + break; + case TOKEN_FILE_SIZE: // 传输文件时的第一个数据包,文件大小,及文件名 + CreateLocalRecvFile(); + break; + case TOKEN_FILE_DATA: // 文件内容 + WriteLocalRecvFile(); + break; + case TOKEN_TRANSFER_FINISH: // 传输完成 + EndLocalRecvFile(); + break; + case TOKEN_CREATEFOLDER_FINISH: + GetRemoteFileList(_T(".")); + break; + case TOKEN_DELETE_FINISH: + EndRemoteDeleteFile(); + break; + case TOKEN_GET_TRANSFER_MODE: //文件上传 + SendTransferMode(); + break; + case TOKEN_DATA_CONTINUE: + SendFileData(); //文件上传数据 + break; + case TOKEN_RENAME_FINISH: + // 刷新远程文件列表 + GetRemoteFileList(_T(".")); + break; + case TOKEN_SEARCH_FILE_LIST: + FixedRemoteSearchFileList + ( + m_pContext->m_DeCompressionBuffer.GetBuffer(0), + m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1 + ); + break; + case TOKEN_SEARCH_FILE_FINISH: + SearchEnd(); + break; + case TOKEN_COMPRESS_FINISH: + GetRemoteFileList(_T(".")); + break; + case TOKEN_FILE_GETNETHOOD: + fixNetHood(m_pContext->m_DeCompressionBuffer.GetBuffer(1), m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1); + break; + case TOKEN_FILE_RECENT: { + CString strRecent = (TCHAR*)m_pContext->m_DeCompressionBuffer.GetBuffer(1); + m_Remote_Directory_ComboBox.SetWindowText(strRecent); + m_list_remote.SetSelectionMark(-1); + GetRemoteFileList(); + } + break; + case TOKEN_FILE_INFO: { + CString szInfo = (TCHAR*)m_pContext->m_DeCompressionBuffer.GetBuffer(1); + if (MessageBox(szInfo, _T("路径 确认拷贝到剪切板"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) { + CStringA a; + a = szInfo; + ::OpenClipboard(::GetDesktopWindow()); + ::EmptyClipboard(); + HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, a.GetLength() + 1); + if (hglbCopy != NULL) { + // Lock the handle and copy the text to the buffer. + LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); + memcpy(lptstrCopy, a.GetBuffer(), a.GetLength() + 1); + GlobalUnlock(hglbCopy); // Place the handle on the clipboard. + SetClipboardData(CF_TEXT, hglbCopy); + GlobalFree(hglbCopy); + } + CloseClipboard(); + } + } + break; + case TOKEN_FILE_REFRESH: { + GetRemoteFileList(_T(".")); + } + break; + case TOKEN_FILE_ZIPOK: { + GetRemoteFileList(_T(".")); + ShowMessage(_T("压缩完成")); + MessageBox(0, _T("ZIP压缩完成")); + } + break; + case TOKEN_FILE_GETINFO: { + } + break; + + case TOKEN_FILE_SEARCHPLUS_LIST: + ShowSearchPlugList(); + break; + case TOKEN_FILE_SEARCHPLUS_NONTFS: { + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2,(LPARAM)_T(" 驱动盘非NTFS格式"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + break; + case TOKEN_FILE_SEARCHPLUS_HANDLE: { + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("需要管理员权限运行"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + break; + case TOKEN_FILE_SEARCHPLUS_INITUSN: { + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("初始化日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + break; + case TOKEN_FILE_SEARCHPLUS_GETUSN: { + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)_T("获取日志文件失败"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + break; + case TOKEN_FILE_SEARCHPLUS_NUMBER: { + DWORD_PTR dwResult; + int i; + memcpy(&i, m_pContext->m_DeCompressionBuffer.GetBuffer() + 1, sizeof(int)); + CString strMsgShow; + strMsgShow.Format(_T("已经搜索 %d 请勿再次搜索"), i); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + break; + + default: + SendException(); + break; + } +} + +void CFileManagerDlg::OnReceive() +{ +} + +void CFileManagerDlg::GetRemoteFileList(CString directory) +{ + if (directory.GetLength() == 0) { + int nItem = m_list_remote.GetSelectionMark(); + + // 如果有选中的,是目录 + if (nItem != -1) { + if (m_list_remote.GetItemData(nItem) == 1) { + directory = m_list_remote.GetItemText(nItem, 0); + } + } + // 从组合框里得到路径 + else { + m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path); + } + } + // 得到父目录 + if (directory == _T("..")) { + if (m_Remote_Path.GetLength() == 3) return; + + m_Remote_Path = GetParentDirectory(m_Remote_Path); + } else if (directory != _T(".")) { + m_Remote_Path += directory; + if (m_Remote_Path.GetLength() > 0 && m_Remote_Path.Right(1) != _T("\\")) + m_Remote_Path += _T("\\"); + } + + // 是驱动器的根目录,返回磁盘列表 + if (m_Remote_Path.GetLength() == 0) { + return; + } + + // 发送数据前清空缓冲区 + int PacketSize = (m_Remote_Path.GetLength() + 1) * sizeof(TCHAR) + 1; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); + + bPacket[0] = COMMAND_LIST_FILES; + memcpy(bPacket + 1, m_Remote_Path.GetBuffer(0), PacketSize - 1); + m_iocpServer->Send(m_pContext, bPacket, PacketSize); + LocalFree(bPacket); + + m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); + m_Remote_Directory_ComboBox.SetCurSel(0); + + // 得到返回数据前禁窗口 + m_list_remote.EnableWindow(FALSE); + m_list_remote_driver.EnableWindow(FALSE); + + DRIVE_CAZ = FALSE; +} + +void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) +{ + if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1) { + //获取文件详细信息 + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); + if (pos != NULL) { + int nItem = m_list_remote.GetNextSelectedItem(pos); + CString filename = m_list_remote.GetItemText(nItem, 0); + filename = m_Remote_Path + filename; + // 发送数据前清空缓冲区 + int PacketSize = (filename.GetLength() + 1) * sizeof(TCHAR) + 1; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); + bPacket[0] = COMMAND_FILE_GETINFO; + memcpy(bPacket + 1, filename.GetBuffer(0), PacketSize - 1); + m_iocpServer->Send(m_pContext, bPacket, PacketSize); + LocalFree(bPacket); + } + return; + } + + GetRemoteFileList(); + *pResult = 0; +} + +void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) +{ + if (m_list_remote_driver.GetSelectedCount() == 0) + return; + + int nItem = m_list_remote_driver.GetSelectionMark(); + CString directory = m_list_remote_driver.GetItemText(nItem, 0); + if (directory.Compare(_T("桌面")) == 0) { + m_Remote_Directory_ComboBox.SetWindowText(m_strDesktopPath); + m_list_remote.SetSelectionMark(-1); + GetRemoteFileList(); + return; + } + if (directory.Compare(_T("最近")) == 0) { + BYTE byToken = COMMAND_FILE_RECENT; + m_iocpServer->Send(m_pContext, &byToken, 1); + return; + } + m_Remote_Path = directory; + // 发送数据前清空缓冲区 + int PacketSize = (directory.GetLength() + 1) * sizeof(TCHAR) + 1; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, PacketSize); + + bPacket[0] = COMMAND_LIST_FILES; + memcpy(bPacket + 1, directory.GetBuffer(0), PacketSize - 1); + m_iocpServer->Send(m_pContext, bPacket, PacketSize); + LocalFree(bPacket); + + m_Remote_Directory_ComboBox.InsertString(0, directory); + m_Remote_Directory_ComboBox.SetCurSel(0); + + // 得到返回数据前禁窗口 + m_list_remote.EnableWindow(FALSE); + m_list_remote_driver.EnableWindow(FALSE); + DRIVE_CAZ = FALSE; + *pResult = 0; +} + +void CFileManagerDlg::OnclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) +{ +} + +void CFileManagerDlg::OnclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) +{ +} + +void CFileManagerDlg::OnclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) +{ +} + +int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes); + +void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) +{ + // 重建标题 + m_list_remote.DeleteAllItems(); + int nItemIndex = 0; + m_list_remote.SetItemData + ( + m_list_remote.InsertItem(nItemIndex++, _T(".."), GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)), + 1 + ); + /* + ListView 消除闪烁 + 更新数据前用SetRedraw(FALSE) + 更新后调用SetRedraw(TRUE) + */ + m_list_remote.SetRedraw(FALSE); + + if (dwBufferLen != 0) { + // + for (int i = 0; i < 2; i++) { + // 跳过Token,共5字节 + byte* pList = (byte*)(pbBuffer + 1); + for (byte* pBase = pList; (unsigned long)(pList - pBase) < dwBufferLen - 1;) { + TCHAR* pszFileName = NULL; + DWORD dwFileSizeHigh = 0; // 文件高字节大小 + DWORD dwFileSizeLow = 0; // 文件低字节大小 + int nItem = 0; + bool bIsInsert = false; + FILETIME ftm_strReceiveLocalFileTime; + + int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; + // i 为 0 时,列目录,i为1时列文件 + bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i; + pszFileName = (TCHAR*)++pList; + + if (bIsInsert) { + int iicon = GetIconIndex(pszFileName, nType); + nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, iicon); + m_list_remote.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); + SHFILEINFO sfi; + SHGetFileInfo(pszFileName, FILE_ATTRIBUTE_NORMAL | nType, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); + } + + // 得到文件大小 + pList += (lstrlen(pszFileName) + 1) * sizeof(TCHAR); + if (bIsInsert) { + CString strFileSize; + memcpy(&dwFileSizeHigh, pList, 4); + memcpy(&dwFileSizeLow, pList + 4, 4); + __int64 nFileSize = ((__int64)dwFileSizeHigh << 32) + dwFileSizeLow; + if (nFileSize >= 1024 * 1024 * 1024) + strFileSize.Format(_T("%0.2f GB"), (double)nFileSize / (1024 * 1024 * 1024)); + else if (nFileSize >= 1024 * 1024) + strFileSize.Format(_T("%0.2f MB"), (double)nFileSize / (1024 * 1024)); + else + strFileSize.Format(_T("%I64u KB"), nFileSize / 1024 + (nFileSize % 1024 ? 1 : 0)); + m_list_remote.SetItemText(nItem, 1, strFileSize); + memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); + CTime time(ftm_strReceiveLocalFileTime); + m_list_remote.SetItemText(nItem, 3, time.Format(_T("%Y-%m-%d %H:%M"))); + } + pList += 16; + } + } + } + + m_list_remote.SetRedraw(TRUE); + // 恢复窗口 + m_list_remote.EnableWindow(TRUE); + m_list_remote_driver.EnableWindow(TRUE); + if (DRIVE_CAZ == FALSE) { + DWORD_PTR dwResult; + ShowMessage(_T("远程目录:%s"), m_Remote_Path); + SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } +} + +void CFileManagerDlg::ShowMessage(TCHAR* lpFmt, ...) +{ + TCHAR buff[1024]; + va_list arglist; + va_start(arglist, lpFmt); + memset(buff, 0, sizeof(buff)); + vsprintf_s(buff, lpFmt, arglist); + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 0, (LPARAM)buff, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + va_end(arglist); +} + +void CFileManagerDlg::OnGo() +{ + m_Remote_Directory_ComboBox.GetWindowText(m_Remote_Path); + m_Remote_Path += _T("\\"); + GetRemoteFileList(_T("..")); +} + +void CFileManagerDlg::OnRemotePrev() +{ + GetRemoteFileList(_T("..")); +} + +//////////////////////////////////以下为工具栏响应处理////////////////////////////////////////// + +void CFileManagerDlg::OnRemoteView() +{ + static int i = 0; + switch (i) { + case 0: + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_LIST); + break; + case 1: + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); + break; + case 2: + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON); + break; + case 3: + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); + break; + default: + break; + } + i++; + if (i > 3) i = 0; +} + +void CFileManagerDlg::OnRemoteRecent() +{ + BYTE byToken = COMMAND_FILE_RECENT; + m_iocpServer->Send(m_pContext, &byToken, 1); +} + +void CFileManagerDlg::OnRemoteDesktop() +{ + m_Remote_Directory_ComboBox.SetWindowText(m_strDesktopPath); + m_list_remote.SetSelectionMark(-1); + GetRemoteFileList(); +} + +bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) +{ + TCHAR lpszFilter[MAX_PATH]; + TCHAR* lpszSlash = NULL; + memset(lpszFilter, 0, sizeof(lpszFilter)); + + if (lpPathName[lstrlen(lpPathName) - 1] != _T('\\')) + lpszSlash = _T("\\"); + else + lpszSlash = _T(""); + + wsprintf(lpszFilter, _T("%s%s*.*"), lpPathName, lpszSlash); + + WIN32_FIND_DATA wfd; + HANDLE hFind = FindFirstFile(lpszFilter, &wfd); + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 + return FALSE; + + do { + if (wfd.cFileName[0] == _T('.')) + continue; // 过滤这两个目录 + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + TCHAR strDirectory[MAX_PATH]; + wsprintf(strDirectory, _T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); + FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归 + } else { + CString file; + file.Format(_T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); + m_Remote_Upload_Job.AddTail(file); + // 对文件进行操作 + } + } while (FindNextFile(hFind, &wfd)); + FindClose(hFind); // 关闭查找句柄 + return true; +} + +void CFileManagerDlg::EnableControl(BOOL bEnable) +{ + // m_list_local.EnableWindow(bEnable); + // m_Local_Directory_ComboBox.EnableWindow(bEnable); + m_list_remote.EnableWindow(bEnable); + m_Remote_Directory_ComboBox.EnableWindow(bEnable); +} + +CString CFileManagerDlg::ExtractNameFromFullPath(CString szFullPath) +{ + TCHAR path_buffer[_MAX_PATH]; + TCHAR fname[_MAX_FNAME]; + TCHAR ext[_MAX_EXT]; + _tcscpy_s(path_buffer, szFullPath); + _tsplitpath_s(szFullPath, NULL, 0, NULL, 0, fname, fname ? _MAX_FNAME : 0, ext, ext ? _MAX_EXT : 0); + return CString(fname) + CString(ext); +} + + +void CFileManagerDlg::OnTransferSend() +{ + m_bIsUpload = true; + // 重置上传任务列表 + m_Remote_Upload_Job.RemoveAll(); + CString file = GetDirectoryPath(TRUE); + if (file == "") return; + + m_Local_Path = file.Left(file.ReverseFind(_T('\\')) + 1); + if (GetFileAttributes(file) & FILE_ATTRIBUTE_DIRECTORY) { + if (file.GetAt(file.GetLength() - 1) != _T('\\')) + file += _T("\\"); + FixedUploadDirectory(file.GetBuffer(0)); + } else { + m_Remote_Upload_Job.AddTail(file); + } + + if (m_Remote_Upload_Job.IsEmpty()) { + ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + EnableControl(FALSE); + SendUploadJob(); +} + +void CFileManagerDlg::TransferSend(CString file) +{ + if (!m_list_remote.GetItemText(0, 0).Compare(_T(""))) + return; + m_bIsUpload = true; + // 重置上传任务列表 + m_Remote_Upload_Job.RemoveAll(); + if (file == "") return; + + m_Local_Path = file.Left(file.ReverseFind(_T('\\')) + 1); + if (GetFileAttributes(file) & FILE_ATTRIBUTE_DIRECTORY) { + if (file.GetAt(file.GetLength() - 1) != _T('\\')) + file += _T("\\"); + FixedUploadDirectory(file.GetBuffer(0)); + } else { + m_Remote_Upload_Job.AddTail(file); + } + + if (m_Remote_Upload_Job.IsEmpty()) { + ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + EnableControl(FALSE); + SendUploadJob(); +} + +// 获取选择的路径 +CString CFileManagerDlg::GetDirectoryPath(BOOL bIncludeFiles) +{ + CString szSavePath; + TCHAR szBrowsePath[MAX_PATH]; + ZeroMemory(szBrowsePath, sizeof(szBrowsePath)); + BROWSEINFO bi = { 0 }; //因为已经初始化为0.所以有些项不用再重复赋值了 + bi.hwndOwner = m_hWnd; + bi.pszDisplayName = szBrowsePath; + if (bIncludeFiles) { + bi.lpszTitle = _T("请选择上传路径: "); + bi.ulFlags = BIF_BROWSEINCLUDEFILES; + } else { + bi.lpszTitle = _T("请选择下载路径: "); + bi.ulFlags = BIF_RETURNONLYFSDIRS; + } + LPITEMIDLIST lpiml = { 0 }; + lpiml = SHBrowseForFolder(&bi); //如果没有选中目录,则返回NULL + if (lpiml && SHGetPathFromIDList(lpiml, szBrowsePath))//从lpiml 中获取路径信息 + szSavePath = szBrowsePath; + else + return _T(""); + return szSavePath; +} + +//////////////// 文件传输操作 //////////////// +// 只管发出了下载的文件 +// 一个一个发,接收到下载完成时,下载第二个文件 ... +void CFileManagerDlg::OnRemoteCopy() +{ + m_bIsUpload = false; + // 禁用文件管理窗口 + EnableControl(FALSE); + + CString file; + m_Remote_Download_Job.RemoveAll(); + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); + while (pos) { + int nItem = m_list_remote.GetNextSelectedItem(pos); + file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + // 如果是目录 + if (m_list_remote.GetItemData(nItem)) + file += '\\'; + m_Remote_Download_Job.AddTail(file); + } + if (file.IsEmpty()) { + EnableControl(TRUE); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + + strLpath = GetDirectoryPath(FALSE); + if (strLpath == _T("")) { + EnableControl(TRUE); + return; + } + if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\')) + strLpath += _T("\\"); + m_nTransferMode = TRANSFER_MODE_NORMAL; + // 发送第一个下载任务 + SendDownloadJob(); +} + +// 发出一个下载任务 +BOOL CFileManagerDlg::SendDownloadJob() +{ + if (m_Remote_Download_Job.IsEmpty()) + return FALSE; + + EnableControl(FALSE); + // 发出第一个下载任务命令 + CString file = m_Remote_Download_Job.GetHead(); + int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); + bPacket[0] = COMMAND_DOWN_FILES; + + // 文件偏移,续传时用 + memcpy(bPacket + 1, file.GetBuffer(0), (file.GetLength() + 1) * sizeof(TCHAR)); + m_iocpServer->Send(m_pContext, bPacket, nPacketSize); + LocalFree(bPacket); + + // 从下载任务列表中删除自己 + m_Remote_Download_Job.RemoveHead(); + + return TRUE; +} + +// 发出一个上传任务 +BOOL CFileManagerDlg::SendUploadJob() +{ + if (m_Remote_Upload_Job.IsEmpty()) + return FALSE; + + EnableControl(FALSE); + CString strDestDirectory = m_Remote_Path; + // 如果远程也有选择,当做目标文件夹 + int nItem = m_list_remote.GetSelectionMark(); + + if (!m_hCopyDestFolder.IsEmpty()) { + strDestDirectory += m_hCopyDestFolder + _T("\\"); + } + + if (strDestDirectory.IsEmpty()) { + m_Local_Path = _T(""); + m_Remote_Upload_Job.RemoveHead(); + EnableControl(TRUE); + ::MessageBox(m_hWnd, _T("请选择目录!"), _T("警告"), MB_OK | MB_ICONWARNING); + return 0; + } + + // 发出第一个下载任务命令 + m_strOperatingFile = m_Remote_Upload_Job.GetHead(); + + DWORD dwSizeHigh; + DWORD dwSizeLow; + CString fileRemote = m_strOperatingFile; // 远程文件 + + // 得到要保存到的远程的文件路径 + fileRemote.Replace(m_Local_Path, strDestDirectory); + m_strFileName = m_strUploadRemoteFile = fileRemote; + + if (m_hFileSend != INVALID_HANDLE_VALUE) + CloseHandle(m_hFileSend); + m_hFileSend = CreateFile(m_strOperatingFile.GetBuffer(0), + GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (m_hFileSend == INVALID_HANDLE_VALUE) + return FALSE; + dwSizeLow = GetFileSize(m_hFileSend, &dwSizeHigh); + m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow; + //CloseHandle(m_hFileSend); // 此处不要关闭, 以后还要用 + + // 构造数据包,发送文件长度(1字节token, 8字节大小, 文件名称, '\0') + int nPacketSize = (fileRemote.GetLength() + 1) * sizeof(TCHAR) + 9; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); + memset(bPacket, 0, nPacketSize); + + bPacket[0] = COMMAND_FILE_SIZE; + memcpy(bPacket + 1, &dwSizeHigh, sizeof(DWORD)); + memcpy(bPacket + 5, &dwSizeLow, sizeof(DWORD)); + memcpy(bPacket + 9, fileRemote.GetBuffer(0), (fileRemote.GetLength() + 1) * sizeof(TCHAR)); + m_iocpServer->Send(m_pContext, bPacket, nPacketSize); + LocalFree(bPacket); + + // 从下载任务列表中删除自己 + m_Remote_Upload_Job.RemoveHead(); + return TRUE; +} + +// 发出一个删除任务 +BOOL CFileManagerDlg::SendDeleteJob() +{ + if (m_Remote_Delete_Job.IsEmpty()) + return FALSE; + + EnableControl(FALSE); + // 发出第一个下载任务命令 + CString file = m_Remote_Delete_Job.GetHead(); + int nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; + BYTE* bPacket = (BYTE*)LocalAlloc(LPTR, nPacketSize); + + m_strFileName = file; + if (file.GetAt(file.GetLength() - 1) == '\\') + bPacket[0] = COMMAND_DELETE_DIRECTORY; + else + bPacket[0] = COMMAND_DELETE_FILE; + + // 文件偏移,续传时用 + memcpy(bPacket + 1, file.GetBuffer(0), nPacketSize - 1); + m_iocpServer->Send(m_pContext, bPacket, nPacketSize); + LocalFree(bPacket); + + // 从下载任务列表中删除自己 + m_Remote_Delete_Job.RemoveHead(); + + DRIVE_CAZ = TRUE; + return TRUE; +} + +void CFileManagerDlg::CreateLocalRecvFile() +{ + // 重置计数器 + m_nCounter = 0; + + FILESIZE* pFileSize = (FILESIZE*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwSizeHigh = pFileSize->dwSizeHigh; + DWORD dwSizeLow = pFileSize->dwSizeLow; + if (pFileSize->error==FALSE) { + EnableControl(TRUE); + return; + } + m_nOperatingFileLength = ((__int64)dwSizeHigh << 32) + dwSizeLow; + + // 当前正操作的文件名 + m_strOperatingFile = (TCHAR*)(m_pContext->m_DeCompressionBuffer.GetBuffer(9)); + + m_strReceiveLocalFile = m_strOperatingFile; + + // 得到要保存到的本地的文件路径 + m_strReceiveLocalFile.Replace(m_Remote_Path, strLpath); + m_strFileName = m_strReceiveLocalFile; + + // 创建多层目录 + MakeSureDirectoryPathExists(m_strReceiveLocalFile.GetBuffer(0)); + + WIN32_FIND_DATA FindFileData; + HANDLE hFind = FindFirstFile(m_strReceiveLocalFile.GetBuffer(0), &FindFileData); + + if (hFind != INVALID_HANDLE_VALUE + && m_nTransferMode != TRANSFER_MODE_OVERWRITE_ALL + && m_nTransferMode != TRANSFER_MODE_ADDITION_ALL + && m_nTransferMode != TRANSFER_MODE_JUMP_ALL + ) { + CFileTransferModeDlg dlg(this); + dlg.m_strFileName = m_strReceiveLocalFile; + switch (dlg.DoModal()) { + case IDC_OVERWRITE: + m_nTransferMode = TRANSFER_MODE_OVERWRITE; + break; + case IDC_OVERWRITE_ALL: + m_nTransferMode = TRANSFER_MODE_OVERWRITE_ALL; + break; + case IDC_ADDITION: + m_nTransferMode = TRANSFER_MODE_ADDITION; + break; + case IDC_ADDITION_ALL: + m_nTransferMode = TRANSFER_MODE_ADDITION_ALL; + break; + case IDC_JUMP: + m_nTransferMode = TRANSFER_MODE_JUMP; + break; + case IDC_JUMP_ALL: + m_nTransferMode = TRANSFER_MODE_JUMP_ALL; + break; + case IDC_CANCEL: + m_nTransferMode = TRANSFER_MODE_CANCEL; + break; + } + } + + if (m_nTransferMode == TRANSFER_MODE_CANCEL) { + // 取消传送 + m_bIsStop = true; + SendStop(TRUE); + FindClose(hFind); + return; + } + + int nTransferMode; + switch (m_nTransferMode) { + case TRANSFER_MODE_OVERWRITE_ALL: + nTransferMode = TRANSFER_MODE_OVERWRITE; + break; + case TRANSFER_MODE_ADDITION_ALL: + nTransferMode = TRANSFER_MODE_ADDITION; + break; + case TRANSFER_MODE_JUMP_ALL: + nTransferMode = TRANSFER_MODE_JUMP; + break; + default: + nTransferMode = m_nTransferMode; + } + + // 1字节Token,四字节偏移高四位,四字节偏移低四位 + BYTE bToken[9]; + DWORD dwCreationDisposition; // 文件打开方式 + memset(bToken, 0, sizeof(bToken)); + bToken[0] = COMMAND_CONTINUE; + + // 文件已经存在 + if (hFind != INVALID_HANDLE_VALUE) { + // 提示点什么 + // 如果是续传 + if (nTransferMode == TRANSFER_MODE_ADDITION) { + memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); + memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); + // 接收的长度递增 + m_nCounter += (__int64)FindFileData.nFileSizeHigh << 32; + m_nCounter += FindFileData.nFileSizeLow; + + dwCreationDisposition = OPEN_EXISTING; + } + // 覆盖 + else if (nTransferMode == TRANSFER_MODE_OVERWRITE) { + // 偏移置0 + memset(bToken + 1, 0, 8); + // 重新创建 + dwCreationDisposition = CREATE_ALWAYS; + + } + // 跳过,指针移到-1 + else if (nTransferMode == TRANSFER_MODE_JUMP) { + DWORD dwOffset = -1; + memcpy(bToken + 1, &dwOffset, 4); + memcpy(bToken + 5, &dwOffset, 4); + dwCreationDisposition = OPEN_EXISTING; + DWORD_PTR dwResult; + SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 100, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + } else { + // 偏移置0 + memset(bToken + 1, 0, 8); + // 重新创建 + dwCreationDisposition = CREATE_ALWAYS; + } + FindClose(hFind); + + if (m_hFileRecv != INVALID_HANDLE_VALUE) + CloseHandle(m_hFileRecv); + m_hFileRecv = CreateFile(m_strReceiveLocalFile.GetBuffer(0), + GENERIC_WRITE, 0, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, 0); + // 需要错误处理 + if (m_hFileRecv == INVALID_HANDLE_VALUE) { + m_nOperatingFileLength = 0; + m_nCounter = 0; + ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件创建失败"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + + ShowProgress(); + if (m_bIsStop) + SendStop(TRUE); + else { + // 发送继续传输文件的token,包含文件续传的偏移 + m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); + } +} + +// 写入文件内容 +void CFileManagerDlg::WriteLocalRecvFile() +{ + // 传输完毕 + BYTE* pData; + DWORD dwBytesToWrite; + DWORD dwBytesWrite = 0; + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 + FILESIZE* pFileSize; + // 得到数据的偏移 + pData = m_pContext->m_DeCompressionBuffer.GetBuffer(nHeadLength); + + pFileSize = (FILESIZE*)m_pContext->m_DeCompressionBuffer.GetBuffer(1); + // 得到数据在文件中的偏移, 赋值给计数器 + //m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh); + + LONG dwOffsetHigh = pFileSize->dwSizeHigh; + LONG dwOffsetLow = pFileSize->dwSizeLow; + // 得到数据在文件中的偏移, 赋值给计数器 + m_nCounter = MAKEINT64(dwOffsetLow, dwOffsetHigh); + + if (m_nCounter < 0) { //数据出错 返回上传传送数据 + m_nCounter = Bf_nCounters; + dwOffsetHigh = Bf_dwOffsetHighs; + dwOffsetLow = Bf_dwOffsetLows; + } else { + Bf_nCounters = m_nCounter; + Bf_dwOffsetHighs = dwOffsetHigh; + Bf_dwOffsetLows = dwOffsetLow; + + dwBytesToWrite = m_pContext->m_DeCompressionBuffer.GetBufferLen() - nHeadLength; + + SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); + + BOOL bResult = FALSE; + int i = 0; + for (i = 0; i < MAX_WRITE_RETRY; i++) { + // 写入文件 + bResult = WriteFile(m_hFileRecv, pData, dwBytesToWrite, &dwBytesWrite, NULL); + if (bResult) + break; + } + if (i == MAX_WRITE_RETRY && !bResult) { + ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件写入失败"), _T("警告"), MB_OK | MB_ICONWARNING); + } + dwOffsetLow = 0; + dwOffsetHigh = 0; + dwOffsetLow = SetFilePointer(m_hFileRecv, dwOffsetLow, &dwOffsetHigh, FILE_CURRENT); + // 为了比较,计数器递增 + m_nCounter += dwBytesWrite; + ShowProgress(); + } + if (m_bIsStop) + SendStop(TRUE); + else { + BYTE bToken[9]; + bToken[0] = COMMAND_CONTINUE; + memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); + memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); + m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); + } +} + +void CFileManagerDlg::EndLocalRecvFile() +{ + m_nCounter = 0; + m_strOperatingFile = ""; + m_nOperatingFileLength = 0; + + if (m_hFileRecv != INVALID_HANDLE_VALUE) { + CloseHandle(m_hFileRecv); + m_hFileRecv = INVALID_HANDLE_VALUE; + } + + if (m_Remote_Download_Job.IsEmpty() || m_bIsStop) { + m_Remote_Download_Job.RemoveAll(); + // 重置传输方式 + m_nTransferMode = TRANSFER_MODE_NORMAL; + EnableControl(TRUE); + DWORD_PTR dwResult; + if (m_bIsStop) { + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, + (LPARAM)_T(" 取消下载"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } else { + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, + (LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + m_bIsStop = false; + } else { + // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 + Sleep(5); + SendDownloadJob(); + } + + return; +} + +void CFileManagerDlg::EndLocalUploadFile() +{ + m_nCounter = 0; + m_strOperatingFile = _T(""); + m_nOperatingFileLength = 0; + + if (m_hFileSend != INVALID_HANDLE_VALUE) { + CloseHandle(m_hFileSend); + m_hFileSend = INVALID_HANDLE_VALUE; + } + SendStop(FALSE); // 发了之后, 被控端才会关闭句柄 + + if (m_Remote_Upload_Job.IsEmpty() || m_bIsStop) { + m_Remote_Upload_Job.RemoveAll(); + EnableControl(TRUE); + GetRemoteFileList(_T(".")); + DWORD_PTR dwResult; + if (m_bIsStop) { + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, + (LPARAM)_T(" 取消上传"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } else { + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, + (LPARAM)_T(" 全部完成"), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + } + m_bIsStop = false; + DRIVE_CAZ = TRUE; + } else { + Sleep(5); + SendUploadJob(); + } + return; +} + +void CFileManagerDlg::EndRemoteDeleteFile() +{ + if (m_Remote_Delete_Job.IsEmpty() || m_bIsStop) { + m_bIsStop = false; + EnableControl(TRUE); + GetRemoteFileList(_T(".")); + DWORD_PTR dwResult; + if (m_strFileName.GetAt(m_strFileName.GetLength() - 1) == '\\') + ShowMessage(_T("删除目录:%s (完成)"), m_strFileName); + else + ShowMessage(_T("删除文件:%s (完成)"), m_strFileName); + SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + DRIVE_CAZ = TRUE; + } else { + Sleep(5); + SendDeleteJob(); + } + return; +} + +void CFileManagerDlg::SendException() +{ + BYTE bBuff = COMMAND_FILE_EXCEPTION; + m_iocpServer->Send(m_pContext, &bBuff, 1); +} + +void CFileManagerDlg::SendContinue() +{ + BYTE bBuff = COMMAND_CONTINUE; + m_iocpServer->Send(m_pContext, &bBuff, 1); +} + +void CFileManagerDlg::SendStop(BOOL bIsDownload) +{ + if (m_hFileRecv != INVALID_HANDLE_VALUE) { + CloseHandle(m_hFileRecv); + m_hFileRecv = INVALID_HANDLE_VALUE; + } + BYTE bBuff[2]; + bBuff[0] = COMMAND_STOP; + bBuff[1] = bIsDownload; + m_iocpServer->Send(m_pContext, bBuff, sizeof(bBuff)); +} + +void CFileManagerDlg::ShowProgress() +{ + TCHAR* lpDirection = NULL; + if (m_bIsUpload) + lpDirection = _T("文件上传"); + else + lpDirection = _T("文件下载"); + + if (m_nCounter == -1) { + m_nCounter = m_nOperatingFileLength; + } + + int progress = (int)((double)(m_nCounter * 100) / m_nOperatingFileLength); + CString str; + DWORD_PTR dwResult; + if (m_nCounter >= 1024 * 1024 * 1024) + str.Format(_T("%.2f GB (%d%%)"), (double)m_nCounter / (1024 * 1024 * 1024), progress); + else if (m_nCounter >= 1024 * 1024) + str.Format(_T("%.2f MB (%d%%)"), (double)m_nCounter / (1024 * 1024), progress); + else + str.Format(_T("%I64u KB (%d%%)"), m_nCounter / 1024 + (m_nCounter % 1024 ? 1 : 0), progress); + ShowMessage(_T("%s: %s"), lpDirection, m_strFileName); + SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, (WPARAM)progress, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)str.GetBuffer(0), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); + + if (m_nCounter == m_nOperatingFileLength) { + m_nCounter = m_nOperatingFileLength = 0; + // 关闭文件句柄 + } +} + +void CFileManagerDlg::OnRemoteDelete() +{ + m_bIsUpload = false; + // TODO: Add your command handler code here + CString str; + if (m_list_remote.GetSelectedCount() > 1) + str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote.GetSelectedCount()); + else { + CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); + if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1) + str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); + else + str.Format(_T("确实要把“%s”删除吗?"), file); + } + if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) + return; + m_Remote_Delete_Job.RemoveAll(); + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + while (pos) { //so long as we have a valid POSITION, we keep iterating + int nItem = m_list_remote.GetNextSelectedItem(pos); + CString file = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + // 如果是目录 + if (m_list_remote.GetItemData(nItem)) + file += _T('\\'); + + m_Remote_Delete_Job.AddTail(file); + } + EnableControl(FALSE); + // 发送第一个下载任务 + SendDeleteJob(); +} + +void CFileManagerDlg::OnRemoteStop() +{ + m_bIsStop = true; +} + + +void CFileManagerDlg::PostNcDestroy() +{ + if (!m_bOnClose) + OnClose(); + CDialog::PostNcDestroy(); + delete this; +} + +void CFileManagerDlg::SendTransferMode() +{ + CFileTransferModeDlg dlg(this); + dlg.m_strFileName = m_strUploadRemoteFile; + switch (dlg.DoModal()) { + case IDC_OVERWRITE: + m_nTransferMode = TRANSFER_MODE_OVERWRITE; + break; + case IDC_OVERWRITE_ALL: + m_nTransferMode = TRANSFER_MODE_OVERWRITE_ALL; + break; + case IDC_ADDITION: + m_nTransferMode = TRANSFER_MODE_ADDITION; + break; + case IDC_ADDITION_ALL: + m_nTransferMode = TRANSFER_MODE_ADDITION_ALL; + break; + case IDC_JUMP: + m_nTransferMode = TRANSFER_MODE_JUMP; + break; + case IDC_JUMP_ALL: + m_nTransferMode = TRANSFER_MODE_JUMP_ALL; + break; + case IDC_CANCEL: + m_nTransferMode = TRANSFER_MODE_CANCEL; + break; + } + if (m_nTransferMode == TRANSFER_MODE_CANCEL) { + m_bIsStop = true; + EndLocalUploadFile(); + return; + } + + BYTE bToken[5]; + bToken[0] = COMMAND_SET_TRANSFER_MODE; + memcpy(bToken + 1, &m_nTransferMode, sizeof(m_nTransferMode)); + m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); +} + +void CFileManagerDlg::SendFileData() +{ + FILESIZE* pFileSize = (FILESIZE*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + LONG dwOffsetHigh = pFileSize->dwSizeHigh; + LONG dwOffsetLow = pFileSize->dwSizeLow; + + m_nCounter = MAKEINT64(pFileSize->dwSizeLow, pFileSize->dwSizeHigh); + + ShowProgress(); + + if (m_nCounter == m_nOperatingFileLength || (dwOffsetHigh == -1 && dwOffsetLow == -1) || m_bIsStop) { + EndLocalUploadFile(); + return; + } + + SetFilePointer(m_hFileSend, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); + + int nHeadLength = 9; // 1 + 4 + 4 数据包头部大小,为固定的9 + + int dwDownFileSize = GetFileSize(m_hFileSend, NULL); + + DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength; + DWORD nNumberOfBytesRead = 0; + + BYTE* lpBuffer = (BYTE*)LocalAlloc(LPTR, MAX_SEND_BUFFER); + // Token, 大小,偏移,数据 + lpBuffer[0] = COMMAND_FILE_DATA; + memcpy(lpBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); + memcpy(lpBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow)); + // 返回值 + bool bRet = true; + ReadFile(m_hFileSend, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); + //CloseHandle(m_hFileSend); // 此处不要关闭, 以后还要用 + + if (nNumberOfBytesRead > 0) { + int nPacketSize = nNumberOfBytesRead + nHeadLength; + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + } + LocalFree(lpBuffer); +} + +bool CFileManagerDlg::DeleteDirectory(LPCTSTR lpszDirectory) +{ + WIN32_FIND_DATA wfd; + TCHAR lpszFilter[MAX_PATH]; + + wsprintf(lpszFilter, _T("%s\\*.*"), lpszDirectory); + + HANDLE hFind = FindFirstFile(lpszFilter, &wfd); + if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败 + return FALSE; + + do { + if (wfd.cFileName[0] != '.') { + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + TCHAR strDirectory[MAX_PATH]; + wsprintf(strDirectory, _T("%s\\%s"), lpszDirectory, wfd.cFileName); + DeleteDirectory(strDirectory); + } else { + TCHAR strFile[MAX_PATH]; + wsprintf(strFile, _T("%s\\%s"), lpszDirectory, wfd.cFileName); + DeleteFile(strFile); + } + } + } while (FindNextFile(hFind, &wfd)); + + FindClose(hFind); // 关闭查找句柄 + + if (!RemoveDirectory(lpszDirectory)) { + return FALSE; + } + return true; +} + + +void CFileManagerDlg::OnRemoteNewFolder() +{ + if (m_Remote_Path == _T("")) + return; + + CInputDialog dlg(this); + dlg.Init(_T("新建目录"), _T("请输入目录名称:")); + if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) { + CString file = m_Remote_Path + dlg.m_str + _T("\\"); + UINT nPacketSize = (file.GetLength() + 1) * sizeof(TCHAR) + 1; + LPBYTE lpBuffer = new BYTE[nPacketSize]; + lpBuffer[0] = COMMAND_CREATE_FOLDER; + memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + SAFE_DELETE_AR(lpBuffer); + } +} + +void CFileManagerDlg::OnTransferRecv() +{ + OnRemoteCopy(); //下载 +} + +void CFileManagerDlg::OnRename() +{ + m_list_remote.EditLabel(m_list_remote.GetSelectionMark()); +} + + +void CFileManagerDlg::OnEndLabelEditListRemote(NMHDR* pNMHDR, LRESULT* pResult) +{ + LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; + // TODO: Add your control notification handler code here + CString str, strExistingFileName, strNewFileName; + m_list_remote.GetEditControl()->GetWindowText(str); + + strExistingFileName = m_Remote_Path + m_list_remote.GetItemText(pDispInfo->item.iItem, 0); + strNewFileName = m_Remote_Path + str; + + if (strExistingFileName != strNewFileName) { + UINT nPacketSize = (strExistingFileName.GetLength() + 1) * sizeof(TCHAR) + (strNewFileName.GetLength() + 1) * sizeof(TCHAR) + 1; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketSize); + lpBuffer[0] = COMMAND_RENAME_FILE; + memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), (strExistingFileName.GetLength() + 1) * sizeof(TCHAR)); + memcpy(lpBuffer + 1 + (strExistingFileName.GetLength() + 1) * sizeof(TCHAR), + strNewFileName.GetBuffer(0), (strNewFileName.GetLength() + 1) * sizeof(TCHAR)); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + LocalFree(lpBuffer); + } + *pResult = 1; +} + +void CFileManagerDlg::OnDelete() +{ + BYTE bBuff; + bBuff = COMMAND_FILE_NO_ENFORCE; + m_iocpServer->Send(m_pContext, &bBuff, sizeof(bBuff)); + OnRemoteDelete(); +} + +void CFileManagerDlg::OnDeleteEnforce() +{ + BYTE bBuff; + bBuff = COMMAND_FILE_ENFOCE; + m_iocpServer->Send(m_pContext, &bBuff, sizeof(bBuff)); + OnRemoteDelete(); +} + +void CFileManagerDlg::OnNewFolder() +{ + OnRemoteNewFolder(); +} + +void CFileManagerDlg::OnRefresh() +{ + GetRemoteFileList(_T(".")); +} + +void CFileManagerDlg::OnUseAdmin() +{ + if (!m_bUseAdmin) + m_bUseAdmin = true; + else + m_bUseAdmin = false; +} + +void CFileManagerDlg::OnRemoteOpenShow() +{ + // TODO: Add your command handler code here + CString str; + int nItem = m_list_remote.GetSelectionMark(); + str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + if (m_list_remote.GetItemData(nItem) == 1) + str += "\\"; + + int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_OPEN_FILE_SHOW; + lpPacket[1] = m_bUseAdmin; + memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnRemoteOpenHide() +{ + // TODO: Add your command handler code here + CString str; + int nItem = m_list_remote.GetSelectionMark(); + str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + if (m_list_remote.GetItemData(nItem) == 1) + str += _T("\\"); + + int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_OPEN_FILE_HIDE; + lpPacket[1] = m_bUseAdmin; + memcpy(lpPacket + 2, str.GetBuffer(0), nPacketLength - 2); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnRemoteInfo() +{ + // TODO: Add your command handler code here + CString str; + int nItem = m_list_remote.GetSelectionMark(); + str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + if (m_list_remote.GetItemData(nItem) == 1) + str += _T("\\"); + + int nPacketLength = (str.GetLength() + 1) * sizeof(TCHAR) + 2; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_INFO; + memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnRemoteEncryption() +{ + // TODO: Add your command handler code here + CString str; + CStringA strA; + int nItem = m_list_remote.GetSelectionMark(); + str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + if (m_list_remote.GetItemData(nItem) == 1) + str += _T("\\"); + strA = str; + int nPacketLength = strA.GetLength() + 1 + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_Encryption; + + memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnRemoteDecrypt() +{ + // TODO: Add your command handler code here + CString str; + CStringA strA; + int nItem = m_list_remote.GetSelectionMark(); + str = m_Remote_Path + m_list_remote.GetItemText(nItem, 0); + if (m_list_remote.GetItemData(nItem) == 1) + str += _T("\\"); + strA = str; + int nPacketLength = strA.GetLength() + 1 + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_Decrypt; + + memcpy(lpPacket + 1, strA.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + + +void CFileManagerDlg::OnRemoteCopyFile() +{ + CString file; + // TODO: Add your command handler code here + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + while (pos) { //so long as we have a valid POSITION, we keep iterating + int nItem = m_list_remote.GetNextSelectedItem(pos); + file += (m_Remote_Path + m_list_remote.GetItemText(nItem, 0)); + file += "|"; + } + + int nPacketLength = file.GetLength() * 2 + 2 + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_CopyFile; + + memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); + ShowMessage(_T("准备粘贴")); +} + +void CFileManagerDlg::OnRemotePasteFile() +{ + int nPacketLength = m_Remote_Path.GetLength() * 2 + 2 + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_PasteFile; + memcpy(lpPacket + 1, m_Remote_Path.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnRemotezip() +{ + CString file; + file = m_Remote_Path; + file += "|"; + // TODO: Add your command handler code here + POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + while (pos) { //so long as we have a valid POSITION, we keep iterating + int nItem = m_list_remote.GetNextSelectedItem(pos); + file += (m_Remote_Path + m_list_remote.GetItemText(nItem, 0)); + // 如果是目录 + if (m_list_remote.GetItemData(nItem)) + file += _T('\\'); + file += "|"; + } + int nPacketLength = file.GetLength() * 2 + 2 + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_FILE_zip; + + memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); + + ShowMessage(_T("开始压缩,不要关闭窗口,其他操作继续")); +} + +void CFileManagerDlg::OnRemotezipstop() +{ + BYTE lpPacket = COMMAND_FILE_zip_stop; + m_iocpServer->Send(m_pContext, &lpPacket, 1); +} + +void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) +{ + CMenu mListmeau; + mListmeau.CreatePopupMenu(); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("分区高级搜索")); + POINT mousepos; + GetCursorPos(&mousepos); + int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); + mListmeau.DestroyMenu(); + if (!nMenuResult) return; + switch (nMenuResult) { + case 100: { + UpdateData(); + + //获取文件详细信息 + POSITION pos = m_list_remote_driver.GetFirstSelectedItemPosition(); + CString str_disk; + if (pos != NULL) { + int nItem = m_list_remote_driver.GetNextSelectedItem(pos); + str_disk = m_list_remote_driver.GetItemText(nItem, 0); + if (str_disk.Find(_T(":")) == -1) return;; + } + CInputDialog dlg(this); + dlg.Init(_T("确认后 必须等待出现结果"), _T("请输入要搜索的关键词")); + if (dlg.DoModal() != IDOK)return; + + // 得到返回数据前禁窗口 + m_list_remote_search.DeleteAllItems(); + m_ProgressCtrl->SetPos(0); + struct SEARCH { + TCHAR TC_disk[8]; + TCHAR TC_search[MAX_PATH]; + }; + SEARCH S_search; + memset(&S_search, 0, sizeof(SEARCH)); + + memcpy(S_search.TC_disk, str_disk.GetBuffer(), str_disk.GetLength() * sizeof(TCHAR)); + if (dlg.m_str.GetLength() > (MAX_PATH - 5)) { + MessageBox(_T("搜索关键词太长"), _T("注意")); + return ; + } + memcpy(S_search.TC_search, dlg.m_str.GetBuffer(), dlg.m_str.GetLength() * sizeof(TCHAR)); + + BYTE* lpbuffer = new BYTE[sizeof(SEARCH) + 1]; + lpbuffer[0] = COMMAND_FILE_SEARCHPLUS_LIST; + memcpy(lpbuffer + 1, &S_search, sizeof(SEARCH)); + m_iocpServer->Send(m_pContext, (LPBYTE)lpbuffer, sizeof(SEARCH) + 1); + SAFE_DELETE_AR(lpbuffer); + SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE); + } + break; + default: + break; + } + *pResult = 0; +} + +void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + int nRemoteOpenMenuIndex = 5; + CListCtrl* pListCtrl = &m_list_remote; + CMenu popup; + popup.LoadMenu(IDR_FILEMANAGER); + CMenu* pM = popup.GetSubMenu(0); + CPoint p; + GetCursorPos(&p); + // pM->DeleteMenu(IDM_LOCAL_OPEN, MF_BYCOMMAND); + if (pListCtrl->GetSelectedCount() == 0 || !m_Remote_Path.GetLength()) { + int count = pM->GetMenuItemCount(); + for (int i = 0; i < count; i++) { + pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); + } + if (m_Remote_Path.GetLength()) { + pM->EnableMenuItem(IDM_TRANSFER_S, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED); + } + pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_DELETE_ENFORCE, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(ID_FILEMANGER_Encryption, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(ID_FILEMANGER_Encryption, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_RENAME, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED); + } + if (pListCtrl->GetSelectedCount() == 1) { + // 单选如果是目录, 不能隐藏运行 + if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) { + pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_REMOTE_OPEN_SHOW, MF_BYCOMMAND | MF_GRAYED); + } + pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED); + } + if (pListCtrl->GetSelectedCount() > 1) { + pM->EnableMenuItem(IDM_REMOTE_OPEN_SHOW, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_REMOTE_OPEN_HIDE, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_COMPRESS, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_UNCOMPRESS, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(IDM_RENAME, MF_BYCOMMAND | MF_GRAYED); + pM->EnableMenuItem(ID_FILEMANGER_COPY, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(ID_FILEMANGER_ZIP, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(ID_FILEMANGER_PASTE, MF_BYCOMMAND | MF_ENABLED); + } + + if (m_bCanAdmin) + pM->EnableMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_ENABLED); + else + pM->EnableMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_GRAYED); + + if (m_bUseAdmin) + pM->CheckMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_CHECKED); + else + pM->CheckMenuItem(IDM_USE_ADMIN, MF_BYCOMMAND | MF_UNCHECKED); + + pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED); + pM->EnableMenuItem(ID_FILEMANGER_ZIP_STOP, MF_BYCOMMAND | MF_ENABLED); + ::TrackPopupMenu(pM->GetSafeHmenu(), TPM_RIGHTBUTTON, p.x, p.y, 0, GetSafeHwnd(), NULL); + + pM->DestroyMenu(); + *pResult = 0; +} + +void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) +{ + CMenu mListmeau; + mListmeau.CreatePopupMenu(); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("下载(附带目录结构)")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除")); + mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("打开文件位置")); + POINT mousepos; + GetCursorPos(&mousepos); + int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); + mListmeau.DestroyMenu(); + if (!nMenuResult) return; + switch (nMenuResult) { + case 100: { + m_bIsUpload = false; + EnableControl(FALSE); + CString file; + m_Remote_Download_Job.RemoveAll(); + POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition(); + CString m_Search_Path; + while (pos) { + int nItem = m_list_remote_search.GetNextSelectedItem(pos); + m_Search_Path = m_list_remote_search.GetItemText(nItem, 3); + m_Search_Path += '\\'; + file = m_Search_Path + m_list_remote_search.GetItemText(nItem, 0); + if (m_list_remote_search.GetItemData(nItem)) + file += '\\'; + m_Remote_Download_Job.AddTail(file); + } + if (file.IsEmpty()) { + EnableControl(TRUE); + ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + return; + } + strLpath = GetDirectoryPath(FALSE); + if (strLpath == _T("")) { + EnableControl(TRUE); + return; + } + if (strLpath.GetAt(strLpath.GetLength() - 1) != _T('\\')) + strLpath += _T("\\"); + m_nTransferMode = TRANSFER_MODE_NORMAL; + SendDownloadJob(); + } + break; + case 200: { + m_bIsUpload = false; + // TODO: Add your command handler code here + CString str; + if (m_list_remote_search.GetSelectedCount() > 1) + str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote_search.GetSelectedCount()); + else { + CString file = m_list_remote_search.GetItemText(m_list_remote_search.GetSelectionMark(), 0); + if (m_list_remote_search.GetItemData(m_list_remote_search.GetSelectionMark()) == 1) + str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); + else + str.Format(_T("确实要把“%s”删除吗?"), file); + } + if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) + return; + m_Remote_Delete_Job.RemoveAll(); + POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + CString m_Search_Path; + while (pos) { //so long as we have a valid POSITION, we keep iterating + int nItem = m_list_remote_search.GetNextSelectedItem(pos); + m_Search_Path = m_list_remote_search.GetItemText(nItem, 3); + m_Search_Path += '\\'; + CString file = m_Search_Path + m_list_remote_search.GetItemText(nItem, 0); + // 如果是目录 + if (m_list_remote_search.GetItemData(nItem)) + file += _T('\\'); + + m_Remote_Delete_Job.AddTail(file); + } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory + + EnableControl(FALSE); + // 发送第一个下载任务 + SendDeleteJob(); + } + break; + case 300: { + int Index = 0; + Index = m_list_remote_search.GetSelectionMark(); + if (Index == -1) + return; + CString str = m_list_remote_search.GetItemText(Index, 3); + if (Index == -1) + return; + m_Remote_Path = _T(""); + GetRemoteFileList(str); + } + break; + + default: + break; + } + *pResult = 0; +} + + +bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath) +{ + LPTSTR p, pszDirCopy; + DWORD dwAttributes; + __try { + pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1)); + if (pszDirCopy == NULL) + return FALSE; + lstrcpy(pszDirCopy, pszDirPath); + p = pszDirCopy; + if ((*p == TEXT('\\')) && (*(p + 1) == TEXT('\\'))) { + p++; // Skip over the first \ in the name. + p++; // Skip over the second \ in the name. + while (*p && *p != TEXT('\\')) { + p = CharNext(p); + } + if (*p) { + p++; + } + while (*p && *p != TEXT('\\')) { + p = CharNext(p); + } + if (*p) { + p++; + } + + } else if (*(p + 1) == TEXT(':')) { // Not a UNC. See if it's : + p++; + p++; + if (*p && (*p == TEXT('\\'))) { + p++; + } + } + + while (*p) { + if (*p == TEXT('\\')) { + *p = TEXT('\0'); + dwAttributes = GetFileAttributes(pszDirCopy); + // Nothing exists with this name. Try to make the directory name and error if unable to. + if (dwAttributes == 0xffffffff) { + if (!CreateDirectory(pszDirCopy, NULL)) { + if (GetLastError() != ERROR_ALREADY_EXISTS) { + free(pszDirCopy); + return FALSE; + } + } + } else { + if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) { + // Something exists with this name, but it's not a directory... Error + free(pszDirCopy); + return FALSE; + } + } + *p = TEXT('\\'); + } + p = CharNext(p); + } + } __except (EXCEPTION_EXECUTE_HANDLER) { + free(pszDirCopy); + return FALSE; + } + + free(pszDirCopy); + return TRUE; +} + +//压缩处理 +void CFileManagerDlg::OnCompress() +{ + // TODO: 在此添加命令处理程序代码 + //winrar a -r D:\123.she.rar d:\123.she //加压 + UpdateData(TRUE); + int i = m_list_remote.GetSelectionMark(); + if (i < 0) { + return; + } + CString strMsg = _T("a -ep1 -ibck "); + CString strFullFileName = m_list_remote.GetItemText(i, 0); + if (m_list_remote.GetItemData(i)) { //文件夹 + strMsg += _T("-r "); + strMsg += (m_Remote_Path + strFullFileName); + } else { + strMsg += (m_Remote_Path + strFullFileName); + } + strMsg += _T(".rar"); + strMsg += _T(" "); + strMsg += (m_Remote_Path + strFullFileName); + + int nPacketLength = (strMsg.GetLength() + 1) * sizeof(TCHAR) + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM; + memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnUncompress() +{ + // TODO: 在此添加命令处理程序代码 + // winrar x D:\11.she.rar D:\11.she\ + UpdateData(TRUE); + int i = m_list_remote.GetSelectionMark(); + if (i < 0) { + return; + } + CString strMsg = _T("x -ibck "); + CString strFullFileName = m_list_remote.GetItemText(i, 0); + + CString strFullName = (m_Remote_Path + strFullFileName); + strMsg += strFullName; + //LFileName lFile(strFullName.GetBuffer(0)); + strMsg += _T(" "); + strMsg += (m_Remote_Path/*+lFile.getNameA()*/); + //strMsg += "\\"; + //COMMAND_UNCOMPRESS_FILE_PARAM + int nPacketLength = (strMsg.GetLength() + 1) * sizeof(TCHAR) + 1; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_COMPRESS_FILE_PARAM; + memcpy(lpPacket + 1, strMsg.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + LocalFree(lpPacket); +} + +void CFileManagerDlg::OnSetfocusRemotePath() +{ + // TODO: Add your control notification handler code here + m_list_remote.SetSelectionMark(-1); +} + +void CFileManagerDlg::OnBtnSearch() +{ + UpdateData(); + + // // 得到返回数据前禁窗口 + m_list_remote_search.DeleteAllItems(); + m_ProgressCtrl->SetPos(0); + + if (m_Remote_Path.IsEmpty()) return; + + // 构建数据包 + FILESEARCH mFileSearchPacket; + lstrcpy(mFileSearchPacket.SearchPath, m_Remote_Path.GetBuffer(0)); + lstrcpy(mFileSearchPacket.SearchFileName, m_SearchStr.GetBuffer(0)); + if (m_bSubFordle) + mFileSearchPacket.bEnabledSubfolder = true; + else + mFileSearchPacket.bEnabledSubfolder = false; + + int nPacketSize = sizeof(mFileSearchPacket) + 2; + LPBYTE lpBuffer = new BYTE[nPacketSize]; + lpBuffer[0] = COMMAND_SEARCH_FILE; + memcpy(lpBuffer + 1, &mFileSearchPacket, sizeof(mFileSearchPacket)); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + SAFE_DELETE_AR(lpBuffer); + // 设置按钮状态 + m_BtnSearch.SetWindowText(_T("正在搜索...")); + + m_list_remote_search.ShowWindow(SW_SHOW); + GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(FALSE); + GetDlgItem(ID_SEARCH_STOP)->EnableWindow(TRUE); + SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE); +} + +void CFileManagerDlg::SearchEnd() +{ + int len = m_list_remote_search.GetItemCount(); + m_BtnSearch.SetWindowText(_T("重新搜索")); + ShowMessage(_T("搜索完毕 共:%d 个文件"), len); + m_list_remote_search.EnableWindow(TRUE); + GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(TRUE); + GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); +} + + +void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLen) +{ + byte* pList = pbBuffer + 1; + int nItemIndex = 0; + for (byte* pBase = pList; (int)(pList - pBase) < (int)(dwBufferLen - 1);) { + TCHAR* pszFileName = NULL; + DWORD dwFileSizeHigh = 0; + DWORD dwFileSizeLow = 0; + FILETIME ftm_strReceiveLocalFileTime; + int nItem = 0; + bool bIsInsert = false; + int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; + + pszFileName = (TCHAR*) ++pList; + + CString csFilePath, csFileFullName; + csFilePath.Format(_T("%s"), pszFileName); + int nPos = csFilePath.ReverseFind(_T('\\')); + csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos - 1);// 获取文件全名,包括文件名和扩展名 + + nItem = m_list_remote_search.InsertItem(nItemIndex++, csFileFullName, GetIconIndex(pszFileName, nType)); + m_list_remote_search.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); + + pList += (lstrlen(pszFileName) + 1) * sizeof(TCHAR); + + memcpy(&dwFileSizeHigh, pList, 4); + memcpy(&dwFileSizeLow, pList + 4, 4); + CString strSize; + strSize.Format(_T("%10d KB"), (dwFileSizeHigh * (MAXDWORD)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); + + m_list_remote_search.SetItemText(nItem, 1, strSize); + memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); + CTime time(ftm_strReceiveLocalFileTime); + m_list_remote_search.SetItemText(nItem, 2, time.Format(_T("%Y-%m-%d %H:%M"))); + + PathRemoveFileSpec(pszFileName); //去除文件名获取文件路径 + m_list_remote_search.SetItemText(nItem, 3, pszFileName); + + pList += 16; + } + + m_ProgressCtrl->StepIt(); +} + + +//文件搜索停止 +void CFileManagerDlg::OnBnClickedSearchStop() +{ + GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); + // TODO: Add your command handler code here + BYTE bToken = COMMAND_FILES_SEARCH_STOP; + m_iocpServer->Send(m_pContext, &bToken, sizeof(BYTE)); +} + +//显示搜索结果 +void CFileManagerDlg::OnBnClickedSearchResult() +{ + m_list_remote_search.ShowWindow(m_list_remote_search.IsWindowVisible() ? SW_HIDE : SW_SHOW); + if (m_list_remote_search.IsWindowVisible()) { + SetWindowPos(NULL, 0, 0, 830, 830, SWP_NOMOVE); + } else { + SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE); + } +} + + +void CFileManagerDlg::ShowSearchPlugList() +{ + char* lpBuffer = (char*)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + char* Filename; + char* Pathname; + + DWORD dwOffset = 0; + m_list_remote_search.DeleteAllItems(); + int i = 0; + for (i = 0; dwOffset < (m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1); i++) { + Filename = lpBuffer + dwOffset; + Pathname = Filename + strlen(Filename) + 1; + CString CS_tem; + CS_tem = Filename; + m_list_remote_search.InsertItem(i, CS_tem, 0); + CS_tem = Pathname; + int index = CS_tem.ReverseFind('\\'); + if (index >= 0) + CS_tem = CS_tem.Left(index); + m_list_remote_search.SetItemText(i,3, CS_tem); + dwOffset += strlen(Filename) + strlen(Pathname) + 2; + } + m_list_remote_search.EnableWindow(TRUE); + CString strMsgShow; + strMsgShow.Format(_T("共搜索到 %d 个"), i); + DWORD_PTR dwResult; + SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, & dwResult); + m_list_remote_search.ShowWindow( SW_SHOW); +} diff --git a/server/2015Remote/file/CFileManagerDlg.h b/server/2015Remote/file/CFileManagerDlg.h new file mode 100644 index 0000000..cf628bd --- /dev/null +++ b/server/2015Remote/file/CFileManagerDlg.h @@ -0,0 +1,197 @@ +#pragma once +#include "stdafx.h" +#include "CFileListCtrl.h" +#include + +#define MAX_WRITE_RETRY 15 +#define MAX_SEND_BUFFER 65535 +#define MAX_RECV_BUFFER 65535 + +namespace file { + + ///////////////////////////////////////////////////////////////////////////// + // CFileManagerDlg dialog + typedef CList strList; + + typedef struct { + DWORD dwSizeHigh; + DWORD dwSizeLow; + BOOL error; + } FILESIZE; + + typedef struct { + TCHAR SearchFileName[MAX_PATH]; + TCHAR SearchPath[MAX_PATH]; + BOOL bEnabledSubfolder; + } FILESEARCH; + + typedef struct { + LVITEM* plvi; + CString sCol2; + } lvItem, * plvItem; + + typedef struct { + BYTE Token; + int w, h, size; + + } FILEPICINFO; + + + class CFileManagerDlg : public DialogBase + { + // Construction + public: + CString strLpath; + CString m_strDesktopPath; + CString GetDirectoryPath(BOOL bIncludeFiles); + bool m_bCanAdmin, m_bUseAdmin, m_bIsStop; + CString m_strReceiveLocalFile; + CString m_strUploadRemoteFile; + void ShowProgress(); + void SendStop(BOOL bIsDownload); + int m_nTransferMode; + CString m_hCopyDestFolder; + void SendContinue(); + void SendException(); + void EndLocalRecvFile(); + void EndRemoteDeleteFile(); + CString ExtractNameFromFullPath(CString szFullPath); + HANDLE m_hFileSend; + HANDLE m_hFileRecv; + CString m_strOperatingFile; // 文件名 + CString m_strFileName; // 操作文件名 + __int64 m_nOperatingFileLength; // 文件总大小 + __int64 m_nCounter;// 计数器 + void WriteLocalRecvFile(); + void CreateLocalRecvFile(); + BOOL SendDownloadJob(); + BOOL SendUploadJob(); + BOOL SendDeleteJob(); + + strList m_Remote_Download_Job; + strList m_Remote_Upload_Job; + strList m_Remote_Delete_Job; + + void ShowMessage(TCHAR* lpFmt, ...); + CString m_Remote_Path; + CStringA CopyFileNAme;; + BYTE m_bRemoteDriveList[2048]; + CString GetParentDirectory(CString strPath); + void OnReceiveComplete(); + void OnReceive(); + void SearchEnd(); // 搜索结束 + void FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLen); + int m_nNewIconBaseIndex; // 新加的ICON + ClientContext* m_pContext; + ISocketBase* m_iocpServer; + CString m_IPAddress; + CProgressCtrl* m_ProgressCtrl; + HCURSOR m_hCursor; + CString m_Local_Path; + bool FixedUploadDirectory(LPCTSTR lpPathName); + void FixedRemoteDriveList(); + void GetRemoteFileList(CString directory = _T("")); + void FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen); + void fixNetHood(BYTE* pbuffer, int buffersize);//远程共享目录 + bool id_search_result; + HICON m_hIcon; + CStatusBar m_wndStatusBar; + CFileManagerDlg(CWnd* pParent = NULL, ISocketBase* pIOCPServer = NULL, ClientContext* pContext = NULL); + ~CFileManagerDlg() { + m_bOnClose = TRUE; + SAFE_DELETE(m_ProgressCtrl); + } + enum { + IDD = IDD_FILE_WINOS + }; + CComboBox m_Remote_Directory_ComboBox; + CComboBox m_Local_Directory_ComboBox; + CFileListCtrl m_list_remote; + CListCtrl m_list_remote_driver; + CListCtrl m_list_remote_search; + CImageList I_ImageList0; + CImageList I_ImageList1; + CButton m_BtnSearch; + CString m_SearchStr; + BOOL m_bSubFordle; + + BOOL DRIVE_Sys; + BOOL DRIVE_CAZ; + + __int64 Bf_nCounters; // 备份计数器 由于比较用 + LONG Bf_dwOffsetHighs; + LONG Bf_dwOffsetLows; + + void TransferSend(CString file); + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual void PostNcDestroy(); + virtual void OnClose(); + protected: + + virtual BOOL OnInitDialog(); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnTimer(UINT_PTR nIDEvent); + afx_msg void OnBeginDragListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg void OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnclkListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnclickListSearch(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnGo(); + afx_msg void OnRemotePrev(); + afx_msg void OnRemoteView(); + afx_msg void OnRemoteRecent(); + afx_msg void OnRemoteDesktop(); + afx_msg void OnRemoteCopy(); + afx_msg void OnTransferSend(); + afx_msg void OnRemoteDelete(); + afx_msg void OnRemoteStop(); + afx_msg void OnRemoteNewFolder(); + afx_msg void OnTransferRecv(); + afx_msg void OnRename(); + afx_msg void OnEndLabelEditListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDelete(); + afx_msg void OnDeleteEnforce(); + afx_msg void OnNewFolder(); + afx_msg void OnRefresh(); + afx_msg void OnUseAdmin(); + afx_msg void OnRemoteOpenShow(); + afx_msg void OnRemoteOpenHide(); + afx_msg void OnRemoteEncryption(); + afx_msg void OnRemoteDecrypt(); + afx_msg void OnRemoteInfo(); + afx_msg void OnRemoteCopyFile(); + afx_msg void OnRemotePasteFile(); + afx_msg void OnRemotezip(); + afx_msg void OnRemotezipstop(); + afx_msg void OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg BOOL MyShell_GetImageLists(); + afx_msg void OnCompress(); + afx_msg void OnUncompress(); + afx_msg void OnSetfocusRemotePath(); + afx_msg void OnBtnSearch(); + afx_msg void OnBnClickedSearchStop(); + afx_msg void OnBnClickedSearchResult(); + DECLARE_MESSAGE_MAP() + + protected: + BOOL m_bOnClose; + private: + bool m_bIsUpload; // 是否是把本地主机传到远程上,标志方向位 + BOOL m_bDragging; // during a drag operation + bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); + void SendTransferMode(); + void SendFileData(); + void EndLocalUploadFile(); + bool DeleteDirectory(LPCTSTR lpszDirectory); + void EnableControl(BOOL bEnable = TRUE); + + void ShowSearchPlugList(); + }; +} diff --git a/server/2015Remote/file/CFileTransferModeDlg.cpp b/server/2015Remote/file/CFileTransferModeDlg.cpp new file mode 100644 index 0000000..3928f79 --- /dev/null +++ b/server/2015Remote/file/CFileTransferModeDlg.cpp @@ -0,0 +1,111 @@ +// FileTransferModeDlg.cpp : implementation file +// +#include "stdafx.h" +#include "2015Remote.h" +#include "CFileTransferModeDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg dialog + +using namespace file; + +CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent /*=NULL*/) + : CDialog(CFileTransferModeDlg::IDD, pParent) +{ +} + + +void CFileTransferModeDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CFileTransferModeDlg, CDialog) + ON_BN_CLICKED(IDC_OVERWRITE, &CFileTransferModeDlg::OnBnClickedOverwrite) + ON_BN_CLICKED(IDC_OVERWRITE_ALL, &CFileTransferModeDlg::OnBnClickedOverwriteAll) + ON_BN_CLICKED(IDC_ADDITION, &CFileTransferModeDlg::OnBnClickedAddition) + ON_BN_CLICKED(IDC_ADDITION_ALL, &CFileTransferModeDlg::OnBnClickedAdditionAll) + ON_BN_CLICKED(IDC_JUMP, &CFileTransferModeDlg::OnBnClickedJump) + ON_BN_CLICKED(IDC_JUMP_ALL, &CFileTransferModeDlg::OnBnClickedJumpAll) + ON_BN_CLICKED(IDC_CANCEL, &CFileTransferModeDlg::OnBnClickedCancel) +END_MESSAGE_MAP() + +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg message handlers + + +void CFileTransferModeDlg::OnEndDialog(UINT id) +{ + EndDialog(id); +} + +BOOL CFileTransferModeDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + CString str; + str.Format(_T("此文件夹已包含一个名为“%s”的文件"), m_strFileName); + + for (int i = 0; i < str.GetLength(); i += 120) { + str.Insert(i, _T("\n")); + i += 1; + } + + SetDlgItemText(IDC_TIPS, str); + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + + +void CFileTransferModeDlg::OnBnClickedOverwrite() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_OVERWRITE); +} + + +void CFileTransferModeDlg::OnBnClickedOverwriteAll() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_OVERWRITE_ALL); +} + + +void CFileTransferModeDlg::OnBnClickedAddition() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_ADDITION); +} + + +void CFileTransferModeDlg::OnBnClickedAdditionAll() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_ADDITION_ALL); +} + + +void CFileTransferModeDlg::OnBnClickedJump() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_JUMP); +} + + +void CFileTransferModeDlg::OnBnClickedJumpAll() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_JUMP_ALL); +} + + +void CFileTransferModeDlg::OnBnClickedCancel() +{ + // TODO: 在此添加控件通知处理程序代码 + EndDialog(IDC_CANCEL); +} diff --git a/server/2015Remote/file/CFileTransferModeDlg.h b/server/2015Remote/file/CFileTransferModeDlg.h new file mode 100644 index 0000000..6793109 --- /dev/null +++ b/server/2015Remote/file/CFileTransferModeDlg.h @@ -0,0 +1,31 @@ + +#pragma once + +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg dialog + +namespace file { + + class CFileTransferModeDlg : public CDialog + { + public: + CString m_strFileName; + CFileTransferModeDlg(CWnd* pParent = NULL); + + enum { IDD = IDD_TRANSFERMODE_DLG }; + protected: + virtual void DoDataExchange(CDataExchange* pDX); + + protected: + afx_msg void OnEndDialog(UINT id); + virtual BOOL OnInitDialog(); + afx_msg void OnBnClickedOverwrite(); + afx_msg void OnBnClickedOverwriteAll(); + afx_msg void OnBnClickedAddition(); + afx_msg void OnBnClickedAdditionAll(); + afx_msg void OnBnClickedJump(); + afx_msg void OnBnClickedJumpAll(); + afx_msg void OnBnClickedCancel(); + DECLARE_MESSAGE_MAP() + }; +} diff --git a/server/2015Remote/res/file/FILE.ico b/server/2015Remote/res/file/FILE.ico new file mode 100644 index 0000000000000000000000000000000000000000..4a753631d0280240e9373b09af245baaeb76140a GIT binary patch literal 894 zcmb`DOG`pg6or>GE~G&dca$wLbD2SqrG%8cm%1WVm z5cw#2P@3!GTDI3@g}e2W}e@?tF`DwMNqR{axsnk>+CiEL$> zt~(Swt^P>kpDEK^l@@EXRIao1Coye|$oVRQZy}|QQVse=^FaOIKkpC$R)eN_ PnpN9P9zSPd+#>r0XmD3F literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/file/Icon_A.ico b/server/2015Remote/res/file/Icon_A.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e469d7a668285602c1b739b63435a8d7aa4c52e GIT binary patch literal 25214 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 literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/file/Icon_C.ico b/server/2015Remote/res/file/Icon_C.ico new file mode 100644 index 0000000000000000000000000000000000000000..f77a13c9c024edd198ff2b34724785fd47435909 GIT binary patch literal 24190 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 XU_E3JyOr3rAnwoy<-Q~MnFjhl*)H#m literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/file/Icon_D.ico b/server/2015Remote/res/file/Icon_D.ico new file mode 100644 index 0000000000000000000000000000000000000000..a261c81756f31e201d1351537f51dddb86d05dcf GIT binary patch literal 45110 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 JhTmTL{{TinoGJhS literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/file/Icon_E.ico b/server/2015Remote/res/file/Icon_E.ico new file mode 100644 index 0000000000000000000000000000000000000000..f3d96e00f82b041b7bea056461e15674c0c585fe GIT binary patch literal 25214 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 ZG2*t?Zq>Nezhcf9v=zANwY{|x{XbUBhHn4> literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/file/Icon_G.ico b/server/2015Remote/res/file/Icon_G.ico new file mode 100644 index 0000000000000000000000000000000000000000..385b4013edb65f67545c67d8cede938db5a20af8 GIT binary patch literal 25214 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 Slw}2f2p&t#HNE`i?*9V{N`BY? literal 0 HcmV?d00001 diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 562b75c348d828f29877023412c4d2affa3a7d76..e42291d6c66ed4534c59d707d7cfacf600e81017 100644 GIT binary patch delta 1026 zcmaJG*HiI-9Z%7y(@>sA0_PDam}KFIyAs`3M*hy=?a}K zNW(4A;SQF{oRtYTsZooN5@8114RB?V<69;(dkk+8$LoUnoW>2f?^Lv*3{{$FLB)~h z&sk+0`%hwHiozyp369@x#Lv~Ji_g|K=TaR~XL`L2I=fg7-^CaXcA`nqt3&!L^kZQN z;V8vP{kqI+goz*crU_iA^m}Y~)de4`Qx6ja!y?8KJcBjZfmiSXUcweUr@O;KZI5Td zIqR_T4@c;jp5~e1^w9|h>1e{EK#Q`-vZvKHNtJSyVZ9$t7WPAGacp@`Q$K_<5cC$oes~%h04`bK7*#*icpRH1Io>D4YUkl{s1&HC%e)j9n c*Y{MZh}+o|4nAE(v$rP|P>Hy=sn08a0X(wBHUIzs delta 47 zcmV+~0MP%&!2;g00