// =============================================================================
//  dworld plugin 基本モジュール
// =============================================================================
module plugin_main;

import core.runtime;
import std.c.stdio;
import std.c.stdlib;
import std.string;

import std.stdio;

import dworld.plugin;

/**
 * プラグインのメインクラスをロードして返します.
 * 本メソッドは, dworld.plugin モジュールのメソッドとして下さい.
 */
export Plugin loadPlugin()
{
	return new SamplePlugin();
}


/**
 * Plugin メインクラス.
 */
class SamplePlugin : Plugin
{

	/**
	 * 本プラグインのメジャーバージョンを返します.
	 *
	 * Return:
	 *	Major バージョン
	 */
	public override
	int getMajorVersion() { return 1; }


	/**
	 * 本プラグインのマイナーバージョンを返します.
	 *
	 * Return:
	 *	Minor バージョン
	 */
	public override
	int getMinorVersion() { return 0; }


	/**
	 * プラグイン開始時に呼び出されます.
	 *
	 * Params:
	 *	context = プラグインコンテキスト
	 */
	public override
	void start(PluginContext context)
	{
		writefln("START PLUGIN");
	}


	/**
	 * プラグイン終了時に呼び出されます.
	 *
	 * Params:
	 *	context = プラグインコンテキスト
	 */
	public override
	void stop(PluginContext context)
	{
		writefln("STOP PLUGINS");
	}
}



// -----------------------------------------------------------------------------
//  以下, Windows の場合の DllMain
// -----------------------------------------------------------------------------
version (Windows)
{

import std.c.windows.windows;
extern (Windows)
	BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
	switch (ulReason)
	{
		case DLL_PROCESS_ATTACH:
			debug { printf("DLL_PROCESS_ATTACH\n");	}
			Runtime.initialize();
			break;

		case DLL_PROCESS_DETACH:
			debug { printf("DLL_PROCESS_DETACH\n");	}
			std.c.stdio._fcloseallp = null;				// so stdio doesn't get closed
			Runtime.terminate();
			break;

		case DLL_THREAD_ATTACH:
			debug { printf("DLL_THREAD_ATTACH\n");	}
			break;

		case DLL_THREAD_DETACH:
			debug { printf("DLL_THREAD_DETACH\n");	}
			break;

		default:
	}
	return true;
}
}
