#include "StdAfx.h"
#include "InterfaceManager.h"

CInterfaceManager::CInterfaceManager(void)
{
}

CInterfaceManager::~CInterfaceManager(void)
{
	Stop();
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//	操作
///////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	開始
*/
void CInterfaceManager::Start(CIServerToolWrap serverTool)
{
	ASSERT(!m_init);
	m_init = TRUE;
}

/*!
	停止
*/
void CInterfaceManager::Stop()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;

	//	クリア
	m_ifArray.RemoveAll();
}

/*!
	インタフェース登録
*/
int CInterfaceManager::RegisterInterface(CUTF8String interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface)
{
	if(ifRegister == NULL)
		return(-1);

	//	登録
	int ret = _RegisterInterface(interfaceName, ifRegister, oldInterface);

	//	必要なら通知
	if(oldInterface != NULL && *oldInterface != NULL)
		(*oldInterface)->NotifyOverload();

	return(ret);
}

/*!
	インターフェース登録解除
*/
int CInterfaceManager::UnRegisterInterface(CUTF8String interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface)
{
	CRITICAL_SECTION_SCOPE();

	//	検索
	int index = FindIndex(interfaceName);
	if(index == -1)
		return(-1);
	if(m_ifArray[index].m_interface != ifUnRegister)
		return(-1);

	//	書き換え
	if(oldInterface == NULL)
		m_ifArray.RemoveAt(index);
	else
		m_ifArray[index].m_interface = oldInterface;
	return(0);
}

/*!
	インタフェース取得
*/
void *CInterfaceManager::GetInterface(CUTF8String interfaceName, int ifVersion)
{
	CRITICAL_SECTION_SCOPE();

	//	検索
	int index = FindIndex(interfaceName);
	if(index == -1)
		return(NULL);

	return(m_ifArray[index].m_interface->GetInterface(ifVersion));
}


/////////////////////////////////////////////////////////////////////////////////
//	補助関数
/////////////////////////////////////////////////////////////////////////////////
/*!
	インタフェース登録
*/
int CInterfaceManager::_RegisterInterface(CUTF8String interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface)
{
	CRITICAL_SECTION_SCOPE();

	int index = FindIndex(interfaceName);
	if(index != -1)
	{
		//	オーバーロード不能?
		if(oldInterface == NULL)
			return(-1);

		*oldInterface = m_ifArray[index].m_interface;
		m_ifArray[index].m_interface = ifRegister;
	}
	else
	{
		if(oldInterface != NULL)
			*oldInterface = NULL;

		m_ifArray.Add(CRegisterdInterface(interfaceName, ifRegister));
	}
	return(0);
}

/*!
	検索
*/
int CInterfaceManager::FindIndex(CUTF8String ifName)
{
	CRITICAL_SECTION_SCOPE();

	for(int i=0;i<m_ifArray.GetCount();i++)
	{
		if(m_ifArray[i].m_interfaceName == ifName)
			return(i);
	}
	return(-1);
}
