/*!
	設定
*/
#pragma once
#include "Workspace.h"
#include "WorkspaceListAccess.h"
#include "Context.h"
#include "CGICommand.h"
#include "UserInfo.h"

/*****************************************************************************************************/
//	マネージャ
/*****************************************************************************************************/
/*!
	スレッドマネージャの設定
	Manager
*/
class CConnectionThreadManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CConnectionThreadManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ConnectionThreadManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	最大接続数
	DEFINE_PROPERTY_METHOD_INT(MaxConnect,			_U8("MaxConnect"),		100);

	//!	オーバーロードモード持続時間
	DEFINE_PROPERTY_METHOD_INT(OverloadModeKeepTime,	_U8("OverloadModeKeepTime"),		10 * 1000);
};


/*!
	ログマネージャの設定
	Manager
*/
class CLogManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CLogManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("LogManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ログ更新周期
	DEFINE_PROPERTY_METHOD_INT(UpdateInterval,	_U8("UpdateInterval"),	1000);
};


/*!
	システムログマネージャの設定
	Manager
*/
class CSystemLogManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CSystemLogManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("SystemLogManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	システムログパス
	DEFINE_PROPERTY_METHOD_STR(SystemLogFilePath,	_U8("SystemLogFilePath"),	_U8("%ServerRoot%Logs\\SystemLog.txt"));
};


/*!
	リスナマネージャの設定
	Manager
*/
class CListenerManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CListenerManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ListenerManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ノーマルリスナ有効
	DEFINE_PROPERTY_METHOD_INT(EnableNormalListener,	_U8("EnableNormalListener"),	TRUE);

	//!	SSLリスナ有効
	DEFINE_PROPERTY_METHOD_INT(EnableSSLListener,		_U8("EnableSSLListener"),	FALSE);
};

/*!
	IPv4リスナの設定
	Manager

	通常の接続に関する設定を兼ねる
*/
class CIPv4ListenerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CIPv4ListenerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("IPv4Listener"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ポート番号列
	DEFINE_PROPERTY_METHOD_STR(Port,			_U8("Port"),				_U8("80"));		//	"80, 8080, 1080"

	//!	ポートオープンエラー時のリトライ時間
	DEFINE_PROPERTY_METHOD_INT(ListenErrorRetryTime,	_U8("ListenErrorRetryTime"),		10 * 1000);

	//!	通信タイムアウト時間
	DEFINE_PROPERTY_METHOD_INT(ConnectionTimeoutTime,	_U8("ConnectionTimeoutTime"),	3 * 60 * 1000);
};

/*!
	SSLリスナの設定
	Manager

	SSL接続に関する設定を兼ねる
*/
class CSSLListenerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CSSLListenerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("SSLListener"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ポート番号列
	DEFINE_PROPERTY_METHOD_STR(Port,					_U8("Port"),						_U8("443"));		//	"80, 8080, 1080"

	//!	ポートオープンエラー時のリトライ時間
	DEFINE_PROPERTY_METHOD_INT(ListenErrorRetryTime,	_U8("ListenErrorRetryTime"),		10 * 1000);

	//!	通信タイムアウト時間
	DEFINE_PROPERTY_METHOD_INT(ConnectionTimeoutTime,	_U8("ConnectionTimeoutTime"),	3 * 60 * 1000);

	//!	秘密鍵
	DEFINE_PROPERTY_METHOD_STR(PrivateKey,				_U8("PrivateKey"),				_U8("%ServerRoot%SSLKey\\04WebServer.pem"));

	//!	秘密鍵パスワード
	DEFINE_PROPERTY_METHOD_STR(PrivateKeyPassword,		_U8("PrivateKeyPassword"),		_U8("test"));

	//!	サーバ証明書
	DEFINE_PROPERTY_METHOD_STR(Certificate,				_U8("Certificate"),				_U8("%ServerRoot%SSLKey\\04WebServer.crt"));

	//!	中間証明書
	DEFINE_PROPERTY_METHOD_STR(CertificateChain,		_U8("CertificateChain"),			_U8(""));
};


/*!
	コンテキストマネージャの設定
	Manager
*/
class CContextManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CContextManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ContextManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ログ数
	DEFINE_PROPERTY_METHOD_INT(MaxContextLogCount,	_U8("MaxContextLogCount"),	100);
};


/*!
	パスマネージャの設定
	Manager
*/
class CPathManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CPathManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("PathManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	パス設定取得
	CPathInfoList GetPathList() { return GetAccess(_U8("PathList")); };
};


/*!
	Mimeタイプマネージャの設定
	Manager
*/
class CMimeTypeManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CMimeTypeManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("MimeTypeManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	MimeTypeのテキストによる設定項目
	DEFINE_PROPERTY_METHOD_STR(MimeTypeText,				_U8("MimeTypeText"),					_U8(""));

	//!	MimeTypeIconのテキストによる設定項目
	DEFINE_PROPERTY_METHOD_STR(MimeTypeIcocText,			_U8("MimeTypeIconText"),					_U8(""));
};


/*!
	接続コントロールの設定
	Manager
*/
class CConnectionControlSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CConnectionControlSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ConnectionControl"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	MimeTypeのテキストによる設定項目
	DEFINE_PROPERTY_METHOD_INT(BlockSize,				_U8("BlockSize"),					65536);

	//!	MimeTypeIconのテキストによる設定項目
	DEFINE_PROPERTY_METHOD_INT(MaxBufferingSize,		_U8("MaxBufferingSize"),				3 * 1024 * 1024);
};


