#pragma once
#include "Buffer.h"
#include "SyncObject.h"
#include "IntervalTimer.h"
#include "OverlapedPipe.h"

class CCommandRecvPipe;
class CPipeServer;

/*!
	パイプコマンド処理ベース
*/
class CPipeCommandExecuteBase
{
	friend class CCommandRecvPipe;

protected:
	//!	コマンド実行
	virtual int OnRecvCommand(CBuffer &recvData, CBuffer &sendData) = 0;
};

/*!
	コマンド受信パイプ

	CPipeServerから呼び出される。
	1クライアント分のパイプを処理するが、CPipeServerのIOCPとスレッドで動作する。
*/
class CCommandRecvPipe : public COverlapedPipe
{
public:
	CCommandRecvPipe(void);
	virtual ~CCommandRecvPipe(void);

	//////////////////////////////////////////////////////////////////////////////////////////
	//	操作
	//////////////////////////////////////////////////////////////////////////////////////////
	//!	初期化
	int Init(CPipeServer *reciver, CPipeCommandExecuteBase *executer, HANDLE pipe, ULONG_PTR CompletionKey);

	//!	終了
	void Close();

	//!	処理
	int PipeTask();

	//!	切断チェック
	int CheckDisconnect();

protected:
	//////////////////////////////////////////////////////////////////////////////////////////
	//	内部関数
	//////////////////////////////////////////////////////////////////////////////////////////
	//!	ウェルカムメッセージ生成
	int BuildWelcomeMessage(CBuffer &sendData);

	//!	コマンド実行
	int OnRecvCommand(CBuffer &recvData, CBuffer &sendData);

	//////////////////////////////////////////////////////////////////////////////////////////
	//	メンバ変数
	//////////////////////////////////////////////////////////////////////////////////////////
	//!	ステータス
	int						m_status;

	//!	サーバ
	CPipeServer		*m_reciver;

	//!	コマンド実行クラス
	CPipeCommandExecuteBase	*m_executer;
};

