#include "client.h"

#include "common.h"

global::Client::Client( LPTSTR PipeName )
{
	this->pipe_name = PipeName;
	this->pipe_handle = CreateFile(
		this->pipe_name,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		0,
		NULL
	);

	if ( this->pipe_handle == INVALID_HANDLE_VALUE )
	{
		LOG_ERROR( "CreateFile failed with status 0x%x", GetLastError() );
		return;
	}

	/* test the write function */
	global::headers::PIPE_PACKET_HEADER header;
	header.message_type = REQUEST_PATTERNS_TO_BE_SCANNED;
	this->WriteToPipe( &header, sizeof( global::headers::PIPE_PACKET_HEADER ) );
}

void global::Client::WriteToPipe( PVOID Buffer, SIZE_T Size )
{
	DWORD bytes_written;

	WriteFile(
		this->pipe_handle,
		Buffer,
		Size,
		&bytes_written,
		NULL
	);

	if ( bytes_written == 0 )
	{
		LOG_ERROR( "WriteFile failed with status code 0x%x", GetLastError() );
		return;
	}

	LOG_INFO( "Sent bytes over pipe" );
}

void global::Client::ReadPipe(PVOID Buffer, SIZE_T Size)
{
	BOOL status = FALSE;
	DWORD bytes_read;

	do
	{
		status = ReadFile(
			this->pipe_handle,
			Buffer,
			Size,
			&bytes_read,
			NULL
		);

		if ( !status && GetLastError() != ERROR_MORE_DATA )
			break;

	} while ( !status );

	if ( !status )
	{
		LOG_ERROR( "ReadFile failed with status 0x%x", GetLastError() );
		return;
	}
}