/*!
	サーバテキストマネージャの設定
	Manager
*/
class CServerTextManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerTextManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ServerTextManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	HTMLフォルダ
	DEFINE_PROPERTY_METHOD_STR(ServerHtmlDirectory,				_U8("ServerHtmlDirectory"),					_U8("%ServerRoot%Html\\"));
};


/*!
	サーバ情報マネージャの設定
	Manager
*/
class CServerInfoManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerInfoManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ServerInfoManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	サーバ名
	DEFINE_PROPERTY_METHOD_STR(ServerName,	_U8("ServerName"),	_U8(""));

	//!	サーババージョン
	DEFINE_PROPERTY_METHOD_STR(ServerVersion,	_U8("ServerVersion"),	_U8(""));

	//!	シグニチャ
	DEFINE_PROPERTY_METHOD_STR(ServerSignature,	_U8("ServerSignature"),	_U8(""));
};



/*!
	ユーザーマネージャの設定
	Manager
*/
class CUserManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CUserManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("UserManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	有効ユーザー
	CUserInfoList GetEnableUserList() { return GetAccess(_U8("EnableUser")); };

	//!	無効ユーザー
	CUserInfoList GetDisableUserList() { return GetAccess(_U8("DisableUser")); };

	//!	グループリスト
	CWorkspaceStringListAccess GetGroupList() { return CWorkspaceStringListAccess(GetAccess(_U8("Group")), _U8("Group")); };
};


/*!
	CGIマネージャの設定
	Manager
*/
class CCGIManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CCGIManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("CGIManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	CGI設定リストの取得
	CCGICommandList GetCGICommandList() { return GetAccess(_U8("CGICommand")); };

	//!	CGIデータ書き込みタイムアウト（サーバ→CGI）
	DEFINE_PROPERTY_METHOD_INT(CGIDataWriteTimeoutTime,	_U8("CGIDataWriteTimeoutTime"),	5 * 1000);

	//!	CGIデータ読み込みタイムアウト（CGI→サーバ）
	DEFINE_PROPERTY_METHOD_INT(CGIDataReadTimeoutTime,	_U8("CGIDataReadTimeoutTime"),	60 * 1000);
};

/*!
	フィルタマネージャの設定
	Manager
*/
class CFilterManagerSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CFilterManagerSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("FilterManager"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	すべての基本フィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisableAllFilter, _U8("DisableAllFilter"), 0);


	//!	ServerInfoフィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisableServerInfoFilter, _U8("DisableServerInfoFilter"), 0);

	//!	Pathフィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisablePathFilter, _U8("DisablePathFilter"), 0);

	//!	Indexフィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisableIndexFilter, _U8("DisableIndexFilter"), 0);

	//!	KeepAliveフィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisableKeepAliveFilter, _U8("DisableKeepAliveFilter"), 0);

	//!	AccessLogフィルタを無効
	DEFINE_PROPERTY_METHOD_INT(DisableAccessLogFilter, _U8("DisableAccessLogFilter"), 0);

};




/*****************************************************************************************************/
//	フィルタ
/*****************************************************************************************************/
/*!
	Indexフィルタの設定
	Filter
*/
class CIndexFilterSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CIndexFilterSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("IndexFilter"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	動作タイプ
	DEFINE_PROPERTY_METHOD_INT(MoveMode,				_U8("MoveMode"),					0);

	//!	インデックスリスト
	CWorkspaceStringListAccess GetIndexList() { return CWorkspaceStringListAccess(GetAccess(_U8("IndexFileList")), _U8("IndexFile")); };
};


/*!
	ログフィルタの設定
	Filter
*/
class CAccessLogFilterSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CAccessLogFilterSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("AccessLogFilter"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	アクセスログパス
	DEFINE_PROPERTY_METHOD_STR(AccessLogFilePath,	_U8("AccessLogFilePath"),	_U8("%ServerRoot%Logs\\%Year%%Month%%Day%.txt"));

	//!	アクセスログフォーマット
	DEFINE_PROPERTY_METHOD_STR(AccessLogFormat,		_U8("AccessLogFormat"),		_U8("[%Time%] <%ClientIP%> (%RecvSize%,%SendSize%) [%Status%] %Method% %Object%"));

	//!	ログに書かないパス
	DEFINE_PROPERTY_METHOD_STR(IgnorePath,			_U8("IgnorePath"),			_U8(""));	//	/icons/*, /private/*
};

/*!
	KeepAliveフィルタの設定
	Filter
*/
class CKeepAliveFilterSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CKeepAliveFilterSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("KeepAliveFilter"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	KeepAlive有効
	DEFINE_PROPERTY_METHOD_INT(EnableKeepAlive,			_U8("EnableKeepAlive"),	1);

	//!	KeepAlive時間
	DEFINE_PROPERTY_METHOD_INT(MaxKeepConnectionTime,	_U8("MaxKeepConnectionTime"),	20 * 1000);

	//!	KeepAlive個数
	DEFINE_PROPERTY_METHOD_INT(MaxKeepConnectionCount,	_U8("MaxKeepConnectionCount"),	2);
};



/*****************************************************************************************************/
//	レスポンス
/*****************************************************************************************************/
/*!
	サーバレスポンスの設定
	Response
	サーバレスポンスはレスポンスモジュールではないが、ここに入れる
*/
class CServerResponseSetting :
	protected CWorkspaceAccess
{
public:
	//	コンストラクタをまとめて定義
	DEFINE_COMMON_CONSTRUCTOR(CServerResponseSetting);

	//!	名称取得
	CUTF8String GetSettingName() { return _U8("ServerResponse"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	プロパティ
	///////////////////////////////////////////////////////////////////////////////////////////////////
};

