/*!
	CConnectionThread

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

#pragma once
#include "ThreadSkeleton.h"
#include "IServerToolWrap.h"
#include "IClientConnection.h"
#include "IConnectionThreadStatus.h"
#include "CnotextManager.h"


class CConnectionThread;

/*!
	スレッドマネージャの公開インタフェース
	ワーカスレッド用
*/
class IConnectionThreadParent
{
public:
	//!	スレッド終了
	virtual void EndConnection(CConnectionThread *connectionPtr) = 0;

	//!	オーバーロード
	virtual int InOverloadMode() = 0;
};
//!	ポインタ型
typedef IConnectionThreadParent* IConnectionThreadParentPtr;


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

	/////////////////////////////////////////////////////////////////////////////////////
	//	操作
	/////////////////////////////////////////////////////////////////////////////////////
	//!	開始
	int Start(	IServerToolPtr				serverTool,
				IConnectionThreadParentPtr	threadManager,
				IConetextGenePtr			contexGene,
				IClientConnectionAutoPtr	connection,
				LONG						connectionID);

	//!	停止
	void Stop();

	//!	削除
	void Delete()
	{
		delete this;
	}

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


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

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

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

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

	//!	接続IDを取得する
	virtual DWORD GetConnectionID() { return m_connectionID; };

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

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

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

	//!	接続
	IClientConnectionAutoPtr	m_connection;

	//!	接続ID
	LONG						m_connectionID;

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

	//!	関数名
	int							m_currentFunctionID;
};

//!	自動ポインタ型
typedef CInterfaceAutoPtr<CConnectionThread>	CConnectionThreadAutoPtr;
