text: #include "IPipeServer.h"
  
  IPipeServer::IPipeServer()
  :m_pipe(INVALID_HANDLE_VALUE)
  {
  	//
  }
  
  IPipeServer::~IPipeServer()
  {
  	Close();
  }
  
  bool IPipeServer::Open(const char * name)
  {
  	Close();
  
  	m_pipe = CreateNamedPipe(
  		name,
  		PIPE_ACCESS_DUPLEX | FILE_FLAG_FIRST_PIPE_INSTANCE,
  		PIPE_TYPE_MESSAGE | PIPE_TYPE_MESSAGE | PIPE_WAIT,
  		PIPE_UNLIMITED_INSTANCES,
  		8192, 8192,
  		10 * 1000,	// 10 seconds
  		NULL);
  
  	return m_pipe != INVALID_HANDLE_VALUE;
  }
  
  void IPipeServer::Close(void)
  {
  	if(m_pipe != INVALID_HANDLE_VALUE)
  	{
  		CloseHandle(m_pipe);
  		m_pipe = INVALID_HANDLE_VALUE;
  	}
  }
  
  bool IPipeServer::WaitForClient(void)
  {
  	bool	result = ConnectNamedPipe(m_pipe, NULL) != 0;
  
  	// already connected?
  	if(!result)
  	{
  		if(GetLastError() == ERROR_PIPE_CONNECTED)
  			result = true;
  	}
  
  	return result;
  }
  
  bool IPipeServer::ReadMessage(UInt8 * buf, UInt32 length)
  {
  	UInt32	bytesRead;
  
  	ReadFile(m_pipe, buf, length, &bytesRead, NULL);
  
  	MessageHeader	* header = (MessageHeader *)buf;
  
  	return
  		(bytesRead >= sizeof(MessageHeader)) &&	// has a valid header
  		(bytesRead >= (sizeof(MessageHeader) + header->length));
  }
  
  bool IPipeServer::WriteMessage(MessageHeader * msg)
  {
  	UInt32	bytesWritten;
  	UInt32	length = sizeof(MessageHeader) + msg->length;
  
  	WriteFile(m_pipe, msg, length, &bytesWritten, NULL);
  
  	return bytesWritten >= length;
  }
  