// Copyright (c) 2012 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.

#ifndef PPAPI_CPP_PRIVATE_NET_ADDRESS_PRIVATE_H_
#define PPAPI_CPP_PRIVATE_NET_ADDRESS_PRIVATE_H_

#include <string>

#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/private/ppb_net_address_private.h"

namespace pp {

class NetAddressPrivate {
 public:
  // Returns true if the required interface is available.
  static bool IsAvailable();

  static bool AreEqual(const PP_NetAddress_Private& addr1,
                       const PP_NetAddress_Private& addr2);
  static bool AreHostsEqual(const PP_NetAddress_Private& addr1,
                            const PP_NetAddress_Private& addr2);
  static std::string Describe(const PP_NetAddress_Private& addr,
                              bool include_port);
  static bool ReplacePort(const PP_NetAddress_Private& addr_in,
                          uint16_t port,
                          PP_NetAddress_Private* addr_out);
  static bool GetAnyAddress(bool is_ipv6, PP_NetAddress_Private* addr);
  static PP_NetAddressFamily_Private GetFamily(
      const PP_NetAddress_Private& addr);
  static uint16_t GetPort(const PP_NetAddress_Private& addr);
  static bool GetAddress(const PP_NetAddress_Private& addr,
                         void* address,
                         uint16_t address_size);
  static uint32_t GetScopeID(const PP_NetAddress_Private& addr);
  static bool CreateFromIPv4Address(const uint8_t ip[4],
                                    uint16_t port,
                                    struct PP_NetAddress_Private* addr_out);
  static bool CreateFromIPv6Address(const uint8_t ip[16],
                                    uint32_t scope_id,
                                    uint16_t port,
                                    struct PP_NetAddress_Private* addr_out);
};

}  // namespace pp

#endif  // PPAPI_CPP_PRIVATE_NET_ADDRESS_PRIVATE_H_
