// 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/cookie_store.mojom";
import "network/public/interfaces/host_resolver.mojom";
import "network/public/interfaces/http_server.mojom";
import "network/public/interfaces/net_address.mojom";
import "network/public/interfaces/tcp_bound_socket.mojom";
import "network/public/interfaces/tcp_connected_socket.mojom";
import "network/public/interfaces/udp_socket.mojom";
import "network/public/interfaces/url_loader.mojom";
import "network/public/interfaces/url_loader_interceptor.mojom";
import "network/public/interfaces/web_socket.mojom";

// TODO Darin suggests that this should probably be two classes. One for
// high-level origin-build requests like WebSockets and HTTP, and the other for
// non-origin-bound low-level stuff like DNS, UDP, and TCP.
interface NetworkService {
  CreateURLLoader(URLLoader& loader);

  GetCookieStore(CookieStore& cookie_store);

  CreateWebSocket(WebSocket& socket);

  // Creates a TCP socket bound to a given local address. This bound socket
  // can be used for creating a client or server socket on that local address.
  //
  // If you want to create a client socket to connect to a server and are in
  // the common case where you don't care about the local address it's bound
  // to, use CreateTCPConnectedSocket.
  //
  // The local address can specify 0 for the port to specify that the OS should
  // pick an available port for the given address, or it can pass 0 for the
  // address and port for the OS to pick both the local address and port. In
  // all success cases, the resulting local address will be passed to the
  // callback as bound_to.
  CreateTCPBoundSocket(NetAddress? local_address,
                       TCPBoundSocket& bound_socket)
      => (NetworkError result, NetAddress? bound_to);

  // Creates a client socket connected to the given remote address. A local
  // address and port will be allocated for the connection and passed to the
  // callback on success.
  //
  // If you want control over the local address and port, instead use
  // CreateTCPBoundSocket.
  //
  // IMPORTANT: This does not work yet! We need to add a new parameter to
  // indicate the protocol type (IPv4 or IPv6) actually be able to create the
  // right type of socket. We also need to figure out how the client is supposed
  // to decide between IPv4 and IPv6 on a given system.
  CreateTCPConnectedSocket(NetAddress remote_address,
                           handle<data_pipe_consumer> send_stream,
                           handle<data_pipe_producer> receive_stream,
                           TCPConnectedSocket& client_socket)
      => (NetworkError result,
          NetAddress? local_address);

  CreateUDPSocket(UDPSocket& socket);

  // Starts an HTTP server running on the given local address. The delegate will
  // be notified with incoming connections.
  //
  // The local address can specify 0 for the port to specify that the OS should
  // pick an available port for the given address, or it can pass 0 for the
  // address and port for the OS to pick both the local address and port. In
  // all success cases, the resulting local address will be passed to the
  // callback as bound_to.
  CreateHttpServer(NetAddress local_address,
                   HttpServerDelegate delegate)
      => (NetworkError result,
          NetAddress? bound_to);

  // Register a new url loader interceptor that will be used on any new
  // URLLoader created with the current connection to the network service.
  // Interceptors are chained. The last registered interceptor will received the
  // requests first and the responses last.
  RegisterURLLoaderInterceptor(URLLoaderInterceptorFactory factory);

  // Create a HostResolver that can be used to do ip <-> host lookups.
  CreateHostResolver(HostResolver& host_resolver);
};
