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

#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
{
	SERVER_STATUS_NORMAL		= 10,
	SERVER_STATUS_NORMAL_LOG	= 0,
	SERVER_STATUS_WARNING		= -10,
	SERVER_STATUS_ERROR			= -20,
	SERVER_STATUS_FATAL_ERROR	= -30,
};


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

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

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

	//!	サーバステータスの変更
	virtual void SetServerStatusStr(LPCSTR statusName, LPCSTR status, LPCSTR statusInfo = "") = 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;
};
//!	ポインタ型
typedef IServerControl* IServerControlPtr;
