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

part of zircon;

// ignore_for_file: constant_identifier_names
// ignore_for_file: public_member_api_docs

/// Typed wrapper around a Zircon socket object.
class Socket extends _HandleWrapper<Socket> {
  Socket(Handle handle) : super(handle);

  // Signals
  static const int READABLE = ZX.SOCKET_READABLE;
  static const int WRITABLE = ZX.SOCKET_WRITABLE;
  static const int PEER_CLOSED = ZX.SOCKET_PEER_CLOSED;
  static const int READ_DISABLED = ZX.SOCKET_READ_DISABLED;
  static const int WRITE_DISABLED = ZX.SOCKET_WRITE_DISABLED;
  static const int CONTROL_READABLE = ZX.SOCKET_CONTROL_READABLE;
  static const int CONTROL_WRITABLE = ZX.SOCKET_CONTROL_WRITABLE;

  // Create options
  static const int STREAM = ZX.SOCKET_STREAM;
  static const int DATAGRAM = ZX.SOCKET_DATAGRAM;
  static const int HAS_CONTROL = ZX.SOCKET_HAS_CONTROL;

  // Read / write options
  static const int CONTROL = ZX.SOCKET_CONTROL;

  // Write options
  static const int SHUTDOWN_READ = ZX.SOCKET_SHUTDOWN_READ;
  static const int SHUTDOWN_WRITE = ZX.SOCKET_SHUTDOWN_WRITE;

  WriteResult write(ByteData data, [int options = 0]) {
    if (handle == null) {
      return const WriteResult(ZX.ERR_INVALID_ARGS);
    }

    return System.socketWrite(handle, data, options);
  }

  ReadResult read(int numBytes) {
    if (handle == null) {
      return const ReadResult(ZX.ERR_INVALID_ARGS);
    }

    return System.socketRead(handle, numBytes);
  }
}

/// Typed wrapper around a linked pair of socket objects and the
/// zx_socket_create() syscall used to create them.
class SocketPair extends _HandleWrapperPair<Socket> {
  factory SocketPair([int options = Socket.STREAM]) {
    final HandlePairResult result = System.socketCreate(options);
    if (result.status == ZX.OK) {
      return SocketPair._(
          result.status, Socket(result.first), Socket(result.second));
    } else {
      return SocketPair._(result.status, null, null);
    }
  }

  SocketPair._(int status, Socket first, Socket second)
      : super._(status, first, second);
}
