blob: 12276cddf58d1418fccdf097eb61cf8aa8e6cc16 [file] [log] [blame]
Junxiao Shi77dcadd2014-10-05 14:40:54 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shid5c2f0c2017-04-04 09:52:11 +00003 * Copyright (c) 2013-2017 Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
Junxiao Shi77dcadd2014-10-05 14:40:54 -070010 *
11 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
12 *
13 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
14 * terms of the GNU Lesser General Public License as published by the Free Software
15 * Foundation, either version 3 of the License, or (at your option) any later version.
16 *
17 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
18 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
19 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
20 *
21 * You should have received copies of the GNU General Public License and GNU Lesser
22 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
23 * <http://www.gnu.org/licenses/>.
24 *
25 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
26 */
27
Junxiao Shi25467942017-06-30 02:53:14 +000028#ifndef NDN_NET_FACE_URI_HPP
29#define NDN_NET_FACE_URI_HPP
Junxiao Shi77dcadd2014-10-05 14:40:54 -070030
Junxiao Shi25467942017-06-30 02:53:14 +000031#include "ethernet.hpp"
32#include "../util/time.hpp"
Junxiao Shi77dcadd2014-10-05 14:40:54 -070033
Davide Pesaventoe1081cd2016-12-19 23:58:15 -050034#include <boost/asio/ip/tcp.hpp>
35#include <boost/asio/ip/udp.hpp>
36#include <boost/asio/local/stream_protocol.hpp>
37
Junxiao Shi77dcadd2014-10-05 14:40:54 -070038namespace ndn {
Davide Pesaventoe1081cd2016-12-19 23:58:15 -050039
Junxiao Shi77dcadd2014-10-05 14:40:54 -070040/** \brief represents the underlying protocol and address used by a Face
Junxiao Shid5c2f0c2017-04-04 09:52:11 +000041 * \sa https://redmine.named-data.net/projects/nfd/wiki/FaceMgmt#FaceUri
Junxiao Shi77dcadd2014-10-05 14:40:54 -070042 */
43class FaceUri
44{
45public:
46 class Error : public std::invalid_argument
47 {
48 public:
49 explicit
50 Error(const std::string& what)
51 : std::invalid_argument(what)
52 {
53 }
54 };
55
56 FaceUri();
57
58 /** \brief construct by parsing
59 *
60 * \param uri scheme://host[:port]/path
61 * \throw FaceUri::Error if URI cannot be parsed
62 */
63 explicit
64 FaceUri(const std::string& uri);
65
66 // This overload is needed so that calls with string literal won't be
67 // resolved to boost::asio::local::stream_protocol::endpoint overload.
68 explicit
69 FaceUri(const char* uri);
70
71 /// exception-safe parsing
72 bool
73 parse(const std::string& uri);
74
75public: // scheme-specific construction
76 /// construct udp4 or udp6 canonical FaceUri
77 explicit
78 FaceUri(const boost::asio::ip::udp::endpoint& endpoint);
79
80 /// construct tcp4 or tcp6 canonical FaceUri
81 explicit
82 FaceUri(const boost::asio::ip::tcp::endpoint& endpoint);
83
Davide Pesaventoe1081cd2016-12-19 23:58:15 -050084 /// construct tcp canonical FaceUri with custom scheme
Junxiao Shi77dcadd2014-10-05 14:40:54 -070085 FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme);
86
87#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS
88 /// construct unix canonical FaceUri
89 explicit
90 FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint);
91#endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
92
93 /// create fd FaceUri from file descriptor
94 static FaceUri
95 fromFd(int fd);
96
97 /// construct ether canonical FaceUri
98 explicit
99 FaceUri(const ethernet::Address& address);
100
101 /// create dev FaceUri from network device name
102 static FaceUri
103 fromDev(const std::string& ifname);
104
Weiwei Liud7f4fda2016-10-19 22:38:39 -0700105 /// create udp4 or udp6 NIC-associated FaceUri from endpoint and network device name
106 static FaceUri
107 fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname);
108
Junxiao Shi77dcadd2014-10-05 14:40:54 -0700109public: // getters
110 /// get scheme (protocol)
111 const std::string&
112 getScheme() const
113 {
114 return m_scheme;
115 }
116
117 /// get host (domain)
118 const std::string&
119 getHost() const
120 {
121 return m_host;
122 }
123
124 /// get port
125 const std::string&
126 getPort() const
127 {
128 return m_port;
129 }
130
131 /// get path
132 const std::string&
133 getPath() const
134 {
135 return m_path;
136 }
137
138 /// write as a string
139 std::string
140 toString() const;
141
142public: // EqualityComparable concept
143 bool
144 operator==(const FaceUri& rhs) const;
145
146 bool
147 operator!=(const FaceUri& rhs) const;
148
Junxiao Shi4083c8d2014-10-12 16:43:16 -0700149public: // canonical FaceUri
150 /** \return whether a FaceUri of the scheme can be canonized
151 */
152 static bool
153 canCanonize(const std::string& scheme);
154
155 /** \brief determine whether this FaceUri is in canonical form
156 * \return true if this FaceUri is in canonical form,
157 * false if this FaceUri is not in canonical form or
158 * or it's undetermined whether this FaceUri is in canonical form
159 */
160 bool
161 isCanonical() const;
162
163 typedef function<void(const FaceUri&)> CanonizeSuccessCallback;
164 typedef function<void(const std::string& reason)> CanonizeFailureCallback;
165
166 /** \brief asynchronously convert this FaceUri to canonical form
167 * \param onSuccess function to call after this FaceUri is converted to canonical form
168 * \note A new FaceUri in canonical form will be created; this FaceUri is unchanged.
169 * \param onFailure function to call if this FaceUri cannot be converted to canonical form
Alexander Afanasyevf2a46222015-09-17 18:01:30 -0700170 * \param io reference to `boost::asio::io_service` instance
171 * \param timeout maximum allowable duration of the operations.
172 * It's intentional not to provide a default value: the caller should set
173 * a reasonable value in balance between network delay and user experience.
Junxiao Shi4083c8d2014-10-12 16:43:16 -0700174 */
175 void
176 canonize(const CanonizeSuccessCallback& onSuccess,
177 const CanonizeFailureCallback& onFailure,
Davide Pesaventoe1081cd2016-12-19 23:58:15 -0500178 boost::asio::io_service& io,
Junxiao Shid5c2f0c2017-04-04 09:52:11 +0000179 time::nanoseconds timeout) const;
Junxiao Shi4083c8d2014-10-12 16:43:16 -0700180
Junxiao Shi77dcadd2014-10-05 14:40:54 -0700181private:
182 std::string m_scheme;
183 std::string m_host;
Junxiao Shi77dcadd2014-10-05 14:40:54 -0700184 std::string m_port;
185 std::string m_path;
Davide Pesaventoe1081cd2016-12-19 23:58:15 -0500186 /// whether to add [] around host when writing string
187 bool m_isV6;
Junxiao Shi77dcadd2014-10-05 14:40:54 -0700188
189 friend std::ostream& operator<<(std::ostream& os, const FaceUri& uri);
190};
191
192std::ostream&
193operator<<(std::ostream& os, const FaceUri& uri);
194
Junxiao Shi77dcadd2014-10-05 14:40:54 -0700195} // namespace ndn
196
Junxiao Shi25467942017-06-30 02:53:14 +0000197#endif // NDN_NET_FACE_URI_HPP