// ConsoleTransfer.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ Å¬·¡½º µ¿ÀÛÀ» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include "ConsoleTransfer.h" #include #include #include "CustomControlSite.h" #include "TransferDlg.h" #include "NoticeTrans.h" #include "Options.h" #include ".\consoletransfer.h" #ifdef _DEBUG #define new DEBUG_NEW #endif bool ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead); bool ShutDownSystem(UINT uFlags); //#define _TEST // CConsoleTransferApp BEGIN_MESSAGE_MAP(CConsoleTransferApp, CWinApp) ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() // CConsoleTransferApp »ý¼º CConsoleTransferApp::CConsoleTransferApp() { // TODO: ¿©±â¿¡ »ý¼º Äڵ带 Ãß°¡ÇÕ´Ï´Ù. // InitInstance¿¡ ¸ðµç Áß¿äÇÑ ÃʱâÈ­ ÀÛ¾÷À» ¹èÄ¡ÇÕ´Ï´Ù. } CConsoleTransferApp::~CConsoleTransferApp() { if (m_pimpldisp) delete m_pimpldisp; } // À¯ÀÏÇÑ CConsoleTransferApp °³Ã¼ÀÔ´Ï´Ù. CConsoleTransferApp theApp; // CConsoleTransferApp ÃʱâÈ­ BOOL CConsoleTransferApp::InitInstance() { // ÀÀ¿ë ÇÁ·Î±×·¥ ¸Å´ÏÆä½ºÆ®°¡ ComCtl32.dll ¹öÀü 6 ÀÌ»óÀ» »ç¿ëÇÏ¿© ºñÁÖ¾ó ½ºÅ¸ÀÏÀ» // »ç¿ëÇϵµ·Ï ÁöÁ¤ÇÏ´Â °æ¿ì, Windows XP »ó¿¡¼­ ¹Ýµå½Ã InitCommonControls()°¡ ÇÊ¿äÇÕ´Ï´Ù. // InitCommonControls()¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é âÀ» ¸¸µé ¼ö ¾ø½À´Ï´Ù. InitCommonControls(); CWinApp::InitInstance(); CCustomOccManager *poccmgr = new CCustomOccManager; m_pimpldisp = new CImpIDispatch; AfxEnableControlContainer(poccmgr); #ifdef _TEST bool bRet = false; CTransferDlg dlg; m_pMainWnd = &dlg; dlg.m_pszFileList = NULL; dlg.m_tp.hwnd = NULL; // dlg.m_tp.nAction = TPA_UPLOAD; dlg.m_tp.nAction = TPA_DOWNLOAD; dlg.m_tp.nFileListSize = 11; dlg.m_tp.nFreeBytes = -1; strcpy(dlg.m_tp.szHost, "222.122.136.201/dav"); // strcpy(dlg.m_tp.szHost, "192.168.0.203/dav"); strcpy(dlg.m_tp.szDstPath, ""); strcpy(dlg.m_tp.szDstPath, "G:\\"); dlg.m_tp.szProxyHost[0] = NULL; dlg.m_tp.nProxyPort = 0; strcpy(dlg.m_tp.szUserId, "0udisk@unizit"); strcpy(dlg.m_tp.szPassword, "0udisk"); // strcpy(dlg.m_tp.szUserId, "192@dosoar"); // strcpy(dlg.m_tp.szPassword, "dosoar"); dlg.m_pszFileList = new char[100]; if (!dlg.m_pszFileList) goto EXIT_PROGRAM; strcpy(dlg.m_pszFileList, "/HODOLi.avi"); // strcpy(dlg.m_pszFileList, "E:\\Game\\F.E.A.R\\FEAR.mdf"); // strcpy(dlg.m_pszFileList, "E:\\¸¶ÀÌŬÁ¶´ø_º£½ºÆ®40.avi"); #else if (!IsValidCommand()) return FALSE; bool bRet = false; CTransferDlg dlg; m_pMainWnd = &dlg; CString strTemp; dlg.m_pszFileList = NULL; // ÆÄÀÌÇÁ ÇÚµé ¿­±â... HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE) goto EXIT_PROGRAM; // ÆÄ¶ó¹ÌÅÍ ±¸Á¶Ã¼ ³»¿ë Àбâ... if (!ReadFile(hStdin, &dlg.m_tp, sizeof(dlg.m_tp))) goto EXIT_PROGRAM; dlg.m_pszFileList = new char[dlg.m_tp.nFileListSize]; if (!dlg.m_pszFileList) goto EXIT_PROGRAM; if (!ReadFile(hStdin, dlg.m_pszFileList, dlg.m_tp.nFileListSize)) goto EXIT_PROGRAM; #endif dlg.DoModal(); bRet = true; EXIT_PROGRAM: if (dlg.m_pszFileList) delete []dlg.m_pszFileList; ::PostMessage(dlg.m_tp.hwnd, WMU_TRANSFER_DLG_CLOSE, (WPARAM)dlg.m_tp.pParam, NULL); if (!IsExistsSameProcess()) { int nAfterExec = COptions::GetOptionVal(OPTION_AFTEREXEC); if (nAfterExec > 0) { // UINT uFlags = bForceKill ? EWX_FORCE : 0; UINT uFlags = 0; switch (nAfterExec) { case 1: uFlags |= EWX_LOGOFF; break; case 2: uFlags |= EWX_REBOOT; break; case 3: uFlags |= EWX_SHUTDOWN; break; } ShutDownSystem(uFlags); } } // ´ëÈ­ »óÀÚ°¡ ´ÝÇûÀ¸¹Ç·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ÆßÇÁ¸¦ ½ÃÀÛÇÏÁö ¾Ê°í // ÀÀ¿ë ÇÁ·Î±×·¥À» ³¡³¾ ¼ö ÀÖµµ·Ï FALSE¸¦ ¹ÝȯÇÕ´Ï´Ù. return FALSE; } bool CConsoleTransferApp::IsValidCommand() { return strcmp(m_lpCmdLine, EXECUTE_PARAM) == 0; } #define MAX_PROCESS 1000 bool CConsoleTransferApp::IsExistsSameProcess() { bool bRet = false; LPDWORD pdwProcessId = new DWORD[MAX_PROCESS]; if (!pdwProcessId) return true; DWORD dwCount; if (!EnumProcesses(pdwProcessId, sizeof(DWORD) * MAX_PROCESS, &dwCount)) goto EXIT_FUNCTION; dwCount /= sizeof(DWORD); char szModuleName[MAX_PATH]; if (!GetModuleFileName(GetModuleHandle(NULL), szModuleName, MAX_PATH)) goto EXIT_FUNCTION; int nFound = 0; char szFileName[MAX_PATH]; for (DWORD i = 0; i < dwCount; i++) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pdwProcessId[i]); if (!hProcess) continue; if (!GetModuleFileNameEx(hProcess, NULL, szFileName, MAX_PATH)) continue; if (strcmp(szFileName, szModuleName) == 0) nFound++; } if (nFound <= 1) bRet = true; EXIT_FUNCTION: if (pdwProcessId) delete []pdwProcessId; return !bRet; } void CConsoleTransferApp::NoticeTransComplete(CString targetPath ) { PTRANPARAM_STRUCT ptp = new TRANPARAM_STRUCT; memcpy( ptp , &(((CTransferDlg*)m_pMainWnd)->m_tp) , sizeof(TRANPARAM_STRUCT)); CNoticeTrans dlg(ptp , targetPath); dlg.DoModal(); CTransferDlg* mainDlg = (CTransferDlg*) m_pMainWnd; mainDlg->TransCompleteWithDistribute(); } void CConsoleTransferApp::NoticeLastFileTransComplete() { PTRANPARAM_STRUCT ptp = new TRANPARAM_STRUCT; memcpy( ptp , &(((CTransferDlg*)m_pMainWnd)->m_tp) , sizeof(TRANPARAM_STRUCT)); CNoticeTrans dlg(ptp , 1 /*LastFileTransComplete*/); dlg.DoModal(); } CString GetErrorMessage(DWORD dwError) { CString sError; LPVOID lpBuffer; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpBuffer, 0, NULL)) sError = "¾Ë ¼ö ¾ø´Â ¿À·ùÀÔ´Ï´Ù."; else sError = (LPCTSTR)lpBuffer; LocalFree(lpBuffer); return sError; } bool CreateDirectory(CString sDirectory) { CString sPath = ""; int iToken = 0; CString sText = sDirectory.Tokenize("\\", iToken); while (sText != "") { sPath += sText + "\\"; if (sPath.GetLength() > 3 && !CreateDirectory(sPath, NULL)) { DWORD dwError = GetLastError(); if (dwError != 183) { SetLastError(dwError); return false; } } sText = sDirectory.Tokenize("\\", iToken); } return true; } bool DeleteDirectory(CString sDirectory) { // no UI if (sDirectory.Right(1) != _T("\\")) sDirectory += _T("\\"); sDirectory += _T("*"); CFileFind finder; BOOL bFound = finder.FindFile(sDirectory); while (bFound) { bFound = finder.FindNextFile(); if (finder.IsDots()) continue; if (finder.IsDirectory()) { if (!DeleteDirectory(finder.GetFilePath())) return false; } else { if (!DeleteFile(finder.GetFilePath())) return false; } } finder.Close(); sDirectory = sDirectory.Left(sDirectory.ReverseFind('\\')); RemoveDirectory(sDirectory); return true; } CString NumericFormat(__int64 nNumeric) { CString sNumeric; sNumeric.Format("%I64d", nNumeric); int nStartPos = sNumeric.GetLength(); for (int i = nStartPos, j = 0; i > 0; i--, j++) { if (i != nStartPos && (j % 3) == 0) sNumeric.Insert(i, ','); } return sNumeric; } CString NumericFormatWithPoint(long double nNumeric) { CString sNumeric; sNumeric.Format("%.2f", nNumeric); int nStartPos = sNumeric.Find('.'); for (int i = nStartPos, j = 0; i > 0; i--, j++) { if (i != nStartPos && (j % 3) == 0) sNumeric.Insert(i, ','); } return sNumeric; } CString BYTE2KMBYTE(__int64 nBytes, int nFlag, BOOL bShowDecimalPoint) { CString sValue; char* szUnit[] = {"Bytes", "KB", "MB", "GB", "TB", "PB"}; if (nFlag == 0) { for (nFlag = 5; nFlag > 0; nFlag--) if (((UINT64)nBytes >> (nFlag * 10)) >= 1) break; } double nPow = pow(1024.0, (double)nFlag); if (bShowDecimalPoint && nFlag > 0) sValue = NumericFormatWithPoint((long double)nBytes / nPow) + szUnit[nFlag]; else sValue = NumericFormat((__int64)ceil((long double)nBytes / nPow)) + szUnit[nFlag]; return sValue; } CString BYTE2KMBIT(__int64 nBytes, int nFlag, BOOL bShowDecimalPoint) { CString sValue; char* szUnit[] = {"", "K", "M", "G", "T", "P"}; if (nFlag == 0) { for (nFlag = 5; nFlag > 0; nFlag--) if (((UINT64)nBytes >> (nFlag * 10)) >= 1) break; } double nPow = pow(1024.0, (double)nFlag); if (bShowDecimalPoint && nFlag > 0) sValue = NumericFormatWithPoint((long double)nBytes / nPow) + szUnit[nFlag]; else sValue = NumericFormat((__int64)ceil((long double)nBytes / nPow)) + szUnit[nFlag]; return sValue; } bool ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead) { DWORD dwRead; while (nNumberOfBytesToRead > 0) { if (!ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, &dwRead, NULL)) return false; nNumberOfBytesToRead -= dwRead; } return true; } bool ShutDownSystem(UINT uFlags) { bool bRet = false; if (uFlags == EWX_LOGOFF) { bRet = ExitWindowsEx(uFlags, 0) ? true : false; } else { UINT uVersion = GetVersion(); if (uVersion < 0x80000000) { // If OS is like WinNT HANDLE hToken; TOKEN_PRIVILEGES tp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return false; if (!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid)) return false; tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) return false; if (!InitiateSystemShutdown(NULL, NULL, 0, TRUE, (uFlags & EWX_REBOOT))) return false; bRet = true; } else { bRet = ExitWindowsEx(uFlags, 0) ? true : false; } } return bRet; }