// *************************************************************
//  
//  Licensed to the Apache Software Foundation (ASF) under one
//  or more contributor license agreements.  See the NOTICE file
//  distributed with this work for additional information
//  regarding copyright ownership.  The ASF licenses this file
//  to you under the Apache License, Version 2.0 (the
//  "License"); you may not use this file except in compliance
//  with the License.  You may obtain a copy of the License at
//  
//    http://www.apache.org/licenses/LICENSE-2.0
//  
//  Unless required by applicable law or agreed to in writing,
//  software distributed under the License is distributed on an
//  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//  KIND, either express or implied.  See the License for the
//  specific language governing permissions and limitations
//  under the License.
//  
// *************************************************************
#ifndef _PIPEIMPL_H_
#define _PIPEIMPL_H_

#ifndef _WINDOWS_
#	include <windows.h>
#endif

#ifndef _INC_MALLOC
#	include <malloc.h>
#endif

#ifndef _INC_TCHAR
#	ifdef UNICODE
#		define _UNICODE
#	endif
#	include <tchar.h>
#endif

#define EXPORT_PIPE_API

//============================================================================
//	Helper functions
//============================================================================

// Because the value of an invalid HANDLE returned by API functions differs 
// between different functions and differs on different Windows platforms,
// this function checks wether the handle has a meaningfull value.
#ifndef __cplusplus

#define IsValidHandle( handle ) ((DWORD)(handle) + 1 > 1)

#else

inline bool IsValidHandle( HANDLE handle )
{
	return INVALID_HANDLE_VALUE != handle && NULL != handle;
}

extern "C" {

#endif	// __cplusplus


EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeA( LPCSTR lpName );
EXPORT_PIPE_API HANDLE WINAPI CreateSimplePipeW( LPCWSTR lpName );

#ifdef UNICODE
#define CreateSimplePipe	CreateSimplePipeW
#else
#define CreateSimplePipe	CreateSimplePipeA
#endif

EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeA( LPCSTR lpName );
EXPORT_PIPE_API HANDLE WINAPI OpenSimplePipeW( LPCWSTR lpName );

#ifdef UNICODE
#define OpenSimplePipe	OpenSimplePipeW
#else
#define OpenSimplePipe	OpenSimplePipeA
#endif

EXPORT_PIPE_API HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe );

EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeA( LPCSTR lpName, DWORD dwTimeOut );
EXPORT_PIPE_API BOOL WINAPI WaitForSimplePipeW( LPCWSTR lpName, DWORD dwTimeOut );

#ifdef UNICODE
#define WaitForSimplePipe	WaitForSimplePipeW
#else
#define WaitForSimplePipe	WaitForSimplePipeA
#endif


EXPORT_PIPE_API BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait );
EXPORT_PIPE_API BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait );
EXPORT_PIPE_API BOOL WINAPI CloseSimplePipe( HANDLE hPipe );

#ifdef __cplusplus
}	// extern "C"
#endif

#endif	// _PIPEIMPL_H_
