/*!
	CConnectionThread

	１接続を処理するスレッドの実装
	接続が終了するまで生存するため、KeepAliveにより複数のリクエストを処理する可能性がある
*/

#pragma once
#include "threadskeleton.h"
#include "IServerTool.h"
#include "IClientConnection.h"
#include "IConnectionThreadStatus.h"
#include "CnotextManager.h"
#include "ConnectionControl.h"
#include "IResponse.h"
#include "FilterControl.h"
#include "ResponseControl.h"
#include "IConnectionToolImplement.h"


class CConnectionThread;

/*!
	スレッドマネージャの公開インタフェース
	ワーカスレッド用
*/
class IConnectionThreadParent
{
public:
	virtual ~IConnectionThreadParent(void)
	{
	}

	//!	スレッド終了
	virtual void EndConnection(CConnectionThread *connectionPtr) = 0;

	//!	オーバーロード
	virtual int InOverloadMode() = 0;
};

//!	インターフェース定義
DEFINE_INTERNAL_INTERFACE_NOWRAP(IConnectionThreadParent);

/*!
	ワーカスレッド
*/
class CConnectionThread :
	public CThreadSkeleton, protected IConnectionThreadStatus
{
public:
	CConnectionThread(void);
	virtual ~CConnectionThread(void);

	/////////////////////////////////////////////////////////////////////////////////////
	//	操作
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	int Start(	IServerToolPtr					serverTool,
				IConnectionThreadParentIIPtr	threadManager,
				IConetextGeneIIPtr				contexGene,
				CIClientConnectionWrapper		connection,
				LONG							connectionID);

	//!	停止
	void Stop();

protected:
	/////////////////////////////////////////////////////////////////////////////////////
	//	スレッド関数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	スレッド
	void ThreadMain();

	//!	リクエスト処理
	int OneRequest();

	//!	ヘッダ受信
	void RecvRequestHeader(CConnectionControl &connectionControl, CContext &context, CFilterControl &filters);

	//!	ボディ受信
	void RecvRequestBody(CConnectionControl &connectionControl, CContext &context, CFilterControl &filters, CResponseControl &response);

	//!	ヘッダ送信
	void SendResponseHeader(CConnectionControl &connectionControl, CContext &context, CFilterControl &filters, CResponseControl &response);

	//!	ボディ送信
	void SendResponseBody(CConnectionControl &connectionControl, CContext &context, CFilterControl &filters, CResponseControl &response);

	//!	サーバレスポンスの送信
	void SendServerResponse(CConnectionControl &connectionControl, CContext &context, CFilterControl &filter, CServerResponseException &serverResponseException);

	//!	通信状態の更新
	void UpdateTransInfo(CConnectionControl &connectionControl, CContext &context);

	/////////////////////////////////////////////////////////////////////////////////////
	//	IConnectionThreadStatus
	/////////////////////////////////////////////////////////////////////////////////////
	//!	取得
	IConnectionThreadStatusPtr GetIConnectionThreadStatus() { return this; };

	//!	中断イベント取得
	virtual HANDLE GetBreakEvent() { return CThreadSkeleton::GetBreakEvent(); };

	//!	中断?
	virtual int GetBreak() { return CThreadSkeleton::GetBreak(); };

	//!	処理中のフィルタ情報を設定する
	virtual void SetCurrentModuleFunction(LPCTSTR moduleName, int functionID)
	{
		m_currentModuleName = moduleName;
		m_currentFunctionID = functionID;
	};

	/////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	/////////////////////////////////////////////////////////////////////////////////////
	//!	サーバツール
	IServerToolPtr				m_serverTool;

	//!	スレッドマネージャ
	IConnectionThreadParentIIPtr	m_threadManager;

	//!	コンテキスト生成
	IConetextGeneIIPtr			m_contexGene;

	//!	接続
	CIClientConnectionWrapper	m_connection;

	//!	接続ID
	LONG						m_connectionID;

	//!	モジュール名
	LPCTSTR						m_currentModuleName;

	//!	関数名
	int							m_currentFunctionID;
};

//!	ポインタ型
typedef CSimplePtr<CConnectionThread>	CConnectionThreadPtr;


