#include "stdafx.h"
#include "ZMWSSAPI.h"
#ifdef WIN32
#include <process.h>
#endif

ZMWSSAPI::ZMWSSAPI(void) {
	this->module = ::GetModuleHandle (NULL);
}

ZMWSSAPI::~ZMWSSAPI(void) {
}

ZMWSSAPIFN ZMWSSAPI::getFnPointer(std::string fnName) {
	static ZMWSSAPI* zmwssapi = NULL;
	if (!zmwssapi) {
		zmwssapi = new ZMWSSAPI();
	}
	ZMWSSAPIFN zmwssapi_fn;
	if (zmwssapi->zmwssapi_fn_map.find(fnName) != zmwssapi->zmwssapi_fn_map.end()) {
		zmwssapi_fn = zmwssapi->zmwssapi_fn_map[fnName];
	} else {
		zmwssapi_fn = (ZMWSSAPIFN)::GetProcAddress(zmwssapi->module, fnName.c_str());
		if (zmwssapi_fn) {
			zmwssapi->zmwssapi_fn_map[fnName] = zmwssapi_fn;
		}
	}

	return zmwssapi_fn;
}

HANDLE_THREAD ZMWSSAPI::Run (const char* fnName, ZMWSSAPI_DATA* args) 
{
	HANDLE_THREAD hthread = 0;
	ZMWSSAPIFN zmwssapi_fn = ZMWSSAPI::getFnPointer(fnName);
	if (zmwssapi_fn) {
		hthread = (HANDLE_THREAD)_beginthread(zmwssapi_fn, 0, args);
	}
	return hthread;
}

void ZMWSSAPI::DataCleanup (ZMWSSAPI_DATA* dataptr) {
	CloseFile (dataptr->hIN);
	CloseFile (dataptr->hOUT);
	free (dataptr->ENV);
	free (dataptr);
}