/*!
	CContext

	リクエスト処理用作業領域
	リクエストやレスポンス情報等は、このクラスに格納されてやり取りされる
	サーバコントローラの詳細表示は、このクラスの内容を使用して行われる
*/

#pragma once
#include "workspaceaccess.h"
#include "WorkspaceStringList.h"
#include "WorkspaceListAccess.h"
#include "PathInfo.h"



class CContextClientInfo :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextClientInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	基本情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	クライアントIP
	DEFINE_PROPERTY_METHOD_STR(ClientIP, "ClientIP", "");

	//!	クライアント名
	DEFINE_PROPERTY_METHOD_STR(ClientHost, "ClientHost", "");

	//!	クライアントポート
	DEFINE_PROPERTY_METHOD_INT(ClientPort, "ClientPort", 0);

	//!	受付ポート
	DEFINE_PROPERTY_METHOD_INT(AcceptedPort, "AcceptedPort", 0);
};



/*!
	日時
*/
class CContextDate :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextDate);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	基本情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	日
	DEFINE_PROPERTY_METHOD_STR(Date, "Date", "");

	//!	時
	DEFINE_PROPERTY_METHOD_STR(Time, "Time", "");

	//!	GMT
	DEFINE_PROPERTY_METHOD_STR(GMT, "GMT", "");

	//!	INT64
	DEFINE_PROPERTY_METHOD_INT64(TIME_T, "TIME_T", 0);
};


/*!
	リクエストオプション
*/
class CContextRequestOption :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextRequestOption);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	基本情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	Content-Length
	DEFINE_PROPERTY_METHOD_INT64(ContentLength, "Content-Length", 0);

	//!	Connection
	DEFINE_PROPERTY_METHOD_STR(Connection, "Connection", "");

	//!	Host
	DEFINE_PROPERTY_METHOD_STR(Host, "Host", "");

	//!	Range
	DEFINE_PROPERTY_METHOD_STR(Range, "Range", "");

	//!	If-None-Match
	DEFINE_PROPERTY_METHOD_STR(IfNoneMatch, "If-None-Match", "");

	//!	If-Modified-Since
	DEFINE_PROPERTY_METHOD_STR(IfModifiedSince, "If-Modified-Since", "");
};


/*!
	リクエスト情報
*/
class CContextRequestInfo :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextRequestInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	リクエスト情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	Method
	DEFINE_PROPERTY_METHOD_STR(Method, "Method", "");

	//!	URL
	DEFINE_PROPERTY_METHOD_STR(URL, "URL", "");

	//!	Object
	DEFINE_PROPERTY_METHOD_STR(Object, "Object", "");

	//!	Version
	DEFINE_PROPERTY_METHOD_STR(Version, "Version", "");

	//!	Query
	DEFINE_PROPERTY_METHOD_STR(Query, "Query", "");

	//!	QueryDecoded
	DEFINE_PROPERTY_METHOD_STR(QueryDecoded, "QueryDecoded", "");

	//!	User
	DEFINE_PROPERTY_METHOD_STR(User, "User", "");

	//!	Passwd
	DEFINE_PROPERTY_METHOD_STR(Passwd, "Passwd", "");

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	オプション
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	オプション取得
	CContextRequestOption GetRequestOption()	{ return GetAccess("Options"); };
};


/*!
	レスポンスオプション
*/
class CContextResponseOption :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextResponseOption);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	基本情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	Date
	DEFINE_PROPERTY_METHOD_STR(Date, "Date", "");

	//!	Content-Length
	DEFINE_PROPERTY_METHOD_INT64(ContentLength, "Content-Length", 0);

	//!	Content-Type
	DEFINE_PROPERTY_METHOD_STR(ContentType, "Content-Type", "");

	//!	Connection
	DEFINE_PROPERTY_METHOD_STR(Connection, "Connection", "");

	//!	Keep-Alive
	DEFINE_PROPERTY_METHOD_STR(KeepAlive, "Keep-Alive", "");

	//!	Server
	DEFINE_PROPERTY_METHOD_STR(Server, "Server", "");

	//!	ETag
	DEFINE_PROPERTY_METHOD_STR(ETag, "ETag", "");

	//!	Content-Range
	DEFINE_PROPERTY_METHOD_STR(ContentRange, "Content-Range", "");

	//!	Accept-Ranges
	DEFINE_PROPERTY_METHOD_STR(AcceptRanges, "Accept-Ranges", "");

	//!	Last-Modified
	DEFINE_PROPERTY_METHOD_STR(LastModified, "Last-Modified", "");
};


