/*!
	CContext

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

#pragma once
#include "WorkspaceAccess.h"
#include "WorkspaceListAccess.h"
#include "PathInfo.h"


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

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

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

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

	//!	受付アドレス
	DEFINE_PROPERTY_METHOD_STR(AcceptedAddress, _U8("AcceptedAddress"), _U8(""));

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



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

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

	//!	Protocol
	DEFINE_PROPERTY_METHOD_STR(Protocol, _U8("Protocol"), _U8(""));

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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


	//!	エクストラパス
	DEFINE_PROPERTY_METHOD_STR(ExtraPath, _U8("ExtraPath"), _U8(""));
};




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

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

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

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

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

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

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

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

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

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

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

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


