// Copyright 2020 Google LLC // // Licensed 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 // // https://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 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 { template class PipeInputStream; template class PipeOutputStream; } // namespace pipe template 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. ////////////////////////////////////////////////////////////////////////////// template friend class pipe::PipeInputStream; template 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 #include "platform/pipe.cc" #endif // PLATFORM_PIPE_H_