summaryrefslogtreecommitdiffstats
path: root/private/utils/ulib/src/pipe.cxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/utils/ulib/src/pipe.cxx165
1 files changed, 165 insertions, 0 deletions
diff --git a/private/utils/ulib/src/pipe.cxx b/private/utils/ulib/src/pipe.cxx
new file mode 100644
index 000000000..b5e06ca3c
--- /dev/null
+++ b/private/utils/ulib/src/pipe.cxx
@@ -0,0 +1,165 @@
+/*++
+
+Copyright (c) 1991 Microsoft Corporation
+
+Module Name:
+
+ pipe.cxx
+
+Abstract:
+
+ This module contains the implementation of the PIPE class.
+
+Author:
+
+ Barry J. Gilhuly (W-Barry) June 27, 1991
+
+Environment:
+
+ ULIB, User Mode
+
+
+--*/
+
+#include <pch.cxx>
+
+#define _ULIB_MEMBER_
+
+#include "ulib.hxx"
+#include "pipestrm.hxx"
+#include "pipe.hxx"
+#include "wstring.hxx"
+
+
+DEFINE_CONSTRUCTOR( PIPE, OBJECT );
+
+DEFINE_CAST_MEMBER_FUNCTION( PIPE );
+
+
+VOID
+PIPE::Destroy(
+ )
+/*++
+
+Routine Description:
+
+ Close the handles which were opened by the initialize method.
+
+Arguments:
+
+ None.
+
+Return Value:
+
+ None.
+
+--*/
+{
+ if( !_fInitialized ) {
+ return;
+ }
+
+ //
+ // Close the pipe...
+ //
+ CloseHandle( _hReadPipe );
+ CloseHandle( _hWritePipe );
+ _fInitialized = FALSE;
+
+ return;
+}
+
+BOOLEAN
+PIPE::Initialize(
+ IN LPSECURITY_ATTRIBUTES PipeAttributes,
+ IN ULONG PipeSize,
+ IN PWSTRING PipeName
+ )
+/*++
+
+Routine Description:
+
+ Create a PIPE by making a call to the system API. If the PIPE object
+ has been previously initialized, destroy it first.
+
+Arguments:
+
+ PipeAttributes - A pointer to a structure which defines the attributes
+ of the pipe to be created.
+
+ PipeSize - A suggested buffer size for the pipe.
+
+ PipeName - The name of the pipe. Currently, this option is
+ unimplemented, it should ALWAYS be NULL.
+
+Return Value:
+
+ TRUE if the PIPE was created successfully.
+
+--*/
+{
+ BOOLEAN PipeStatus = FALSE;
+
+ Destroy();
+
+ if( PipeName == NULL ) {
+ //
+ // Create an anonomous pipe...
+ //
+ if( !( PipeStatus = CreatePipe( &_hReadPipe,
+ &_hWritePipe,
+ PipeAttributes,
+ PipeSize ) ) ) {
+ DebugPrint( "Unable to create the pipe - returning failure!\n" );
+ _fInitialized = FALSE;
+ } else {
+ _fInitialized = TRUE;
+ }
+ } else {
+ DebugPrint( "Named Pipes are not currently implemented!\n" );
+ }
+ return( PipeStatus );
+}
+
+PPIPE_STREAM
+PIPE::QueryPipeStream(
+ IN HANDLE hPipe,
+ IN STREAMACCESS Access
+ )
+/*++
+
+Routine Description:
+
+ Create and initialize a stream to the PIPE object.
+
+Arguments:
+
+ hPipe - A handle to use in the initialization of the stream.
+
+ Access - The desired access on this stream.
+
+Return Value:
+
+ Returns a pointer to the created PIPE STREAM if successful. Otherwise,
+ it returns NULL.
+
+--*/
+{
+ PPIPE_STREAM NewStream;
+
+ if( !_fInitialized ) {
+ DebugPrint( "Pipe object is uninitialized!\n" );
+ NewStream = NULL;
+ } else {
+ if( ( NewStream = NEW PIPE_STREAM ) == NULL ) {
+ DebugPrint( "Unable to create a new copy of the Read Stream!\n" );
+ } else {
+ if( !NewStream->Initialize( hPipe, Access ) ) {
+ DebugPrint( "Unable to initialize the new stream!\n" );
+ DELETE( NewStream );
+ NewStream = NULL;
+ }
+ }
+ }
+ return( NewStream );
+}