/*!
	サーバツールインタフェース
*/

#pragma once
#include "InterfaceWrapperMacro.h"
#include "IManagerInterface.h"
#include "Workspace.h"

#define	MANAGER_SETTING		_T("ManagerSetting")
#define	FILTER_SETTING		_T("FilterSetting")
#define	RESPONSE_SETTING	_T("ResponseSetting")
#define	SERVER_STATUS		_T("ServerStatus")
#define	SERVER_INFO			_T("ServerInfo")

//!	インターフェース宣言
class IPathManager;
class IMimeTypeManager;
class ILogManager;
class IServerTextManager;
class ICGIManager;

typedef IServerTextManager* IServerTextManagerPtr;
typedef ILogManager*		ILogManagerPtr;
typedef IMimeTypeManager*	IMimeTypeManagerPtr;
typedef ICGIManager*		ICGIManagerPtr;

//!	ログタイプ
enum
{
	//!	表示のみ、ファイルには記録されない
	SYSTEM_LOG_INFO				= 100,

	//!	ファイルに記録されるログ
	SYSTEM_LOG_INFO_LOG			= 0,

	//!	警告
	SYSTEM_LOG_WARNING			= -100,

	//!	エラー
	SYSTEM_LOG_ERROR			= -200,

	//!	致命的エラー
	SYSTEM_LOG_FATAL_ERROR		= -300,
};

//!	メッセージタイプ
enum
{
	//!	消去
	SYSTEM_MESSAGE_OFF			= 0,

	//!	青文字
	SYSTEM_MESSAGE_INFO			= 100,

	//!	黄文字
	SYSTEM_MESSAGE_WARNING		= 200,

	//!	赤文字
	SYSTEM_MESSAGE_ERROR		= 300,
};


/*!
	サーバ内部用ツール
*/
class IServerTool
{
public:
	//!	デストラクタ
	virtual ~IServerTool() {};

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	ステータス・ログ
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバログの書き込み
	virtual void WriteSystemLog(LPCSTR callerName, int logType, LPCSTR logString) = 0;

	//!	サーバステータスの変更
	virtual void SetServerStatus(LPCSTR statusName, LPCSTR status, LPCSTR statusInfo = "", LPCSTR statusType = "String") = 0;

	//!	サーバメッセージを通知
	virtual void NotifyServerMessage(LPCSTR messageID, LPCSTR message, int messageType, int autoOffTimeSec = -1) = 0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	ワークスペースへのアクセスを取得
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ワークスペースへのアクセスを取得
	virtual int GetServerWorkspaceAccess(IWorkspaceAccessRefPtr accessRef, LPCSTR type, LPCSTR section) = 0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース管理
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェース登録
	virtual int RegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifRegister, IManagerInterfacePtr *oldInterface = NULL) = 0;

	//!	インターフェース登録解除
	virtual int UnRegisterManagerInterface(LPCSTR interfaceName, IManagerInterfacePtr ifUnRegister, IManagerInterfacePtr oldInterface = NULL) = 0;

	//!	インタフェース取得
	virtual void *GetManagerInterface(LPCSTR interfaceName, int ifVersion) = 0;
};
//!	ポインタ型
typedef IServerTool* IServerToolPtr;



/*!
	サーバ操作用
*/
class IServerControl
{
public:
	//!	デストラクタ
	virtual ~IServerControl() {};

	//!	サーバの開始
	virtual void StartServer() = 0;

	//!	サーバの停止
	virtual void StopServer() = 0;

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//	情報の取得
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//!	コンテキスト取得
	virtual void DuplicateCurrentContext(CWorkspace &contextRoot) = 0;

	//!	サーバステータス取得
	virtual void DuplicateServerStatus(CWorkspace &statusRoot) = 0;
};
//!	ポインタ型
typedef IServerControl* IServerControlPtr;
