DragonNest/Client/DnMakeFullPatch/DnMakeFullPatchDlg.cpp

681 lines
15 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// DnMakeFullPatchDlg.cpp : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
//
#include "stdafx.h"
#include "DnMakeFullPatch.h"
#include "DnMakeFullPatchDlg.h"
#include "MD5Checksum.h"
#include "zip.h"
#include "LogWnd.h"
#include <direct.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDnPatcherDlg <20><>ȭ <20><><EFBFBD><EFBFBD>
BOOL PeekAndPump()
{
static MSG msg;
while(::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return FALSE;
}
}
return TRUE;
}
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> CAboutDlg <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// <20><>ȭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
// <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
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 <20><>ȭ <20><><EFBFBD><EFBFBD>
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 <20>޽<EFBFBD><DEBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD>
BOOL CDnMakeFullPatchDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// <20>ý<EFBFBD><C3BD><EFBFBD> <20>޴<EFBFBD><DEB4><EFBFBD> "<22><><EFBFBD><EFBFBD>..." <20>޴<EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD> <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
// IDM_ABOUTBOX<4F><58> <20>ý<EFBFBD><C3BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>մϴ<D5B4>.
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);
}
}
// <20><> <20><>ȭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><> â<><C3A2> <20><>ȭ <20><><EFBFBD>ڰ<EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1>
// <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ũ<EFBFBD><C5A9> <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
SetIcon(m_hIcon, TRUE); // ū <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
SetIcon(m_hIcon, FALSE); // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
// TODO: <20><><EFBFBD><20>߰<EFBFBD> <20>ʱ<EFBFBD>ȭ <20>۾<EFBFBD><DBBE><EFBFBD> <20>߰<EFBFBD><DFB0>մϴ<D5B4>.
m_ListCtrlFileList.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
CRect rt;
m_ListCtrlFileList.GetWindowRect(rt);
m_ListCtrlFileList.InsertColumn(0, _T("<EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD>"), 0, int(rt.Width()*0.07f));
m_ListCtrlFileList.InsertColumn(1, _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), 0, int(rt.Width()*0.13f));
m_ListCtrlFileList.InsertColumn(2, _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), 0, int(rt.Width()*0.80f));
m_szEditPath = _T("<EFBFBD>Է<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20>Է<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>.");
m_szEditOutFolder = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>.");
m_szStaticMsg = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>.");
UpdateData(FALSE);
return TRUE; // <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD>ѿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRUE<55><45> <20><>ȯ<EFBFBD>մϴ<D5B4>.
}
void CDnMakeFullPatchDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// <20><>ȭ <20><><EFBFBD>ڿ<EFBFBD> <20>ּ<EFBFBD>ȭ <20><><EFBFBD>߸<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD><EFBFBD><EFBFBD>
// <20>Ʒ<EFBFBD> <20>ڵ尡 <20>ʿ<EFBFBD><CABF>մϴ<D5B4>. <20><><EFBFBD><EFBFBD>/<2F><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> MFC <20><><EFBFBD><EFBFBD> <20><><EFBFBD>α׷<CEB1><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><ECBFA1>
// <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ũ<EFBFBD><C5A9><EFBFBD><EFBFBD> <20><> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
void CDnMakeFullPatchDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // <20>׸<EFBFBD><D7B8><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> <20><><EFBFBD>ؽ<EFBFBD>Ʈ
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ <20><EFBFBD><E7B0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB5A5> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
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;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8>ϴ<EFBFBD>.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20>ּ<EFBFBD>ȭ<EFBFBD><C8AD> â<><C3A2> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ȿ<EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> ǥ<>õǵ<C3B5><C7B5><EFBFBD> <20>ý<EFBFBD><C3BD>ۿ<EFBFBD><DBBF><EFBFBD>
// <20><> <20>Լ<EFBFBD><D4BC><EFBFBD> ȣ<><C8A3><EFBFBD>մϴ<D5B4>.
HCURSOR CDnMakeFullPatchDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
switch (uMsg)
{
case BFFM_INITIALIZED:
SetWindowText(hwnd, _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
SetWindowPos(hwnd,NULL,10,10,0,0,SWP_NOSIZE | SWP_NOZORDER);
break;
case BFFM_VALIDATEFAILED:
MessageBox(hwnd,_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>. <20>ٽ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20>ֽʽÿ<CABD>"),
_T("<EFBFBD>˸<EFBFBD>"),MB_OK);
return 1;
}
return 0;
}
BOOL BrowseFolder(HWND hWnd, TCHAR *szFolder)
{
LPMALLOC pMalloc;
LPITEMIDLIST pidl;
BROWSEINFO bi;
LPITEMIDLIST root;
bi.hwndOwner = hWnd;
//<2F><> <20><>ǻ<EFBFBD>͸<EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SHGetSpecialFolderLocation(hWnd,CSIDL_DRIVES,&root);
bi.pidlRoot = root;
bi.pidlRoot = NULL;
bi.pszDisplayName = NULL;
bi.lpszTitle = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>." );
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>.");
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("<EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ּ<EFBFBD><D6BC><EFBFBD>"));
}
}
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 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
break;
case VK_RETURN:
pMsg->wParam=NULL; // <20><><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
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); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
TCHAR strPath[_MAX_PATH]={0,};
if ( iCount < 0 )
return ;
if ( iCount != 1 )
{
AfxMessageBox(_T("<EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E5B7A1> <20><><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>."));
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 );
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
if ( hFile != INVALID_HANDLE_VALUE )
{
CloseHandle(hFile);
AfxMessageBox(_T("<EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E5B7A1> <20><><EFBFBD>ּ<EFBFBD><D6BC><EFBFBD>."));
return ;
}
// <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD><CFB0><EFBFBD>
else
{
m_szEditPath = strPath;
UpdateData(FALSE);
DropFolder(strPath);
}
}
m_szStaticMsg = _T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ư<EFBFBD><C6B0> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>ϼ<EFBFBD><CFBC><EFBFBD>.");
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!! m_szEditOutFolder[%s] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20><><EFBFBD><EFBFBD>"), m_szEditOutFolder.GetBuffer());
return;
}
if ( GetSafeHwnd() )
{
m_szStaticMsg = _T("Ǯ<EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Դϴ<D4B4>. <20><><EFBFBD><EFBFBD> <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ٷ<EFBFBD><D9B7>ּ<EFBFBD><D6BC><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>!");
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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> [%s]"), szOnlyFolder.GetBuffer());
if ( __AccessFolder(szOnlyFolder.GetBuffer()) == false )
{
LogWnd::TraceLog(_T("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!! <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> [%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]<5D><><EFBFBD><EFBFBD> <20>Ϸ<EFBFBD> "), pF->szFilePath, pF->szChecksum);
if ( GetSafeHwnd() )
{
m_ProgressCurrent.SetPos(100);
PeekAndPump();
}
}
_BuildChecksumFile();
if ( GetSafeHwnd() )
{
m_ProgressTotal.SetPos((int)m_FileList.size()+1);
AfxMessageBox(_T("<EFBFBD>Ϸ<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
}
LogWnd::TraceLog(_T("<EFBFBD>Ϸ<EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> "));
}
void CDnMakeFullPatchDlg::_BuildChecksumFile()
{
LogWnd::TraceLog(_T("_BuildChecksumFile <20><><EFBFBD><EFBFBD>"));
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);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MD5::üũ<C3BC><C5A9> <20><><EFBFBD><EFBFBD>
CString sAccess;
CString sCheckSum;
sCheckSum = CMD5Checksum::GetMD5( sfile );
// MD5 üũ<C3BC><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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 <20>Ϸ<EFBFBD>"));
}