/*!
	ManagedInterfaceRegister.h - インタフェース登録用クラス
*/
#pragma once


/************************************************************************************************/
//	実装クラス用内部インタフェース
/************************************************************************************************/
/*!
	管理型インタフェースの実装
*/
class IManagedInterfaceImplement
{
public:
	//!	関数存在確認
	virtual int FunctionIsExist(CString funcName) = 0;

	//!	関数の実行
	virtual int Invoke(CString funcName, IManagedInterfaceArgStackPtr args) = 0;
};
//!	ポインタ型
typedef IManagedInterfaceImplement*	IManagedInterfaceImplementPtr;


/*!
	管理型インタフェース登録インタフェース(親)
*/
class IManagedInterfaceRegisterRoot
{
public:
	//!	登録
	virtual int RegisterInterface(CString ifPath, IManagedInterfaceImplementPtr toRegist, int overload) = 0;

	//!	削除
	virtual int UnRegisterInterface(CString ifPath, IManagedInterfaceImplementPtr toUnRegist) = 0;
};
//!	ポインタ型
typedef IManagedInterfaceRegisterRoot*	IManagedInterfaceRegisterRootPtr;


/*!
	管理型インタフェース登録インタフェース
*/
class IManagedInterfaceRegister
{
public:
	//!	登録インタフェース取得
	virtual IManagedInterfaceRegisterRootPtr GetIManagedInterfaceRegisterRootPtr() = 0;

	//!	パス取得
	virtual void GetRegisterPath(IStringPtr path) = 0;
};
//!	ポインタ型
typedef IManagedInterfaceRegister*	IManagedInterfaceRegisterPtr;



/*!
	インタフェース登録用クラス

	GetInterfaceRagister("Tset").RegisterInterface("TestIf", hoge, TRUE);で
	Test::TestIfに登録される
*/
class CManagedInterfaceRegister : public IManagedInterfaceRegister
{
public:
	CManagedInterfaceRegister(void)
	{
		m_mapper = NULL;
	}
	CManagedInterfaceRegister(IManagedInterfaceRegisterRootPtr mapper)
	{
		m_mapper = mapper;
	}
	CManagedInterfaceRegister(IManagedInterfaceRegisterRootPtr mapper, CString path)
	{
		m_mapper = mapper;
		m_ifPath = path;
	}
	CManagedInterfaceRegister(const CManagedInterfaceRegister &other)
	{
		m_mapper = other.m_mapper;
		m_ifPath = other.m_ifPath;
	}

	//!	ここにインタフェースを登録する
	virtual int RegisterInterface(CString ifName, IManagedInterfaceImplementPtr toRegit, int overload)
	{
		ASSERT(m_mapper != NULL);
		return(m_mapper->RegisterInterface(m_ifPath + "::" + ifName, toRegit, overload));
	}

	//!	インタフェースの登録を解除する
	virtual int UnRegisterInterface(CString ifName, IManagedInterfaceImplementPtr toUnRegit)
	{
		ASSERT(m_mapper != NULL);
		return(m_mapper->UnRegisterInterface(m_ifPath + "::" + ifName, toUnRegit));
	}

	//!	下層のインタフェース登録クラスを取得
	virtual CManagedInterfaceRegister GetChildInterface(CString parentIfName)
	{
		ASSERT(m_mapper != NULL);
		return(CManagedInterfaceRegister(m_mapper, m_ifPath + "::" + parentIfName));
	}


protected:
	///////////////////////////////////////////////////////////////////
	//	IManagedInterfaceRegister
	///////////////////////////////////////////////////////////////////
	//!	登録インタフェース取得
	virtual IManagedInterfaceRegisterRootPtr GetIManagedInterfaceRegisterRootPtr()
	{
		return m_mapper;
	};

	//!	パス取得
	virtual LPCSTR GetRegisterPath()
	{
		return m_ifPath.GetBuffer(0);
	};

protected:
	///////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////
	//!	マッパ
	IManagedInterfaceRegisterRootPtr	m_mapper;

	//!	パス
	CString								m_ifPath;
};

