// DnMakeFullPatchDlg.cpp : ±¸Çö ÆÄÀÏ // #include "stdafx.h" #include "DnMakeFullPatch.h" #include "DnMakeFullPatchDlg.h" #include "MD5Checksum.h" #include "zip.h" #include "LogWnd.h" #include #include #include #include #ifdef _DEBUG #define new DEBUG_NEW #endif // CDnPatcherDlg ´ëÈ­ »óÀÚ BOOL PeekAndPump() { static MSG msg; while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if(!AfxGetApp()->PumpMessage()) { ::PostQuitMessage(0); return FALSE; } } return TRUE; } // ÀÀ¿ë ÇÁ·Î±×·¥ Á¤º¸¿¡ »ç¿ëµÇ´Â CAboutDlg ´ëÈ­ »óÀÚÀÔ´Ï´Ù. class CAboutDlg : public CDialog { public: CAboutDlg(); // ´ëÈ­ »óÀÚ µ¥ÀÌÅÍÀÔ´Ï´Ù. enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Áö¿øÀÔ´Ï´Ù. // ±¸ÇöÀÔ´Ï´Ù. protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CDnMakeFullPatchDlg ´ëÈ­ »óÀÚ CDnMakeFullPatchDlg::CDnMakeFullPatchDlg(CWnd* pParent /*=NULL*/) : CDialog(CDnMakeFullPatchDlg::IDD, pParent) , m_szEditPath(_T("")) , m_szStaticMsg(_T("")) , m_szEditOutFolder(_T("")) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_bSetInputFolder = false; m_bSetOutputFolder = false; } void CDnMakeFullPatchDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_PATH, m_szEditPath); DDX_Text(pDX, IDC_EDIT_OUT_PATH, m_szEditOutFolder); DDX_Text(pDX, IDC_STATIC_MSG, m_szStaticMsg); DDX_Control(pDX, IDC_PROGRESS_CURRENT, m_ProgressCurrent); DDX_Control(pDX, IDC_PROGRESS_TOTAL, m_ProgressTotal); DDX_Control(pDX, IDC_LIST_FILELIST, m_ListCtrlFileList); } BEGIN_MESSAGE_MAP(CDnMakeFullPatchDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON_SET_PATH, &CDnMakeFullPatchDlg::OnBnClickedButtonSetPath) ON_BN_CLICKED(IDC_BUTTON_BUILD, &CDnMakeFullPatchDlg::OnBnClickedButtonBuild) ON_BN_CLICKED(IDC_BUTTON_SET_OUT_PATH, &CDnMakeFullPatchDlg::OnBnClickedButtonSetOutPath) END_MESSAGE_MAP() // CDnMakeFullPatchDlg ¸Þ½ÃÁö 󸮱â BOOL CDnMakeFullPatchDlg::OnInitDialog() { CDialog::OnInitDialog(); // ½Ã½ºÅÛ ¸Þ´º¿¡ "Á¤º¸..." ¸Þ´º Ç׸ñÀ» Ãß°¡ÇÕ´Ï´Ù. // IDM_ABOUTBOX´Â ½Ã½ºÅÛ ¸í·É ¹üÀ§¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. m_ListCtrlFileList.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ); CRect rt; m_ListCtrlFileList.GetWindowRect(rt); m_ListCtrlFileList.InsertColumn(0, _T("À妽º"), 0, int(rt.Width()*0.07f)); m_ListCtrlFileList.InsertColumn(1, _T("»çÀÌÁî"), 0, int(rt.Width()*0.13f)); m_ListCtrlFileList.InsertColumn(2, _T("°æ·Î"), 0, int(rt.Width()*0.80f)); m_szEditPath = _T("ÀÔ·Â Æú´õ ¿­±â¸¦ ´­·¯ ÀÔ·Â Æú´õ¸¦ ¼¼ÆÃÇØ ÁÖ¼¼¿ä."); m_szEditOutFolder = _T("Ãâ·Â Æú´õ ¿­±â¸¦ ´­·¯ Ãâ·Â Æú´õ¸¦ ¼¼ÆÃÇØ ÁÖ¼¼¿ä."); m_szStaticMsg = _T("Æú´õ°¡ ¼±Åà µÇÁö ¾Ê¾Ò½À´Ï´Ù."); UpdateData(FALSE); return TRUE; // Æ÷Ä¿½º¸¦ ÄÁÆ®·Ñ¿¡ ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CDnMakeFullPatchDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CDnMakeFullPatchDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ±×¸®±â¸¦ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Ŭ¶óÀÌ¾ðÆ® »ç°¢Çü¿¡¼­ ¾ÆÀÌÄÜÀ» °¡¿îµ¥¿¡ ¸ÂÃä´Ï´Ù. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // ¾ÆÀÌÄÜÀ» ±×¸³´Ï´Ù. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CDnMakeFullPatchDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData) { switch (uMsg) { case BFFM_INITIALIZED: SetWindowText(hwnd, _T("Æú´õ °í¸£±â")); SetWindowPos(hwnd,NULL,10,10,0,0,SWP_NOSIZE | SWP_NOZORDER); break; case BFFM_VALIDATEFAILED: MessageBox(hwnd,_T("¿¡µðÆ®¿¡ ÀÔ·ÂÇÑ Æú´õ´Â Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù. ´Ù½Ã ÀÔ·ÂÇØ Áֽʽÿä"), _T("¾Ë¸²"),MB_OK); return 1; } return 0; } BOOL BrowseFolder(HWND hWnd, TCHAR *szFolder) { LPMALLOC pMalloc; LPITEMIDLIST pidl; BROWSEINFO bi; LPITEMIDLIST root; bi.hwndOwner = hWnd; //³» ÄÄÇ»Å͸¦ ·çÆ®·Î ¸¸µé±â SHGetSpecialFolderLocation(hWnd,CSIDL_DRIVES,&root); bi.pidlRoot = root; bi.pidlRoot = NULL; bi.pszDisplayName = NULL; bi.lpszTitle = _T("Æú´õ¸¦ ¼±ÅÃÇϼ¼¿ä." ); bi.ulFlags = BIF_EDITBOX | BIF_STATUSTEXT | BIF_VALIDATE; bi.lpfn = BrowseCallbackProc; bi.lParam = 0; pidl = SHBrowseForFolder(&bi); if (pidl == NULL) { return FALSE; } SHGetPathFromIDList(pidl, szFolder); if (SHGetMalloc(&pMalloc) != NOERROR) { return FALSE; } pMalloc->Free(pidl); pMalloc->Release(); return TRUE; } void CDnMakeFullPatchDlg::OnBnClickedButtonSetPath() { // TODO: Add your control notification handler code here TCHAR szPath[1024] = {0, } ; ZeroMemory( szPath,sizeof(szPath)); if ( BrowseFolder(GetSafeHwnd(), szPath) == TRUE) { m_szEditPath = szPath; UpdateData(FALSE); DropFolder(szPath); _UpdateFileList(); m_bSetInputFolder = true; } } void CDnMakeFullPatchDlg::OnBnClickedButtonSetOutPath() { // TODO: Add your control notification handler code here TCHAR szPath[1024] = {0, } ; ZeroMemory( szPath,sizeof(szPath)); if ( BrowseFolder(GetSafeHwnd(), szPath) == TRUE) { m_szEditOutFolder = szPath; m_szStaticMsg = _T("ºôµå ¹öưÀ» ´­·¯ ÆÐÄ¡¸¦ »ý¼ºÇϼ¼¿ä."); UpdateData(FALSE); m_bSetOutputFolder = true; } } void CDnMakeFullPatchDlg::OnBnClickedButtonBuild() { // TODO: Add your control notification handler code here if ( m_bSetOutputFolder && m_bSetOutputFolder ) { Build(); } else { AfxMessageBox(_T("ÀÔ/Ãâ·Â Æú´õ¸¦ ¼¼ÆÃÇØ ÁÖ¼¼¿ä")); } } BOOL CDnMakeFullPatchDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class switch(pMsg->wParam) { case VK_ESCAPE: pMsg->wParam=NULL; // ESC ´Â ¹«½ÃÇÑ´Ù. break; case VK_RETURN: pMsg->wParam=NULL; // ¿£Å͵µ ¹«½ÃÇÑ´Ù. break; } /* switch(pMsg->message) { case WM_DROPFILES: DropFile((HDROP)pMsg->wParam); break; } */ return CDialog::PreTranslateMessage(pMsg); } void CDnMakeFullPatchDlg::DropFile(HDROP hDrop) { m_FileList.clear(); int iCount = DragQueryFile(hDrop,0xFFFFFFFF,NULL,0); // ÆÄÀÏÀÇ °¹¼ö¸¦ ±¸ÇÑ´Ù. TCHAR strPath[_MAX_PATH]={0,}; if ( iCount < 0 ) return ; if ( iCount != 1 ) { AfxMessageBox(_T("ÇϳªÀÇ Æú´õ¸¸ µå·¡±× ÇØÁÖ¼¼¿ä.")); return ; } for ( int i = 0 ; i < iCount ; i++ ) { DragQueryFile(hDrop,i,strPath,_MAX_PATH); HANDLE hFile = INVALID_HANDLE_VALUE; hFile = CreateFile(strPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL ); // ÆÄÀÏÀÏ °æ¿ì if ( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); AfxMessageBox(_T("ÇϳªÀÇ Æú´õ¸¸ µå·¡±× ÇØÁÖ¼¼¿ä.")); return ; } // Æú´õ Àϰæ¿ì else { m_szEditPath = strPath; UpdateData(FALSE); DropFolder(strPath); } } m_szStaticMsg = _T("ºôµå ¹öưÀ» ´­·¯ ÆÐÄ¡¸¦ »ý¼º Çϼ¼¿ä."); UpdateData(FALSE); _UpdateFileList(); } void CDnMakeFullPatchDlg::DropFolder(const TCHAR* szPath) { WIN32_FIND_DATA fd; HANDLE hFD; LogWnd::TraceLog("DropFolder %s", szPath); hFD = FindFirstFile(szPath, &fd); if (hFD != INVALID_HANDLE_VALUE) { do { if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { CString _szName(fd.cFileName); if ( _szName != _T(".") && _szName != _T("..") ) { TCHAR szDrive[MAX_PATH] = { 0, }; TCHAR szDir[MAX_PATH] = { 0, }; TCHAR szFileName[MAX_PATH] = { 0, }; TCHAR szExt[MAX_PATH] = { 0, }; _tsplitpath(szPath, szDrive, szDir, szFileName, szExt ); CString szNewPath; szNewPath.Format(_T("%s%s%s\\*.*"), szDrive, szDir, _szName.GetBuffer()); DropFolder(szNewPath.GetBuffer()); } } else { TCHAR szDrive[MAX_PATH] = { 0, }; TCHAR szDir[MAX_PATH] = { 0, }; TCHAR szFileName[MAX_PATH] = { 0, }; TCHAR szExt[MAX_PATH] = { 0, }; _tsplitpath(szPath, szDrive, szDir, szFileName, szExt ); CString szNewPath; szNewPath.Format(_T("%s%s%s"), szDrive, szDir, fd.cFileName ); HANDLE hFile = INVALID_HANDLE_VALUE; hFile = CreateFile(szNewPath.GetBuffer(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL ); DWORD tmp = 0; DWORD nFileSize = 0; nFileSize = GetFileSize(hFile, &tmp); CloseHandle(hFile); FILELIST f; f.nFileSize = nFileSize; CString szTemp; szTemp = m_szEditPath; szTemp += _T("\\"); int n = szNewPath.Find(szTemp.GetBuffer()); if ( n >= 0 && n < szNewPath.GetLength() ) { szNewPath.Delete(0, szTemp.GetLength()); } strcpy(f.szFilePath, szNewPath.GetBuffer()); LogWnd::TraceLog(_T("FileList Add %s"), szNewPath.GetBuffer()); m_FileList.push_back(f); } } while(FindNextFile(hFD, &fd)); FindClose( hFD ); } } void CDnMakeFullPatchDlg::_UpdateFileList() { m_ListCtrlFileList.DeleteAllItems(); for ( int i = 0 ; i < (int)m_FileList.size() ; i++ ) { CString szTemp; szTemp.Format(_T("%d"), i); FILELIST* pF = (FILELIST*)&(m_FileList[i]); m_ListCtrlFileList.InsertItem(i, szTemp.GetBuffer()); szTemp.Format(_T("%d"), pF->nFileSize); TCHAR text[512] = {0,}; LV_ITEM lvitem; strcpy(text, szTemp.GetBuffer()); lvitem.pszText = text; lvitem.mask = LVIF_TEXT; lvitem.iSubItem = 1; lvitem.iItem = i; m_ListCtrlFileList.SetItem(&lvitem); strcpy(text, pF->szFilePath); lvitem.pszText = text; lvitem.mask = LVIF_TEXT; lvitem.iSubItem = 2; lvitem.iItem = i; m_ListCtrlFileList.SetItem(&lvitem); } } // d:\sample\sample // d:/sample/sample bool __AccessFolder( char *sSrcFullPath_ ) { char spath[1024+1]; char *ps; char *pd; ZeroMemory( spath, sizeof(spath) ); ps = sSrcFullPath_; pd = spath; int i; for (i=0; i< (int) strlen(sSrcFullPath_); ++i) { char ch = *(ps); if ( ch == '\\' || ch == '/' ) { if ( strlen( ps ) > 0 && *(ps-1) != ':') { ::_mkdir( spath ); if ( ::_access( spath, 0) == -1) return false; /* OutputDebugString(spath); OutputDebugString("\n"); */ } } *(pd) = ch; ++pd; ++ps; } return true; } void CDnMakeFullPatchDlg::Build() { LogWnd::TraceLog(_T("Build Begin....")); if ( ::_access( m_szEditOutFolder.GetBuffer(), 6) == -1 ) { LogWnd::TraceLog(_T("¿À·ù!!! m_szEditOutFolder[%s] Æú´õ¿¡ Á¢±ÙÇÒ¼ö ¾øÀ½"), m_szEditOutFolder.GetBuffer()); return; } if ( GetSafeHwnd() ) { m_szStaticMsg = _T("Ç®ÆÐÄ¡¸¦ ¸¸µå´Â ÁßÀÔ´Ï´Ù. ¿À·¡ °É¸®´õ¶óµµ ±â´Ù·ÁÁÖ¼¼¿ä.. »¸Àº°Ô ¾Æ´Ô!"); UpdateData(FALSE); PeekAndPump(); m_ProgressCurrent.SetRange(0,100); m_ProgressTotal.SetRange(0,(int)m_FileList.size() ); } for ( int i = 0 ; i < (int)m_FileList.size() ; i++ ) { if ( GetSafeHwnd() ) { m_ProgressTotal.SetPos(i); PeekAndPump(); } CString szTemp; szTemp.Format(_T("%d"), i); FILELIST* pF = (FILELIST*)&(m_FileList[i]); CString szPath, szOnlyPath ; szPath = m_szEditPath; szPath += _T("\\"); szOnlyPath = szPath; szPath += pF->szFilePath; CString szChecksum = CMD5Checksum::GetMD5(szPath); if ( GetSafeHwnd() ) { m_ProgressCurrent.SetPos(50); PeekAndPump(); } strcpy(pF->szChecksum, szChecksum.GetBuffer()); CString szZipPath ; szZipPath = m_szEditOutFolder; szZipPath += _T("\\"); szZipPath += pF->szFilePath; szZipPath += _T(".zip"); TCHAR szDrive[MAX_PATH] = { 0, }; TCHAR szDir[MAX_PATH] = { 0, }; TCHAR szFileName[MAX_PATH] = { 0, }; TCHAR szExt[MAX_PATH] = { 0, }; _tsplitpath(szZipPath, szDrive, szDir, szFileName, szExt ); CString szOnlyFolder; szOnlyFolder.Format(_T("%s%s"), szDrive, szDir); LogWnd::TraceLog(_T("Æú´õ Á¢±Ù [%s]"), szOnlyFolder.GetBuffer()); if ( __AccessFolder(szOnlyFolder.GetBuffer()) == false ) { LogWnd::TraceLog(_T("¿À·ù!!! Æú´õ Á¢±Ù ¿À·ù [%s]"), szOnlyFolder.GetBuffer()); return; } DeleteFile(szZipPath); HZIP hz; hz = CreateZip( szZipPath, "" ); ZipAdd(hz, szFileName, szPath ); CloseZip(hz); HANDLE hFile = INVALID_HANDLE_VALUE; hFile = CreateFile(szZipPath.GetBuffer(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL ); DWORD tmp = 0; DWORD nFileSize = 0; nFileSize = GetFileSize(hFile, &tmp); CloseHandle(hFile); pF->nCompressFileSize = nFileSize; LogWnd::TraceLog(_T("[%s] [%s]ÆÄÀÏ ¿Ï·á "), pF->szFilePath, pF->szChecksum); if ( GetSafeHwnd() ) { m_ProgressCurrent.SetPos(100); PeekAndPump(); } } _BuildChecksumFile(); if ( GetSafeHwnd() ) { m_ProgressTotal.SetPos((int)m_FileList.size()+1); AfxMessageBox(_T("¿Ï·áµÇ¾ú½À´Ï´Ù.")); } LogWnd::TraceLog(_T("¿Ï·áµÇ¾ú½À´Ï´Ù ")); } void CDnMakeFullPatchDlg::_BuildChecksumFile() { LogWnd::TraceLog(_T("_BuildChecksumFile ½ÃÀÛ")); TCHAR sfile[ 1024+1 ]; if ( m_FileList.size() <= 0) return; _stprintf( sfile,_T("%s\\fullpatch_svr.cfg"), m_szEditOutFolder.GetBuffer() ); FILE *fw; if (( fw =fopen(sfile,"w+")) != NULL ) { for ( int i = 0 ; i < (int)m_FileList.size() ; i++ ) { FILELIST* pF = (FILELIST*)&(m_FileList[i]); fprintf(fw,"%10ld|%10ld|%-32s|%s\n",pF->nFileSize,pF->nCompressFileSize, pF->szChecksum, pF->szFilePath); LogWnd::TraceLog(_T("%10ld|%10ld|%-32s|%s\n"),pF->nFileSize,pF->nCompressFileSize, pF->szChecksum, pF->szFilePath); } fclose(fw); } // ¸ñ·ÏÆÄÀÏ MD5::üũ¼¶ »ý¼º CString sAccess; CString sCheckSum; sCheckSum = CMD5Checksum::GetMD5( sfile ); // MD5 üũ¼¶ÆÄÀÏ sprintf( sfile,"%s\\fullpatch_svr.md5", m_szEditOutFolder.GetBuffer()); if ((fw = fopen( sfile,"w+")) != NULL) { fprintf(fw,"%s\n",sCheckSum.GetBuffer()); fclose(fw); } LogWnd::TraceLog(_T("_BuildChecksumFile ¿Ï·á")); }