// PatchDlg.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "ServiceManagerEx.h" #include "PatchDlg.h" #include "ItemData.h" #include "ServiceManager.h" extern CServiceManager* g_pServiceManager; IMPLEMENT_DYNAMIC(CPatchDlg, CDialog) CPatchDlg::CPatchDlg(CWnd* pParent /*=NULL*/) : CDialog(CPatchDlg::IDD, pParent) { } CPatchDlg::~CPatchDlg() { ClearLauncherData(); } void CPatchDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE_PATCH_LIST, m_Tree); } BEGIN_MESSAGE_MAP(CPatchDlg, CDialog) ON_BN_CLICKED(IDOK, &CPatchDlg::OnBnClickedOk) END_MESSAGE_MAP() void CPatchDlg::Open() { m_LauncherList.clear(); DoModal(); } BOOL CPatchDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ¿©±â¿¡ Ãß°¡ ÃʱâÈ­ ÀÛ¾÷À» Ãß°¡ÇÕ´Ï´Ù. ClearLauncherData(); BuildView(); RefreshView(); return TRUE; // return TRUE unless you set the focus to a control // ¿¹¿Ü: OCX ¼Ó¼º ÆäÀÌÁö´Â FALSE¸¦ ¹ÝÈ¯ÇØ¾ß ÇÕ´Ï´Ù. } void CPatchDlg::BuildView() { const ViewConfig* pViewConfig = ((CServiceManagerExApp*)::AfxGetApp())->GetConfigEx().GetViewConfig(L"Manager"); if (pViewConfig) m_Tree.SetBkColor(pViewConfig->GetBgColor()); else m_Tree.SetBkColor(RGB(0, 0, 0)); m_Tree.SetTextColor(RGB(255,255,255)); // insert partition(==root) wchar_t text[256] = {0,}; g_pServiceManager->GetPartitionText(text); TVINSERTSTRUCT tvi; tvi.hParent = TVI_ROOT; tvi.hInsertAfter = TVI_LAST; tvi.item.mask = TVIF_TEXT | TVIF_SELECTEDIMAGE; tvi.item.pszText = text; HTREEITEM hRoot = m_Tree.InsertItem(&tvi); #if defined (USE_FONT_BOLD) m_Tree.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD); #endif //#if defined (USE_FONT_BOLD) // insert netlauncher vector launchers; g_pServiceManager->GetLauncherList(launchers); for each (const TNetLauncher* pLauncher in launchers) { ::wsprintf(text, L"[%s] NID : %d", pLauncher->szIP, pLauncher->nID); tvi.hParent = hRoot; tvi.hInsertAfter = TVI_LAST; tvi.item.mask = TVIF_TEXT | TVIF_SELECTEDIMAGE; tvi.item.pszText = text; HTREEITEM hLauncher = m_Tree.InsertItem(&tvi); ItemData* pItemData = new ItemData(text, 0, ItemData::Launcher, ItemData::Off); pItemData->item = hLauncher; m_LauncherList.insert(make_pair(pLauncher->nID, pItemData)); #if defined (USE_FONT_BOLD) m_Tree.SetItemState(hLauncher, TVIS_BOLD, TVIS_BOLD); #endif //#if defined (USE_FONT_BOLD) } //expand m_Tree.Expand(hRoot, TVE_EXPAND); } void CPatchDlg::RefreshView() { } void CPatchDlg::Patch(PatchTarget target) { if (IDYES != ::AfxMessageBox(L"Are you sure to patch?", MB_YESNO)) return; SetDlgItemText(IDC_STATIC_PATCH_RESULT, L""); GetDlgItem(IDOK)->EnableWindow(FALSE); char src[32]; if (target == Exe) ::sprintf_s(src, "%s", "exe"); else ::sprintf_s(src, "%s", "full"); char cmd[256]; ::sprintf_s(cmd, "patch%s", src); try { g_pServiceManager->ParseCommand(cmd); } catch (...) { ::AfxMessageBox(L"Patch failed."); OnCancel(); return; } } void CPatchDlg::ClearLauncherData() { for each (map::value_type v in m_LauncherList) { delete v.second; } m_LauncherList.clear(); } void CPatchDlg::OnBnClickedOk() { PatchTarget target = Full; int checkExe = ((CButton*)GetDlgItem(IDC_CHECK_PATCH_EXE))->GetCheck(); if (checkExe == BST_CHECKED) target = Exe; Patch(target); } void CPatchDlg::OnPatchStart() { } void CPatchDlg::OnPatchProgress(int id, const wchar_t* key, unsigned long progress, unsigned long progressMax) { map::iterator it = m_LauncherList.find(id); if (it == m_LauncherList.end()) return; const ItemData* pItemData = it->second; if( pItemData->bFail ) return; wchar_t text[512]; if (progressMax < 1024) ::wsprintf(text, L"%s [key : %s] [recv : %d / %d bytes]", pItemData->name.c_str(), key, progress, progressMax); else ::wsprintf(text, L"%s [key : %s] [recv : %d / %d Kbytes]", pItemData->name.c_str(), key, progress / 1024, progressMax / 1024); m_Tree.SetItemText(pItemData->item, text); } void CPatchDlg::OnPatchEnd(bool succeeded) { if (m_LauncherList.empty()) return; if (succeeded) { SetDlgItemText(IDC_STATIC_PATCH_RESULT, L"Patch completed."); GetDlgItem(IDCANCEL)->SetWindowText(L"Close"); } else { SetDlgItemText(IDC_STATIC_PATCH_RESULT, L"Patch failed."); GetDlgItem(IDOK)->EnableWindow(TRUE); } } void CPatchDlg::OnUnzipProgress(int id, const wchar_t* filename, unsigned long progress, unsigned long progressMax) { map::iterator it = m_LauncherList.find(id); if (it == m_LauncherList.end()) return; const ItemData* pItemData = it->second; if( pItemData->bFail ) return; wchar_t text[512]; ::wsprintf(text, L"%s [count : %d / %d] [%s] ", pItemData->name.c_str(), progress, progressMax, filename); m_Tree.SetItemText(pItemData->item, text); } void CPatchDlg::OnCancel() { // TODO: ¿©±â¿¡ Ư¼öÈ­µÈ Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº» Ŭ·¡½º¸¦ È£ÃâÇÕ´Ï´Ù. ClearLauncherData(); CDialog::OnCancel(); } void CPatchDlg::OnPatchFail(int id, const wchar_t* msg) { map::iterator it = m_LauncherList.find(id); if (it == m_LauncherList.end()) return; ItemData* pItemData = it->second; wchar_t text[512]; ::wsprintf(text, L"%s %s", pItemData->name.c_str(), msg); pItemData->bFail = true; m_Tree.SetItemColor(pItemData->item, RGB(255, 0, 0)); m_Tree.SetItemBold(pItemData->item, TRUE); m_Tree.SetItemText(pItemData->item, text); } void CPatchDlg::OnPatchCompleted(int id) { map::iterator it = m_LauncherList.find(id); if (it == m_LauncherList.end()) return; ItemData* pItemData = it->second; if( pItemData->bFail ) return; wchar_t text[512]; ::wsprintf(text, L"%s Patch Complete", pItemData->name.c_str()); m_Tree.SetItemColor(pItemData->item,RGB(0,250,154)); m_Tree.SetItemBold(pItemData->item, TRUE); m_Tree.SetItemText(pItemData->item, text); }