// PatchBuilderDlg.cpp : ±¸Çö ÆÄÀÏ // #include "stdafx.h" #include "PatchBuilder.h" #include "PatchBuilderDlg.h" #include "ExportBrowseFolder.h" #include "NewProfile.h" #include "RegProfile.h" #include "SundriesFunc.h" #include "tinyxml.h" #include "EtFileSystem.h" #include "MD5Checksum.h" #include "DnAttachFile.h" #include "DNTableFile.h" #include using namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif // CPatchBuilderDlg ´ëÈ­ »óÀÚ #define RMAKE_RESULT_NAME "rmakeresult.txt" bool IsPatchFile( const char *pFileName ) { char szCheckFile[ _MAX_PATH ]; strcpy_s( szCheckFile, _MAX_PATH, pFileName ); _strlwr_s( szCheckFile, _MAX_PATH ); if( strncmp( szCheckFile, "mapdata", strlen( "mapdata" ) ) == 0 ) { return true; } if( strncmp( szCheckFile, "\\mapdata", strlen( "\\mapdata" ) ) == 0 ) { return true; } if( strncmp( szCheckFile, "resource", strlen( "resource" ) ) == 0 ) { return true; } if( strncmp( szCheckFile, "\\resource", strlen( "\\resource" ) ) == 0 ) { return true; } return false; } CPatchBuilderDlg::CPatchBuilderDlg(CWnd* pParent /*=NULL*/) : CDialog(CPatchBuilderDlg::IDD, pParent) , m_szSVNUrl( _T("") ) , m_szSVNUrlBuildSet( _T("") ) , m_szSVNUrlServer( _T("") ) , m_szPatchFolder( _T("") ) , m_nCurrentVersion( 0 ) , m_nLastRevision( 0 ) , m_nStartRevision( 0 ) , m_nBuildSetLastRevision( 0 ) , m_nBuildSetStartRevision( 0 ) , m_szRMakeCmd( _T("") ) , m_szCountryCode( _T("") ) , m_szSVNUpdateFolder( _T("") ) , m_bMakeFullVersion( FALSE ) , m_bCopyServerData( FALSE ) , m_bRollBack( FALSE ) , m_pDnAttachFile( NULL ) , m_szManualPatchExe( _T("") ) , m_bManualPatch( FALSE ) , m_nDefaultProfile( 0 ) , m_bAutoStart( FALSE ) , m_nManualPatchTargetStartVer( 0 ) , m_nManualPatchTargetEndVer( 0 ) , m_bManualTargetVer( FALSE ) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CPatchBuilderDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_SVN_URL, m_szSVNUrl); DDX_Text(pDX, IDC_SVN_URL_BUILDSET, m_szSVNUrlBuildSet); DDX_Text(pDX, IDC_SVN_URL_SERVER, m_szSVNUrlServer); DDX_Text(pDX, IDC_PATCH_FOLDER, m_szPatchFolder); DDX_Control(pDX, IDC_SELECT_PROFILE, m_SelectProfile); DDX_Text(pDX, IDC_CURRENT_REVISION, m_nLastRevision); DDX_Text(pDX, IDC_BASE_REVISION, m_nStartRevision); DDX_Text(pDX, IDC_CURRENT_REVISION_BUILDSET, m_nBuildSetLastRevision); DDX_Text(pDX, IDC_BASE_REVISION_BUILDSET, m_nBuildSetStartRevision); DDX_Text(pDX, IDC_RMAKE_FOLDER, m_szRMakeCmd); DDX_Text(pDX, IDC_COUNTRY_CODE, m_szCountryCode); DDX_Text(pDX, IDC_SVN_UPDATE_FOLDER, m_szSVNUpdateFolder); DDX_Check(pDX, IDC_FULL_VERSION, m_bMakeFullVersion); DDX_Check(pDX, IDC_COPY_SERVER_DATA, m_bCopyServerData); DDX_Check(pDX, IDC_ROLLBACK, m_bRollBack); DDX_Text(pDX, IDC_MANUAL_FOLDER, m_szManualPatchExe); DDX_Check(pDX, IDC_MANUAL_PATCH, m_bManualPatch); DDX_Check(pDX, IDC_CHECK_MANUAL_TARGET_VER, m_bManualTargetVer); DDX_Text(pDX, IDC_EDIT_MANUALPATCH_TARGET_START_VER, m_nManualPatchTargetStartVer); DDX_Text(pDX, IDC_EDIT_MANUALPATCH_TARGET_END_VER, m_nManualPatchTargetEndVer); } BEGIN_MESSAGE_MAP(CPatchBuilderDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_DESTROY() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_PATCH_FOLDER_BROWSE, &CPatchBuilderDlg::OnBnClickedPatchFolderBrowse) ON_BN_CLICKED(ID_ADD_PROFILE, &CPatchBuilderDlg::OnBnClickedAddProfile) ON_BN_CLICKED(ID_MODIFY_PROFILE, &CPatchBuilderDlg::OnBnClickedModifyProfile) ON_BN_CLICKED(ID_DELETE_PROFILE, &CPatchBuilderDlg::OnBnClickedDeleteProfile) ON_CBN_SELCHANGE(IDC_SELECT_PROFILE, &CPatchBuilderDlg::OnCbnSelchangeSelectProfile) ON_BN_CLICKED(ID_BUILD, &CPatchBuilderDlg::OnBnClickedBuild) ON_BN_CLICKED(IDC_RMAKE_FOLDER_BROWSE, &CPatchBuilderDlg::OnBnClickedRmakeFolderBrowse) ON_BN_CLICKED(IDC_UPDATE_FOLDER_BROWSE, &CPatchBuilderDlg::OnBnClickedUpdateFolderBrowse) ON_BN_CLICKED(IDC_FULL_VERSION, &CPatchBuilderDlg::OnBnClickedFullVersion) ON_BN_CLICKED(IDC_COPY_SERVER_DATA, &CPatchBuilderDlg::OnBnClickedCopyServerData) ON_BN_CLICKED(ID_EXIT, &CPatchBuilderDlg::OnBnClickedExit) ON_BN_CLICKED(IDC_ROLLBACK, &CPatchBuilderDlg::OnBnClickedRollback) ON_BN_CLICKED(IDC_MANUAL_PATCH, &CPatchBuilderDlg::OnBnClickedManualPatch) ON_BN_CLICKED(IDC_IDC_MANUAL_FOLDER_BROWSE2, &CPatchBuilderDlg::OnBnClickedIdcManualFolderBrowse2) ON_BN_CLICKED(IDC_CHECK_MANUAL_TARGET_VER, &CPatchBuilderDlg::OnBnClickedCheckManualTargetVer) END_MESSAGE_MAP() // CPatchBuilderDlg ¸Þ½ÃÁö 󸮱â BOOL CPatchBuilderDlg::OnInitDialog() { CDialog::OnInitDialog(); // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. GetModuleRoot(); SetCurrentDirectoryA(m_szModuleRoot); DeleteFile(".\\rmakeresult.txt"); RefreshProfileList(); //·¹Áö½ºÆ®¸®¿¡¼­ ÀúÀåµÈ ÇÁ·ÎÇÊ Á¤º¸¸¦ Àоî¿Å SetCurProfile( m_nDefaultProfile ); //ºÒ·¯¿Â ÇØ´ç °ªÀ¸·Î ¼ÂÆÃ if( m_bAutoStart ) { PostMessage( WM_COMMAND, MAKEWPARAM( ID_BUILD, 1 ) ); } return TRUE; // Æ÷Ä¿½º¸¦ ÄÁÆ®·Ñ¿¡ ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } void CPatchBuilderDlg::OnDestroy() { LogWnd::TraceLog( "CPatchBuilderDlg::OnDestroy" ); m_vecModifyFile.clear(); m_vecDeleteFile.clear(); m_vecRollDeleteFile.clear(); m_vecRestoreFile.clear(); m_mapIgnoreFileList.clear(); m_vecIncludeMapList.clear(); CDialog::OnDestroy(); } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CPatchBuilderDlg::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 CPatchBuilderDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CPatchBuilderDlg::OnBnClickedUpdateFolderBrowse() { CFolderDialog Dlg; if( Dlg.DoModal() == IDOK ) { m_szSVNUpdateFolder = Dlg.GetFolderPath(); UpdateData( FALSE ); } } void CPatchBuilderDlg::OnBnClickedPatchFolderBrowse() { CFolderDialog Dlg; if( Dlg.DoModal() == IDOK ) { m_szPatchFolder = Dlg.GetFolderPath(); UpdateData( FALSE ); } } void CPatchBuilderDlg::OnBnClickedRmakeFolderBrowse() { CFileDialog FileDlg( TRUE, "*.exe", "RMakeCmd.exe" ); if( FileDlg.DoModal() == IDOK ) { m_szRMakeCmd = FileDlg.m_ofn.lpstrFile; UpdateData( FALSE ); } } void CPatchBuilderDlg::OnBnClickedFullVersion() { UpdateData( TRUE ); SetRegistryNumber( HKEY_CURRENT_USER, REG_SUBKEY, "MakeFullVersion", m_bMakeFullVersion ); } void CPatchBuilderDlg::OnBnClickedCopyServerData() { UpdateData( TRUE ); SetRegistryNumber( HKEY_CURRENT_USER, REG_SUBKEY, "MakeServerData", m_bCopyServerData ); } void CPatchBuilderDlg::OnBnClickedRollback() { UpdateData( TRUE ); SetRegistryNumber( HKEY_CURRENT_USER, REG_SUBKEY, "RollBack", m_bRollBack ); } void CPatchBuilderDlg::OnBnClickedManualPatch() { // TODO: Add your control notification handler code here UpdateData( TRUE ); SetRegistryNumber( HKEY_CURRENT_USER, REG_SUBKEY, "ManualPatch", m_bManualPatch ); if( m_bManualPatch ) GetDlgItem( IDC_CHECK_MANUAL_TARGET_VER )->EnableWindow( true ); else GetDlgItem( IDC_CHECK_MANUAL_TARGET_VER )->EnableWindow( false ); } void CPatchBuilderDlg::OnBnClickedCheckManualTargetVer() { UpdateData( TRUE ); if( !m_bManualPatch ) return; if( m_bManualTargetVer ) { GetDlgItem( IDC_EDIT_MANUALPATCH_TARGET_START_VER )->EnableWindow( true ); GetDlgItem( IDC_EDIT_MANUALPATCH_TARGET_END_VER )->EnableWindow( true ); } else { GetDlgItem( IDC_EDIT_MANUALPATCH_TARGET_START_VER )->EnableWindow( false ); GetDlgItem( IDC_EDIT_MANUALPATCH_TARGET_END_VER )->EnableWindow( false ); } } void CPatchBuilderDlg::RefreshProfileList() { m_SelectProfile.ResetContent(); for( int i=0; iszProfileName.c_str() ); } } //·¹Áö¿¡¼­ Á¤º¸¸¦ ¾ò¾î¿Â´Ù void CPatchBuilderDlg::SetCurProfile( int nIndex ) { m_SelectProfile.SetCurSel( nIndex ); SProfile *pProfile = CRegProfile::GetInstance().GetProfile( nIndex ); if( !pProfile ) { return; } m_szSVNUrl = pProfile->szSVNUrl.c_str(); m_szSVNUrlBuildSet = pProfile->szSVNUrlBuildSet.c_str(); m_szSVNUrlServer = pProfile->szSVNUrlServer.c_str(); m_szSVNUpdateFolder = pProfile->szSVNUpdateFolder.c_str(); m_szPatchFolder = pProfile->szPatchFolder.c_str(); m_szRMakeCmd = pProfile->szRMakeCmd.c_str(); m_szCountryCode = pProfile->szCountryCode.c_str(); m_szManualPatchExe = pProfile->szManualPatchExe.c_str(); CheckSVNInfo( nIndex ); CheckPatchFolder(); #ifdef _ROLLBACK_PATCH LoadPatchInfo(); #endif UpdateData( FALSE ); } //ÇÁ·ÎÇÊÁß¿¡ ¾Æ¹«°Å³ª ¼±ÅÃÇϸé ÇØ´ç ÀúÀåµÈ Á¤º¸¿¡¼­ ·Îµå ÇÑ´Ù. void CPatchBuilderDlg::OnBnClickedAddProfile() { CNewProfile Dlg; if( Dlg.DoModal() == IDOK ) { UpdateData( TRUE ); SProfile TempProfile; TempProfile.szProfileName = Dlg.m_szProfileName.GetBuffer(); TempProfile.szSVNUrl = m_szSVNUrl.GetBuffer(); TempProfile.szSVNUrlBuildSet = m_szSVNUrlBuildSet.GetBuffer(); TempProfile.szSVNUrlServer = m_szSVNUrlServer.GetBuffer(); TempProfile.szSVNUpdateFolder = m_szSVNUpdateFolder.GetBuffer(); TempProfile.szPatchFolder = m_szPatchFolder.GetBuffer(); TempProfile.szRMakeCmd = m_szRMakeCmd.GetBuffer(); TempProfile.szCountryCode = m_szCountryCode.GetBuffer(); TempProfile.szManualPatchExe = m_szManualPatchExe.GetBuffer(); CRegProfile::GetInstance().AddProfile( TempProfile ); RefreshProfileList(); SetCurProfile( CRegProfile::GetInstance().GetProfileCount() - 1 ); char szString[ 1024 ]; sprintf_s( szString, 1024, "Profile %s Ãß°¡ µÇ¾ú½À´Ï´Ù", Dlg.m_szProfileName.GetBuffer() ); MessageBox( szString ); } } //¼öÁ¤ ÇÑ´Ù ¤»¤» void CPatchBuilderDlg::OnBnClickedModifyProfile() { int nCurSel = m_SelectProfile.GetCurSel(); if( nCurSel == CB_ERR ) { MessageBox( "¼±ÅÃµÈ ProfileÀÌ ¾ø½À´Ï´Ù." ); return; } UpdateData( TRUE ); SProfile *pProfile = CRegProfile::GetInstance().GetProfile( nCurSel ); pProfile->szSVNUrl = m_szSVNUrl.GetBuffer(); pProfile->szSVNUrlBuildSet = m_szSVNUrlBuildSet.GetBuffer(); pProfile->szSVNUrlServer = m_szSVNUrlServer.GetBuffer(); pProfile->szSVNUpdateFolder = m_szSVNUpdateFolder.GetBuffer(); pProfile->szPatchFolder = m_szPatchFolder.GetBuffer(); pProfile->szRMakeCmd = m_szRMakeCmd.GetBuffer(); pProfile->szCountryCode = m_szCountryCode.GetBuffer(); pProfile->szManualPatchExe = m_szManualPatchExe.GetBuffer(); CRegProfile::GetInstance().SaveProfile(); char szString[ 1024 ]; sprintf_s( szString, 1024, "Profile %s º¯°æ µÇ¾ú½À´Ï´Ù", pProfile->szProfileName.c_str() ); MessageBox( szString ); } //ÇÁ·ÎÇÊ »èÁ¦ void CPatchBuilderDlg::OnBnClickedDeleteProfile() { int nCurSel = m_SelectProfile.GetCurSel(); if( nCurSel == CB_ERR ) { MessageBox( "¼±ÅÃµÈ ProfileÀÌ ¾ø½À´Ï´Ù." ); return; } SProfile *pProfile = CRegProfile::GetInstance().GetProfile( nCurSel ); std::string szDelName = pProfile->szProfileName; CRegProfile::GetInstance().DeleteProfile( nCurSel ); RefreshProfileList(); if( CRegProfile::GetInstance().GetProfileCount() > 0 ) { SetCurProfile( 0 ); } char szString[ 1024 ]; sprintf_s( szString, 1024, "Profile %s »èÁ¦ µÇ¾ú½À´Ï´Ù", szDelName.c_str() ); MessageBox( szString ); } void CPatchBuilderDlg::OnCbnSelchangeSelectProfile() { int nCurSel = m_SelectProfile.GetCurSel(); if( nCurSel == CB_ERR ) { return; } SetCurProfile( nCurSel ); } void CPatchBuilderDlg::GetModifyList() { SetWorkStatus( "Log ºÐ¼®ÁßÀÔ´Ï´Ù" ); m_vecModifyFile.clear(); m_vecDeleteFile.clear(); #ifdef _ROLLBACK_PATCH m_vecRollDeleteFile.clear(); m_vecRestoreFile.clear(); #endif char szString[ 1024 ]; std::string szOutput; int nStartRevision, nEndRevision; // Get Resource Modify List nStartRevision = m_nStartRevision + 1; nEndRevision = m_nLastRevision; if( nStartRevision > nEndRevision ) { nStartRevision = nEndRevision; } #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "svn log %s -r %d:%d -v --xml --username hicom15 --password 6326", m_szSVNUrl.GetBuffer(), nStartRevision, nEndRevision ); #else sprintf_s( szString, 1024, "svn log %s -r %d:%d -v --xml --username build --password b@0625", m_szSVNUrl.GetBuffer(), nStartRevision, nEndRevision ); #endif ExecCommand( szString, &szOutput ); ClassifyModifyList( szOutput, m_szMainResourceFolder ); int nModifyListCount = (int)m_vecModifyFile.size(); int nRestoreListCount = (int)m_vecRestoreFile.size(); // Get BuildSet Modify List if( m_nBuildSetStartRevision < m_nBuildSetLastRevision ) { nStartRevision = m_nBuildSetStartRevision + 1; nEndRevision = m_nBuildSetLastRevision; #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "svn log %s -r %d:%d -v --xml --username hicom15 --password 6326", m_szSVNUrlBuildSet.GetBuffer(), nStartRevision, nEndRevision ); #else sprintf_s( szString, 1024, "svn log %s -r %d:%d -v --xml --username build --password b@0625", m_szSVNUrlBuildSet.GetBuffer(), nStartRevision, nEndRevision ); #endif ExecCommand( szString, &szOutput ); ClassifyModifyList( szOutput, m_szMainBuildSetFolder ); } // BuildSet º¯°æ ¸®½ºÆ®¿¡ ´ëÇØ¼­´Â ¾Õ¿¡ BuildSet°æ·Î¸¦ Ãß°¡ std::vector::iterator iter; for( int i=nModifyListCount; i<(int)m_vecModifyFile.size(); i++ ) { iter = m_vecModifyFile.begin(); iter += i; CString strFileName; strFileName.Format( "BuildSet\\%s", (*iter).c_str() ); (*iter) = strFileName.GetBuffer( 0 ); } for( int i=nRestoreListCount; i<(int)m_vecRestoreFile.size(); i++ ) { iter = m_vecRestoreFile.begin(); iter += i; CString strFileName; strFileName.Format( "BuildSet\\%s", (*iter).c_str() ); (*iter) = strFileName.GetBuffer( 0 ); } // Sort std::sort( m_vecDeleteFile.begin(), m_vecDeleteFile.end() ); std::sort( m_vecModifyFile.begin(), m_vecModifyFile.end() ); #ifdef _ROLLBACK_PATCH std::sort( m_vecRollDeleteFile.begin(), m_vecRollDeleteFile.end() ); std::sort( m_vecRestoreFile.begin(), m_vecRestoreFile.end() ); #endif for( int i=0; i<( int )m_vecDeleteFile.size(); i++ ) std::replace( m_vecDeleteFile[ i ].begin(), m_vecDeleteFile[ i ].end(), '/', '\\' ); for( int i=0; i<( int )m_vecModifyFile.size(); i++ ) std::replace( m_vecModifyFile[ i ].begin(), m_vecModifyFile[ i ].end(), '/', '\\' ); #ifdef _ROLLBACK_PATCH for( int i=0; i<( int )m_vecRollDeleteFile.size(); i++ ) std::replace( m_vecRollDeleteFile[ i ].begin(), m_vecRollDeleteFile[ i ].end(), '/', '\\' ); for( int i=0; i<( int )m_vecRestoreFile.size(); i++ ) std::replace( m_vecRestoreFile[ i ].begin(), m_vecRestoreFile[ i ].end(), '/', '\\' ); #endif } void CPatchBuilderDlg::ClassifyModifyList( std::string& szOutput, CString& szMainFolder ) { int nMainFolderLength = szMainFolder.GetLength(); TiXmlDocument Document; Document.Parse( szOutput.c_str(), 0, TIXML_ENCODING_UTF8 ); if ( !Document.Error() ) { TiXmlElement* pRoot = Document.FirstChildElement( "log" ); if( pRoot ) { TiXmlElement* pLogEntryElement = pRoot->FirstChildElement( "logentry" ); while( pLogEntryElement ) { TiXmlElement *pMsg = pLogEntryElement->FirstChildElement( "msg" ); if( !strstr( pMsg->GetText(), "###") ) { TiXmlElement *pPathsElement = pLogEntryElement->FirstChildElement( "paths" ); if( pPathsElement ) { TiXmlElement *pPath = pPathsElement->FirstChildElement( "path" ); while( pPath ) { const char *pAction = pPath->Attribute( "action" ); if( pAction ) { const char *pFileName = pPath->GetText() + nMainFolderLength; if( ( pFileName[ 0 ] ) && ( strstr( pPath->GetText(), szMainFolder.GetBuffer() ) ) ) { //¼øÂ÷ÀûÀ¸·Î µ·´Ù pFileName++; std::vector< std::string >::iterator idModi = std::find( m_vecModifyFile.begin(), m_vecModifyFile.end(), pFileName ); std::vector< std::string >::iterator itDelete = std::find( m_vecDeleteFile.begin(), m_vecDeleteFile.end(), pFileName ); #ifdef _ROLLBACK_PATCH std::vector< std::string >::iterator itRollDelete = std::find( m_vecRollDeleteFile.begin() ,m_vecRollDeleteFile.end() , pFileName ) ; std::vector< std::string >::iterator itRestore = std::find( m_vecRestoreFile.begin() , m_vecRestoreFile.end() , pFileName ); // 'A' Ãß°¡°¡µÈ°ÍÀº »èÁ¦¸¦ ÇØ¾ßµÇ°í M , D ¼öÁ¤À̳ª »èÁ¦°¡ µÈ°ÍÀº ¼öÁ¤À» Ç߱⿡ º¹±¸¿¡ ³Ö´Â´Ù. switch(pAction[0]) { case 'A': if ( itRollDelete == m_vecRollDeleteFile.end() ) { m_vecRollDeleteFile.push_back(pFileName); } break; case 'M': case 'R': case 'D': //Ãß°¡°¡µÈ ÆÄÀÏÀº ¹«Á¶°Ç »èÁ¦µÇ¾ß Çϱ⶧¹®¿¡ º¹±¸ÆÄÀÏ¿¡ µé¾î°¡Áö ¾Ê´Â´Ù. if( itRollDelete != m_vecRollDeleteFile.end() ) { break; } if( itRestore == m_vecRestoreFile.end()) { m_vecRestoreFile.push_back(pFileName); } break; default: ASSERT( 0 && "À߸øµÈ ¾×¼ÇÄÚµå" ); break; } #endif switch( pAction[ 0 ] ) { case 'A': case 'M': case 'R': if( idModi == m_vecModifyFile.end() ) { m_vecModifyFile.push_back( pFileName ); } //»èÁ¦ ¸®½ºÆ® ¿¡¼­ ´Ù½Ã ¼öÁ¤À̳ª Ãß°¡ÇѰÍÀº ¸®½ºÆ®¿¡¼­ »©¹ö¸°´Ù. if( itDelete != m_vecDeleteFile.end() ) { m_vecDeleteFile.erase( itDelete ); } break; case 'D': //ÀúÀåµÈ ¸ðµð ¸®½ºÆ® »èÁ¦ ¾×¼ÇÀÌ ³ª¿À¸é if( idModi != m_vecModifyFile.end() ) { m_vecModifyFile.erase( idModi ); } if( itDelete == m_vecDeleteFile.end() ) { m_vecDeleteFile.push_back( pFileName ); } break; default: ASSERT( 0 && "À߸øµÈ ¾×¼ÇÄÚµå" ); break; } } } TiXmlNode *pPathNode =pPathsElement->IterateChildren( pPath ); if( pPathNode ) { pPath = pPathNode->ToElement(); } else { break; } } } } TiXmlNode *pLogEntryNode = pRoot->IterateChildren( pLogEntryElement ); if( pLogEntryNode ) pLogEntryElement = pLogEntryNode->ToElement(); else break; } } } else { MessageBox( "Log ¸¦ °¡Á®¿Ã ¼ö ¾ø½À´Ï´Ù" ); } } void CPatchBuilderDlg::UpdateLastRevision() { LogWnd::TraceLog( "UpdateLastRevision" ); SetWorkStatus( "Update ½ÇÇàÁßÀÔ´Ï´Ù" ); char szString[ 1024 ]; SHELLEXECUTEINFO ShellExecInfo; memset( &ShellExecInfo, 0, sizeof( SHELLEXECUTEINFO ) ); ShellExecInfo.cbSize = sizeof( SHELLEXECUTEINFO ); ShellExecInfo.hwnd = GetSafeHwnd(); ShellExecInfo.lpFile = "svn"; ShellExecInfo.nShow = SW_SHOW; ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; ShellExecInfo.lpVerb = __TEXT( "open" ); ShellExecInfo.lpParameters = szString; // Update Resource #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "update %s//Resource -r %d --username hicom15 --password 6326", m_szSVNUpdateFolder.GetBuffer(), m_nLastRevision ); #else sprintf_s( szString, 1024, "update %s//Resource -r %d --username build --password b@0625", m_szSVNUpdateFolder.GetBuffer(), m_nLastRevision ); #endif if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } // Update Build Set #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "update %s//BuildSet -r %d --username hicom15 --password 6326", m_szSVNUpdateFolder.GetBuffer(), m_nBuildSetLastRevision ); #else sprintf_s( szString, 1024, "update %s//BuildSet -r %d --username build --password b@0625", m_szSVNUpdateFolder.GetBuffer(), m_nBuildSetLastRevision ); #endif if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } } BOOL CPatchBuilderDlg::CopyBuild( bool bDirectCopy ) { LogWnd::TraceLog( "CopyBuild" ); SetWorkStatus( "¼­¹ö µ¥ÀÌŸ ºÐ·ùÁßÀÔ´Ï´Ù" ); char szString[ 1024 ], szCopyFolder[ _MAX_PATH ]; SHELLEXECUTEINFO ShellExecInfo; memset( &ShellExecInfo, 0, sizeof( SHELLEXECUTEINFO ) ); ShellExecInfo.cbSize = sizeof( SHELLEXECUTEINFO ); ShellExecInfo.hwnd = GetSafeHwnd(); ShellExecInfo.lpFile = "cmd.exe"; ShellExecInfo.nShow = SW_SHOW; ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; ShellExecInfo.lpVerb = __TEXT( "open" ); ShellExecInfo.lpParameters = szString; if( bDirectCopy ) { sprintf_s( szCopyFolder, _MAX_PATH, "%s\\%08d\\Server", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); } else { GetCurrentDirectory( _MAX_PATH, szCopyFolder ); } sprintf_s( szString, 1024, "/c %s %s\\Client %s\\LoginServer /SL %s", m_szRMakeCmd.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), szCopyFolder, m_szCountryCode.GetBuffer() ); if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } sprintf_s( szString, 1024, "%s\\LoginServer\\%s",szCopyFolder , RMAKE_RESULT_NAME ); if( !FileExistName(szString)) { goto ErrorMsg; } // sprintf_s( szString, 1024, "/c %s %s\\Client %s\\MasterServer /SM %s", m_szRMakeCmd.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), szCopyFolder, m_szCountryCode.GetBuffer() ); if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } sprintf_s( szString, 1024, "%s\\MasterServer\\rmakeresult.txt",szCopyFolder ); if( !FileExistName(szString)) { goto ErrorMsg; } char szSourceFile[ _MAX_PATH ], szDestFile[ _MAX_PATH ]; sprintf_s( szSourceFile, _MAX_PATH, "%s\\ResourceRevision.txt", szCopyFolder ); sprintf_s( szDestFile, _MAX_PATH, "%s\\VillageServer\\ResourceRevision.txt", szCopyFolder ); if( CopyFile( szSourceFile, szDestFile, FALSE ) == 0 ) { char szPath[ _MAX_PATH ]; _GetPath( szPath, szDestFile ); CreateFolder( szPath ); CopyFile( szSourceFile, szDestFile, FALSE ); } sprintf_s( szString, 1024, "/c %s %s\\Client %s\\VillageServer /SV %s /zip", m_szRMakeCmd.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), szCopyFolder, m_szCountryCode.GetBuffer() ); if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } sprintf_s( szString, 1024, "%s\\VillageServer\\%s",szCopyFolder , RMAKE_RESULT_NAME ); if( !FileExistName(szString)) { goto ErrorMsg; } sprintf_s( szSourceFile, _MAX_PATH, "%s\\ResourceRevision.txt", szCopyFolder ); sprintf_s( szDestFile, _MAX_PATH, "%s\\GameServer\\ResourceRevision.txt", szCopyFolder ); if( CopyFile( szSourceFile, szDestFile, FALSE ) == 0 ) { char szPath[ _MAX_PATH ]; _GetPath( szPath, szDestFile ); CreateFolder( szPath ); CopyFile( szSourceFile, szDestFile, FALSE ); } sprintf_s( szString, 1024, "/c %s %s\\Client %s\\GameServer /SG %s /zip", m_szRMakeCmd.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), szCopyFolder, m_szCountryCode.GetBuffer() ); if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } sprintf_s( szString, 1024, "%s\\GameServer\\%s",szCopyFolder , RMAKE_RESULT_NAME); if( !FileExistName(szString)) { goto ErrorMsg; } return TRUE; ErrorMsg: sprintf_s( szString , 1024 , "%s\\%s", m_szModuleRoot , RMAKE_RESULT_NAME ); FILE *fp; fopen_s( &fp, szString , "w" ); fprintf(fp , " "); fclose(fp); return FALSE; } void CPatchBuilderDlg::CreateDeleteList() { LogWnd::TraceLog( "CreateDeleteList" ); char szString[ 1024 ]; FILE *fp; sprintf_s( szString, _MAX_PATH, "%s\\%08d\\Patch%08d.txt", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, m_nCurrentVersion ); fopen_s( &fp, szString, "wt" ); for( int i=0; i<( int )m_vecDeleteFile.size(); i++ ) { WCHAR wszBuffer[ _MAX_PATH ]; char szTemp[ _MAX_PATH ]; MultiByteToWideChar( CP_UTF8, 0, m_vecDeleteFile[ i ].c_str(), -1, wszBuffer, _MAX_PATH ); WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, szTemp, _MAX_PATH, NULL, NULL ); sprintf_s( szString, 1024, "D %s\n", RemoveCountryPath( szTemp ).GetBuffer( 0 ) ); fputs( szString, fp ); } int bFindLauncher = false; for( int i=0; i<( int )m_vecModifyFile.size(); i++ ) { if( _stricmp( m_vecModifyFile[ i ].c_str(), "DNLauncher.exe" ) == 0 ) { m_vecModifyFile.erase( m_vecModifyFile.begin() + i ); bFindLauncher = true; break; } } if( bFindLauncher ) { m_vecModifyFile.push_back( "DNLauncher.exe" ); } for( int i=0; i<( int )m_vecModifyFile.size(); i++ ) { if( IsPatchFile( m_vecModifyFile[ i ].c_str() ) ) { sprintf_s( szString, 1024, "P %s\n", RemoveCountryPath( m_vecModifyFile[ i ].c_str() ).GetBuffer( 0 ) ); } else { sprintf_s( szString, 1024, "C %s\n", RemoveCountryPath( m_vecModifyFile[ i ].c_str() ).GetBuffer( 0 ) ); fputs( szString, fp ); } } // ¾Æ¹«°Íµµ ¾øÀ¸¸é 0¹ÙÀÌÆ®Â¥¸® ÆÄÀÏÀÌ »ý¼ºµÇ¼­.. ´Ù¿î·Îµå ¾ÈµÉ¼öµµ À־. ´õ¹Ì Çϳª ³Ö¾îÁØ´Ù. fputs( " ", fp ); fclose( fp ); } void CPatchBuilderDlg::CreatePatch() { LogWnd::TraceLog( "CreatePatch" ); CEtPackingFile FileSystem; char szString[ 1024 ]; char szPath[ _MAX_PATH ], szFileName[ _MAX_PATH ]; sprintf_s( szString, _MAX_PATH, "%s\\%08d\\Patch%08d.pak", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, m_nCurrentVersion ); FileSystem.NewFileSystem( szString ); std::sort( m_vecModifyFile.begin(), m_vecModifyFile.end() ); for( int i=0; i<( int )m_vecModifyFile.size(); i++ ) { if( strstr( m_vecModifyFile[ i ].c_str(), "BuildSet" ) ) { sprintf_s( szFileName, _MAX_PATH, "%s\\%s", m_szSVNUpdateFolder.GetBuffer(), m_vecModifyFile[ i ].c_str() ); CString strFileName( m_vecModifyFile[ i ].c_str() ); strFileName.Delete( 0, 9 ); m_vecModifyFile[ i ] = strFileName.GetBuffer( 0 ); } else sprintf_s( szFileName, _MAX_PATH, "%s\\Resource\\%s", m_szSVNUpdateFolder.GetBuffer(), m_vecModifyFile[ i ].c_str() ); _GetPath( szPath, m_vecModifyFile[ i ].c_str() ); FileSystem.ChangeDir( "\\" ); if( szPath[ 0 ] ) { FileSystem.ChangeDir( RemoveCountryPath( szPath ).GetBuffer( 0 ) ); } FileSystem.AddFile( szFileName ); char szMessage[ 1024 ]; sprintf_s( szMessage, 1024, "ÆÐÄ¡ÆÄÀÏ »ý¼ºÁßÀÔ´Ï´Ù %d%%", ( int )( i * 100 / m_vecModifyFile.size() ) ); SetWorkStatus( szMessage ); } // DiffFiles Æú´õ¿¡ ÆÄÀÏÀÌ ÀÖ´Ù¸é ÆÐÄ¡¿¡ Æ÷ÇÔ ½ÃŲ´Ù. char szDiffFilesPath[ _MAX_PATH ]; sprintf_s( szDiffFilesPath, _MAX_PATH, "%s\\DiffFiles", m_szSVNUpdateFolder.GetBuffer() ); if( PathIsDirectory( szDiffFilesPath ) ) { std::vector< std::string > vecResult; FindFileListInDirectory( szDiffFilesPath, "*.*", vecResult, false, true, true ); for( int i=0; i<( int )vecResult.size(); i++ ) { CString strFileName( vecResult[ i ].c_str() ); strFileName.Delete( 0, m_szSVNUpdateFolder.GetLength() + 11 ); _GetPath( szPath, strFileName.GetBuffer( 0 ) ); FileSystem.ChangeDir( "\\" ); if( szPath[ 0 ] ) { FileSystem.ChangeDir( RemoveCountryPath( szPath ).GetBuffer( 0 ) ); } FileSystem.AddFile( vecResult[ i ].c_str() ); } DeleteFolder( szDiffFilesPath ); } FileSystem.CloseFileSystem(); } void CPatchBuilderDlg::CopyServerPatch( bool bDirectCopy ) { LogWnd::TraceLog( "CopyServerPatch" ); SetWorkStatus( "¼­¹ö µ¥ÀÌŸ º¹»çÁßÀÔ´Ï´Ù" ); char szString[ 1024 ]; sprintf_s( szString, _MAX_PATH, "%s\\%08d\\Server", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CreateDirectory( szString, NULL ); if( m_szSVNUrlServer.GetLength() ) { SHELLEXECUTEINFO ShellExecInfo; memset( &ShellExecInfo, 0, sizeof( SHELLEXECUTEINFO ) ); ShellExecInfo.cbSize = sizeof( SHELLEXECUTEINFO ); ShellExecInfo.hwnd = GetSafeHwnd(); ShellExecInfo.lpFile = "svn"; ShellExecInfo.nShow = SW_SHOW; ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; ShellExecInfo.lpVerb = __TEXT( "open" ); ShellExecInfo.lpParameters = szString; #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "export -r %d %s %s\\%08d\\Server --force --username hicom15 --password 6326", m_nBuildSetLastRevision, m_szSVNUrlBuildSet.GetBuffer(), m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); #else sprintf_s( szString, 1024, "export -r %d %s %s\\%08d\\Server --force --username build --password b@0625", m_nBuildSetLastRevision, m_szSVNUrlServer.GetBuffer(), m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); #endif if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } } } void CPatchBuilderDlg::LoadPatchInfo() { FILE *fp; char szString[ 1024 ] = {0,}; DWORD dwsize = 0; char arg1[1024]={0,} , arg2[1024]={0,}; m_SkipNumber.clear(); sprintf_s( szString, _MAX_PATH, "%s\\PatchInfoServer.cfg", m_szPatchFolder.GetBuffer() ); if( !fopen_s( &fp, szString, "rt" ) ) { fseek(fp , 0 , SEEK_END ); dwsize = ftell(fp); fseek(fp , 0 , SEEK_SET); char *buffer = new char[dwsize+ 3 ]; ZeroMemory(buffer , dwsize+3); fread(buffer, sizeof(char) , dwsize , fp ); char *szToken , *nextToken ,delimiters[] = "\r\n"; szToken = strtok_s(buffer , delimiters , &nextToken ); while( szToken != NULL ) { if(sscanf_s(szToken , "%s %s" ,&arg1 , sizeof(arg1) ,&arg2 , sizeof(arg2))) { _strlwr_s( arg1 ); //¼­¹ö¹öÀüÀº ÀÐÁö ¾ÊÀ½ if( strcmp(arg1 , "version") == 0 ) { int a = 0 ; } //skipnum ¸¸ Àоî¿Â´Ù. else if( strcmp(arg1 , "skipnum") == 0 ) { int version = atol(arg2); m_SkipNumber.push_back(version); } } szToken = strtok_s( NULL, delimiters ,&nextToken ); } delete [] buffer; fclose(fp); } } void CPatchBuilderDlg::UpdatePatchInfo() { LogWnd::TraceLog( "UpdatePatchInfo" ); #ifdef _ROLLBACK_PATCH //½ºÅµÀÇ ¹øÈ£´Â ÆÐÄ¡ÈÄ ÀÌ»óÀÌ »ý±ä ÆÐÄ¡¹öÁ¯À» ÀúÀåÇÑ´Ù. std::vector m_PatchInfoData; FILE *fp; char szString[ 1024 ] = {0,}; sprintf_s( szString, _MAX_PATH, "%s\\PatchInfoServer.cfg", m_szPatchFolder.GetBuffer() ); std::sort(m_SkipNumber.begin() , m_SkipNumber.end() ); if( !fopen_s( &fp, szString, "wt" ) ) { //¼­¹ö ¹öÀü ù¶óÀο¡ ³Ö°í sprintf_s( szString, _MAX_PATH, "version %d\n", m_nCurrentVersion ); fputs( szString, fp ); for( int i=0; i<( int )m_SkipNumber.size(); i++ ) { sprintf_s( szString, 1024, "SkipNum %d\n", m_SkipNumber[i] ); fputs( szString, fp ); } fclose( fp ); } else { if( !m_bAutoStart ) { AfxMessageBox(_T("PatchInfoServer.cfg ¹öÀü ÀúÀå ½ÇÆÐ!!")); } } #else FILE *fp; char szString[ 1024 ] = {0 ,}; sprintf_s( szString, _MAX_PATH, "%s\\PatchInfoServer.cfg", m_szPatchFolder.GetBuffer() ); fopen_s( &fp, szString, "wt" ); sprintf_s( szString, _MAX_PATH, "%d", m_nCurrentVersion ); fwrite(szString , strlen(szString)+1 , 1 , fp ); // fputs( szString, fp ); fclose( fp ); #endif } void CPatchBuilderDlg::CleanupDir() { LogWnd::TraceLog( "CleanupDir" ); char szString[ _MAX_PATH ], szCurDirectory[ _MAX_PATH ]; GetCurrentDirectory( _MAX_PATH, szCurDirectory ); // sprintf_s( szString, _MAX_PATH, "%s\\Client", szCurDirectory ); // DeleteFolder( szString ); sprintf_s( szString, _MAX_PATH, "%s\\LoginServer", szCurDirectory ); DeleteFolder( szString ); sprintf_s( szString, _MAX_PATH, "%s\\MasterServer", szCurDirectory ); DeleteFolder( szString ); sprintf_s( szString, _MAX_PATH, "%s\\VillageServer", szCurDirectory ); DeleteFolder( szString ); sprintf_s( szString, _MAX_PATH, "%s\\GameServer", szCurDirectory ); DeleteFolder( szString ); } //Ç®¹öÁ¯À» ¸¸µé¶§ »ç¿ëÇÑ´Ù .. //ÇØ´ç UpdateFolder ¿¡ ÀÖ´Â Á¤º¸¸¦ °¡Áö°í mapdata , resource , etc ÆÄÀÏÀ» Ç®ÆÑ ÇÑ´Ù. void CPatchBuilderDlg::BuildFullVersion() { LogWnd::TraceLog( "BuildFullVersion" ); char szClientPath[ _MAX_PATH ]; sprintf_s( szClientPath, _MAX_PATH, "%s\\Client", m_szSVNUpdateFolder.GetBuffer() ); std::vector< std::string > vecResult; FindFileListInDirectory( szClientPath, "*.*", vecResult, false, true, true ); int nMainFolderLength, nCurrentFileSystem = 0; CEtPackingFile *pFileSystem = NULL; char szString[ _MAX_PATH ]; sprintf_s( szString, _MAX_PATH, "%s\\%08d\\ClientFull", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CreateFolder( szString ); sprintf_s( szString, _MAX_PATH, "%s\\%08d\\ClientFull\\Resource%02d.pak", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, nCurrentFileSystem ); pFileSystem = new CEtPackingFile(); pFileSystem->NewFileSystem( szString ); sprintf_s( szString, _MAX_PATH, "%s\\%08d\\ClientFull", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); nMainFolderLength = m_szSVNUpdateFolder.GetLength() + 7; // client°æ·Î Ãß°¡‰çÀ¸¹Ç·Î ´ÃÀÓ for( int i=0; i<( int )vecResult.size(); i++ ) { char szPath[ _MAX_PATH ]; _GetPath( szPath, vecResult[ i ].c_str() + nMainFolderLength + 1 ); pFileSystem->ChangeDir( "\\" ); if( IsPatchFile( szPath ) ) { pFileSystem->ChangeDir( szPath ); pFileSystem->AddFile( vecResult[ i ].c_str() ); // ÆÄÀÏ Çϳª°¡ 512¸Þ°¡ ÀÌ»ó µÇ¸é ´ÙÀ½ ÆÄÀÏ·Î ¾ÐÃàÇÑ´Ù. if( pFileSystem->GetFileSystemSize() > ( DWORD )DEFAULT_PACKING_FILE_SIZE ) { char szNewFileSystem[ _MAX_PATH ]; pFileSystem->CloseFileSystem(); SAFE_DELETE( pFileSystem ); pFileSystem = new CEtPackingFile(); nCurrentFileSystem++; sprintf_s( szNewFileSystem, _MAX_PATH, "%s\\%08d\\ClientFull\\Resource%02d.pak", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, nCurrentFileSystem ); pFileSystem->NewFileSystem( szNewFileSystem ); } } else { char szFileName[ _MAX_PATH ], szFullName[ _MAX_PATH ]; if( strlen( szPath ) <= 1 ) { _GetFullFileName( szFileName, vecResult[ i ].c_str() ); sprintf_s( szFullName, _MAX_PATH, "%s\\%s", szString, szFileName ); } else { sprintf_s( szFullName, _MAX_PATH, "%s\\%s", szString, szPath ); CreateFolder( szFullName ); sprintf_s( szFullName, _MAX_PATH, "%s\\%s", szString, vecResult[ i ].c_str() + nMainFolderLength + 1 ); } CopyFile( vecResult[ i ].c_str(), szFullName, FALSE ); } char szMessage[ 1024 ]; sprintf_s( szMessage, 1024, "Full Version »ý¼ºÁßÀÔ´Ï´Ù %d%%", ( int )( i * 100 / vecResult.size() ) ); SetWorkStatus( szMessage ); } vecResult.clear(); pFileSystem->CloseFileSystem(); SAFE_DELETE( pFileSystem ); sprintf_s( szString, _MAX_PATH, "%s\\%08d\\ClientFull\\Version.cfg", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); FILE *fp; fopen_s( &fp, szString, "wt" ); sprintf_s( szString, _MAX_PATH, "version %d\n", m_nCurrentVersion ); fputs( szString, fp ); fclose( fp ); } void CPatchBuilderDlg::BuildVersion1() { std::string szPatchFolder; char szString[ 1024 ]; sprintf_s( szString, _MAX_PATH, "%s\\%08d", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CreateDirectory( szString, NULL ); bool bDirectCopy = true; UpdateLastRevision(); // rmakecmd·Î ÆÄÀÏ ÇÊÅ͸µ SHELLEXECUTEINFO ShellExecInfo; memset( &ShellExecInfo, 0, sizeof( SHELLEXECUTEINFO ) ); ShellExecInfo.cbSize = sizeof( SHELLEXECUTEINFO ); ShellExecInfo.hwnd = GetSafeHwnd(); ShellExecInfo.lpFile = "cmd.exe"; ShellExecInfo.nShow = SW_SHOW; ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; ShellExecInfo.lpVerb = __TEXT( "open" ); ShellExecInfo.lpParameters = szString; sprintf_s( szString, 1024, "/c %s %s\\Resource %s\\Client /C %s", m_szRMakeCmd.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), m_szSVNUpdateFolder.GetBuffer(), m_szCountryCode.GetBuffer() ); if( ShellExecuteEx( &ShellExecInfo ) ) { ::WaitForSingleObject( ShellExecInfo.hProcess, INFINITE ); } sprintf_s( szString, 1024, "%s\\Client\\rmakeresult.txt", m_szSVNUpdateFolder.GetBuffer() ); DeleteFile( szString ); // buildset³»¿ëÀ» clientÆú´õ·Î ¿Å±ä´Ù CopyBuildSetToClient(); CopyServerPatch( bDirectCopy ); CopyBuild( bDirectCopy ); UpdatePatchInfo(); BuildFullVersion(); sprintf_s( szString, _MAX_PATH, "%s\\%08d\\%d-%d_%d-%d", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, m_nStartRevision, m_nLastRevision, m_nBuildSetStartRevision, m_nBuildSetLastRevision ); CreateDirectory( szString, NULL ); } void CPatchBuilderDlg::CopyBuildSetToClient() { char szClientPath[ _MAX_PATH ]; char szBuildSetPath[ _MAX_PATH ]; sprintf_s( szClientPath, _MAX_PATH, "%s\\Client", m_szSVNUpdateFolder.GetBuffer() ); sprintf_s( szBuildSetPath, _MAX_PATH, "%s\\BuildSet", m_szSVNUpdateFolder.GetBuffer() ); std::vector< std::string > vecResult; FindFileListInDirectory( szBuildSetPath, "*.*", vecResult, false, true, true ); int nMainFolderLength = m_szSVNUpdateFolder.GetLength() + 9; for( int i=0; i<( int )vecResult.size(); i++ ) { char szPath[ _MAX_PATH ]; _GetPath( szPath, vecResult[ i ].c_str() + nMainFolderLength + 1 ); std::string strPath( szPath ); char szCreateFolderPath[ _MAX_PATH ]; sprintf_s( szCreateFolderPath, _MAX_PATH, "%s\\%s", szClientPath, strPath.c_str() ); if( strPath.length() > 0 ) CreateFolder( szCreateFolderPath ); char szFileName[ _MAX_PATH ]; _GetFullFileName( szFileName, vecResult[ i ].c_str() ); char szCreateFile[ _MAX_PATH ]; sprintf_s( szCreateFile, _MAX_PATH, "%s\\%s", szCreateFolderPath, szFileName ); CopyFile( vecResult[ i ].c_str(), szCreateFile, FALSE ); } } void CPatchBuilderDlg::ApplyPatchResourceToClientFolder() { LogWnd::TraceLog( "ApplyPatchResourceToClientFolder" ); char szClientPath[ _MAX_PATH ]; char szResourcePath[ _MAX_PATH ]; // Apply Modify Patch File for( int i=0; i<( int )m_vecModifyFile.size(); i++ ) { CString strPatchFile = RemoveCountryPath( m_vecModifyFile[ i ].c_str() ); char szPath[ _MAX_PATH ]; _GetPath( szPath, strPatchFile.GetBuffer() ); char szCreateFolderPath[ _MAX_PATH ]; sprintf_s( szCreateFolderPath, _MAX_PATH, "%s\\Client\\%s", m_szSVNUpdateFolder.GetBuffer(), szPath ); if( !PathIsDirectory( szCreateFolderPath ) ) CreateFolder( szCreateFolderPath ); sprintf_s( szClientPath, _MAX_PATH, "%s\\Client\\%s", m_szSVNUpdateFolder.GetBuffer(), strPatchFile.GetBuffer() ); sprintf_s( szResourcePath, _MAX_PATH, "%s\\Resource\\%s", m_szSVNUpdateFolder.GetBuffer(), m_vecModifyFile[ i ].c_str() ); CopyFile( szResourcePath, szClientPath, FALSE ); } // Apply Delete Patch File for( int i=0; i<( int )m_vecDeleteFile.size(); i++ ) { CString strPatchFile = RemoveCountryPath( m_vecDeleteFile[ i ].c_str() ); sprintf_s( szClientPath, _MAX_PATH, "%s\\Client\\%s", m_szSVNUpdateFolder.GetBuffer(), strPatchFile.GetBuffer() ); DeleteFile( szClientPath ); } } void CPatchBuilderDlg::SetWorkStatus( const char *pString ) { SetDlgItemText( IDC_WORK_STATUS , pString ); } void CPatchBuilderDlg::BuildPatch() { LogWnd::TraceLog( "BuildPatch Start" ); std::string szPatchFolder; char szString[ 1024 ]; //ÆÐÄ¡ ¹öÁ¯ÀÌ 1À϶§ ´Â ·Ñ¹éÆÐÄ¡´Â ¸¸µéÁö ¾Ê´Â´Ù.. if( m_nCurrentVersion == 1 ) { BuildVersion1(); } else { LogWnd::TraceLog( "FilteringModifyList" ); // ¼­¹öµ¥ÀÌŸ Ä«ÇǸ¦ ÀüºÎ ´Ù ÇØ´Þ¶ó°í ÇØ¼­ true·Î ¹Ù²å´Ù.. bool bDirectCopy = true; GetModifyList(); SaveListLog( "BeforeLogList.txt" ); if( m_vecModifyFile.size() > 0 ) FilteringModifyList( m_vecModifyFile ); if( m_vecDeleteFile.size() > 0 ) FilteringModifyList( m_vecDeleteFile ); if( m_vecRollDeleteFile.size() > 0 ) FilteringModifyList( m_vecRollDeleteFile ); if( m_vecRestoreFile.size() > 0 ) FilteringModifyList( m_vecRestoreFile ); SaveListLog( "AfterLogList.txt" ); if( m_vecModifyFile.empty() && m_vecDeleteFile.empty() ) { MessageBox( "ÆÐÄ¡ÇÒ ³»¿ëÀÌ ¾ø½À´Ï´Ù" ); return; } sprintf_s( szString, _MAX_PATH, "%s\\%08d", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CreateDirectory( szString, NULL ); #ifdef _ROLLBACK_PATCH if( m_bRollBack ) { RollBackPatch(); } #endif // ¸¶Áö¸· ¸®ºñÁ¯±îÁö ÇØ´ç Æú´õ·Î ¾÷µ¥ÀÌÆ® ÇÑ´Ù. SVN UpdateFolder UpdateLastRevision(); ApplyPatchResourceToClientFolder(); // ÆÐÄ¡ ¸®¼Ò½º ³»¿ëÀ» UpdateFolder\Client¿¡ Àû¿ëÇÑ´Ù. (¼­¹ö RMakeCmdµ¹¸± ¶§ ¸®¼Ò½º »ç¿ëÇϱ⶧¹®¿¡ ÃÖ½ÅÀ¸·Î À¯Áö) if( m_bCopyServerData ) { CopyServerPatch( bDirectCopy ); if( !CopyBuild( bDirectCopy ) ) { if( !m_bAutoStart ) { sprintf_s( szString, 1024, "RmakeCmd Fail ", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); MessageBox( szString ); } PostMessage( WM_QUIT ); return; } } CreatePatch(); CreateDeleteList(); UpdatePatchInfo(); if( m_bMakeFullVersion ) { BuildFullVersion(); } sprintf_s( szString, _MAX_PATH, "%s\\%08d\\%d-%d_%d-%d", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, m_nStartRevision, m_nLastRevision, m_nBuildSetStartRevision, m_nBuildSetLastRevision ); CreateDirectory( szString, NULL ); #ifdef MANUAL_PATCH if( m_bManualPatch ) { ManualPatch(); } #endif // MD5 ÆÄÀÏ »ý¼º LogWnd::TraceLog( "Generate MD5 File" ); CString strFilePath; strFilePath.Format( "%s\\%08d\\Patch%08d.pak", m_szPatchFolder.GetBuffer(), m_nCurrentVersion, m_nCurrentVersion ); CString strChecksum = CMD5Checksum::GetMD5( strFilePath ); CString strMD5FileName = strFilePath + ".MD5"; FILE* stream = fopen( strMD5FileName.GetString(), "w+" ); if( stream ) { fseek( stream, 0L, SEEK_SET ); fprintf_s( stream, strChecksum.GetString() ); fprintf_s( stream, "\n" ); fclose( stream ); } } CleanupDir(); if( !m_bAutoStart ) { sprintf_s( szString, 1024, "%s\\%08d Æú´õ¿¡ ÆÐÄ¡ »ý¼º ¼º°ø!!", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); MessageBox( szString ); } LogWnd::TraceLog( "BuildPatch End" ); PostMessage( WM_QUIT ); } UINT AFX_CDECL _BuildPatchThread( LPVOID Param ) { CPatchBuilderDlg *pMainDlg = ( CPatchBuilderDlg * )AfxGetApp()->m_pMainWnd; if ( pMainDlg ) { pMainDlg->BuildPatch(); } return 0; } void CPatchBuilderDlg::ManualPatch() { LogWnd::TraceLog( "ManualPatch" ); #ifdef MANUAL_PATCH USES_CONVERSION; //¹öÁ¯ÀÌ 1ÀΰÍÀº ¸¸µéÁö ¾Èµé´Ù. if( m_nCurrentVersion == 1 ) return; int nManualPatchTargetStartVer = 0; int nManualPatchTargetEndVer = 0; if( m_nManualPatchTargetStartVer > 0 && m_nManualPatchTargetEndVer > 0 && m_nManualPatchTargetEndVer > m_nManualPatchTargetStartVer ) { nManualPatchTargetStartVer = m_nManualPatchTargetStartVer; nManualPatchTargetEndVer = m_nManualPatchTargetEndVer; } else { nManualPatchTargetStartVer = m_nCurrentVersion - 1; nManualPatchTargetEndVer = m_nCurrentVersion; } LogWnd::TraceLog( "ManualPatch StartVer:%d, EndVer:%d", nManualPatchTargetStartVer, nManualPatchTargetEndVer ); m_pDnAttachFile = new CDnAttachFile; //ÆÑÀÇ ¼ø¼­´Â ÅØ½ºÆ®¸ÕÀú µé°¡°í ´ÙÀ½ µ¥ÀÌÅÍ ¼øÀ¸·Î ÆÄÀÏÀ» ¸¸µç´Ù. //¾îÅÂÄ¡ ÇϴºκÐÀº ·Ñ¹é¹öÁ¯¿¡¼­ ÆÛ¿Â´Ù. CStringA szTxt , szPak; CStringA szPatchFolder; szPatchFolder.Format( "%s\\%08d\\" ,m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CStringA szManualPatchFolder, szPatchExecutePath; szManualPatchFolder.Format( "%s%s", szPatchFolder.GetBuffer(), "ManualPatch" ); //Æú´õ ¸¸µé°í CreateFolder( szManualPatchFolder.GetBuffer() ); szPatchExecutePath.Format( "%s\\DNUpdater_%dto%d.exe", szManualPatchFolder.GetBuffer(), nManualPatchTargetStartVer, nManualPatchTargetEndVer ); //¾îÅÂÄ¡ÇÒ ¸ðµâ ÆÄÀϰú »Ì¾Æ³¾ ÆÄÀÏ if( !m_bAutoStart ) { MessageBox( m_szManualPatchExe.GetBuffer() ); MessageBox( szPatchExecutePath.GetBuffer() ); } LogWnd::TraceLog( "--- %s, %s", m_szManualPatchExe.GetBuffer(), szPatchExecutePath.GetBuffer() ); if( !m_pDnAttachFile->Create( m_szManualPatchExe.GetBuffer(), szPatchExecutePath.GetBuffer() ) ) { if( !m_bAutoStart ) { LogWnd::TraceLog( "¿øº» ¼öµ¿ÆÐÄ¡ ÀÐ±â ½ÇÆÐ %s, %s", m_szManualPatchExe.GetBuffer(), szPatchExecutePath.GetBuffer() ); MessageBox( "¿øº» ¼öµ¿ÆÐÄ¡ ÀÐ±â ½ÇÆÐ" ); SAFE_DELETE( m_pDnAttachFile ); return; } } //¹öÁ¯Á¤º¸¸¦ óÀ½ ÀúÀåÇÑ´Ù. m_pDnAttachFile->WriteVersion( nManualPatchTargetStartVer, nManualPatchTargetEndVer ); szTxt.Format( "Patch%08d.txt", m_nCurrentVersion ); szPak.Format( "Patch%08d.pak", m_nCurrentVersion ); char szMessage[ 1024 ]; sprintf_s( szMessage, 1024, "¼öµ¿ ÆÐÄ¡¸¦ »ý¼º ÁßÀÔ´Ï´Ù." ); SetWorkStatus( szMessage ); if( !m_pDnAttachFile->AttachFile( szPatchFolder.GetBuffer(), szTxt.GetBuffer() ) ) { if( !m_bAutoStart ) { LogWnd::TraceLog( "ÆÐÄ¡ÆÄÀÏ º´ÇÕ ½ÇÆÐ %s, %s", szPatchFolder.GetBuffer(), szTxt.GetBuffer() ); MessageBox( "ÆÐÄ¡ÆÄÀÏ º´ÇÕ ½ÇÆÐ" ); SAFE_DELETE( m_pDnAttachFile ); return; } } m_pDnAttachFile->AttachFile( szPatchFolder.GetBuffer(), szPak.GetBuffer() ); m_pDnAttachFile->Close(); sprintf_s( szMessage, 1024, "¼öµ¿ ÆÐÄ¡ »ý¼º ¿Ï·á!!" ); SetWorkStatus( szMessage ); SAFE_DELETE( m_pDnAttachFile ); #endif // MANUAL_PATCH } void CPatchBuilderDlg::OnBnClickedBuild() { UpdateData( TRUE ); if( m_nStartRevision >= m_nLastRevision ) { MessageBox( "Revision ¹øÈ£¸¦ Á¦´ë·Î ÀÔ·ÂÇØÁÖ¼¼¿ä.." ); return; } if( m_nCurrentVersion <= 0 ) { MessageBox( "À߸øµÈ ºôµå ¹öÀü ÀÔ´Ï´Ù." ); return; } GetDlgItem( ID_BUILD )->EnableWindow( FALSE ); CleanupDir(); if( m_szSVNUrl[ m_szSVNUrl.GetLength() - 1 ] == '\\' ) { m_szSVNUrl.Delete( m_szSVNUrl.GetLength() - 1 ); } if( m_szSVNUpdateFolder[ m_szSVNUpdateFolder.GetLength() - 1 ] == '\\' ) { m_szSVNUpdateFolder.Delete( m_szSVNUpdateFolder.GetLength() - 1 ); } // ÇÊÅ͸µ ÇÒ ÆÄÀÏ ±¸Çϱâ rmakecmd.cfg LoadFilteringCfg(); AfxBeginThread( _BuildPatchThread, GetSafeHwnd() ); } void CPatchBuilderDlg::LoadFilteringCfg() { char szPath[ _MAX_PATH ], szFileName[ _MAX_PATH ]; _GetPath( szPath, m_szRMakeCmd.GetBuffer( 0 ) ); sprintf_s( szFileName, _MAX_PATH, "%s\\RMakeCmd.cfg", szPath ); FILE *fp; fopen_s( &fp, szFileName, "rt" ); if( fp == NULL ) return; char szTemp[1024]; char cFlag = -1; while( !feof(fp) ) { memset( szTemp, 0, sizeof(szTemp) ); fscanf_s( fp, "%s", szTemp, 1024 ); if( _stricmp( szTemp, "[Common]" ) == NULL ) continue; if( _stricmp( szTemp, "[Client]" ) == NULL ) break; m_mapIgnoreFileList.insert( make_pair( szTemp, "" ) ); } fclose(fp); // maptable.ext load char szOrig[512]; DNTableFileFormat* pSox = new DNTableFileFormat; bool bValidNation = false; if( m_szCountryCode.GetLength() > 0 ) { sprintf_s( szOrig, "%s\\Resource\\Resource_%s\\Ext\\MapTable.ext", m_szSVNUpdateFolder.GetBuffer( 0 ), m_szCountryCode.GetBuffer( 0 ) ); if( PathFileExists( szOrig ) ) { bValidNation = true; if( !pSox->Load( szOrig ) ) { ASSERT( "Ext Open Error - Nation\n" ); return; } } } if( !bValidNation ) { sprintf_s( szOrig, "%s\\Resource\\Resource\\Ext\\MapTable.ext", m_szSVNUpdateFolder.GetBuffer( 0 ), m_szCountryCode.GetBuffer( 0 ) ); if( !pSox->Load( szOrig ) ) { ASSERT( "Ext Open Error - Local\n" ); return; } } char szLabel[64]; std::string szMapName; for( int i=0; iGetItemCount(); i++ ) { int nItemID = pSox->GetItemID( i ); for( int j=0; j<10; j++ ) { sprintf_s( szLabel, "_ToolName%d", j + 1 ); szMapName = pSox->GetFieldFromLablePtr( nItemID, szLabel )->GetString(); if( pSox->GetFieldFromLablePtr( nItemID, "_IncludeBuild" )->GetInteger() == 0 ) continue; if( !szMapName.empty() ) { bool bExistNation = false; if( m_szCountryCode.GetLength() > 0 ) { sprintf_s( szOrig, "%s\\Resource\\MapData_%s\\Grid\\%s", m_szSVNUpdateFolder.GetBuffer( 0 ), m_szCountryCode.GetBuffer( 0 ), szMapName.c_str() ); if( PathIsDirectory( szOrig ) ) { bExistNation = true; sprintf_s( szOrig, "MapData_%s\\Grid\\%s", m_szCountryCode.GetBuffer( 0 ), szMapName.c_str() ); m_vecIncludeMapList.push_back( std::string( szOrig ) ); } } if( !bExistNation ) { sprintf_s( szOrig, "%s\\Resource\\MapData\\Grid\\%s", m_szSVNUpdateFolder.GetBuffer( 0 ), szMapName.c_str() ); if( PathIsDirectory( szOrig ) ) { sprintf_s( szOrig, "MapData\\Grid\\%s", szMapName.c_str() ); m_vecIncludeMapList.push_back( std::string( szOrig ) ); } } } } } SAFE_DELETE( pSox ); } void CPatchBuilderDlg::FilteringModifyList( std::vector& vecFileList ) { std::vector::iterator iterFileList; for( int i=0; i<(int)vecFileList.size(); i++ ) { iterFileList = vecFileList.begin(); iterFileList += i; char szPath[ _MAX_PATH ]; _GetPath( szPath, (*iterFileList).c_str() ); // 0. ·çÆ® Æú´õ°¡ mapdata, resource, buildsetÀÌ ¾Æ´Ñ Æú´õ Á¦¿Ü if( !strstr( szPath, "MapData" ) && !strstr( szPath, "Resource" ) && !strstr( szPath, "BuildSet" ) ) { vecFileList.erase( iterFileList ); i--; continue; } // 1. mapdataÆÄÀÏ ÇÊÅ͸µ if( strstr( szPath, "MapData" ) ) { CString strPath( szPath ); strPath.Delete( strPath.GetLength() - 1, 1 ); char szMapDataCountryPath[ _MAX_PATH ]; sprintf_s( szMapDataCountryPath, "MapData_%s", m_szCountryCode.GetBuffer() ); CString strMapDataPath( szPath ); int nIndex = strMapDataPath.Find( '\\' ); strMapDataPath.Delete( nIndex, strMapDataPath.GetLength() - nIndex ); if( strstr( szPath, "MapData_" ) ) // MapData_±¹°¡ Æú´õÁß Å¸±¹°¡ ¸®¼Ò½º Æú´õ´Â Á¦¿Ü { if( _stricmp( strMapDataPath.GetBuffer( 0 ), szMapDataCountryPath ) ) { vecFileList.erase( iterFileList ); i--; continue; } } else { if( strstr( szPath, "Grid" ) ) // GridÆú´õ´Â FileMap.extÆÄÀÏ¿¡¼­ ·ÎµåÇÑ IncludeMapList°Ë»ç ÈÄ Ãß°¡ { BOOL bFindIncludeMapList = FALSE; std::vector::iterator iter = m_vecIncludeMapList.begin(); for( ; iter != m_vecIncludeMapList.end(); iter++ ) { if( _stricmp( (*iter).c_str(), strPath.GetBuffer( 0 ) ) == 0 ) { bFindIncludeMapList = TRUE; break; } } if( !bFindIncludeMapList ) { vecFileList.erase( iterFileList ); i--; continue; } } else { CString strFileName( (*iterFileList).c_str() ); nIndex = strFileName.Find( '\\' ); strFileName.Delete( 0, nIndex + 1 ); char szFileName[ _MAX_PATH ]; sprintf_s( szFileName, "%s\\Resource\\%s\\%s", m_szSVNUpdateFolder.GetBuffer( 0 ), szMapDataCountryPath, strFileName.GetBuffer( 0 ) ); if( FileExistName( szFileName ) ) { vecFileList.erase( iterFileList ); i--; continue; } } } continue; } // 2. ResourceÆÄÀÏ ÇÊÅ͸µ if( strstr( szPath, "Resource" ) ) { char szResourceCountryPath[ _MAX_PATH ]; sprintf_s( szResourceCountryPath, "Resource_%s", m_szCountryCode.GetBuffer() ); CString strResourcePath( szPath ); int nIndex = strResourcePath.Find( '\\' ); strResourcePath.Delete( nIndex, strResourcePath.GetLength() - nIndex ); if( strstr( szPath, "Resource_" ) ) // Resource_±¹°¡ Æú´õÁß Å¸±¹°¡ ¸®¼Ò½º Æú´õ´Â Á¦¿Ü { if( _stricmp( strResourcePath.GetBuffer( 0 ), szResourceCountryPath ) ) { vecFileList.erase( iterFileList ); i--; continue; } } else // Resource_±¹°¡ ¿¡ µ¿ÀÏ ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì ±¹°¡Æú´õ ¿ì¼±À̹ǷΠÁ¦¿Ü { CString strFileName( (*iterFileList).c_str() ); nIndex = strFileName.Find( '\\' ); strFileName.Delete( 0, nIndex + 1 ); char szFileName[ _MAX_PATH ]; sprintf_s( szFileName, "%s\\Resource\\%s\\%s", m_szSVNUpdateFolder.GetBuffer( 0 ), szResourceCountryPath, strFileName.GetBuffer( 0 ) ); if( FileExistName( szFileName ) ) { vecFileList.erase( iterFileList ); i--; continue; } } } } } CString CPatchBuilderDlg::RemoveCountryPath( const char* szPath ) { CString strNewPath( szPath ); int nCount = 0; if( strstr( szPath, "MapData_" ) ) nCount = 7; else if( strstr( szPath, "Resource_" ) ) nCount = 8; if( nCount > 0 ) strNewPath.Delete( nCount, m_szCountryCode.GetLength() + 1 ); return strNewPath; } void CPatchBuilderDlg::OnBnClickedExit() { OnCancel(); } void CPatchBuilderDlg::OnOK() { return; } //SVN ¸¶Áö¸· ¸®ºñÁ¯À» °¡Á®¿È BOOL CPatchBuilderDlg::CheckSVNInfo( int nProfileIndex ) { char szString[ 1024 ]; SProfile *pProfile = CRegProfile::GetInstance().GetProfile( nProfileIndex ); #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "svn info %s -r HEAD --xml --username hicom15 --password 6326", pProfile->szSVNUrl.c_str() ); #else sprintf_s( szString, 1024, "svn info %s -r HEAD --xml --username build --password b@0625", pProfile->szSVNUrl.c_str() ); #endif std::string szOutput; if( ExecCommand( szString, &szOutput ) ) { TiXmlDocument Document; Document.Parse( szOutput.c_str(), 0, TIXML_ENCODING_UTF8 ); if( !Document.Error() ) { Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "commit" )->QueryIntAttribute( "revision", &m_nLastRevision ); std::string szURL = Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "url" )->GetText(); std::string szRoot = Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "repository" )->FirstChildElement( "root" )->GetText(); m_szMainResourceFolder = szURL.c_str() + strlen( szRoot.c_str() ); } else { MessageBox( szOutput.c_str() ); return FALSE; } } else { MessageBox( "svn info ¸í·É ½ÇÇà ¿¡·¯! svn Ä¿¸Çµå¶óÀÎ ÀνºÅç µÇ¾î ÀÖ´ÂÁö È®ÀÎ ÇØÁÖ¼¼¿ä" ); return FALSE; } // Check BuildSet Revision #ifdef DH_SELF_TEST sprintf_s( szString, 1024, "svn info %s -r HEAD --xml --username hicom15 --password 6326", pProfile->szSVNUrlBuildSet.c_str() ); #else sprintf_s( szString, 1024, "svn info %s -r HEAD --xml --username build --password b@0625", pProfile->szSVNUrlBuildSet.c_str() ); #endif if( ExecCommand( szString, &szOutput ) ) { TiXmlDocument Document; Document.Parse( szOutput.c_str(), 0, TIXML_ENCODING_UTF8 ); if( !Document.Error() ) { Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "commit" )->QueryIntAttribute( "revision", &m_nBuildSetLastRevision ); std::string szURL = Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "url" )->GetText(); std::string szRoot = Document.FirstChildElement( "info" )->FirstChildElement( "entry" )->FirstChildElement( "repository" )->FirstChildElement( "root" )->GetText(); m_szMainBuildSetFolder = szURL.c_str() + strlen( szRoot.c_str() ); } else { MessageBox( szOutput.c_str() ); return FALSE; } } else { MessageBox( "svn info ¸í·É ½ÇÇà ¿¡·¯! svn Ä¿¸Çµå¶óÀÎ ÀνºÅç µÇ¾î ÀÖ´ÂÁö È®ÀÎ ÇØÁÖ¼¼¿ä" ); return FALSE; } return TRUE; } void CPatchBuilderDlg::CheckPatchFolder() { std::vector< std::string > szVecResult; std::string szLastPatchFolder; szLastPatchFolder = m_szPatchFolder.GetBuffer(); CreateFolder( szLastPatchFolder.c_str() ); _FindFolder( szLastPatchFolder.c_str(), szVecResult, false, NULL ); m_nCurrentVersion = 1; GetDlgItem( IDC_BASE_REVISION )->EnableWindow( false ); GetDlgItem( IDC_FULL_VERSION )->EnableWindow( false ); GetDlgItem( IDC_COPY_SERVER_DATA )->EnableWindow( false ); if( szVecResult.empty() ) return; bool bDeleteFolder = false; std::sort( szVecResult.begin(), szVecResult.end() ); for( int i=( int )szVecResult.size() - 1; i>=0; i-- ) { szLastPatchFolder = m_szPatchFolder.GetBuffer(); szLastPatchFolder += "\\"; szLastPatchFolder += szVecResult[ i ]; std::vector< std::string > szVecRevision; _FindFolder( szLastPatchFolder.c_str(), szVecRevision, false, NULL ); std::sort( szVecRevision.begin(), szVecRevision.end() ); if( !szVecRevision.empty() ) { CString strFolderName( szVecRevision[ 0 ].c_str() ); int nSeperator = strFolderName.Find( '_' ); CString strResourceVerInfo, strBuildSetVerInfo; strResourceVerInfo = strFolderName; strBuildSetVerInfo = strFolderName; strResourceVerInfo.Delete( nSeperator, strResourceVerInfo.GetLength() - nSeperator ); strBuildSetVerInfo.Delete( 0, nSeperator + 1 ); if( strResourceVerInfo.GetLength() > 0 && strBuildSetVerInfo.GetLength() > 0 ) { if( bDeleteFolder ) { m_nCurrentVersion = atoi( szVecResult[ i ].c_str() ); UpdatePatchInfo(); } nSeperator = strResourceVerInfo.Find( '-' ); strResourceVerInfo.Delete( 0, nSeperator + 1 ); m_nStartRevision = atoi( strResourceVerInfo.GetBuffer( 0 ) ); m_nCurrentVersion = atoi( szVecResult[ i ].c_str() ) + 1; nSeperator = strBuildSetVerInfo.Find( '-' ); strBuildSetVerInfo.Delete( 0, nSeperator + 1 ); m_nBuildSetStartRevision = atoi( strBuildSetVerInfo.GetBuffer( 0 ) ); if( m_nCurrentVersion > 1 ) { GetDlgItem( IDC_BASE_REVISION )->EnableWindow( true ); GetDlgItem( IDC_FULL_VERSION )->EnableWindow( true ); GetDlgItem( IDC_COPY_SERVER_DATA )->EnableWindow( true ); } return; } } char szString[ 1024 ]; sprintf_s( szString, 1024, "%s Æú´õ´Â À߸øµÈ Æú´õ ÀÔ´Ï´Ù. Áö¿ï±î¿ä?", szLastPatchFolder.c_str() ); if(!m_bAutoStart) { if( MessageBox( szString, NULL, MB_YESNO ) == IDYES ) { DeleteFolder( szLastPatchFolder.c_str() ); bDeleteFolder = true; } } else { DeleteFolder( szLastPatchFolder.c_str() ); bDeleteFolder = true; } } } void CPatchBuilderDlg::RollPacking() { CEtPackingFile FileSystem; char szString[ 1024 ]; sprintf_s( szString, _MAX_PATH , "%s\\%08d" , m_szRollPatchFoloer.GetBuffer() , m_nCurrentVersion+1 ); CreateDirectory(szString , NULL ); sprintf_s( szString, _MAX_PATH, "%s\\%08d\\Patch%08d.pak", m_szRollPatchFoloer.GetBuffer(),m_nCurrentVersion+1 ,m_nCurrentVersion+1 ); FileSystem.NewFileSystem( szString ); std::sort( m_vecRestoreFile.begin(), m_vecRestoreFile.end() ); for( int i=0; i<( int )m_vecRestoreFile.size(); i++ ) { char szPath[ _MAX_PATH ], szFileName[ _MAX_PATH ]; _GetPath( szPath, m_vecRestoreFile[ i ].c_str() ); sprintf_s( szFileName, _MAX_PATH, "%s\\%s", m_szRollTempFolder.GetBuffer(), m_vecRestoreFile[ i ].c_str() ); FileSystem.ChangeDir( "\\" ); if( szPath[ 0 ] ) { FileSystem.ChangeDir( RemoveCountryPath( szPath ).GetBuffer( 0 ) ); } FileSystem.AddFile( szFileName ); char szMessage[ 1024 ]; sprintf_s( szMessage, 1024, "·Ñ¹é ÆÄÀÏÀ» »ý¼ºÁßÀÔ´Ï´Ù %d%%", ( int )( i * 100 / m_vecRestoreFile.size() ) ); SetWorkStatus( szMessage ); } FileSystem.CloseFileSystem(); } void CPatchBuilderDlg::RollSaveVersion() { FILE *fp; char szString[ 1024 ] = {0,}; sprintf_s( szString, _MAX_PATH, "%s\\PatchInfoServer.cfg", m_szRollPatchFoloer.GetBuffer() ); //ÇöÀç¹öÁ¯À» ½ºÅµÇÑ´Ù. m_SkipNumber.push_back(m_nCurrentVersion); std::sort(m_SkipNumber.begin() , m_SkipNumber.end()); if( !fopen_s( &fp, szString, "wt" ) ) { //¼­¹ö ¹öÁ¯ ù¶óÀο¡ ³Ö°í sprintf_s( szString, _MAX_PATH, "version %d\n", m_nCurrentVersion+1 ); fputs( szString, fp ); for( int i=0; i<( int )m_SkipNumber.size(); i++ ) { sprintf_s( szString, 1024, "SkipNum %d\n", m_SkipNumber[i] ); fputs( szString, fp ); } fclose( fp ); } //ÀúÀåµÈ ½ºÅµ³Ñ¹ö ¿Í ÇöÀç¹öÁ¯ÀÌ °°Àº°ÍÀº »èÁ¦ for( int i=0; i<(int)m_SkipNumber.size() ;i++ ) { if( m_SkipNumber[i] == m_nCurrentVersion ) { m_SkipNumber.erase(m_SkipNumber.begin()+i); break; } } } void CPatchBuilderDlg::RollBackCopyFile() { char szMessage[1024]={0,}; char szString[1024]={0,}; std::string SrcFile, DstFile; std::string szRollPatchFolder , szRollSvnUpdateFolder ; std::string szRollPatchTempFolder; // ÇØ´çÆú´õ¿¡ ·Ñ¹é Æú´õ»ý¼º sprintf_s( szString, _MAX_PATH, "%s\\%08d\\RollBack", m_szPatchFolder.GetBuffer(), m_nCurrentVersion ); CreateDirectory( szString, NULL ); m_szRollPatchFoloer = szString; // ·Ñ¹é Æú´õ¿¡ ÅÛÇÁ ÆÄÀÏ »ý¼º ¿©±â ÆÄÀÏÀ» ¹Þ¾Æ¿Â´Ù. sprintf_s( szString , _MAX_PATH , "%s\\Temp", m_szRollPatchFoloer.GetBuffer() ); CreateDirectory(szString , NULL ); m_szRollTempFolder = szString; szRollPatchTempFolder = m_szRollTempFolder.GetBuffer() ; szRollSvnUpdateFolder = m_szSVNUpdateFolder.GetBuffer(); szRollPatchFolder = m_szRollPatchFoloer.GetBuffer(); SHELLEXECUTEINFO ShellExecInfo; memset( &ShellExecInfo, 0, sizeof( SHELLEXECUTEINFO ) ); ShellExecInfo.cbSize = sizeof( SHELLEXECUTEINFO ); ShellExecInfo.hwnd = GetSafeHwnd(); ShellExecInfo.lpFile = "svn"; ShellExecInfo.nShow = SW_HIDE; ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NO_CONSOLE; ShellExecInfo.lpVerb = __TEXT( "open" ); ShellExecInfo.lpParameters = szString; for( int i=0; i<(int)m_vecRestoreFile.size(); ++i ) { if( strstr( m_vecRestoreFile[ i ].c_str(), "BuildSet" ) ) { SrcFile = szRollSvnUpdateFolder + "\\" + m_vecRestoreFile[ i ]; CString strFileName( m_vecRestoreFile[ i ].c_str() ); strFileName.Delete( 0, 9 ); m_vecRestoreFile[ i ] = strFileName.GetBuffer( 0 ); } else SrcFile = szRollSvnUpdateFolder + "\\Resource\\" + m_vecRestoreFile[ i ]; DstFile = szRollPatchTempFolder + "\\" + m_vecRestoreFile[ i ]; std::string StrChange, SVNPath; StrChange = m_vecRestoreFile[i]; char szPath[1024] = {0 , }; _GetPath( szPath, DstFile.c_str() ); CreateFolder( szPath ); // ¿øº» µ¥ÀÌÅ͸¦ ¸ÕÀú ÅÛÇÁÂÊ¿¡ Ä«ÇÇÇÑ´Ù. if( CopyFile( SrcFile.c_str(), DstFile.c_str(), FALSE ) == 0 ) { CopyFile( SrcFile.c_str(), DstFile.c_str(), FALSE ); } } } void CPatchBuilderDlg::RollCreateDeleteList() { char szString[ 1024 ]; FILE *fp; sprintf_s( szString, _MAX_PATH, "%s\\%08d\\Patch%08d.txt", m_szRollPatchFoloer.GetBuffer(),m_nCurrentVersion+1 ,m_nCurrentVersion+1 ); fopen_s( &fp, szString, "wt" ); for( int i=0; i<( int )m_vecRollDeleteFile.size(); i++ ) { WCHAR wszBuffer[ _MAX_PATH ]; char szTemp[ _MAX_PATH ]; MultiByteToWideChar( CP_UTF8, 0, m_vecRollDeleteFile[ i ].c_str(), -1, wszBuffer, _MAX_PATH ); WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, szTemp, _MAX_PATH, NULL, NULL ); sprintf_s( szString, 1024, "D %s\n", RemoveCountryPath( szTemp ).GetBuffer( 0 ) ); fputs( szString, fp ); } // DiffFiles Æú´õ°¡ ÀÖ´Ù¸é ÆÐÄ¡¿¡ Æ÷ÇԵǹǷΠ»èÁ¦¸®½ºÆ®¿¡ µî·Ï char szDiffFilesPath[ _MAX_PATH ]; sprintf_s( szDiffFilesPath, _MAX_PATH, "%s\\DiffFiles", m_szSVNUpdateFolder.GetBuffer() ); if( PathIsDirectory( szDiffFilesPath ) ) { std::vector< std::string > vecResult; FindFileListInDirectory( szDiffFilesPath, "*.*", vecResult, false, true, true ); for( int i=0; i<( int )vecResult.size(); i++ ) { CString strFileName( vecResult[ i ].c_str() ); strFileName.Delete( 0, m_szSVNUpdateFolder.GetLength() + 11 ); sprintf_s( szString, 1024, "D %s\n", strFileName.GetBuffer( 0 ) ); fputs( szString, fp ); } } int bFindLauncher = false; for( int i=0; i<( int )m_vecRestoreFile.size(); i++ ) { if( _stricmp( m_vecRestoreFile[ i ].c_str(), "DNLauncher.exe" ) == 0 ) { m_vecRestoreFile.erase( m_vecRestoreFile.begin() + i ); bFindLauncher = true; break; } } if( bFindLauncher ) { m_vecRestoreFile.push_back( "DNLauncher.exe" ); } for( int i=0; i<( int )m_vecRestoreFile.size(); i++ ) { if( IsPatchFile( m_vecRestoreFile[ i ].c_str() ) ) { sprintf_s( szString, 1024, "P %s\n", RemoveCountryPath( m_vecRestoreFile[ i ].c_str() ).GetBuffer( 0 ) ); } else { sprintf_s( szString, 1024, "C %s\n", RemoveCountryPath( m_vecRestoreFile[ i ].c_str() ).GetBuffer( 0 ) ); fputs( szString, fp ); } } // ¾Æ¹«°Íµµ ¾øÀ¸¸é 0¹ÙÀÌÆ®Â¥¸® ÆÄÀÏÀÌ »ý¼ºµÇ¼­.. ´Ù¿î·Îµå ¾ÈµÉ¼öµµ À־. ´õ¹Ì Çϳª ³Ö¾îÁØ´Ù. fputs( " ", fp ); fclose( fp ); } void CPatchBuilderDlg::RollBackPatch() { LogWnd::TraceLog( "RollBackPatch" ); RollBackCopyFile(); RollPacking(); RollCreateDeleteList(); DeleteFolder(m_szRollTempFolder.GetBuffer()); char szString[1024]={0,}; //¸®ºñÀü ±â·Ï sprintf_s( szString, _MAX_PATH, "%s\\%08d\\%d-%d_%d-%d", m_szRollPatchFoloer.GetBuffer(), m_nCurrentVersion+1, m_nStartRevision, m_nStartRevision, m_nBuildSetStartRevision, m_nBuildSetStartRevision ); CreateDirectory( szString, NULL ); //·Ñ¹éÆú´õ¿¡ ¹öÁ¯°ú ½ºÅµµÇ´Â ¹öÁ¯À» ÀúÀåÇÑ´Ù.. RollSaveVersion(); return ; } BOOL CPatchBuilderDlg::FileExistName(char *Path) { if( ::GetFileAttributes( Path ) == 0xFFFFFFFF ) { return FALSE; } return TRUE; } void CPatchBuilderDlg::GetModuleRoot() { GetModuleFileNameA(NULL, m_szModuleRoot, MAX_PATH); int i = 0; for( i=( lstrlenA( m_szModuleRoot) - 1 ); i >= 0; --i ) { if( m_szModuleRoot[i] == '\\' || m_szModuleRoot[i] == '/' ) { m_szModuleRoot[i] = '\0'; break; } } if( i < 0 ) { i=0; m_szModuleRoot[i] = '\0'; } } void CPatchBuilderDlg::OnBnClickedIdcManualFolderBrowse2() { CFileDialog FileDlg( TRUE, "*.exe", "*.*" ); if( FileDlg.DoModal() == IDOK ) { m_szManualPatchExe = FileDlg.m_ofn.lpstrFile; UpdateData( FALSE ); } // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. } void CPatchBuilderDlg::SaveListLog( LPCTSTR strFileName ) { char szString[ _MAX_PATH ], szCurDirectory[ _MAX_PATH ]; GetCurrentDirectory( _MAX_PATH, szCurDirectory ); FILE *fp; sprintf_s( szString, _MAX_PATH, "%s\\%s", szCurDirectory, strFileName ); fopen_s( &fp, szString, "wt" ); fputs( "\n< ModifyListFile >\n", fp ); std::vector::iterator iter = m_vecModifyFile.begin(); for( ; iter != m_vecModifyFile.end(); iter++ ) { sprintf_s( szString, _MAX_PATH, "%s\n", (*iter).c_str() ); fputs( szString, fp ); } fputs( "\n< DeleteFileList >\n", fp ); iter = m_vecDeleteFile.begin(); for( ; iter != m_vecDeleteFile.end(); iter++ ) { sprintf_s( szString, _MAX_PATH, "%s\n", (*iter).c_str() ); fputs( szString, fp ); } fputs( "\n< RestoreFileList >\n", fp ); iter = m_vecRestoreFile.begin(); for( ; iter != m_vecRestoreFile.end(); iter++ ) { sprintf_s( szString, _MAX_PATH, "%s\n", (*iter).c_str() ); fputs( szString, fp ); } fputs( "\n< RollDeletFileList >\n", fp ); iter = m_vecRollDeleteFile.begin(); for( ; iter != m_vecRollDeleteFile.end(); iter++ ) { sprintf_s( szString, _MAX_PATH, "%s\n", (*iter).c_str() ); fputs( szString, fp ); } fclose( fp ); }