diff options
Diffstat (limited to 'sal/osl/os2/pipeimpl.cxx')
-rw-r--r-- | sal/osl/os2/pipeimpl.cxx | 742 |
1 files changed, 0 insertions, 742 deletions
diff --git a/sal/osl/os2/pipeimpl.cxx b/sal/osl/os2/pipeimpl.cxx deleted file mode 100644 index aba0dd370e99..000000000000 --- a/sal/osl/os2/pipeimpl.cxx +++ /dev/null @@ -1,742 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -# include "pipeimpl.h" - -#ifndef _INC_MALLOC -# include <malloc.h> -#endif - -#ifndef _INC_TCHAR -# ifdef UNICODE -# define _UNICODE -# endif -# include <tchar.h> -#endif - -const TCHAR PIPE_NAME_PREFIX_MAPPING[] = TEXT("PIPE_FILE_MAPPING_"); -const TCHAR PIPE_NAME_PREFIX_SYNCHRONIZE[] = TEXT("PIPE_SYNCHRONIZE_MUTEX_"); -const TCHAR PIPE_NAME_PREFIX_CONNECTION[] = TEXT("PIPE_CONNECTION_SEMAPHORE_"); - -const DWORD PIPE_BUFFER_SIZE = 4096; - - -//============================================================================ -// PipeData -//============================================================================ - -struct PipeData -{ - DWORD dwProcessId; - HANDLE hReadPipe; - HANDLE hWritePipe; -}; - -//============================================================================ -// Pipe -//============================================================================ - -#ifdef UNICODE -#define Pipe PipeW -#define ClientPipe ClientPipeW -#define ServerPipe ServerPipeW -#else -#define Pipe PipeA -#define ClientPipe ClientPipeA -#define ServerPipe ServerPipeA -#endif - -class Pipe -{ -protected: - HANDLE m_hReadPipe; // Handle to use for reading - HANDLE m_hWritePipe; // Handle to use for writing - - Pipe( HANDLE hReadPipe, HANDLE hWritePipe ); - - static HANDLE CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner ); - static HANDLE CreatePipeDataMapping( LPCTSTR lpName ); - static HANDLE OpenPipeDataMapping( LPCTSTR lpName ); - static HANDLE CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumcount ); - -public: - Pipe( const Pipe& ); - const Pipe& operator = ( const Pipe& ); - virtual ~Pipe(); - - virtual bool Close(); - virtual bool Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait = true ); - virtual bool Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait = true ); - - virtual Pipe *AcceptConnection() - { - SetLastError( ERROR_INVALID_HANDLE ); - return NULL; - } - - void * operator new( size_t nBytes ) - { - return HeapAlloc( GetProcessHeap(), 0, nBytes ); - } - - void operator delete( void *ptr ) - { - HeapFree( GetProcessHeap(), 0, ptr ); - } - - bool is() const - { - return (FALSE != HeapValidate( GetProcessHeap(), 0, this )); - } - -}; - -//============================================================================ -// ClientPipe -//============================================================================ - -class ClientPipe : public Pipe -{ -protected: - ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe ); -public: - static ClientPipe* Create( LPCTSTR lpName ); -}; - -//============================================================================ -// ServerPipe -//============================================================================ - -class ServerPipe : public Pipe -{ -protected: - HANDLE m_hMapping; - HANDLE m_hSynchronize; - LPTSTR m_lpName; - - ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe ); -public: - virtual ~ServerPipe(); - - static ServerPipe *Create( LPCTSTR lpName ); - - virtual Pipe *AcceptConnection(); -}; - -HANDLE Pipe::CreatePipeDataMapping( LPCTSTR lpName ) -{ - HANDLE hMapping = NULL; - LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) ); - - if ( lpMappingName ) - { - _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING ); - _tcscat( lpMappingName, lpName ); - - LPTSTR lpMappingFileName = (LPTSTR)alloca( MAX_PATH * sizeof(TCHAR) ); - - if ( lpMappingFileName ) - { - DWORD nChars = GetTempPath( MAX_PATH, lpMappingFileName ); - - if ( MAX_PATH + _tcslen(lpName) < nChars + 1 ) - { - lpMappingFileName = (LPTSTR)alloca( (nChars + 1 + _tcslen(lpName)) * sizeof(TCHAR) ); - if ( lpMappingFileName ) - nChars = GetTempPath( nChars, lpMappingFileName ); - else - { - nChars = 0; - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - } - - if ( nChars ) - { - _tcscat( lpMappingFileName, lpMappingName ); - - HANDLE hFile = CreateFile( - lpMappingFileName, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, - OPEN_ALWAYS, - FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE, - NULL ); - - if ( IsValidHandle(hFile) ) - { - hMapping = CreateFileMapping( - (HANDLE)hFile, - (LPSECURITY_ATTRIBUTES)NULL, - PAGE_READWRITE, - 0, - sizeof(PipeData), - lpMappingName ); - - CloseHandle( hFile ); - } - } - } - else - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - - return hMapping; -} - -HANDLE Pipe::OpenPipeDataMapping( LPCTSTR lpName ) -{ - HANDLE hMapping = NULL; - LPTSTR lpMappingName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_MAPPING) ); - - if ( lpMappingName ) - { - _tcscpy( lpMappingName, PIPE_NAME_PREFIX_MAPPING ); - _tcscat( lpMappingName, lpName ); - - hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, lpMappingName ); - } - - return hMapping; -} - -HANDLE Pipe::CreatePipeDataMutex( LPCTSTR lpName, BOOL bInitialOwner ) -{ - HANDLE hMutex = NULL; - LPTSTR lpMutexName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_SYNCHRONIZE) ); - - if ( lpMutexName ) - { - _tcscpy( lpMutexName, PIPE_NAME_PREFIX_SYNCHRONIZE ); - _tcscat( lpMutexName, lpName ); - - hMutex = CreateMutex( NULL, bInitialOwner, lpMutexName ); - } - - return hMutex; -} - -HANDLE Pipe::CreatePipeConnectionSemaphore( LPCTSTR lpName, LONG lInitialCount, LONG lMaximumCount ) -{ - HANDLE hSemaphore = NULL; - LPTSTR lpSemaphoreName = (LPTSTR)alloca( _tcslen(lpName) * sizeof(TCHAR) + sizeof(PIPE_NAME_PREFIX_CONNECTION) ); - - if ( lpSemaphoreName ) - { - _tcscpy( lpSemaphoreName, PIPE_NAME_PREFIX_CONNECTION ); - _tcscat( lpSemaphoreName, lpName ); - - hSemaphore = CreateSemaphore( NULL, lInitialCount, lMaximumCount, lpSemaphoreName ); - } - - return hSemaphore; -} - - -//---------------------------------------------------------------------------- -// Pipe copy ctor -//---------------------------------------------------------------------------- - -Pipe::Pipe( const Pipe& rPipe ) : -m_hReadPipe( INVALID_HANDLE_VALUE ), -m_hWritePipe( INVALID_HANDLE_VALUE ) -{ - DuplicateHandle( - GetCurrentProcess(), - rPipe.m_hReadPipe, - GetCurrentProcess(), - &m_hReadPipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - DuplicateHandle( - GetCurrentProcess(), - rPipe.m_hWritePipe, - GetCurrentProcess(), - &m_hWritePipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); -} - -//---------------------------------------------------------------------------- -// Pipe assignment operator -//---------------------------------------------------------------------------- - -const Pipe& Pipe::operator = ( const Pipe& rPipe ) -{ - Close(); - - DuplicateHandle( - GetCurrentProcess(), - rPipe.m_hReadPipe, - GetCurrentProcess(), - &m_hReadPipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - DuplicateHandle( - GetCurrentProcess(), - rPipe.m_hWritePipe, - GetCurrentProcess(), - &m_hWritePipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - return *this; -} - -//---------------------------------------------------------------------------- -// Pipe ctor -//---------------------------------------------------------------------------- - -Pipe::Pipe( HANDLE hReadPipe, HANDLE hWritePipe ) : -m_hReadPipe( INVALID_HANDLE_VALUE ), -m_hWritePipe( INVALID_HANDLE_VALUE ) -{ - DuplicateHandle( - GetCurrentProcess(), - hReadPipe, - GetCurrentProcess(), - &m_hReadPipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - DuplicateHandle( - GetCurrentProcess(), - hWritePipe, - GetCurrentProcess(), - &m_hWritePipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); -} - -//---------------------------------------------------------------------------- -// Pipe dtor -//---------------------------------------------------------------------------- - -Pipe::~Pipe() -{ - Close(); -} - -//---------------------------------------------------------------------------- -// Pipe Close -//---------------------------------------------------------------------------- - -bool Pipe::Close() -{ - bool fSuccess = false; // Assume failure - - if ( IsValidHandle(m_hReadPipe) ) - { - CloseHandle( m_hReadPipe ); - m_hReadPipe = INVALID_HANDLE_VALUE; - } - - if ( IsValidHandle(m_hWritePipe) ) - { - CloseHandle( m_hWritePipe ); - m_hWritePipe = INVALID_HANDLE_VALUE; - } - - return fSuccess; -} - -//---------------------------------------------------------------------------- -// Pipe Write -//---------------------------------------------------------------------------- - -bool Pipe::Write( LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, bool bWait ) -{ - DWORD dwBytesAvailable = 0; - BOOL fSuccess = TRUE; - - if ( !bWait ) - fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL ); - - if ( fSuccess ) - { - if ( !bWait && dwBytesToWrite > PIPE_BUFFER_SIZE - dwBytesAvailable ) - dwBytesToWrite = PIPE_BUFFER_SIZE - dwBytesAvailable ; - - return !!WriteFile( m_hWritePipe, lpBuffer, dwBytesToWrite, lpBytesWritten, NULL ); - } - - return false; -} - -//---------------------------------------------------------------------------- -// Pipe Read -//---------------------------------------------------------------------------- - -bool Pipe::Read( LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, bool bWait ) -{ - DWORD dwBytesAvailable = 0; - BOOL fSuccess = TRUE; - - if ( !bWait ) - fSuccess = PeekNamedPipe( m_hReadPipe, NULL, 0, NULL, &dwBytesAvailable, NULL ); - - if ( fSuccess ) - { - if ( bWait || dwBytesAvailable ) - return !!ReadFile( m_hReadPipe, lpBuffer, dwBytesToRead, lpBytesRead, NULL ); - else - { - *lpBytesRead = 0; - return true; - } - } - - return false; -} - - - -//---------------------------------------------------------------------------- -// Client pipe dtor -//---------------------------------------------------------------------------- - -ClientPipe::ClientPipe( HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe ) -{ -} - -//---------------------------------------------------------------------------- -// Client pipe creation -//---------------------------------------------------------------------------- - -ClientPipe *ClientPipe::Create( LPCTSTR lpName ) -{ - ClientPipe *pPipe = NULL; // Assume failure - - HANDLE hMapping = OpenPipeDataMapping( lpName ); - - if ( IsValidHandle(hMapping) ) - { - PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); - - if ( pData ) - { - HANDLE hSourceProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, pData->dwProcessId ); - - if ( IsValidHandle(hSourceProcess) ) - { - BOOL fSuccess; - HANDLE hReadPipe = INVALID_HANDLE_VALUE, hWritePipe = INVALID_HANDLE_VALUE; - - fSuccess = DuplicateHandle( - hSourceProcess, - pData->hReadPipe, - GetCurrentProcess(), - &hReadPipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - fSuccess = fSuccess && DuplicateHandle( - hSourceProcess, - pData->hWritePipe, - GetCurrentProcess(), - &hWritePipe, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - if ( fSuccess ) - pPipe = new ClientPipe( hReadPipe, hWritePipe ); - - if ( IsValidHandle(hWritePipe) ) - CloseHandle( hWritePipe ); - - if ( IsValidHandle(hReadPipe) ) - CloseHandle( hReadPipe ); - - HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( lpName, 0, 1 ); - - ReleaseSemaphore( hConnectionRequest, 1, NULL ); - - CloseHandle( hConnectionRequest ); - - CloseHandle( hSourceProcess ); - } - - UnmapViewOfFile( pData ); - } - - CloseHandle( hMapping ); - } - - return pPipe; -} - - - -//---------------------------------------------------------------------------- -// ServerPipe ctor -//---------------------------------------------------------------------------- - -ServerPipe::ServerPipe( LPCTSTR lpName, HANDLE hMapping, HANDLE hSynchronize, HANDLE hReadPipe, HANDLE hWritePipe ) : Pipe( hReadPipe, hWritePipe ), -m_hMapping( NULL ), -m_hSynchronize( NULL ), -m_lpName( NULL ) -{ - DuplicateHandle( - GetCurrentProcess(), - hMapping, - GetCurrentProcess(), - &m_hMapping, - 0, - FALSE, - DUPLICATE_SAME_ACCESS ); - - DuplicateHandle( - GetCurrentProcess(), - hSynchronize, - GetCurrentProcess(), - &m_hSynchronize, - 0, - FALSE, - DUPLICATE_SAME_ACCESS - ); - m_lpName = new TCHAR[_tcslen(lpName) + 1]; - if ( m_lpName ) - _tcscpy( m_lpName, lpName ); -} - -//---------------------------------------------------------------------------- -// ServerPipe dtor -//---------------------------------------------------------------------------- - -ServerPipe::~ServerPipe() -{ - if ( IsValidHandle(m_hMapping) ) - CloseHandle( m_hMapping ); - if ( m_lpName ) - delete[]m_lpName; -} - -//---------------------------------------------------------------------------- -// ServerPipe AcceptConnection -//---------------------------------------------------------------------------- - -Pipe *ServerPipe::AcceptConnection() -{ - Pipe *pPipe = NULL; // Assume failure; - - HANDLE hConnectionRequest = CreatePipeConnectionSemaphore( m_lpName, 0, 1 ); - - if ( WAIT_OBJECT_0 == WaitForSingleObject( hConnectionRequest, INFINITE ) ) - { - pPipe = new Pipe( *this ); - Close(); - - // Create new inbound Pipe - - HANDLE hClientWritePipe = NULL, hServerReadPipe = NULL; - - BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE ); - - - if ( fSuccess ) - { - // Create outbound pipe - - HANDLE hClientReadPipe = NULL, hServerWritePipe = NULL; - - if ( CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE ) ) - { - m_hReadPipe = hServerReadPipe; - m_hWritePipe = hServerWritePipe; - - PipeData *pData = (PipeData *)MapViewOfFile( m_hMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(PipeData) ); - - HANDLE hSynchronize = CreatePipeDataMutex( m_lpName, TRUE ); - - CloseHandle( pData->hReadPipe ); - CloseHandle( pData->hWritePipe ); - - pData->hReadPipe = hClientReadPipe; - pData->hWritePipe = hClientWritePipe; - - ReleaseMutex( hSynchronize ); - - CloseHandle( hSynchronize ); - - } - else - { - CloseHandle( hClientWritePipe ); - CloseHandle( hServerWritePipe ); - } - } - - ReleaseMutex( hConnectionRequest ); - } - - CloseHandle( hConnectionRequest ); - - return pPipe; -} - -//---------------------------------------------------------------------------- -// Pipe creation -//---------------------------------------------------------------------------- - -ServerPipe *ServerPipe::Create( LPCTSTR lpName ) -{ - ServerPipe *pPipe = NULL; - - HANDLE hMapping = CreatePipeDataMapping( lpName ); - - if ( IsValidHandle(hMapping) ) - { - if ( ERROR_FILE_EXISTS != GetLastError() ) - { - HANDLE hSynchronize = CreatePipeDataMutex( lpName, FALSE); - - WaitForSingleObject( hSynchronize, INFINITE ); - - PipeData *pData = (PipeData*)MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); - - if ( pData ) - { - - // Initialize pipe data - - pData->dwProcessId = 0; - pData->hReadPipe = NULL; - pData->hWritePipe = NULL; - - // Create inbound pipe - - HANDLE hServerReadPipe = NULL, hClientWritePipe = NULL; - - BOOL fSuccess = CreatePipe( &hServerReadPipe, &hClientWritePipe, NULL, PIPE_BUFFER_SIZE ); - - if ( fSuccess ) - { - // Create outbound pipe - - HANDLE hServerWritePipe = NULL, hClientReadPipe = NULL; - - fSuccess = CreatePipe( &hClientReadPipe, &hServerWritePipe, NULL, PIPE_BUFFER_SIZE ); - - if ( fSuccess ) - { - pData->dwProcessId = GetCurrentProcessId(); - pData->hReadPipe = hClientReadPipe; - pData->hWritePipe = hClientWritePipe; - pPipe = new ServerPipe( lpName, hMapping, hSynchronize, hServerReadPipe, hServerWritePipe ); - - CloseHandle( hServerWritePipe ); - CloseHandle( hServerReadPipe ); - } - else - { - CloseHandle( hServerReadPipe ); - CloseHandle( hClientWritePipe ); - } - } - - UnmapViewOfFile( pData ); - } - - ReleaseMutex( hSynchronize ); - CloseHandle( hSynchronize ); - } - - CloseHandle( hMapping ); - } - - return pPipe; -} - - -//---------------------------------------------------------------------------- -// C style API -//---------------------------------------------------------------------------- - -const TCHAR LOCAL_PIPE_PREFIX[] = TEXT("\\\\.\\PIPE\\" ); - -extern "C" HANDLE WINAPI CreateSimplePipe( LPCTSTR lpName ) -{ - int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX ); - if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) ) - lpName += nPrefixLen; - return (HANDLE)ServerPipe::Create( lpName ); -} - -extern "C" HANDLE WINAPI OpenSimplePipe( LPCTSTR lpName ) -{ - int nPrefixLen = _tcslen( LOCAL_PIPE_PREFIX ); - if ( 0 == _tcsnicmp( lpName, LOCAL_PIPE_PREFIX, nPrefixLen ) ) - lpName += nPrefixLen; - return (HANDLE)ClientPipe::Create( lpName ); -} - -extern "C" HANDLE WINAPI AcceptSimplePipeConnection( HANDLE hPipe ) -{ - Pipe *pPipe = (Pipe *)hPipe; - - if ( pPipe->is() ) - return (HANDLE)pPipe->AcceptConnection(); - else - { - SetLastError( ERROR_INVALID_HANDLE ); - return NULL; - } -} - -extern "C" BOOL WINAPI WaitForSimplePipe( LPCTSTR /*lpName*/, DWORD /*dwTimeOut*/ ) -{ - return FALSE; -} - -extern "C" BOOL WINAPI WriteSimplePipe( HANDLE hPipe, LPCVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten, BOOL bWait ) -{ - Pipe *pPipe = (Pipe *)hPipe; - - if ( pPipe->is() ) - return pPipe->Write( lpBuffer, dwBytesToWrite, lpBytesWritten, bWait ); - else - { - SetLastError( ERROR_INVALID_HANDLE ); - return FALSE; - } -} - -extern "C" BOOL WINAPI ReadSimplePipe( HANDLE hPipe, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesRead, BOOL bWait ) -{ - Pipe *pPipe = (Pipe *)hPipe; - - if ( pPipe->is() ) - return pPipe->Read( lpBuffer, dwBytesToRead, lpBytesRead, bWait ); - else - { - SetLastError( ERROR_INVALID_HANDLE ); - return FALSE; - } -} - -extern "C" BOOL WINAPI CloseSimplePipe( HANDLE hPipe ) -{ - Pipe *pPipe = (Pipe *)hPipe; - - if ( pPipe->is() ) - { - delete pPipe; - return TRUE; - } - else - { - SetLastError( ERROR_INVALID_HANDLE ); - return FALSE; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |