#pragma once
#include "BinaryData.h"
#include "PipePair.h"
#include "Workspace.h"


/*!
	サブプロセス
*/
class CSubProcess
{
public:
	CSubProcess(void);
	virtual ~CSubProcess(void);

	///////////////////////////////////////////////////////////////////////
	//	サブプロセス起動、制御
	///////////////////////////////////////////////////////////////////////
	//!	サブプロセスの起動
	virtual int RunSubProcess(CString command, CString workPath, CString idString);

	//!	プロセスは実行中か？
	virtual int SubProcessIsRunning();

	//!	強制終了
	virtual void TerminateSubProcess();

	///////////////////////////////////////////////////////////////////////
	//	通信
	///////////////////////////////////////////////////////////////////////
	//!	STDINへ出力
	virtual int WriteStdIn(CBinaryData &buf, HANDLE breakEvent, int timeout) { return m_stdIn.Write(buf, breakEvent, timeout); };

	//!	STDOUT読み出し
	virtual int ReadStdOut(CBinaryData &buf, int blockSize, HANDLE breakEvent, int timeout) { return m_stdOut.Read(buf, blockSize, breakEvent, timeout); };

	//!	STDOUT読み出し(非破壊)
	virtual int PeekStdOut(CBinaryData &buf, int blockSize) { return m_stdOut.Peek(buf, blockSize); };

	//!	STDERR読み出し
	virtual int ReadStdErr(CBinaryData &buf, int blockSize, HANDLE breakEvent, int timeout)  { return m_stdErr.Read(buf, blockSize, breakEvent, timeout); };

	//!	STDOUT読み出し(非破壊)
	virtual int PeekStdErr(CBinaryData &buf, int blockSize)  { return m_stdErr.Peek(buf, blockSize); };

	///////////////////////////////////////////////////////////////////////
	//	環境変数
	///////////////////////////////////////////////////////////////////////
	//!	環境変数の追加
	void AddSubProcessEnvironment(CString env);

	//!	環境変数の追加
	void AddSubProcessEnvironmentWorkspace(CWorkspaceAccess workspace);

	//!	クリア
	void ClearSubProcessEnvironment();

protected:
	///////////////////////////////////////////////////////////////////////
	//	補助関数
	///////////////////////////////////////////////////////////////////////
	//!	パイプ準備
	int SetupPipe(CString idString);

	///////////////////////////////////////////////////////////////////////
	//	メンバ変数
	///////////////////////////////////////////////////////////////////////
	//!	StdIn
	CPipePair			m_stdIn;

	//!	StdOut
	CPipePair			m_stdOut;

	//!	StdErr
	CPipePair			m_stdErr;

	//!	プロセス情報
	PROCESS_INFORMATION m_processInfo;

	//!	環境変数
	CBinaryData			m_subProcessEnvironment;

	//!	起動フラグ
	int					m_processCreated;
};
