#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 "InterfaceManager.h"
#include "SupportManagers.h"


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

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

	//!	デバッグ
	void Dump();

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

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

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

	//!	コンテキスト取得
	virtual void DuplicateCurrentContext(CWorkspace &contextRoot);

	//!	サーバステータス取得
	virtual void DuplicateServerStatus(CWorkspace &statusRoot);


	/////////////////////////////////////////////////////////////////////////////////////////////////
	//	IServerTool
	/////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバステータスの変更
	virtual void WriteSystemLog(LPCSTR callerName, int logType, LPCSTR logString);

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

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


	//!	ワークスペースへのアクセスを取得
	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;

	//!	補助マネージャ
	CSupportManagers		m_supportManagers;


	//!	リスナ
	CListenerManager		m_listenerManager;

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

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

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


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