/*!
	ManagedInterfaceImplement.h - 管理型インタフェース 実装クラスのベースクラス
*/
#pragma once
#include "ManagedInterfaceMapper.h"
#include "ManagedInterfaceImplementArgStack.h"
#include "ServerException.h"

/*!
	管理型インタフェース 実装クラスのベースクラス
*/
class CManagedInterfaceImplement :
	public IManagedInterfaceImplement
{
public:
	virtual ~CManagedInterfaceImplement(void) {}

	///////////////////////////////////////////////////////////////////
	//	インタフェース
	///////////////////////////////////////////////////////////////////
	//!	関数存在確認
	virtual int FunctionIsExist(CString funcName)
	{
		return(Dispatch(funcName, NULL, TRUE) == 0);
	}

	//!	関数の実行
	virtual int Invoke(CString funcName, IManagedInterfaceArgStackPtr args)
	{
		//	例外の中継
		try
		{
			//	実行
			return(Dispatch(funcName, args, FALSE));
		}
		catch(CManagedInterfaceException err)
		{
			args->SetException(err.GetExceptionType(), NULL, NULL);
		}
		catch(CConnectionErrorException err)
		{
			args->SetException(MI_EXCEPTION_TYPE_OTHER_EXCEPTION, "CConnectionErrorException", err.m_errorInfo);
		}
		catch(CServerResponseException err)
		{
			args->SetException(MI_EXCEPTION_TYPE_OTHER_EXCEPTION, "CServerResponseException", err.m_status);
		}

		return(-1);
	}

	///////////////////////////////////////////////////////////////////
	//	オーバーライド
	///////////////////////////////////////////////////////////////////
	//!	実装
	virtual int Dispatch(CString funcName, CManagedInterfaceImplementArgStack args, int checkFunctionExist) = 0;
	
	///////////////////////////////////////////////////////////////////
	//	補助
	///////////////////////////////////////////////////////////////////
	//!	取得
	IManagedInterfaceImplementPtr GetIManagedInterfaceImplement() { return this; };
};