/*!
	レスポンス情報
*/
class CContextResponseInfo :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextResponseInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	ResponseCode
	DEFINE_PROPERTY_METHOD_INT(ResponseCode, "ResponseCode", 500);

	//!	ResponseText
	DEFINE_PROPERTY_METHOD_STR(ResponseText, "ResponseText", "");

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	オプション
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	オプション取得
	CContextResponseOption GetResponseOption()	{ return GetAccess("Options"); };

	//!	CGI用ヘッダ
	DEFINE_PROPERTY_METHOD_STR(CGIHeader, "CGIHeader", "");
};


/*!
	ターゲット情報
*/
class CContextTargetInfo :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextTargetInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	パス情報
	CPathInfo GetPathInfo() { return GetAccess("PathInfo"); };

	//!	ターゲット
	DEFINE_PROPERTY_METHOD_STR(Target, "Target", "");

	//!	ターゲットは存在するか？
	DEFINE_PROPERTY_METHOD_INT(TargetIsExist, "TargetIsExist", 0);

	//!	ターゲットはディレクトリ？
	DEFINE_PROPERTY_METHOD_INT(TargetIsDirectory, "TargetIsDirectory", 0);

	//!	ターゲットは非表示？
	DEFINE_PROPERTY_METHOD_INT(TargetIsHidden, "TargetIsHidden", 0);
};


/*!
	KeepAlive情報
*/
class CContextKeepAliveInfo :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContextKeepAliveInfo);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	レスポンス情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	有効？(基本的に、有効にするのはKeepAliveフィルタのみ)
	DEFINE_PROPERTY_METHOD_INT(EnableKeepAlive, "EnableKeepAlive", FALSE);

	//!	可能？（いろいろなフィルタが無効に）
	DEFINE_PROPERTY_METHOD_INT(CanReuseConnection, "CanReuseConnection", TRUE);
};



/*!
	コンテキスト
*/
class CContext :
	public CWorkspaceAccess
{
public:
	//!	色々まとめて宣言
	DEFINE_COMMON_CONSTRUCTOR(CContext);

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	基本情報
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	名前
	DEFINE_PROPERTY_METHOD_STR(Name, "Name", "");

	//!	使用した接続ID
	DEFINE_PROPERTY_METHOD_INT(ConnectionID, "ConnectionID", 0);

	//!	生成日時
	CContextDate GetStartTime() { return GetAccess("StartTime"); };
	
	//!	終了日時
	CContextDate GetEndTime()	{ return GetAccess("EndTime"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	下位アクセス
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	クライアント情報取得
	CContextClientInfo GetClientInfo()	{ return GetAccess("ClientInfo"); };

	//!	リクエスト情報
	CContextRequestInfo GetRequestInfo() { return GetAccess("RequestInfo");  };

	//!	レスポンス情報
	CContextResponseInfo GetResponseInfo() { return GetAccess("ResponseInfo");  };

	//!	ターゲット情報
	CContextTargetInfo GetTargetInfo() { return GetAccess("TargetInfo");  };

	//!	KeepAlive情報
	CContextKeepAliveInfo GetKeepAliveInfo() { return GetAccess("KeepAliveInfo"); };

	///////////////////////////////////////////////////////////////////////////////////////////////////
	//	ステータス
	///////////////////////////////////////////////////////////////////////////////////////////////////
	//!	状態
	DEFINE_PROPERTY_METHOD_STR(Status, "Status", "");

	//!	処理したレスポンスモジュール名
	DEFINE_PROPERTY_METHOD_STR(ResponseModule, "ResponseModule", "");

	//!	送信サイズ
	DEFINE_PROPERTY_METHOD_INT64(SendSize, "SendSize", 0);

	//!	受信サイズ
	DEFINE_PROPERTY_METHOD_INT64(RecvSize, "RecvSize", 0);
};


