//
// Common functions for Object DLL capabilities
// C. Beaudet
//
#include "stdafx.h"

#include "afxdllx.h"    
#include "ACP_Base.h"
#include "ITF.h"
#include "IncMEC.h"
#define D_State_Define
#include "IncGAM.h"
#undef D_State_Define
#include "GLI.h"

#include "_IADItrf.hpp"
#include "IADStrg.hpp"


//------------------------------------------------------------------------
// Global vars
static CList<CPA_DLLBase*,CPA_DLLBase*> g_oListOfInstances;	//private internal

static char		*gs_p_szCPAVersion = C_szCPAVersion;
static AFX_EXTENSION_MODULE NEAR    extensionDLL = { NULL, NULL };

#ifdef DLL_ONLY_ONE_INSTANCE
static IAD_Interface *gs_p_oIADInterface = NULL;
#endif 

//------------------------------------------------------------------------
// functions that are present in all DLL :
//------------------------------------------------------------------------

//========================================================================
// Get current CPA version
//========================================================================
extern "C" char __declspec(dllexport) *fn_p_szGetCPAVersion(void)
{
	return gs_p_szCPAVersion;
}

//========================================================================
// Get type of this DLL
//========================================================================
extern "C" tdstDLLIdentity __declspec(dllexport) *fn_p_stGetDLLIdentity(void)
{
	g_stIADDLLIdentity.eType = TOOL_DLL;
	g_stIADDLLIdentity.csName = "IA_Debugger";
	g_stIADDLLIdentity.hModule = NULL;
	g_stIADDLLIdentity.p_oListOfInstances = &g_oListOfInstances;

	return &g_stIADDLLIdentity;
}

//========================================================================
// DLL int function
//========================================================================
extern "C" void __declspec(dllexport) fn_vInitDll(void)
{
	new CDynLinkLibrary(extensionDLL);
}

//========================================================================
// DLL entry point
//========================================================================
extern "C" int __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		if (!AfxInitExtensionModule(extensionDLL, hInstance))
		   return 0;
	}
	return 1;
}

//========================================================================
// Get the DLL
//========================================================================
extern "C" CPA_DLLBase __declspec(dllexport) *fn_p_oGetDLL(long lKey)
{
#ifdef DLL_ONLY_ONE_INSTANCE

	switch(lKey)
	{
	case 0:	// the game world
		if (gs_p_oMYTOOLInterface == NULL)
		{
			gs_p_oIADInterface = new IAD_Interface();
			ASSERT(gs_p_oIADInterface != NULL);
			// YB //
			g_pclInterface = gs_p_oIADInterface;
			// End YB //
		}
		return gs_p_oIADInterface;
		break;

	default:
		return NULL;
	}

#else //DLL_ONLY_ONE_INSTANCE

	switch(lKey)
	{
	case 0:	// the game world
		// YB //
		g_pclInterface = new IAD_Interface();
		return g_pclInterface;
		// End YB //
		break;

	default:
		return NULL;
	}

#endif //DLL_ONLY_ONE_INSTANCE
}


//------------------------------------------------------------------------
// functions that are present in this type of DLL only :
//------------------------------------------------------------------------

#undef DLL_ONLY_ONE_INSTANCE
