#pragma once
#include "IManagerInterface.h"
#include "ServerToolWrap.h"
#include "SyncObject.h"

/*!
	インターフェースマネージャ
*/
class CInterfaceManager
{
public:
	CInterfaceManager(void);
	virtual ~CInterfaceManager(void);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	void Start(CIServerToolWrap serverTool);

	//!	停止
	void Stop();

	//!	インタフェース登録
	int RegisterInterface(CString interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface = NULL);

	//!	インターフェース登録解除
	int UnRegisterInterface(CString interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface = NULL);

	//!	インタフェース取得
	void *GetInterface(CString interfaceName, int ifVersion);

protected:
	/////////////////////////////////////////////////////////////////////////////////
	//	補助関数
	/////////////////////////////////////////////////////////////////////////////////
	//!	インタフェース登録
	int _RegisterInterface(CString interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface = NULL);

	//!	検索
	int FindIndex(CString ifName);

	/////////////////////////////////////////////////////////////////////////////////
	//	内部クラス
	/////////////////////////////////////////////////////////////////////////////////
	class CRegisterdInterface
	{
	public:
		CRegisterdInterface() {};
		CRegisterdInterface(CString interfaceName, IManagerInterfacePtr ifRegister)
		{
			m_interfaceName = interfaceName;
			m_interface = ifRegister;
		};

		//!	インターフェース名
		CString					m_interfaceName;

		//!	インターフェース
		IManagerInterfacePtr	m_interface;
	};
	class CRegisterdInterfaceArray : public CArray<CRegisterdInterface> {};

	/////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////
	//!	初期化フラグ
	CInterlockCounter			m_init;

	//!	クリティカルセクション
	CCriticalSection			m_scopeLock;

	//!	保存中のインタフェース
	CRegisterdInterfaceArray	m_ifArray;
};

