// 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 HostResolverService {
  // 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);
};
