blob: 80e79308060ff0906eb512ead5b969a874ef8c38 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -07002/**
Alexander Afanasyev9d158f02015-02-17 21:30:19 -08003 * Copyright (c) 2013-2015 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070020 */
21
Jeff Thompsonb9e3c8e2013-08-02 11:42:51 -070022#ifndef NDN_FACE_HPP
Jeff Thompsona0d18c92013-08-06 13:55:32 -070023#define NDN_FACE_HPP
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070024
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080025#include "common.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070026
27#include "name.hpp"
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080028#include "interest.hpp"
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070029#include "interest-filter.hpp"
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080030#include "data.hpp"
Joao Pereira0b3cac52015-07-02 14:49:49 -040031#include "security/signing-info.hpp"
32
33#define NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
34
35#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev984ad192014-05-02 19:11:15 -070036#include "security/identity-certificate.hpp"
Joao Pereira0b3cac52015-07-02 14:49:49 -040037#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080038
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070039namespace boost {
40namespace asio {
41class io_service;
42}
43}
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080044
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -070045namespace ndn {
46
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -070047class Transport;
48
49class PendingInterestId;
50class RegisteredPrefixId;
51class InterestFilterId;
52
Yingdi Yu1b0311c2015-06-10 14:58:47 -070053namespace security {
54class KeyChain;
55}
56using security::KeyChain;
57
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -070058namespace nfd {
59class Controller;
60}
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -070061
Jeff Thompsonfe08e5a2013-08-13 11:15:59 -070062/**
Alexander Afanasyev984ad192014-05-02 19:11:15 -070063 * @brief Callback called when expressed Interest gets satisfied with Data packet
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080064 */
65typedef function<void(const Interest&, Data&)> OnData;
66
67/**
Alexander Afanasyev984ad192014-05-02 19:11:15 -070068 * @brief Callback called when expressed Interest times out
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080069 */
70typedef function<void(const Interest&)> OnTimeout;
71
72/**
Alexander Afanasyev984ad192014-05-02 19:11:15 -070073 * @brief Callback called when incoming Interest matches the specified InterestFilter
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080074 */
Alexander Afanasyev90164962014-03-06 08:29:59 +000075typedef function<void (const InterestFilter&, const Interest&)> OnInterest;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080076
77/**
Alexander Afanasyev984ad192014-05-02 19:11:15 -070078 * @brief Callback called when registerPrefix or setInterestFilter command succeeds
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080079 */
Alexander Afanasyev984ad192014-05-02 19:11:15 -070080typedef function<void(const Name&)> RegisterPrefixSuccessCallback;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080081
Alexander Afanasyev984ad192014-05-02 19:11:15 -070082/**
83 * @brief Callback called when registerPrefix or setInterestFilter command fails
84 */
85typedef function<void(const Name&, const std::string&)> RegisterPrefixFailureCallback;
86
87/**
88 * @brief Callback called when unregisterPrefix or unsetInterestFilter command succeeds
89 */
90typedef function<void()> UnregisterPrefixSuccessCallback;
91
92/**
93 * @brief Callback called when unregisterPrefix or unsetInterestFilter command fails
94 */
95typedef function<void(const std::string&)> UnregisterPrefixFailureCallback;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -080096
97
98/**
99 * @brief Abstraction to communicate with local or remote NDN forwarder
Jeff Thompsonfe08e5a2013-08-13 11:15:59 -0700100 */
Alexander Afanasyev8460afb2014-02-15 20:31:42 -0800101class Face : noncopyable
102{
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700103public:
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700104 class Error : public std::runtime_error
105 {
106 public:
107 explicit
108 Error(const std::string& what)
109 : std::runtime_error(what)
110 {
111 }
112 };
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800113
Junxiao Shiedd834e2014-10-28 20:28:58 -0700114public: // constructors
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800115 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700116 * @brief Create a new Face using the default transport (UnixTransport)
117 *
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600118 * @throws ConfigFile::Error on configuration file parse failure
119 * @throws Face::Error on unsupported protocol
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800120 */
Alexander Afanasyevf7ca3202014-02-14 22:28:31 -0800121 Face();
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800122
123 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700124 * @brief Create a new Face using the default transport (UnixTransport)
125 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700126 * @par Usage examples:
127 *
128 * Face face1;
129 * Face face2(face1.getIoService());
130 *
131 * // Now the following ensures that events on both faces are processed
132 * face1.processEvents();
133 * // or face1.getIoService().run();
134 *
135 * @par or
136 *
137 * boost::asio::io_service ioService;
138 * Face face1(ioService);
139 * Face face2(ioService);
140 * ...
141 *
142 * ioService.run();
143 *
144 * @param ioService A reference to boost::io_service object that should control all
145 * IO operations.
146 * @throws ConfigFile::Error on configuration file parse failure
147 * @throws Face::Error on unsupported protocol
148 */
149 explicit
150 Face(boost::asio::io_service& ioService);
151
152 /**
153 * @brief Create a new Face using TcpTransport
154 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700155 * @param host The host of the NDN forwarder
156 * @param port (optional) The port or service name of the NDN forwarder (**default**: "6363")
157 *
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600158 * @throws Face::Error on unsupported protocol
Jeff Thompsonfe08e5a2013-08-13 11:15:59 -0700159 */
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800160 Face(const std::string& host, const std::string& port = "6363");
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800161
162 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700163 * @brief Create a new Face using the given Transport
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700164 *
165 * @param transport A shared_ptr to a Transport object used for communication
166 *
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600167 * @throws Face::Error on unsupported protocol
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800168 */
Alexander Afanasyevf7ca3202014-02-14 22:28:31 -0800169 explicit
170 Face(const shared_ptr<Transport>& transport);
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800171
172 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700173 * @brief Create a new Face using the given Transport and IO service object
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800174 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700175 * @sa Face(boost::asio::io_service&)
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800176 *
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600177 * @throws Face::Error on unsupported protocol
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800178 */
179 Face(const shared_ptr<Transport>& transport,
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700180 boost::asio::io_service& ioService);
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800181
Jeff Thompson4fe45512013-08-23 14:06:38 -0700182 /**
Junxiao Shiedd834e2014-10-28 20:28:58 -0700183 * @brief Create a new Face using the given Transport and IO service object
184 * @param transport the Transport used for communication
185 * @param ioService the io_service that controls all IO operations
186 * @param keyChain the KeyChain to sign commands
187 * @throws Face::Error on unsupported protocol
188 * @note shared_ptr is passed by value because ownership is shared with this class
189 */
190 Face(shared_ptr<Transport> transport,
191 boost::asio::io_service& ioService,
192 KeyChain& keyChain);
193
194 ~Face();
195
196public: // consumer
197 /**
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800198 * @brief Express Interest
199 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700200 * @param interest An Interest to be expressed
201 * @param onData Callback to be called when a matching data packet is received
202 * @param onTimeout (optional) A function object to call if the interest times out
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800203 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700204 * @return The pending interest ID which can be used with removePendingInterest
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700205 *
206 * @throws Error when Interest size exceeds maximum limit (MAX_NDN_PACKET_SIZE)
Jeff Thompson4fe45512013-08-23 14:06:38 -0700207 */
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800208 const PendingInterestId*
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800209 expressInterest(const Interest& interest,
210 const OnData& onData, const OnTimeout& onTimeout = OnTimeout());
Jeff Thompson4fe45512013-08-23 14:06:38 -0700211
212 /**
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800213 * @brief Express Interest using name and Interest template
214 *
215 * @param name Name of the Interest
216 * @param tmpl Interest template to fill parameters
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700217 * @param onData Callback to be called when a matching data packet is received
218 * @param onTimeout (optional) A function object to call if the interest times out
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800219 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700220 * @return Opaque pending interest ID which can be used with removePendingInterest
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700221 *
222 * @throws Error when Interest size exceeds maximum limit (MAX_NDN_PACKET_SIZE)
Jeff Thompson7aec0252013-08-22 17:29:57 -0700223 */
Alexander Afanasyevb790d952014-01-24 12:07:53 -0800224 const PendingInterestId*
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800225 expressInterest(const Name& name,
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800226 const Interest& tmpl,
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800227 const OnData& onData, const OnTimeout& onTimeout = OnTimeout());
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700228
Jeff Thompson11095142013-10-01 16:20:28 -0700229 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700230 * @brief Cancel previously expressed Interest
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700231 *
Jeff Thompson11095142013-10-01 16:20:28 -0700232 * @param pendingInterestId The ID returned from expressInterest.
233 */
234 void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800235 removePendingInterest(const PendingInterestId* pendingInterestId);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700236
Jeff Thompson432c8be2013-08-09 16:16:08 -0700237 /**
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700238 * @brief Get number of pending Interests
239 */
240 size_t
241 getNPendingInterests() const;
242
Junxiao Shiedd834e2014-10-28 20:28:58 -0700243public: // producer
Alexander Afanasyev6fcdde22014-08-22 19:03:36 -0700244 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700245 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
246 * callback and register the filtered prefix with the connected NDN forwarder
247 *
248 * This version of setInterestFilter combines setInterestFilter and registerPrefix
249 * operations and is intended to be used when only one filter for the same prefix needed
250 * to be set. When multiple names sharing the same prefix should be dispatched to
251 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
252 * a series of setInterestFilter calls.
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700253 *
Alexander Afanasyev90164962014-03-06 08:29:59 +0000254 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700255 * @param onInterest A callback to be called when a matching interest is received
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700256 * @param onFailure A callback to be called when prefixRegister command fails
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400257 * @param flags (optional) RIB flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400258 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
259 * used in the signature will be used.
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700260 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700261 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
262 * removeRegisteredPrefix
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700263 */
264 const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000265 setInterestFilter(const InterestFilter& interestFilter,
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700266 const OnInterest& onInterest,
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700267 const RegisterPrefixFailureCallback& onFailure,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400268 const security::SigningInfo& signingInfo = security::SigningInfo(),
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700269 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700270
271 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700272 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
273 * callback and register the filtered prefix with the connected NDN forwarder
274 *
275 * This version of setInterestFilter combines setInterestFilter and registerPrefix
276 * operations and is intended to be used when only one filter for the same prefix needed
277 * to be set. When multiple names sharing the same prefix should be dispatched to
278 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
279 * a series of setInterestFilter calls.
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700280 *
Alexander Afanasyev90164962014-03-06 08:29:59 +0000281 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700282 * @param onInterest A callback to be called when a matching interest is received
283 * @param onSuccess A callback to be called when prefixRegister command succeeds
284 * @param onFailure A callback to be called when prefixRegister command fails
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400285 * @param flags (optional) RIB flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400286 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
287 * used in the signature will be used.
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700288 *
Joao Pereira0b3cac52015-07-02 14:49:49 -0400289 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
290 * removeRegisteredPrefix
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700291 */
292 const RegisteredPrefixId*
Alexander Afanasyev90164962014-03-06 08:29:59 +0000293 setInterestFilter(const InterestFilter& interestFilter,
Yingdi Yue66bf2a2014-04-28 17:07:36 -0700294 const OnInterest& onInterest,
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700295 const RegisterPrefixSuccessCallback& onSuccess,
296 const RegisterPrefixFailureCallback& onFailure,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400297 const security::SigningInfo& signingInfo = security::SigningInfo(),
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700298 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700299
300 /**
301 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest callback
302 *
303 * @param interestFilter Interest
304 * @param onInterest A callback to be called when a matching interest is received
305 *
306 * This method modifies library's FIB only, and does not register the prefix with the
307 * forwarder. It will always succeed. To register prefix with the forwarder, use
308 * registerPrefix, or use the setInterestFilter overload taking two callbacks.
309 *
310 * @return Opaque interest filter ID which can be used with unsetInterestFilter
311 */
312 const InterestFilterId*
313 setInterestFilter(const InterestFilter& interestFilter,
314 const OnInterest& onInterest);
315
Joao Pereira0b3cac52015-07-02 14:49:49 -0400316#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
317 /**
318 * @deprecated Use override with SigningInfo instead of this function
319 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
320 * callback and register the filtered prefix with the connected NDN forwarder
321 *
322 * This version of setInterestFilter combines setInterestFilter and registerPrefix
323 * operations and is intended to be used when only one filter for the same prefix needed
324 * to be set. When multiple names sharing the same prefix should be dispatched to
325 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
326 * a series of setInterestFilter calls.
327 *
328 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
329 * @param onInterest A callback to be called when a matching interest is received
330 * @param onSuccess A callback to be called when prefixRegister command succeeds
331 * @param onFailure A callback to be called when prefixRegister command fails
332 * @param flags (optional) RIB flags
333 * @param certificate (optional) A certificate under which the prefix registration
334 * command is signed. When omitted, a default certificate of
335 * the default identity is used to sign the registration command
336 *
337 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
338 * removeRegisteredPrefix
339 */
philobb778e72015-08-25 14:49:19 -0700340 DEPRECATED(
Joao Pereira0b3cac52015-07-02 14:49:49 -0400341 const RegisteredPrefixId*
342 setInterestFilter(const InterestFilter& interestFilter,
343 const OnInterest& onInterest,
344 const RegisterPrefixSuccessCallback& onSuccess,
345 const RegisterPrefixFailureCallback& onFailure,
346 const IdentityCertificate& certificate,
philobb778e72015-08-25 14:49:19 -0700347 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700348
349 /**
Joao Pereira0b3cac52015-07-02 14:49:49 -0400350 * @deprecated Use override with SigningInfo instead of this function
351 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
352 * callback and register the filtered prefix with the connected NDN forwarder
353 *
354 * This version of setInterestFilter combines setInterestFilter and registerPrefix
355 * operations and is intended to be used when only one filter for the same prefix needed
356 * to be set. When multiple names sharing the same prefix should be dispatched to
357 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
358 * a series of setInterestFilter calls.
359 *
360 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
361 * @param onInterest A callback to be called when a matching interest is received
362 * @param onFailure A callback to be called when prefixRegister command fails
363 * @param flags (optional) RIB flags
364 * @param certificate (optional) A certificate under which the prefix registration
365 * command is signed. When omitted, a default certificate of
366 * the default identity is used to sign the registration command
367 *
368 * @return Opaque registered prefix ID which can be used with unsetInterestFilter or
369 * removeRegisteredPrefix
370 */
philobb778e72015-08-25 14:49:19 -0700371 DEPRECATED(
Joao Pereira0b3cac52015-07-02 14:49:49 -0400372 const RegisteredPrefixId*
373 setInterestFilter(const InterestFilter& interestFilter,
374 const OnInterest& onInterest,
375 const RegisterPrefixFailureCallback& onFailure,
376 const IdentityCertificate& certificate,
philobb778e72015-08-25 14:49:19 -0700377 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400378
379 /**
380 * @deprecated Use override with SigningInfo instead of this function
381 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
382 * callback and register the filtered prefix with the connected NDN forwarder
383 *
384 * This version of setInterestFilter combines setInterestFilter and registerPrefix
385 * operations and is intended to be used when only one filter for the same prefix needed
386 * to be set. When multiple names sharing the same prefix should be dispatched to
387 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
388 * a series of setInterestFilter calls.
389 *
390 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
391 * @param onInterest A callback to be called when a matching interest is received
392 * @param onSuccess A callback to be called when prefixRegister command succeeds
393 * @param onFailure A callback to be called when prefixRegister command fails
394 * @param identity A signing identity. A prefix registration command is signed
395 * under the default certificate of this identity
396 * @param flags (optional) RIB flags
397 *
398 * @return Opaque registered prefix ID which can be used with removeRegisteredPrefix
399 */
philobb778e72015-08-25 14:49:19 -0700400 DEPRECATED(
Joao Pereira0b3cac52015-07-02 14:49:49 -0400401 const RegisteredPrefixId*
402 setInterestFilter(const InterestFilter& interestFilter,
403 const OnInterest& onInterest,
404 const RegisterPrefixSuccessCallback& onSuccess,
405 const RegisterPrefixFailureCallback& onFailure,
406 const Name& identity,
philobb778e72015-08-25 14:49:19 -0700407 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400408
409 /**
410 * @deprecated Use override with SigningInfo instead of this function
411 * @brief Set InterestFilter to dispatch incoming matching interest to onInterest
412 * callback and register the filtered prefix with the connected NDN forwarder
413 *
414 * This version of setInterestFilter combines setInterestFilter and registerPrefix
415 * operations and is intended to be used when only one filter for the same prefix needed
416 * to be set. When multiple names sharing the same prefix should be dispatched to
417 * different callbacks, use one registerPrefix call, followed (in onSuccess callback) by
418 * a series of setInterestFilter calls.
419 *
420 * @param interestFilter Interest filter (prefix part will be registered with the forwarder)
421 * @param onInterest A callback to be called when a matching interest is received
422 * @param onFailure A callback to be called when prefixRegister command fails
423 * @param identity A signing identity. A prefix registration command is signed
424 * under the default certificate of this identity
425 * @param flags (optional) RIB flags
426 *
427 * @return Opaque registered prefix ID which can be used with removeRegisteredPrefix
428 */
philobb778e72015-08-25 14:49:19 -0700429 DEPRECATED(
Joao Pereira0b3cac52015-07-02 14:49:49 -0400430 const RegisteredPrefixId*
431 setInterestFilter(const InterestFilter& interestFilter,
432 const OnInterest& onInterest,
433 const RegisterPrefixFailureCallback& onFailure,
434 const Name& identity,
philobb778e72015-08-25 14:49:19 -0700435 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400436#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
437
438 /**
439 * @brief Register prefix with the connected NDN forwarder
440 *
441 * This method only modifies forwarder's RIB and does not associate any
442 * onInterest callbacks. Use setInterestFilter method to dispatch incoming Interests to
443 * the right callbacks.
444 *
445 * @param prefix A prefix to register with the connected NDN forwarder
446 * @param onSuccess A callback to be called when prefixRegister command succeeds
447 * @param onFailure A callback to be called when prefixRegister command fails
448 * @param signingInfo (optional) Signing parameters. When omitted, a default parameters
449 * used in the signature will be used.
Alexander Afanasyevf2a46222015-09-17 18:01:30 -0700450 * @param flags Prefix registration flags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400451 *
452 * @return The registered prefix ID which can be used with unregisterPrefix
Alexander Afanasyevf2a46222015-09-17 18:01:30 -0700453 * @see nfd::RouteFlags
Joao Pereira0b3cac52015-07-02 14:49:49 -0400454 */
455 const RegisteredPrefixId*
456 registerPrefix(const Name& prefix,
457 const RegisterPrefixSuccessCallback& onSuccess,
458 const RegisterPrefixFailureCallback& onFailure,
459 const security::SigningInfo& signingInfo = security::SigningInfo(),
460 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT);
461
462#ifdef NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
463 /**
464 * @deprecated Use override with SigningInfo instead of this function
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700465 * @brief Register prefix with the connected NDN forwarder
466 *
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400467 * This method only modifies forwarder's RIB and does not associate any
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700468 * onInterest callbacks. Use setInterestFilter method to dispatch incoming Interests to
469 * the right callbacks.
470 *
471 * @param prefix A prefix to register with the connected NDN forwarder
472 * @param onSuccess A callback to be called when prefixRegister command succeeds
473 * @param onFailure A callback to be called when prefixRegister command fails
474 * @param certificate (optional) A certificate under which the prefix registration
Junxiao Shi6a90f372014-10-13 20:29:30 -0700475 * command is signed. When omitted, a default certificate of
476 * the default identity is used to sign the registration command
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400477 * @param flags (optional) RIB flags
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700478 *
479 * @return The registered prefix ID which can be used with unregisterPrefix
480 */
philobb778e72015-08-25 14:49:19 -0700481 DEPRECATED(
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700482 const RegisteredPrefixId*
483 registerPrefix(const Name& prefix,
484 const RegisterPrefixSuccessCallback& onSuccess,
485 const RegisterPrefixFailureCallback& onFailure,
Joao Pereira0b3cac52015-07-02 14:49:49 -0400486 const IdentityCertificate& certificate,
philobb778e72015-08-25 14:49:19 -0700487 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700488
489 /**
Joao Pereira0b3cac52015-07-02 14:49:49 -0400490 * @deprecated Use override with SigningInfo instead of this function
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700491 * @brief Register prefix with the connected NDN forwarder and call onInterest when a matching
492 * interest is received.
493 *
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400494 * This method only modifies forwarder's RIB and does not associate any
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700495 * onInterest callbacks. Use setInterestFilter method to dispatch incoming Interests to
496 * the right callbacks.
497 *
498 * @param prefix A prefix to register with the connected NDN forwarder
499 * @param onSuccess A callback to be called when prefixRegister command succeeds
500 * @param onFailure A callback to be called when prefixRegister command fails
Junxiao Shi6a90f372014-10-13 20:29:30 -0700501 * @param identity A signing identity. A prefix registration command is signed
502 * under the default certificate of this identity
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400503 * @param flags (optional) RIB flags
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700504 *
505 * @return The registered prefix ID which can be used with unregisterPrefix
506 */
philobb778e72015-08-25 14:49:19 -0700507 DEPRECATED(
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700508 const RegisteredPrefixId*
509 registerPrefix(const Name& prefix,
510 const RegisterPrefixSuccessCallback& onSuccess,
511 const RegisterPrefixFailureCallback& onFailure,
Alexander Afanasyev0866f512014-08-11 13:25:09 -0700512 const Name& identity,
philobb778e72015-08-25 14:49:19 -0700513 uint64_t flags = nfd::ROUTE_FLAG_CHILD_INHERIT));
Joao Pereira0b3cac52015-07-02 14:49:49 -0400514#endif // NDN_FACE_KEEP_DEPRECATED_REGISTRATION_SIGNING
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700515
516 /**
Alexander Afanasyev1b01c312014-05-26 16:58:10 +0300517 * @brief Remove the registered prefix entry with the registeredPrefixId
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700518 *
519 * This does not affect another registered prefix with a different registeredPrefixId,
520 * even it if has the same prefix name. If there is no entry with the
521 * registeredPrefixId, do nothing.
522 *
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700523 * unsetInterestFilter will use the same credentials as original
524 * setInterestFilter/registerPrefix command
525 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700526 * @param registeredPrefixId The ID returned from registerPrefix
Jeff Thompson11095142013-10-01 16:20:28 -0700527 */
528 void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800529 unsetInterestFilter(const RegisteredPrefixId* registeredPrefixId);
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800530
Alexander Afanasyevee8bb1e2014-05-02 17:39:54 -0700531 /**
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700532 * @brief Remove previously set InterestFilter from library's FIB
533 *
534 * This method always succeeds and will **NOT** send any request to the connected
535 * forwarder.
536 *
537 * @param interestFilterId The ID returned from setInterestFilter.
538 */
539 void
540 unsetInterestFilter(const InterestFilterId* interestFilterId);
541
542 /**
Joao Pereiraba1e3b92015-06-01 17:50:37 -0400543 * @brief Unregister prefix from RIB
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700544 *
545 * unregisterPrefix will use the same credentials as original
546 * setInterestFilter/registerPrefix command
547 *
548 * If registeredPrefixId was obtained using setInterestFilter, the corresponding
549 * InterestFilter will be unset too.
550 *
Alexander Afanasyev770827c2014-05-13 17:42:55 -0700551 * @param registeredPrefixId The ID returned from registerPrefix
552 * @param onSuccess Callback to be called when operation succeeds
553 * @param onFailure Callback to be called when operation fails
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700554 */
555 void
556 unregisterPrefix(const RegisteredPrefixId* registeredPrefixId,
557 const UnregisterPrefixSuccessCallback& onSuccess,
558 const UnregisterPrefixFailureCallback& onFailure);
559
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800560 /**
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800561 * @brief Publish data packet
562 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700563 * This method can be called to satisfy the incoming Interest or to put Data packet into
Alexander Afanasyev6a05b4b2014-07-18 17:23:00 -0700564 * the cache of the local NDN forwarder.
565 *
566 * @param data Data packet to publish. It is highly recommended to use Data packet that
567 * was created using make_shared<Data>(...). Otherwise, put() will make an
568 * extra copy of the Data packet to ensure validity of published Data until
569 * asynchronous put() operation finishes.
Alexander Afanasyev49bb1fb2014-07-21 12:54:01 -0700570 *
571 * @throws Error when Data size exceeds maximum limit (MAX_NDN_PACKET_SIZE)
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800572 */
573 void
Alexander Afanasyev7682ccb2014-02-20 10:29:35 -0800574 put(const Data& data);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700575
Junxiao Shiedd834e2014-10-28 20:28:58 -0700576public: // IO routine
Jeff Thompson86507bc2013-08-23 20:51:38 -0700577 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700578 * @brief Process any data to receive or call timeout callbacks.
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800579 *
580 * This call will block forever (default timeout == 0) to process IO on the face.
581 * To exit, one expected to call face.shutdown() from one of the callback methods.
582 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700583 * If positive timeout is specified, then processEvents will exit after this timeout, if
584 * not stopped earlier with face.shutdown() or when all active events finish. The call
585 * can be called repeatedly, if desired.
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -0800586 *
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700587 * If negative timeout is specified, then processEvents will not block and process only
588 * pending events.
Alexander Afanasyevf75a0aa2014-01-09 14:29:22 -0800589 *
Alexander Afanasyev984ad192014-05-02 19:11:15 -0700590 * @param timeout maximum time to block the thread
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700591 * @param keepThread Keep thread in a blocked state (in event processing), even when
592 * there are no outstanding events (e.g., no Interest/Data is expected)
593 *
594 * @throw This may throw an exception for reading data or in the callback for processing
595 * the data. If you call this from an main event loop, you may want to catch and
596 * log/disregard all exceptions.
Jeff Thompson432c8be2013-08-09 16:16:08 -0700597 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700598 void
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700599 processEvents(const time::milliseconds& timeout = time::milliseconds::zero(),
600 bool keepThread = false);
Jeff Thompson432c8be2013-08-09 16:16:08 -0700601
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700602 /**
603 * @brief Shutdown face operations
604 *
605 * This method cancels all pending operations and closes connection to NDN Forwarder.
606 *
607 * Note that this method does not stop IO service and if the same IO service is shared
608 * between multiple Faces or with other IO objects (e.g., Scheduler).
609 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700610 void
Jeff Thompson0050abe2013-09-17 12:50:25 -0700611 shutdown();
Yingdi Yu0d920812014-01-30 14:50:57 -0800612
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700613 /**
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700614 * @brief Get reference to IO service object
615 */
616 boost::asio::io_service&
617 getIoService()
618 {
Junxiao Shi2cced062014-11-02 21:27:38 -0700619 return m_ioService;
Alexander Afanasyev691c3ce2014-04-23 14:28:04 -0700620 }
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800621
622private:
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700623
624 /**
625 * @throws ConfigFile::Error on parse error and unsupported protocols
626 */
627 void
Joao Pereira68c0d882015-05-19 14:27:55 -0400628 construct(KeyChain& keyChain);
Steve DiBenedettoa8659ff2014-12-04 14:50:28 -0700629
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600630 /**
631 * @throws Face::Error on unsupported protocol
Junxiao Shi2cced062014-11-02 21:27:38 -0700632 * @note shared_ptr is passed by value because ownership is transferred to this function
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600633 */
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800634 void
Joao Pereira68c0d882015-05-19 14:27:55 -0400635 construct(shared_ptr<Transport> transport, KeyChain& keyChain);
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600636
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700637 void
Alexander Afanasyev6d48bc12014-02-18 00:10:51 -0800638 onReceiveElement(const Block& wire);
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800639
Alexander Afanasyev7dced462014-03-19 15:12:32 -0700640 void
641 asyncShutdown();
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700642
Jeff Thompsonb982b6d2013-07-15 18:15:45 -0700643private:
Junxiao Shi2cced062014-11-02 21:27:38 -0700644 /// the IO service owned by this Face, could be null
645 unique_ptr<boost::asio::io_service> m_internalIoService;
646 /// the IO service used by this Face
647 boost::asio::io_service& m_ioService;
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700648
Alexander Afanasyevf39c5372014-02-17 19:42:56 -0800649 shared_ptr<Transport> m_transport;
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800650
Junxiao Shiedd834e2014-10-28 20:28:58 -0700651 /** @brief if not null, a pointer to an internal KeyChain owned by Face
652 * @note if a KeyChain is supplied to constructor, this pointer will be null,
653 * and the passed KeyChain is given to nfdController;
654 * currently Face does not keep the KeyChain passed in constructor
655 * because it's not needed, but this may change in the future
656 */
Joao Pereira68c0d882015-05-19 14:27:55 -0400657 unique_ptr<KeyChain> m_internalKeyChain;
Junxiao Shiedd834e2014-10-28 20:28:58 -0700658
Joao Pereira68c0d882015-05-19 14:27:55 -0400659 unique_ptr<nfd::Controller> m_nfdController;
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600660
Alexander Afanasyev258ec2b2014-05-14 16:15:37 -0700661 class Impl;
Joao Pereira68c0d882015-05-19 14:27:55 -0400662 unique_ptr<Impl> m_impl;
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700663};
664
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800665} // namespace ndn
Jeff Thompsonaa4e6db2013-07-15 17:25:23 -0700666
Alexander Afanasyev0222fba2014-02-09 23:16:02 -0800667#endif // NDN_FACE_HPP