#include ".\scriptparser.h" #include "io.h" #include "Psapi.h" ScriptParser::ScriptParser(void) { Release(); } ScriptParser::~ScriptParser(void) { Release(); } VOID ScriptParser::Release() { m_nDriveType = 0; m_nShotDownTime = 0; m_nFileCount = 0; m_szSourcePath[0] = '\0'; m_szDestPath[0] = '\0'; m_vecSourcePath.clear(); m_vecDestPath.clear(); m_strServerFile.clear(); } BOOL ScriptParser::ParsingCurProcess( OUT TCHAR* pszCategory, IN int nCategorySize, OUT TCHAR* pszServerFile, int nServerSize ) { ZeroMemory( pszCategory, nCategorySize ); ZeroMemory( pszServerFile, nServerSize ); TCHAR szFullFileName[MAX_PATH]; HANDLE hHandle = GetCurrentProcess(); GetProcessImageFileName( hHandle, szFullFileName, MAX_PATH ); TCHAR szCurFileName[MAX_PATH]; TCHAR szFileName[MAX_PATH]; TCHAR szFileExt[MAX_PATH]; //ºÐ¸®.. _splitpath( szFullFileName, NULL, NULL, szFileName, szFileExt ); //ÆÄÀÏÀ̸§ _snprintf( szCurFileName, MAX_PATH, "%s%s", szFileName, szFileExt); szCurFileName[MAX_PATH-1] = '\0'; #ifdef _DEBUG if( strcmp( szCurFileName, "_DEBUGAgentServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "AGENT_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "AgentServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGFieldServer.exe" ) == 0) { _snprintf( pszCategory, MAX_PATH, "FIELD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "FieldServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGBattleServer.exe" ) == 0) { _snprintf( pszCategory, MAX_PATH, "BATTLE_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "BattleServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGDBPServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "DBPROXY_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "databaseproxy_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGWorldServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "WORLD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "WorldServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGGuildServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "GUILD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "GuildServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGPortalServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "PORTAL_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "PortalServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGMasterServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "MASTER_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "MasterServer_d.exe" ); } else if( strcmp( szCurFileName, "_DEBUGADBPServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "ACCOUNTDBP_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "accountdatabaseproxy_d.exe" ); } else { printf( "Category Not Found, Current FileName is %s\n", szCurFileName ); return FALSE; } #else if( strcmp( szCurFileName, "_RELEASEAgentServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "AGENT_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "AgentServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEFieldServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "FIELD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "FieldServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEBattleServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "BATTLE_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "BattleServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEDBPServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "DBPROXY_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "databaseproxy.exe" ); } else if( strcmp( szCurFileName, "_RELEASEWorldServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "WORLD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "WorldServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEGuildServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "GUILD_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "GuildServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEPortalServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "PORTAL_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "PortalServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEMasterServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "MASTER_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "MasterServer.exe" ); } else if( strcmp( szCurFileName, "_RELEASEADBPServer.exe" ) == 0 ) { _snprintf( pszCategory, MAX_PATH, "ACCOUNTDBP_SERVER" ); _snprintf( pszServerFile, MAX_PATH, "accountdatabaseproxy.exe" ); } else { printf( "Category Not Found, Current FileName is %s\n", szCurFileName ); return FALSE; } #endif return TRUE; } BOOL ScriptParser::Load( const char* pszFilePath ) { TCHAR szDir[MAX_PATH], szFilePath[MAX_PATH]; GetCurrentDirectory( MAX_PATH, szDir ); printf( "Current Directory is %s\n", szDir ); _snprintf( szFilePath, MAX_PATH, "%s\\%s", szDir, pszFilePath ); if( !pszFilePath ) return FALSE; if( _access( pszFilePath, 0 ) == - 1 ) { printf( "%s File Not Exist\n", pszFilePath ); return FALSE; } Release(); //Common m_nDriveType = GetPrivateProfileInt( "COMMON", "DRIVE_TYPE", 0, szFilePath ); m_nShotDownTime = GetPrivateProfileInt( "COMMON", "SHUTDOWN_TIME", 0, szFilePath ); if( !GetPrivateProfileString( "COMMON", "SERVER_ARGUMENT", "", m_szServerArgument, MAX_PATH, szFilePath ) ) { printf( "Script Read Error, Category = COMMON, Key = SERVER_ARGUMENT\n" ); return FALSE; } //°¢°¢ÀÇ Server Á¤º¸ TCHAR szCategory[MAX_PATH], szServerFile[MAX_PATH]; if( !ParsingCurProcess( szCategory, MAX_PATH, szServerFile, MAX_PATH ) ) return FALSE; if( m_nDriveType == NONE_DRIVE ) { //¼­¹öÆÄÀÏ ¼¼ÆÃ TCHAR szCurDir[MAX_PATH]; GetCurrentDirectory( MAX_PATH, szCurDir ); m_strServerFile = szCurDir; m_strServerFile += "\\"; m_strServerFile += szServerFile; return TRUE; } if( !GetPrivateProfileString( szCategory, "SOURCE", "", m_szSourcePath, MAX_PATH, szFilePath ) ) { printf( "Script Read Error, Category = %s, Key = SOURCE \n", szCategory ); return FALSE; } if( !GetPrivateProfileString( szCategory, "DEST", "", m_szDestPath, MAX_PATH, szFilePath ) ) { printf( "Script Read Error, Category = %s, Key = DEST \n", szCategory ); return FALSE; } m_nFileCount = GetPrivateProfileInt( szCategory, "FILE_COUNT", 0, szFilePath ); TCHAR szFileName[MAX_PATH], szKey[MAX_PATH]; std::string strSourceFile, strDestFile; for( int i = 1; i <= m_nFileCount; i++ ) { _snprintf( szKey, MAX_PATH, "FILE%d", i ); if( !GetPrivateProfileString( szCategory, szKey, "", szFileName, MAX_PATH, szFilePath ) ) { printf( "Script Read Error, Category = %s, Key = %s \n", szCategory, szKey ); return FALSE; } strSourceFile = m_szSourcePath; strSourceFile += "\\"; strSourceFile += szFileName; m_vecSourcePath.push_back( strSourceFile ); strDestFile = m_szDestPath; strDestFile += "\\"; strDestFile += szFileName; m_vecDestPath.push_back( strDestFile ); } //¼­¹öÆÄÀÏ ¼¼ÆÃ m_strServerFile = m_szDestPath; m_strServerFile += "\\"; m_strServerFile += szServerFile; return TRUE; } BOOL ScriptParser::CopyFiles() { if( GetDriveType() != NETWORK_DRIVE ) return TRUE; if( m_vecSourcePath.size() != m_vecDestPath.size() ) return FALSE; int nSize = (int) m_vecDestPath.size(); if( nSize == 0 ) return FALSE; for( int i = 0 ; i < nSize; i++ ) { std::string strSource = m_vecSourcePath[i]; std::string strDest = m_vecDestPath[i]; if( !CopyFile( strSource.c_str(), strDest.c_str(), FALSE ) ) { DWORD dwError = GetLastError(); printf( "File Copy Fail[Error Code = %u], %s To %s \n", dwError, strSource.c_str(), strDest.c_str() ); return FALSE; } else { DWORD dwAttrs = GetFileAttributes( strDest.c_str() ); if ( (dwAttrs & FILE_ATTRIBUTE_READONLY) ) SetFileAttributes( strDest.c_str(), FILE_ATTRIBUTE_NORMAL ); } printf( "File Copy Success, %s To %s \n", strSource.c_str(), strDest.c_str() ); } return TRUE; } BOOL ScriptParser::StartServer() { if( m_strServerFile.empty() ) { printf( "ServerFile is EMPTY.\n"); return FALSE; } if( _access( m_strServerFile.c_str(), 0 ) == -1 ) { printf( "ServerFile Not Exist. Path = %s\n", m_strServerFile.c_str() ); return FALSE; } if( GetDriveType() == NETWORK_DRIVE ) { m_strServerFile += " "; m_strServerFile += m_szServerArgument; } STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); // Start the child process. if( !CreateProcess( NULL, // No module name (use command line). (LPSTR)m_strServerFile.c_str(), // Command line. NULL, // Process handle not inheritable. NULL, // Thread handle not inheritable. FALSE, // Set handle inheritance to FALSE. 0, // No creation flags. NULL, // Use parent's environment block. NULL, // Use parent's starting directory. &si, // Pointer to STARTUPINFO structure. &pi ) // Pointer to PROCESS_INFORMATION structure. ) { printf( "Server Execute Success. Path = %s\n", m_strServerFile.c_str() ); } return TRUE; }