// Copyright (c) 2016 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 NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_SOCKET_ADDRESS_IMPL_H_
#define NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_SOCKET_ADDRESS_IMPL_H_

#include "net/base/ip_endpoint.h"
#include "net/third_party/quic/platform/api/quic_export.h"
#include "net/third_party/quic/platform/impl/quic_ip_address_impl.h"

namespace quic {

class QUIC_EXPORT_PRIVATE QuicSocketAddressImpl {
 public:
  QuicSocketAddressImpl() = default;
  explicit QuicSocketAddressImpl(const net::IPEndPoint& addr);
  QuicSocketAddressImpl(QuicIpAddressImpl address, uint16_t port);
#if !defined(STARBOARD)
  explicit QuicSocketAddressImpl(const struct sockaddr_storage& saddr);
  explicit QuicSocketAddressImpl(const struct sockaddr& saddr);
#endif
  QuicSocketAddressImpl(const QuicSocketAddressImpl& other) = default;
  QuicSocketAddressImpl& operator=(const QuicSocketAddressImpl& other) =
      default;
  QuicSocketAddressImpl& operator=(QuicSocketAddressImpl&& other) = default;
  friend bool operator==(const QuicSocketAddressImpl& lhs,
                         const QuicSocketAddressImpl& rhs);
  friend bool operator!=(const QuicSocketAddressImpl& lhs,
                         const QuicSocketAddressImpl& rhs);

  bool IsInitialized() const;
  std::string ToString() const;
#if !defined(STARBOARD)
  int FromSocket(int fd);
#endif
  QuicSocketAddressImpl Normalized() const;

  QuicIpAddressImpl host() const;
  uint16_t port() const;

#if !defined(STARBOARD)
  sockaddr_storage generic_address() const;
#endif
  const net::IPEndPoint& socket_address() const { return socket_address_; }

 private:
  net::IPEndPoint socket_address_;
};

}  // namespace quic

#endif  // NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_SOCKET_ADDRESS_IMPL_H_
