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

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

	//!	名称取得
	CString GetSettingName() { return "ConnectionManager"; };

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

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


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

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

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


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

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

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


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

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

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

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

/*!
	ノーマルリスナの設定
	Manager

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

	//!	名称取得
	CString GetSettingName() { return "NormalListener"; };

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

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

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

/*!
	SSLリスナの設定
	Manager

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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


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

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

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

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

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



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

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

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

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


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

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

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

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

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

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

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

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

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

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



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

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

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

