#pragma once

#include "IServerTool.h"
#include "SettingManager.h"
#include "NewConnectionQueue.h"
#include "ListenerManager.h"
#include "ConnectionManager.h"
#include "ServerStatusManager.h"
#include "ResponseManager.h"
#include "FilterManager.h"
#include "PathManager.h"
#include "MimeTypeManager.h"
#include "LogManager.h"
#include "ServerTextManager.h"
#include "ServerInfoManager.h"
#include "CGIManager.h"
#include "InterfaceManager.h"

class CServer : protected IServerTool, protected IServerControl
{
public:
	CServer(void);
	virtual ~CServer(void);

	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース取得
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	IServerControlインターフェースを取得
	IServerControlPtr GetIServerControl() { return this; };

protected:
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	インターフェース取得
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	IServerToolインターフェースを取得
	IServerToolPtr GetIServerTool() { return this; };

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

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

	//!	現在の接続ステータス取得
	virtual CWorkspaceAccess GetConnectionInfo() { return CWorkspaceAccess(); };


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	IServerTool
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバステータスの変更
	virtual void WriteSystemLog(LPCSTR callerName, int statusCode, LPCSTR statusInfo, int autoOffTime = -1);

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

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

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

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

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

	//!	インタフェース名を指定して取得
	virtual void *GetManagerInterface(LPCSTR managerName, int interfaceVersion);


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	下位クラス
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	インタフェースマネージャ
	CInterfaceManager		m_interfaceManager;

	//!	設定マネージャ
	CSettingManager			m_settingManager;

	//!	ステータスマネージャ
	CServerStatusManager	m_statusManager;

	//!	サーバ情報マネージャ
	CServerInfoManager		m_serverInfoManager;


	//!	リスナ
	CListenerManager		m_listenerManager;

	//!	レスポンスマネージャ
	CResponseManager		m_responseManager;

	//!	フィルタマネージャ
	CFilterManager			m_filterManager;

	//!	接続マネージャ
	CConnectionManager		m_connectionManager;


	//!	パスマネージャ
	CPathManager			m_pathManager;

	//!	MimeTypeマネージャ
	CMimeTypeManager		m_mineTypeManager;

	//!	CGIマネージャ
	CCGIManager				m_cgiManager;

	//!	サーバテキストマネージャ
	CServerTextManager		m_serverTextManager;

	//!	アクセスログマネージャ
	CLogManager				m_logManager;


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバ実行中
	CInterlockCounter		m_serverRunning;
};
