// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

[DartPackage="mojo_services"]
module mojo;

import "mojo/public/interfaces/network/network_error.mojom";
import "network/public/interfaces/net_address.mojom";

// UDPSocket and UDPSocketReceiver represent a UDP socket and its client. The
// typical flow of using the interfaces is:
// - Acquire a UDPSocket interface pointer.
// - (optional) Set options which are allowed prior to Bind()/Connect().
// - Bind or connect the socket.
// - (optional) Bind the UDPSocketReceiver request returned by Bind()/Connect()
// - (optional) Set options which are allowed after Bind()/Connect().
// - Send / request to receive datagrams. Received datagrams will be delivered
//   to the bound receiver's OnReceived() call.
interface UDPSocket {
  // Allows the socket to share the local address to which it will be bound with
  // other processes. Should be called before Bind().
  // (This is equivalent to SO_REUSEADDR of the POSIX socket API.)
  AllowAddressReuse() => (NetworkError result);

  // Binds the socket to the given address. The socket must not be bound or
  // connected.
  // |bound_addr| is non-null on success. It might not be the same as |addr|.
  // For example, if port 0 is used in |addr|, an available port is picked and
  // returned in |bound_addr|. The caller may provide an implementation of
  // |receiver| to receive datagrams read from the socket. |receiver| is null
  // on failure.
  Bind(NetAddress addr) => (NetworkError result, NetAddress? bound_addr,
                            UDPSocketReceiver&? receiver);

  // Connects the socket to the remote address. The socket must not be bound or
  // connected.
  // |local_addr| is non-null on success.
  // The caller may provide an implementation of |receiver| to receive datagrams
  // read from the socket. |receiver| is null on failure.
  Connect(NetAddress remote_addr) => (NetworkError result,
                                      NetAddress? local_addr,
                                      UDPSocketReceiver&? receiver);

  // Sets the OS send buffer size (in bytes) for the socket. The socket must be
  // bound or connected.
  SetSendBufferSize(uint32 size) => (NetworkError result);

  // Sets the OS receive buffer size (in bytes) for the socket. The socket must
  // be bound or connected.
  SetReceiveBufferSize(uint32 size) => (NetworkError result);

  // Negotiates the maximum number of pending SendTo() requests. If
  // |requested_size| is set to 0, this method queries the current settings.
  //
  // The service stores SendTo() requests in a queue while they are waiting to
  // be executed (i.e., while they are waiting to be placed in the OS send
  // buffer and sent out). This method negotiates how many requests (not bytes)
  // this queue is able to store. If the queue is full, the service fails new
  // requests directly with error code ERR_INSUFFICIENT_RESOURCES and discards
  // those datagrams. If the client wants to avoid such failures, it needs to
  // keep track of how many SendTo() calls are pending and make sure the number
  // doesn't exceed the result of this method.
  NegotiateMaxPendingSendRequests(uint32 requested_size)
      => (uint32 actual_size);

  // Notifies that the receiver is ready to accept |number| of datagrams.
  // Correspondingly, OnReceived() of the UDPSocketReceiver interface will be
  // called |number| times (errors also count), unless the connection is closed
  // before that.
  //
  // It is allowed to call this method again before the previous request is
  // completely satisfied. For example:
  //   service->ReceiveMore(3);
  //   ...
  //   // OnReceived() is called.
  //   // OnReceived() is called.
  //   ...
  //   service->ReceiveMore(3);
  //   // The client expects 4 more calls to OnReceived().
  //
  // Please note that how ReceiveMore() is used will affect performance
  // significantly. For example:
  //   // Approach 1:
  //   service->ReceiveMore(3);
  //   // OnReceived() is called.
  //   // OnReceived() is called.
  //   // OnReceived() is called.
  //
  //   // Approach 2:
  //   service->ReceiveMore(1);
  //   // OnReceived() is called.
  //   service->ReceiveMore(1);
  //   // OnReceived() is called.
  //   service->ReceiveMore(1);
  //   // OnReceived() is called.
  //
  // It is very likely that approach 1 will perform better than approach 2,
  // because in approach 2 getting every datagram takes at least the time of a
  // round trip to the service side.
  ReceiveMore(uint32 datagram_number);

  // Sends data to the specified destination. The socket must be bound or
  // connected. |dest_addr| is allowed to be null if the socket is connected.
  // On success, |result.code| is a non-negative number indicating how many
  // bytes have been written. Otherwise, it is a network error code, including
  // (but not limited to):
  // - ERR_INSUFFICIENT_RESOURCES (-12): The service doesn't have sufficient
  //   resource to complete the operation. One possible cause is that the client
  //   tries to send too many datagrams in a short period of time.
  // TODO(yzshen): Formalize Mojo networking error codes.
  SendTo(NetAddress? dest_addr, array<uint8> data) => (NetworkError result);
};

interface UDPSocketReceiver {
  // On success, |data| is non-null, |src_addr| is non-null if the socket is
  // not connected, |result.code| is a non-negative number indicating how many
  // bytes have been received. On failure, |result.code| is a network error
  // code.
  OnReceived(NetworkError result, NetAddress? src_addr, array<uint8>? data);
};
