#ifndef PLATFORM_PIPE_H_ #define PLATFORM_PIPE_H_ #include #include #include "platform/api/condition_variable.h" #include "platform/api/input_stream.h" #include "platform/api/lock.h" #include "platform/api/output_stream.h" #include "platform/byte_array.h" #include "platform/exception.h" #include "platform/ptr.h" namespace location { namespace nearby { namespace pipe { class PipeInputStream; class PipeOutputStream; } // namespace pipe class Pipe { public: Pipe(); ~Pipe(); // The returned InputStream is auto-destroyed when no longer referenced. static Ptr createInputStream(Ptr); // The returned OutputStream is auto-destroyed when no longer referenced. static Ptr createOutputStream(Ptr); private: ////////////////////////////////////////////////////////////////////////////// // Everything in this first private: section is only used by PipeInputStream // and PipeOutputStream, thus forming the interface presented to those 2 // classes. ////////////////////////////////////////////////////////////////////////////// friend class pipe::PipeInputStream; friend class pipe::PipeOutputStream; ExceptionOr > read(std::int64_t size); Exception::Value write(ConstPtr data); void markInputStreamClosed(); void markOutputStreamClosed(); private: Exception::Value writeLocked(ConstPtr data); bool eitherStreamClosed() const; ScopedPtr > lock_; ScopedPtr > cond_; typedef std::deque > BufferType; BufferType buffer_; bool input_stream_closed_; bool output_stream_closed_; bool read_all_chunks_; }; } // namespace nearby } // namespace location #endif // PLATFORM_PIPE_H_