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

// WARNING! Do NOT use this mojom. It is intended as a temporary interface to
// implement out-of-process proxy resolution. If you wish to use a Mojo DNS
// service, contact amistry@/sammc@ and net-dev to discuss a permanent Mojo DNS
// interface.

// Put Mojo definitions into their own namespace to avoid collisions with C++
// definitions.
// TODO(amistry): Resolve the conflict between these two sets of definitions.
module net.interfaces;

// Mirror of net::AddressFamily.
enum AddressFamily {
  UNSPECIFIED,
  IPV4,
  IPV6,
};

// Mirror of net::HostResolver::RequestInfo.
struct HostResolverRequestInfo {
  string host;
  uint16 port;
  AddressFamily address_family;
  bool is_my_ip_address;
};

// Mirror of net::IPEndPoint.
struct IPEndPoint {
  // IP address as a numeric value from most to least significant byte.
  // Will be of length 4 for IPv4 addresses and 16 for IPv6.
  array<uint8> address;
  uint16 port;
};

// Mirror of net::AddressList.
struct AddressList {
  array<IPEndPoint> addresses;
};

interface HostResolver {
  // Use a HostResolverRequestClient instead of returning a result so we can
  // cancel in-flight requests by destroying the client.  IPC requests in Mojo
  // cannot be cancelled directly.
  // TODO(amistry): Add BoundNetLog.
  Resolve(HostResolverRequestInfo request_info,
          HostResolverRequestClient client);
};

interface HostResolverRequestClient {
  // |error| is a value in net::Error.
  ReportResult(int32 error, AddressList? result);
};
