/*!
	ManagedInterfaceAccess.h

	管理型インタフェース呼び出しクラス
*/
#pragma once
#include "ManagedInterfaceExchangeInterfaces.h"
#include "ManagedInterfaceAccessArgStack.h"

/*!
	管理型インタフェース呼び出しクラス
	このクラスを継承してアクセスクラスを作る
*/
class CManagedInterfaceAccess :
	public IManagedInterfaceAccess
{
public:
	//!	コンストラクタ
	CManagedInterfaceAccess();
	CManagedInterfaceAccess(IManagedInterfaceMapperPtr mapper, CString ifPath);
	CManagedInterfaceAccess(CManagedInterfaceAccess &other);

	//!	コピー
	void operator=(CManagedInterfaceAccess &other);

	///////////////////////////////////////////////////////////////////
	//	関数実行
	///////////////////////////////////////////////////////////////////
	//!	呼び出し実行
	void Invoke(CString funcName, CManagedInterfaceAccessArgStack &stack);

	//!	関数の存在チェック
	int FunctionIsExist(CString funcName);

	///////////////////////////////////////////////////////////////////
	//	子インタフェース
	///////////////////////////////////////////////////////////////////
	//!	子インタフェース取得
	CManagedInterfaceAccess GetChildInterface(CString ifName);

	//!	子インタフェースのチェック
	int ChildInterfaceIsExist(CString ifName);

protected:
	///////////////////////////////////////////////////////////////////
	//	補助
	///////////////////////////////////////////////////////////////////
	//!	例外チェック
	void CheckAndRelayException(CManagedInterfaceAccessArgStack &stack);

	//!	外部例外チェック
	void CheckAndRelayOtherException(int type, CString &name, CString &info);

	///////////////////////////////////////////////////////////////////
	//	IManagedInterfaceAccess
	///////////////////////////////////////////////////////////////////
	//!	インターフェース取得
	virtual IManagedInterfaceMapperPtr	GetIMappedInterfacePtr()
	{
		return m_mapper;
	};

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

	///////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////
	//!	インタフェース
	IManagedInterfaceMapperPtr		m_mapper;

	//!	パス
	CString							m_ifPath;

	//!	パスバッファ
	CString							m_ifPathBuf;
};


//!	コンストラクタをまとめて定義
#define	MANAGED_INTERFACE_COMMON_CONSTRUCTOR(className)	\
	className(void) {};\
	className(IManagedInterfaceMapperPtr mapper, CString ifPath) : CManagedInterfaceAccess(mapper, ifPath)	{};\
	className(CManagedInterfaceAccess  &other)					 : CManagedInterfaceAccess(other)	{};\
	void operator = (CManagedInterfaceAccess &other)			{ CManagedInterfaceAccess::operator=(other); };

