Files
2022-10-26 12:25:11 +08:00

175 lines
5.1 KiB
C++

#include "stdafx.h"
#include "ScriptLoadManager.h"
#include "SolarAuthInfoLoader.h"
#include "SolarAcceptableMasterServerListLoader.h"
#include "ScriptListLoader.h"
#include "ServerList/ServerInfo.h"
ScriptLoadManager::ScriptLoadManager()
{
_Init();
}
ScriptLoadManager::~ScriptLoadManager()
{
SAFE_DELETE( SolarAuthInfoLoaderHandle.REFERENCE() );
// 아래 두 개는 순서에 영향을 받는다. 왜냐? ScriptListLoader는 각 마스터서버별 가지고 있으며,
// 그 정보를 토대로 리소스들을 받아들인다.
SAFE_DELETE( ScriptListLoaderHandle.REFERENCE() );
SAFE_DELETE( SolarAcceptableMasterServerListLoaderHandle.REFERENCE() );
}
VOID ScriptLoadManager::_Init()
{
SolarAuthInfoLoaderHandle.REFERENCE() = new SolarAuthInfoLoader();
SolarAcceptableMasterServerListLoaderHandle.REFERENCE() = new SolarAcceptableMasterServerListLoader();
ScriptListLoaderHandle.REFERENCE() = new ScriptListLoader();
}
BOOL ScriptLoadManager::Initialize(
const TCHAR* pszSolarAuthInfo,
const TCHAR* pszSolarAcceptableMasterList,
const TCHAR* pszScriptList
)
{
if( !( pszSolarAuthInfo && pszSolarAcceptableMasterList && pszScriptList ) )
return FALSE;
// 해당 스크립트 로더를 불러 처리하기로 한다.
// 해당 로더는 다음과 같은 처리를 수행한다.
// 1: 해당 파일의 암호화 여부
// T : 해당 파일을 읽어들여 복호화 한다.
// F : 해당 파일을 읽어들인다.
// 2: 메모리 스트림을 분석해 의미있게 조각낸다.
// 3: 해당 로더의 인터페이스에 맞게 조직화한다.
memcpy( m_pszSolarAuthInfo, pszSolarAuthInfo, sizeof(m_pszSolarAuthInfo) );
m_pszSolarAuthInfo[sizeof(m_pszSolarAuthInfo)-1] = _T('\0');
//배열 옵셋 확인할 것
memcpy( m_pszSolarAcceptableMasterList, pszSolarAcceptableMasterList, sizeof(m_pszSolarAcceptableMasterList) );
m_pszSolarAcceptableMasterList[sizeof(m_pszSolarAcceptableMasterList)-1] = _T('\0');
memcpy( m_pszScriptList, pszScriptList, sizeof(m_pszScriptList) );
m_pszScriptList[sizeof(m_pszScriptList)-1] = _T('\0');
//SolarAuthInfoLoader
SolarAuthInfoLoaderHandle->Load( m_pszSolarAuthInfo );
return TRUE;
}
BOOL ScriptLoadManager::LoadSolarAuthInfo( BOOL bReload )
{
if( bReload || !SolarAuthInfoLoaderHandle() )
{
SAFE_DELETE( SolarAuthInfoLoaderHandle.REFERENCE() );
SolarAuthInfoLoaderHandle.REFERENCE() = new SolarAuthInfoLoader();
}
SolarAuthInfoLoaderHandle->Load( m_pszSolarAuthInfo );
//TTT = SolarAuthInfoLoaderHandle->GetInfo();
return TRUE;
}
BOOL ScriptLoadManager::LoadAcceptableMasterServerList( BOOL bReload )
{
if( bReload || !SolarAcceptableMasterServerListLoaderHandle() )
{
SAFE_DELETE( SolarAcceptableMasterServerListLoaderHandle.REFERENCE() );
SolarAcceptableMasterServerListLoaderHandle.REFERENCE() = new SolarAcceptableMasterServerListLoader();
}
SolarAcceptableMasterServerListLoaderHandle->Load( m_pszSolarAcceptableMasterList );
return TRUE;
}
BOOL ScriptLoadManager::LoadData( BOOL bReload )
{
if( bReload || !ScriptListLoaderHandle() )
{
SAFE_DELETE( ScriptListLoaderHandle.REFERENCE() );
ScriptListLoaderHandle.REFERENCE() = new ScriptListLoader();
}
ScriptListLoaderHandle->Load( m_pszScriptList );
ScriptListLoaderHandle->LoadDataAll();
return TRUE;
}
BOOL ScriptLoadManager::LoadServerListPerMaster( BOOL bReload )
{
if( bReload || !SolarAcceptableMasterServerListLoaderHandle() )
{
//SAFE_DELETE( ServerListHandle.REFERENCE() );
//ServerListHandle.REFERENCE() = new ServerListFromFile();
}
SolarAcceptableMasterServerListLoaderDelegator& rSERVER_LIST =
SolarAcceptableMasterServerListLoaderHandle;
// 서버 목록 부르는 객체 두개를 택일 할 수 있도록 구현할 것.
ServerListFromFile* pInstance = new ServerListFromFile();
rSERVER_LIST->ForeachServerList(
&ServerListFromFile::LoadDataHandler,
pInstance
);
SAFE_DELETE( pInstance );
return TRUE;
}
// 각 로더로 분산된 것 중 자주 사용되는 것 도출
SCRIPT_LOADER ScriptLoadManager::GetScriptLoaderByKey( CRYPT_KEY_T cryptKey )
{
ScriptLoadManager* pLoadManager = ScriptLoadManager::Instance();
SolarAcceptableMasterServerListLoaderDelegator& rServerListLoader =
pLoadManager->SolarAcceptableMasterServerListLoaderHandle;
SCRIPT_LOADER hScriptLoader = rServerListLoader->GetMasterServerDataByKey( cryptKey );
return hScriptLoader;
}
SCRIPT_LOADER ScriptLoadManager::GetScriptLoaderByIP( DWORD dwIPAddress )
{
ScriptLoadManager* pLoadManager = ScriptLoadManager::Instance();
SolarAcceptableMasterServerListLoaderDelegator& rServerListLoader =
pLoadManager->SolarAcceptableMasterServerListLoaderHandle;
SCRIPT_LOADER hScriptLoader = rServerListLoader->GetMasterServerDataByIP( dwIPAddress );
return hScriptLoader;
}
SCRIPT_DATA_STREAM_DELEGATOR
ScriptLoadManager::GetScriptDataByKey( CRYPT_KEY_T cryptKey, eSCRIPT_CODE scriptCode )
{
SCRIPT_LOADER& hScriptLoader = GetScriptLoaderByKey( cryptKey );
if( hScriptLoader == NULL )
return NULL;
return hScriptLoader->GetScriptDataStream(scriptCode);
}
SCRIPT_DATA_STREAM_DELEGATOR
ScriptLoadManager::GetScriptDataByIP( DWORD dwIPAddress, eSCRIPT_CODE scriptCode )
{
SCRIPT_LOADER& hScriptLoader = GetScriptLoaderByIP( dwIPAddress );
if( hScriptLoader == NULL )
return NULL;
return hScriptLoader->GetScriptDataStream(scriptCode);
}