// // Pipe.h // // $Id: //poco/1.3/Foundation/include/Poco/Pipe.h#1 $ // // Library: Foundation // Package: Processes // Module: Pipe // // Definition of the Pipe class. // // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // Permission is hereby granted, free of charge, to any person or organization // obtaining a copy of the software and accompanying documentation covered by // this license (the "Software") to use, reproduce, display, distribute, // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: // // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #ifndef Foundation_Pipe_INCLUDED #define Foundation_Pipe_INCLUDED #include "Poco/Foundation.h" #include "Poco/PipeImpl.h" namespace Poco { class Foundation_API Pipe /// This class implements an anonymous pipe. /// /// Pipes are a common method of inter-process communication - /// on Unix, pipes are the oldest form of IPC. /// /// A pipe is a half-duplex communication channel, which means /// that data only flows in one direction. /// Pipes have a read-end and a write-end. One process writes to /// the pipe and another process reads the data written by /// its peer. /// Read and write operations are always synchronous. A read will /// block until data is available and a write will block until /// the reader reads the data. /// /// The sendBytes() and readBytes() methods of Pipe are usually /// used through a PipeOutputStream or PipeInputStream and are /// not called directly. /// /// Pipe objects have value semantics; the actual work is delegated /// to a reference-counted PipeImpl object. { public: typedef PipeImpl::Handle Handle; /// The read/write handle or file descriptor. enum CloseMode /// used by close() { CLOSE_READ = 0x01, /// Close reading end of pipe. CLOSE_WRITE = 0x02, /// Close writing end of pipe. CLOSE_BOTH = 0x03 /// Close both ends of pipe. }; Pipe(); /// Creates the Pipe. /// /// Throws a CreateFileException if the pipe cannot be /// created. Pipe(const Pipe& pipe); /// Creates the Pipe using the PipeImpl from another one. ~Pipe(); /// Closes and destroys the Pipe. Pipe& operator = (const Pipe& pipe); /// Releases the Pipe's PipeImpl and assigns another one. int writeBytes(const void* buffer, int length); /// Sends the contents of the given buffer through /// the pipe. Blocks until the receiver is ready /// to read the data. /// /// Returns the number of bytes sent. /// /// Throws a WriteFileException if the data cannot be written. int readBytes(void* buffer, int length); /// Receives data from the pipe and stores it /// in buffer. Up to length bytes are received. /// Blocks until data becomes available. /// /// Returns the number of bytes received, or 0 /// if the pipe has been closed. /// /// Throws a ReadFileException if nothing can be read. Handle readHandle() const; /// Returns the read handle or file descriptor /// for the Pipe. For internal use only. Handle writeHandle() const; /// Returns the write handle or file descriptor /// for the Pipe. For internal use only. void close(CloseMode mode = CLOSE_BOTH); /// Depending on the argument, closes either the /// reading end, the writing end, or both ends /// of the Pipe. private: PipeImpl* _pImpl; }; // // inlines // inline int Pipe::writeBytes(const void* buffer, int length) { return _pImpl->writeBytes(buffer, length); } inline int Pipe::readBytes(void* buffer, int length) { return _pImpl->readBytes(buffer, length); } inline Pipe::Handle Pipe::readHandle() const { return _pImpl->readHandle(); } inline Pipe::Handle Pipe::writeHandle() const { return _pImpl->writeHandle(); } } // namespace Poco #endif // Foundation_Pipe_INCLUDED