// 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_ipc {

// 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_ipc

#endif  // SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_STREAM_H_
