/*!
	ManagedInterfaceExchangeInterfaces.h - 管理型インタフェース受け渡し用インタフェース

	仕様が固定されているインタフェース
	ここに宣言されているインタフェースは、今後変更されない。
*/
#pragma once
#include "ManagedInterfaceBasicInterfaces.h"

////////////////////////////////////////////////////////////////////////////////////////////////////////
//	定数定義
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	引数の型宣言
*/
enum MI_ARG_TYPE
{
	MI_ARG_TYPE_NODATA				= 0000,

	MI_ARG_TYPE_INT					= 1000,
	MI_ARG_TYPE_INT_REFERENCE		= 1001,

	MI_ARG_TYPE_INT64				= 1010,
	MI_ARG_TYPE_INT64_REFERENCE		= 1011,

	MI_ARG_TYPE_STR					= 1020,
	MI_ARG_TYPE_STR_REFERENCE		= 1021,

	MI_ARG_TYPE_BINARY				= 1030,
	MI_ARG_TYPE_BINARY_REFERENCE	= 1031,

	MI_ARG_TYPE_WORKSPACE			= 1040,
	MI_ARG_TYPE_WORKSPACE_REFERENCE	= 1041,
};

/*!
	例外の型宣言
*/
enum MI_EXCEPTION_TYPE
{
	MI_EXCEPTION_TYPE_NOEXCEPTION		= 0000,

	////////////////////////////////////////////////////////////////////
	//	呼び出し時の例外
	////////////////////////////////////////////////////////////////////
	//	引数異常
	MI_EXCEPTION_TYPE_INVALID_ARG		= 1000,

	//	パス名異常
	MI_EXCEPTION_TYPE_INVALID_IFPATH	= 2000,

	//	関数名異常
	MI_EXCEPTION_TYPE_INVALID_FUNC		= 3000,

	////////////////////////////////////////////////////////////////////
	//	例外中継用
	////////////////////////////////////////////////////////////////////
	//	外部例外
	MI_EXCEPTION_TYPE_OTHER_EXCEPTION	= 100000,
};



////////////////////////////////////////////////////////////////////////////////////////////////////////
//	ManagedInterface 受け渡しインタフェース
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*!
	マネージャの関数呼び出し用引数
	関数呼び出し側がインスタンスを持つ、すべてポインタ型

	関数呼び出し中に例外が発生すると、SetExceptionが呼び出され、例外状況が設定される
	呼び出し側は、必要に応じて再度例外を発生させ、例外を処理する（DLL対策）

	index = 0 は、関数戻り値
*/
class IManagedInterfaceArgStack
{
public:
	////////////////////////////////////////////////////////////////////
	//	引数受け渡し用
	////////////////////////////////////////////////////////////////////
	//!	引数の個数取得
	virtual int GetArgCount() = 0;

	//!	指定した引数の型取得
	virtual int GetArgType(int index) = 0;

	//!	取得
	virtual void *GetArgPtr(int index) = 0;

	////////////////////////////////////////////////////////////////////
	//	例外処理用
	////////////////////////////////////////////////////////////////////
	//!	例外を設定
	virtual void SetException(int tyep, LPCSTR name, LPCSTR info) = 0;

};
//!	ポインタ型
typedef IManagedInterfaceArgStack*	IManagedInterfaceArgStackPtr;


/*!
	汎用インタフェース受け渡し用
*/
class IManagedInterfaceMapper
{
public:
	//!	インタフェース存在確認
	virtual int InterfaceIsExist(LPCSTR interfacePath) = 0;

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

	//!	関数の実行
	virtual int Invoke(LPCSTR interfacePath, LPCSTR funcName, IManagedInterfaceArgStackPtr args) = 0;
};
//!	ポインタ型
typedef IManagedInterfaceMapper*	IManagedInterfaceMapperPtr;



/*!
	CInterfaceAccessの受け渡し用クラス
*/
class IManagedInterfaceAccess
{
public:
	//!	インターフェース取得
	virtual IManagedInterfaceMapperPtr	GetIMappedInterfacePtr() = 0;

	//!	パス取得
	virtual LPCSTR GetInterfacePath() = 0;
};
//!	ポインタ型
typedef IManagedInterfaceAccess*	IManagedInterfaceAccessPtr;



