blob: 9d692284c87f6c2dcf48908646cbc3732f937175 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -08002/**
Alexander Afanasyevc169a812014-05-20 20:37:29 -04003 * Copyright (c) 2013-2014 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.
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080020 */
21
22#ifndef NDN_HELPERS_COMMAND_INTEREST_GENERATOR_HPP
23#define NDN_HELPERS_COMMAND_INTEREST_GENERATOR_HPP
24
25#include "../interest.hpp"
26#include "../security/key-chain.hpp"
27#include "../util/time.hpp"
28#include "../util/random.hpp"
29
30namespace ndn {
31
32/**
33 * @brief Helper class to generate CommandInterests
34 *
35 * @see http://redmine.named-data.net/projects/nfd/wiki/Command_Interests
36 */
37class CommandInterestGenerator
38{
39public:
40 static const Name DEFAULT_CERTIFICATE_NAME;
41
42 CommandInterestGenerator()
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070043 : m_lastTimestamp(time::toUnixTimestamp(time::system_clock::now()))
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080044 {
45 }
46
47 virtual
48 ~CommandInterestGenerator()
49 {
50 }
51
52 void
53 generate(Interest& interest, const Name& certificateName = Name());
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070054
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080055 void
56 generateWithIdentity(Interest& interest, const Name& identity);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070057
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080058private:
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070059 time::milliseconds m_lastTimestamp;
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080060 KeyChain m_keyChain;
61};
62
63
64inline void
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070065CommandInterestGenerator::generate(Interest& interest,
Yingdi Yue66bf2a2014-04-28 17:07:36 -070066 const Name& certificateName /*= Name()*/)
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080067{
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070068 time::milliseconds timestamp = time::toUnixTimestamp(time::system_clock::now());
Yingdi Yue66bf2a2014-04-28 17:07:36 -070069 while (timestamp <= m_lastTimestamp)
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080070 {
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070071 timestamp += time::milliseconds(1);
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080072 }
73
74 Name commandInterestName = interest.getName();
75 commandInterestName
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070076 .append(name::Component::fromNumber(timestamp.count()))
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080077 .append(name::Component::fromNumber(random::generateWord64()));
78 interest.setName(commandInterestName);
79
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070080 if (certificateName.empty())
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080081 m_keyChain.sign(interest);
82 else
83 m_keyChain.sign(interest, certificateName);
84
85 m_lastTimestamp = timestamp;
86}
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070087
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080088inline void
89CommandInterestGenerator::generateWithIdentity(Interest& interest, const Name& identity)
90{
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070091 time::milliseconds timestamp = time::toUnixTimestamp(time::system_clock::now());
Yingdi Yue66bf2a2014-04-28 17:07:36 -070092 while (timestamp <= m_lastTimestamp)
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070093 {
94 timestamp += time::milliseconds(1);
95 }
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -080096
97 Name commandInterestName = interest.getName();
98 commandInterestName
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070099 .append(name::Component::fromNumber(timestamp.count()))
Alexander Afanasyev9cbf70a2014-02-17 18:07:51 -0800100 .append(name::Component::fromNumber(random::generateWord64()));
101 interest.setName(commandInterestName);
102
103 m_keyChain.signByIdentity(interest, identity);
104
105 m_lastTimestamp = timestamp;
106}
107
108
109} // namespace ndn
110
111#endif // NDN_HELPERS_COMMAND_INTEREST_GENERATOR_HPP