28 #include <boost/lexical_cast.hpp>
29 #include <boost/regex.hpp>
31 #include <ndn-cxx/mgmt/nfd/face-query-filter.hpp>
32 #include <ndn-cxx/mgmt/nfd/face-status.hpp>
33 #include <ndn-cxx/util/segment-fetcher.hpp>
39 FaceIdFetcher::FaceIdFetcher(ndn::Face& face,
40 ndn::nfd::Controller& controller,
42 const SuccessCallback& onSucceed,
43 const FailureCallback& onFail)
45 , m_controller(controller)
46 , m_allowCreate(allowCreate)
47 , m_onSucceed(onSucceed)
53 FaceIdFetcher::start(ndn::Face& face,
54 ndn::nfd::Controller& controller,
55 const std::string& input,
70 boost::regex e(
"^[a-z0-9]+\\:.*");
71 if (!boost::regex_match(input, e)) {
73 uint32_t faceId = boost::lexical_cast<uint32_t>(input);
77 catch (
const boost::bad_lexical_cast&) {
78 onFail(
"No valid faceId or faceUri is provided");
84 if (!faceUri.parse(input)) {
85 onFail(
"FaceUri parse failed");
89 auto fetcher =
new FaceIdFetcher(std::ref(face), std::ref(controller),
90 allowCreate, onSucceed, onFail);
91 fetcher->startGetFaceId(faceUri);
96 FaceIdFetcher::startGetFaceId(
const FaceUri& faceUri)
98 faceUri.canonize(bind(&FaceIdFetcher::onCanonizeSuccess,
this, _1),
99 bind(&FaceIdFetcher::onCanonizeFailure,
this, _1),
100 m_face.getIoService(), time::seconds(4));
104 FaceIdFetcher::onCanonizeSuccess(
const FaceUri& canonicalUri)
106 ndn::Name queryName(
"/localhost/nfd/faces/query");
107 ndn::nfd::FaceQueryFilter queryFilter;
108 queryFilter.setRemoteUri(canonicalUri.toString());
109 queryName.append(queryFilter.wireEncode());
111 ndn::Interest interestPacket(queryName);
112 interestPacket.setMustBeFresh(
true);
113 interestPacket.setInterestLifetime(time::milliseconds(4000));
114 auto interest = std::make_shared<ndn::Interest>(interestPacket);
116 ndn::util::SegmentFetcher::fetch(
117 m_face, *interest, m_validator,
118 bind(&FaceIdFetcher::onQuerySuccess,
this, _1, canonicalUri),
119 bind(&FaceIdFetcher::onQueryFailure,
this, _1, canonicalUri));
123 FaceIdFetcher::onCanonizeFailure(
const std::string& reason)
125 fail(
"Canonize faceUri failed : " + reason);
129 FaceIdFetcher::onQuerySuccess(
const ndn::ConstBufferPtr& data,
130 const FaceUri& canonicalUri)
135 std::tie(isOk, block) = ndn::Block::fromBuffer(data, offset);
139 startFaceCreate(canonicalUri);
142 fail(
"Fail to find faceId");
147 ndn::nfd::FaceStatus status(block);
148 succeed(status.getFaceId());
150 catch (
const ndn::tlv::Error& e) {
151 std::string errorMessage(e.what());
152 fail(
"ERROR: " + errorMessage);
158 FaceIdFetcher::onQueryFailure(uint32_t errorCode,
159 const FaceUri& canonicalUri)
161 std::stringstream ss;
162 ss <<
"Cannot fetch data (code " << errorCode <<
")";
167 FaceIdFetcher::onFaceCreateError(
const ndn::nfd::ControlResponse& response,
168 const std::string& message)
170 std::stringstream ss;
171 ss << message <<
" : " << response.getText() <<
" (code " << response.getCode() <<
")";
176 FaceIdFetcher::startFaceCreate(
const FaceUri& canonicalUri)
178 ndn::nfd::ControlParameters parameters;
179 parameters.setUri(canonicalUri.toString());
181 m_controller.start<ndn::nfd::FaceCreateCommand>(parameters,
182 [
this] (
const ndn::nfd::ControlParameters& result) { succeed(result.getFaceId()); },
183 bind(&FaceIdFetcher::onFaceCreateError,
this, _1,
"Face creation failed"));
187 FaceIdFetcher::succeed(uint32_t faceId)
194 FaceIdFetcher::fail(
const std::string& reason)
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...