/*
	ZazouMiniWebServer

	Copyright (C) 2003-2009 Xavier Garreau <xavier@xgarreau.org>

	This file is part of ZazouMiniWebServer.

    ZazouMiniWebServer is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    ZazouMiniWebServer is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ZazouMiniWebServer; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
*/

// ZazouMiniWebServerDll.cpp : définit le point d'entrée pour l'application DLL.
//

#include "stdafx.h"
#include "ZazouMiniWebServerDll.h"
#include <zmws.h>
#include <zmwssapi.h>

static ZMWS theServer = ZMWS::GetInstance();

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
    return TRUE;
}

extern "C" {
	ZMWS_EXPORT int __cdecl zmws_easy_start () {
		return theServer.StartServer (0, NULL);
	}

	ZMWS_EXPORT int __cdecl zmws_get_port () {
		CBaseZMWSConfig aConfig;
		int port;

		theServer.GetConfig (&aConfig);
		port = aConfig.port;
		theServer.FreeConfig(&aConfig);
		return port;
	}

	ZMWS_EXPORT int __cdecl zmws_start (int argc, char** argv) {
		return theServer.StartServer (argc, argv);
	}

	ZMWS_EXPORT int __cdecl zmws_start_with_config_file (const char* config_file_path) {
		int res;
		int argc;
		char** argv;
		
		argc = 3;
		argv = (char**)malloc(argc*sizeof(char*));
		if (!argv) return 0;

		argv[0] = NULL;
		argv[1] = strdup("-conf");
		if (!argv[1]) return 0;
		argv[2] = strdup(config_file_path);
		if (!argv[2]) return 0;
		
		res = theServer.StartServer (argc, argv); 
		
		free(argv[1]);
		free(argv[2]);
		free(argv);

		return res;
	}

	ZMWS_EXPORT void __cdecl zmws_wait () {
		theServer.WaitForShutDown ();
	}

	ZMWS_EXPORT void __cdecl zmws_stop () {
		theServer.StopServer ();
		print_dbg (NULL, OPER_DELETE);
	}

	ZMWS_EXPORT void __cdecl zmws_stop_and_wait () {
		theServer.StopServer ();
		theServer.WaitForShutDown ();
		print_dbg (NULL, OPER_DELETE);
	}

	ZMWS_EXPORT void __cdecl zmws_get_config (CBaseZMWSConfig* base_config) {
		theServer.GetConfig (base_config);
	}

	ZMWS_EXPORT void __cdecl zmws_free_config (CBaseZMWSConfig* base_config) {
		theServer.FreeConfig (base_config);
	}

	ZMWS_EXPORT void __cdecl zmws_browse () {
		theServer.BrowseNow ();
	}

	ZMWS_EXPORT const char* __cdecl zmws_get_version () {
		return theServer.GetVersion ();
	}

	ZMWS_EXPORT const char* __cdecl zmws_get_ips () {
		return theServer.GetIPs ();
	}

	ZMWS_EXPORT BOOL __cdecl zmws_configure () {
		return theServer.Configure (NULL);
	}

	ZMWS_EXPORT BOOL __cdecl zmws_configure_with_config_file (const char* config_file_path) {
		return theServer.Configure (config_file_path);
	}

	ZMWS_EXPORT void __cdecl zmws_sapi_data_cleanup (void* data) {
		ZMWSSAPI::DataCleanup((ZMWSSAPI_DATA*)data);
	}


	// Dangerous !!!
	// if var is an invalid pointer ==> crash
	ZMWS_EXPORT const int __cdecl zmws_strlen (const char* var) {
		if (!var) {
			return 0;
		}

		return strlen (var);
	}
}
