#include <windows.h>
#include <commctrl.h>

#include "global.h"
#include "..\DynamicLink\serverblock.h"
#include "..\ClientChannel\channel.h"
#include "DynamicLink.h"
#include "utilities.h"

BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) {

	switch(fdwReason) {
	case DLL_PROCESS_ATTACH:
		hin = hinstDLL;

		EmptyCleanString = (CLEAN_STRING) rmalloc( sizeof(int) + 1);
		EmptyCleanString->length = 0;

		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return(TRUE);
}

int FirstInstanceOfServer2(int firstinstance) {
	
	HANDLE hLocalServerReady;
	HANDLE hGlobalServerReady;
	HANDLE hLocalClientReady;
	HANDLE hFileMapping;
	char *b;

//	__asm int 3

	if( !firstinstance ) {

		hLocalServerReady = CreateEvent( NULL, FALSE, FALSE, LOCAL_SERVER_READY_NAME);
		if( hLocalServerReady == NULL ) {
			error();
			msg( "FirstInstanceOfServer: hLocalServerReady" );
			ExitProcess(-1);
		}

		hGlobalServerReady = CreateEvent( NULL, FALSE, TRUE, GLOBAL_SERVER_READY_NAME);
		if( hGlobalServerReady == NULL ) {
			error();
			msg( "FirstInstanceOfServer: hGlobalServerReady" );
			ExitProcess(-1);
		}

		hLocalClientReady = CreateEvent( NULL, FALSE, FALSE, LOCAL_CLIENT_READY_NAME);
		if( hLocalClientReady == NULL ) {
			error();
			msg( "FirstInstanceOfServer: hLocalClientReady" );
			ExitProcess(-1);
		}
	
		// Open buffer
		hFileMapping = CreateFileMapping( (HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,MESSAGE_SIZE,GLOBAL_BUFFER_NAME);
		if( hFileMapping == NULL ) {
			error();
			msg( "FirstInstanceOfServer: hFileMapping" );
			ExitProcess(-1);
		}

		b = (char *) MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, MESSAGE_SIZE);
		if( b == NULL ) {
			error();
			msg( "FirstInstanceOfServer: MapViewOfFile" );
			ExitProcess(-1);
		}

		// Communicate with server
		WaitForSingleObject( hGlobalServerReady, INFINITE );


		*((DWORD *) (b + GLOBAL_BUFFER_START)) = UNKNOWN_CLIENT_ID;
//		rsprintf( (b + sizeof(DWORD) + GLOBAL_BUFFER_START), "AddClient\n%s\n\n", GetCommandLine() );
		rsprintf( (b + sizeof(DWORD) + GLOBAL_BUFFER_START), "MessageFromSecondOrLaterLinker\n%s\n\n", GetCommandLine() );

#ifdef DEBUG
		msg( (b + sizeof(DWORD) + GLOBAL_BUFFER_START) );
#endif

		// Send to server
		SetEvent( hLocalClientReady );

		// Wait for server to process request
		WaitForSingleObject( hLocalServerReady, INFINITE );

		// Quit instance, close all open handles
		UnmapViewOfFile( b );
		CloseHandle( hFileMapping );
		CloseHandle( hLocalClientReady );
		CloseHandle( hGlobalServerReady );
		CloseHandle( hLocalServerReady );

		ExitProcess(-1);

	} /* if */ 

	return( CLEAN_TRUE );
}



RESOURCEAPI CLEAN_STRING DoReqS(CLEAN_STRING s) {

	msg( "DoReqS should not be called in Server" );
}
