#include "StdAfx.h"
#include "ManagedInterfaceAccess.h"
#include "ServerException.h"


/*!
	コンストラクタ
*/
CManagedInterfaceAccess::CManagedInterfaceAccess()
{
	m_mapper = NULL;
	m_ifPath.Empty();
}

/*!
	コンストラクタ
*/
CManagedInterfaceAccess::CManagedInterfaceAccess(IManagedInterfaceMapperPtr mapper, CString ifPath)
{
	m_mapper = mapper;
	m_ifPath = ifPath;
}

/*!
	コンストラクタ
*/
CManagedInterfaceAccess::CManagedInterfaceAccess(CManagedInterfaceAccess &other)
{
	m_mapper = other.m_mapper;
	m_ifPath = other.m_ifPath;
}

/*!
	コピー
*/
void CManagedInterfaceAccess::operator=(CManagedInterfaceAccess &other)
{
	m_mapper = other.m_mapper;
	m_ifPath = other.m_ifPath;
}


///////////////////////////////////////////////////////////////////
//	関数実行
///////////////////////////////////////////////////////////////////
/*!
	呼び出し実行
*/
void CManagedInterfaceAccess::Invoke(CString funcName, CManagedInterfaceAccessArgStack &stack)
{
	ASSERT(m_mapper != NULL);

	//	呼び出し
	if(m_mapper->Invoke(m_ifPath, funcName, &stack))
		throw CManagedInterfaceException(MI_EXCEPTION_TYPE_INVALID_FUNC);

	//	例外チェック
	CheckAndRelayException(stack);
}

/*!
	関数の存在チェック
*/
int CManagedInterfaceAccess::FunctionIsExist(CString funcName)
{
	ASSERT(m_mapper != NULL);

	//	チェック
	return m_mapper->FunctionIsExist(m_ifPath, funcName);
}

///////////////////////////////////////////////////////////////////
//	子インタフェース
///////////////////////////////////////////////////////////////////
/*!
	子インタフェース取得
*/
CManagedInterfaceAccess CManagedInterfaceAccess::GetChildInterface(CString ifName)
{
	ASSERT(m_mapper != NULL);

	//	存在チェック
	if(!ChildInterfaceIsExist(ifName))
		throw CManagedInterfaceException(MI_EXCEPTION_TYPE_INVALID_IFPATH);

	//	生成
	return CManagedInterfaceAccess(m_mapper, m_ifPath + "::" + ifName);
}

/*!
	子インタフェースのチェック
*/
int CManagedInterfaceAccess::ChildInterfaceIsExist(CString ifName)
{
	ASSERT(m_mapper != NULL);

	//	チェック
	return m_mapper->InterfaceIsExist(m_ifPath + "::" + ifName);
}

///////////////////////////////////////////////////////////////////
//	補助
///////////////////////////////////////////////////////////////////
/*!
	例外チェック
*/
void CManagedInterfaceAccess::CheckAndRelayException(CManagedInterfaceAccessArgStack &stack)
{
	//	例外なし
	if(stack.GetExceptionType() == MI_EXCEPTION_TYPE_NOEXCEPTION)
		return;

	//	インターフェースマッパ例外
	if(stack.GetExceptionType() < MI_EXCEPTION_TYPE_OTHER_EXCEPTION)
		throw CManagedInterfaceException(stack.GetExceptionType());

	//	その他の例外
	CheckAndRelayOtherException(stack.GetExceptionType(), stack.GetExceptionName(), stack.GetExceptionInfo());
}

/*!
	外部例外チェック
	ここは、各ソフトウェアでカスタマイズ
*/
void CManagedInterfaceAccess::CheckAndRelayOtherException(int type, CString &name, CString &info)
{
	if(name == "CConnectionErrorException")
		throw CConnectionErrorException(info);
	else if(name == "CServerResponseException")
		throw CConnectionErrorException("マネージャ内での異常なサーバレスポンス例外が発生しました");
	else
		throw CConnectionErrorException("マネージャ内での異常な例外が発生しました");
}

