blob: aad6245f9fd52f3f8381eb87a7106364be54beaf [file] [log] [blame]
Andrea Tosatto672b9a72016-01-05 16:18:20 +01001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Klaus Schneider59ec95a2017-09-14 17:50:00 -07002/*
Davide Pesavento7c4246c2021-03-12 01:35:22 -05003 * Copyright (c) 2016-2021, Regents of the University of California,
Davide Pesavento6f76afc2017-09-19 18:43:51 -04004 * Colorado State University,
5 * University Pierre & Marie Curie, Sorbonne University.
Andrea Tosatto672b9a72016-01-05 16:18:20 +01006 *
7 * This file is part of ndn-tools (Named Data Networking Essential Tools).
8 * See AUTHORS.md for complete list of ndn-tools authors and contributors.
9 *
10 * ndn-tools is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * ndn-tools is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * ndn-tools, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
20 *
21 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
22 *
23 * @author Wentao Shang
24 * @author Steve DiBenedetto
25 * @author Andrea Tosatto
Davide Pesavento6f76afc2017-09-19 18:43:51 -040026 * @author Davide Pesavento
Klaus Schneider59ec95a2017-09-14 17:50:00 -070027 * @author Klaus Schneider
Andrea Tosatto672b9a72016-01-05 16:18:20 +010028 */
29
30#ifndef NDN_TOOLS_CHUNKS_PUTCHUNKS_PRODUCER_HPP
31#define NDN_TOOLS_CHUNKS_PUTCHUNKS_PRODUCER_HPP
32
33#include "core/common.hpp"
34
35namespace ndn {
36namespace chunks {
37
38/**
Davide Pesavento6f76afc2017-09-19 18:43:51 -040039 * @brief Segmented & versioned data publisher
Andrea Tosatto672b9a72016-01-05 16:18:20 +010040 *
Davide Pesavento7c4246c2021-03-12 01:35:22 -050041 * Packetizes and publishes data from an input stream as `/prefix/<version>/<segment number>`.
42 * Unless another value is provided, the current time is used as the version number.
43 * The packet store always has at least one item, even when the input is empty.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010044 */
45class Producer : noncopyable
46{
47public:
Davide Pesavento6f76afc2017-09-19 18:43:51 -040048 struct Options
49 {
50 security::SigningInfo signingInfo;
Davide Pesavento7c4246c2021-03-12 01:35:22 -050051 time::milliseconds freshnessPeriod = 10_s;
52 size_t maxSegmentSize = 8000;
Davide Pesavento6f76afc2017-09-19 18:43:51 -040053 bool isQuiet = false;
54 bool isVerbose = false;
55 bool wantShowVersion = false;
56 };
57
58public:
Andrea Tosatto672b9a72016-01-05 16:18:20 +010059 /**
Davide Pesavento7c4246c2021-03-12 01:35:22 -050060 * @brief Create the producer
Davide Pesavento6f76afc2017-09-19 18:43:51 -040061 * @param prefix prefix used to publish data; if the last component is not a valid
62 * version number, the current system time is used as version number.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010063 */
Davide Pesavento6f76afc2017-09-19 18:43:51 -040064 Producer(const Name& prefix, Face& face, KeyChain& keyChain, std::istream& is,
65 const Options& opts);
Andrea Tosatto672b9a72016-01-05 16:18:20 +010066
67 /**
Davide Pesavento7c4246c2021-03-12 01:35:22 -050068 * @brief Run the producer
Andrea Tosatto672b9a72016-01-05 16:18:20 +010069 */
70 void
71 run();
72
73private:
Andrea Tosatto672b9a72016-01-05 16:18:20 +010074 /**
75 * @brief Split the input stream in data packets and save them to the store
76 *
Davide Pesavento7c4246c2021-03-12 01:35:22 -050077 * Create data packets reading all the characters from the input stream until EOF or an
78 * error occurs. Each data packet has a maximum payload size of `m_options.maxSegmentSize`
79 * bytes and is stored in the vector `m_store`. An empty data packet is created and stored
80 * if the input stream is empty.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010081 *
82 * @return Number of data packets contained in the store after the operation
83 */
84 void
85 populateStore(std::istream& is);
86
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080087 /**
88 * @brief Respond with a metadata packet containing the versioned content name
89 */
Andrea Tosatto672b9a72016-01-05 16:18:20 +010090 void
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080091 processDiscoveryInterest(const Interest& interest);
92
93 /**
94 * @brief Respond with the requested segment of content
95 */
96 void
97 processSegmentInterest(const Interest& interest);
Davide Pesavento6f76afc2017-09-19 18:43:51 -040098
Andrea Tosatto672b9a72016-01-05 16:18:20 +010099PUBLIC_WITH_TESTS_ELSE_PRIVATE:
100 std::vector<shared_ptr<Data>> m_store;
101
102private:
103 Name m_prefix;
104 Name m_versionedPrefix;
105 Face& m_face;
106 KeyChain& m_keyChain;
Davide Pesavento6f76afc2017-09-19 18:43:51 -0400107 const Options m_options;
Andrea Tosatto672b9a72016-01-05 16:18:20 +0100108};
109
110} // namespace chunks
111} // namespace ndn
112
113#endif // NDN_TOOLS_CHUNKS_PUTCHUNKS_PRODUCER_HPP