1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_BASE_HOST_PORT_PAIR_H_
6#define NET_BASE_HOST_PORT_PAIR_H_
7
8#include <string>
9#include "base/basictypes.h"
10#include "net/base/net_export.h"
11
12class GURL;
13
14namespace net {
15
16class IPEndPoint;
17
18class NET_EXPORT HostPortPair {
19 public:
20  HostPortPair();
21  // If |in_host| represents an IPv6 address, it should not bracket the address.
22  HostPortPair(const std::string& in_host, uint16 in_port);
23
24  // Creates a HostPortPair for the origin of |url|.
25  static HostPortPair FromURL(const GURL& url);
26
27  // Creates a HostPortPair from an IPEndPoint.
28  static HostPortPair FromIPEndPoint(const IPEndPoint& ipe);
29
30  // Creates a HostPortPair from a string formatted in same manner as
31  // ToString().
32  static HostPortPair FromString(const std::string& str);
33
34  // TODO(willchan): Define a functor instead.
35  // Comparator function so this can be placed in a std::map.
36  bool operator<(const HostPortPair& other) const {
37    if (port_ != other.port_)
38      return port_ < other.port_;
39    return host_ < other.host_;
40  }
41
42  // Equality test of contents. (Probably another violation of style guide).
43  bool Equals(const HostPortPair& other) const {
44    return host_ == other.host_ && port_ == other.port_;
45  }
46
47  bool IsEmpty() const {
48    return host_.empty() && port_ == 0;
49  }
50
51  const std::string& host() const {
52    return host_;
53  }
54
55  uint16 port() const {
56    return port_;
57  }
58
59  void set_host(const std::string& in_host) {
60    host_ = in_host;
61  }
62
63  void set_port(uint16 in_port) {
64    port_ = in_port;
65  }
66
67  // ToString() will convert the HostPortPair to "host:port".  If |host_| is an
68  // IPv6 literal, it will add brackets around |host_|.
69  std::string ToString() const;
70
71  // Returns |host_|, adding IPv6 brackets if needed.
72  std::string HostForURL() const;
73
74 private:
75  // If |host_| represents an IPv6 address, this string will not contain
76  // brackets around the address.
77  std::string host_;
78  uint16 port_;
79};
80
81}  // namespace net
82
83#endif  // NET_BASE_HOST_PORT_PAIR_H_
84