| // Copyright 2021 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_STREAM_H_ | |
| #define SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_STREAM_H_ | |
| #include <functional> | |
| #include "src/developer/debug/shared/stream_buffer.h" | |
| namespace debug { | |
| // A base class for implementation-specific version of a buffered stream. | |
| // | |
| // This manages a StreamBuffer for the actual buffering, and provides a common API for managing | |
| // the stream. Its derived classes supply the actual reading and writing APIs. | |
| class BufferedStream : public StreamBuffer::Writer { | |
| public: | |
| using DataAvailableCallback = std::function<void()>; | |
| using ErrorCallback = std::function<void()>; | |
| BufferedStream() { stream_.set_writer(this); } | |
| virtual ~BufferedStream() = default; | |
| // Starts and stops listening to the stream source. | |
| virtual bool Start() = 0; | |
| virtual bool Stop() = 0; | |
| // Stops, releases the resources, and resets all callbacks. | |
| void Reset() { | |
| ResetInternal(); | |
| callback_ = DataAvailableCallback(); | |
| error_callback_ = ErrorCallback(); | |
| } | |
| // Returns true if the stream is properly set up. | |
| virtual bool IsValid() = 0; | |
| void set_data_available_callback(DataAvailableCallback cb) { callback_ = std::move(cb); } | |
| void set_error_callback(ErrorCallback cb) { error_callback_ = std::move(cb); } | |
| StreamBuffer& stream() { return stream_; } | |
| const StreamBuffer& stream() const { return stream_; } | |
| protected: | |
| // Does the stream-specific work of Reset(). | |
| virtual void ResetInternal() = 0; | |
| [[nodiscard]] DataAvailableCallback& callback() { return callback_; } | |
| [[nodiscard]] ErrorCallback& error_callback() { return error_callback_; } | |
| private: | |
| StreamBuffer stream_; | |
| DataAvailableCallback callback_; | |
| ErrorCallback error_callback_; | |
| }; | |
| } // namespace debug | |
| #endif // SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_STREAM_H_ |