/*!
	ManagedInterfaceMapper.h - 管理型インタフェース管理クラス

	自由にインタフェースを登録・削除可能でツリー型構造を持つ
	関数は、インターフェースパスと関数名でアクセスする
	以下の例外は正常に管理型インタフェースを超えることが出来る（管理クラスでキャッチされ、呼び出し元で再度スローされる）。
	・CManagedInterfaceException
*/
#pragma once
#include "InternalInterfaceTemplate.h"
#include "ManagedInterfaceExchangeInterfaces.h"
#include "FastReadWriteLock.h"
#include "ManagedInterfaceRegister.h"


/************************************************************************************************/
//	管理型インタフェース　管理クラス
/************************************************************************************************/
/*!
	管理型インタフェース　管理クラス
*/
class CManagedInterfaceMapper :
	public IManagedInterfaceMapper, public IManagedInterfaceRegisterRoot
{
public:
	CManagedInterfaceMapper(void);
	virtual ~CManagedInterfaceMapper(void);

	///////////////////////////////////////////////////////////////////
	//	IMappedInterface(読み込みロック)
	///////////////////////////////////////////////////////////////////
	//!	インタフェース存在確認
	virtual int InterfaceIsExist(LPCSTR interfacePath);

	//!	関数存在確認
	virtual int FunctionIsExist(LPCSTR interfacePath, LPCSTR funcName);

	//!	関数の実行
	virtual int Invoke(LPCSTR interfacePath, LPCSTR funcName, IManagedInterfaceArgStackPtr args);

	///////////////////////////////////////////////////////////////////
	//	IManagedInterfaceRegisterRoot(書き込みロック)
	///////////////////////////////////////////////////////////////////
	//!	登録
	virtual int RegisterInterface(CString ifPath, IManagedInterfaceImplementPtr toRegist, int overload);

	//!	削除
	virtual int UnRegisterInterface(CString ifPath, IManagedInterfaceImplementPtr toUnRegist);

protected:
	///////////////////////////////////////////////////////////////////
	//	補助(配列用クリティカルセクションで保護)
	///////////////////////////////////////////////////////////////////
	//!	追加
	int AddInterface(CString ifPath, IManagedInterfaceImplementPtr regit, int overload);

	//!	インタフェース取得
	IManagedInterfaceImplementPtr GetInterface(CString ifPath);

	//!	削除
	int DeleteInterface(CString ifPath, IManagedInterfaceImplementPtr toUnRegist);

	//!	インタフェース名から検索
	int FindInterface(CString ifPath);

protected:
	///////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////
	//!	クリティカルセクション
	CCriticalSection						m_scopeLock;

	//!	読み書きロック
	CFastReadWriteLock						m_readWriteLock;

	//!	インタフェース名リスト
	CStringArray							m_interfacePath;

	//!	インタフェース実装リスト
	CTypedPtrArray<CPtrArray, IManagedInterfaceImplementPtr>	m_interface;
};
