#include "StdAfx.h"
#include "OverlapedPipe.h"
#include "SyncObject.h"

#define	MAX_PACKET_SIZE		(1024 * 1024)

COverlapedPipe::COverlapedPipe(void)
{
	m_hPipe = NULL;
}

COverlapedPipe::~COverlapedPipe(void)
{
	Close();
}


//////////////////////////////////////////////////////////////////////////////////////////
//	操作
//////////////////////////////////////////////////////////////////////////////////////////
/*!
	初期化
*/
int COverlapedPipe::Init(HANDLE pipe, ULONG_PTR CompletionKey)
{
	m_hPipe = pipe;
	m_completeKey = CompletionKey;

	return(0);
}

/*!
	終了
*/
void COverlapedPipe::Close()
{
	SAFE_CLOSE_HANDLE(m_hPipe);
}


//////////////////////////////////////////////////////////////////////////////////////////
//	動作
//////////////////////////////////////////////////////////////////////////////////////////
/*!
	受信開始
*/
int COverlapedPipe::StartWaitRecv()
{
	//	OVRP初期化
	INIT_OVERLAPPED(m_ovrp, NULL);
	
	//	受信準備
	m_recvData.ReSize(MAX_PACKET_SIZE);

	//	受信開始
	if(!ReadFile(m_hPipe, m_recvData.GetPtr(), MAX_PACKET_SIZE, NULL, &m_ovrp))
	{
		//	その他のエラー？
		if(GetLastError() !=  ERROR_IO_PENDING)
		{
			TRACE("error COverlapedPipe::StartWaitRecv : 0x%x\n", GetLastError());
			return(-1);
		}
	}

	m_timer.Reset();
	return(0);
}



/*!
	送信開始
*/
int COverlapedPipe::StartWaitSend()
{
	//	OVRP初期化
	INIT_OVERLAPPED(m_ovrp, NULL);

	//	送信開始
	if(!WriteFile(m_hPipe, m_sendData.GetPtr(), m_sendData.GetSize(), NULL, &m_ovrp))
	{
		//	その他のエラー？
		if(GetLastError() !=  ERROR_IO_PENDING)
		{
			TRACE("error COverlapedPipe::StartWaitSend : 0x%x\n", GetLastError());
			return(-1);
		}
	}

	m_timer.Reset();
	return(0);
}

/*!
	受信完了処理
*/
int COverlapedPipe::EndOverlap()
{
	//	正常終了？
	if(m_ovrp.Internal != ERROR_SUCCESS)
	{
		TRACE("error COverlapedPipe::EndOverlap : 0x%x\n", m_ovrp.Internal);
		return(-1);
	}

	//	サイズ取得
	if(m_ovrp.InternalHigh > MAX_PACKET_SIZE)
		return(-1);
	
	//	サイズを設定
	m_recvData.ReSize((int)m_ovrp.InternalHigh);

	return(0);
}

