DragonNest/Client/PatchBuilder/PatchBuilderNew/PatchBuilderDlg.cpp
2024-12-19 09:48:26 +08:00

2198 lines
65 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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 <Shlwapi.h>
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<WPARAM>(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<HCURSOR>(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; i<CRegProfile::GetInstance().GetProfileCount(); i++ )
{
SProfile *pProfile = CRegProfile::GetInstance().GetProfile( i );
m_SelectProfile.AddString( pProfile->szProfileName.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<std::string>::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<std::string > 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; i<pSox->GetItemCount(); 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<std::string>& vecFileList )
{
std::vector<std::string>::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<std::string>::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<std::string>::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 );
}