#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);
}


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

	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_BOOL PassCommandLine(CLEAN_STRING s) {
	
	HANDLE hLocalServerReady;
	HANDLE hGlobalServerReady;
	HANDLE hLocalClientReady;
	HANDLE hFileMapping;
	char *b;

	// 1. only to be called for non-first instance of dynamic linker.
	// 2. zero-terminated string.

	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", s->characters );

#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);

	return( CLEAN_TRUE );
}


RESOURCEAPI CLEAN_STRING DoReqS(CLEAN_STRING s) {

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