/* Blinker
   Copyright 2011-2019 Stefan Schuermans <stefan@blinkenarea.org>
   Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
   a blinkenarea.org project */

#ifndef UDP6ADDR_H
#define UDP6ADDR_H

#include <netinet/in.h>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>

#include "Addr.h"

namespace Blinker {

/// UDP v6 address
class Udp6Addr: public Addr
{
public:
  /// constructor
  Udp6Addr();

  /// virtual destructor
  virtual ~Udp6Addr();

public:
  /// comparison
  //@{
  int compare(const Udp6Addr &that) const;
  bool operator==(const Udp6Addr &that) const;
  bool operator!=(const Udp6Addr &that) const;
  bool operator<(const Udp6Addr &that) const;
  bool operator>(const Udp6Addr &that) const;
  bool operator<=(const Udp6Addr &that) const;
  bool operator>=(const Udp6Addr &that) const;
  //@}

  /// return address family
  virtual int getFamily() const;

  /// return port (use this function only if absolutely necessary)
  virtual int getPort() const;

  /// set port (use this function only if absolutely necessary)
  virtual void setPort(int port);

  /**
   * @brief parse from string format
   * @param[in] str string format
   * @return if parsing was successful
   */
  virtual bool fromStr(const std::string &str);

  /**
   * @brief convert to string format
   * @return string format
   */
  virtual std::string toStr() const;
protected:
  struct sockaddr_in6 m_addr;

friend class Udp6Sock;
}; // class Udp6Addr

} // namespace Blinker

#endif // #ifndef UDP6ADDR_H

