blob: f5f0d4cab4b3df80884775b4523dfa6fa9cf7281 [file] [log] [blame]
// Copyright 2018 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_ZX_SOCKET_H_
#define SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_ZX_SOCKET_H_
#include <lib/zx/socket.h>
#include <functional>
#include "src/developer/debug/shared/message_loop.h"
#include "src/developer/debug/shared/socket_watcher.h"
#include "src/developer/debug/shared/stream_buffer.h"
namespace debug_ipc {
// An adapter that converts a zx::socket to a StreamBuffer.
class BufferedZxSocket : public SocketWatcher, public StreamBuffer::Writer {
public:
using DataAvailableCallback = std::function<void()>;
using ErrorCallback = std::function<void()>;
BufferedZxSocket();
~BufferedZxSocket();
// This won't start listening on the socket (some users might want to delay doing that).
//
// If successful, it will leave the object in a valid state.
zx_status_t Init(zx::socket socket);
// A MessageLoopZircon must be already set up on the current thread. Start can be called as long
// as valid() is true. ZX_ERR_BAD_STATE will be returned otherwise.
zx_status_t Start();
zx_status_t Stop();
// Stops and leaves the buffer in an invalid state.
void Reset();
bool valid() const { return socket_.is_valid(); }
void set_data_available_callback(DataAvailableCallback cb) { callback_ = cb; }
void set_error_callback(ErrorCallback cb) { error_callback_ = cb; }
StreamBuffer& stream() { return stream_; }
const StreamBuffer& stream() const { return stream_; }
private:
// SocketWatcher implementation.
void OnSocketReadable(zx_handle_t) override;
void OnSocketWritable(zx_handle_t) override;
void OnSocketError(zx_handle_t) override;
// StreamBuffer::Writer implementation.
size_t ConsumeStreamBufferData(const char* data, size_t len) override;
zx::socket socket_;
StreamBuffer stream_;
MessageLoop::WatchHandle watch_handle_;
DataAvailableCallback callback_;
ErrorCallback error_callback_;
FXL_DISALLOW_COPY_AND_ASSIGN(BufferedZxSocket);
};
} // namespace debug_ipc
#endif // SRC_DEVELOPER_DEBUG_SHARED_BUFFERED_ZX_SOCKET_H_