blob: 7000bd775f30e2013e51491f3087b52d453ea0db [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 Pesaventob3570c62022-02-19 19:19:00 -05003 * Copyright (c) 2016-2022, 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
Davide Pesaventob3570c62022-02-19 19:19:00 -050035namespace ndn::chunks {
Andrea Tosatto672b9a72016-01-05 16:18:20 +010036
37/**
Davide Pesavento6f76afc2017-09-19 18:43:51 -040038 * @brief Segmented & versioned data publisher
Andrea Tosatto672b9a72016-01-05 16:18:20 +010039 *
Davide Pesavento7c4246c2021-03-12 01:35:22 -050040 * Packetizes and publishes data from an input stream as `/prefix/<version>/<segment number>`.
41 * Unless another value is provided, the current time is used as the version number.
42 * The packet store always has at least one item, even when the input is empty.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010043 */
44class Producer : noncopyable
45{
46public:
Davide Pesavento6f76afc2017-09-19 18:43:51 -040047 struct Options
48 {
49 security::SigningInfo signingInfo;
Davide Pesavento7c4246c2021-03-12 01:35:22 -050050 time::milliseconds freshnessPeriod = 10_s;
51 size_t maxSegmentSize = 8000;
Davide Pesavento6f76afc2017-09-19 18:43:51 -040052 bool isQuiet = false;
53 bool isVerbose = false;
54 bool wantShowVersion = false;
55 };
56
57public:
Andrea Tosatto672b9a72016-01-05 16:18:20 +010058 /**
Davide Pesavento7c4246c2021-03-12 01:35:22 -050059 * @brief Create the producer
Davide Pesavento6f76afc2017-09-19 18:43:51 -040060 * @param prefix prefix used to publish data; if the last component is not a valid
61 * version number, the current system time is used as version number.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010062 */
Davide Pesavento6f76afc2017-09-19 18:43:51 -040063 Producer(const Name& prefix, Face& face, KeyChain& keyChain, std::istream& is,
64 const Options& opts);
Andrea Tosatto672b9a72016-01-05 16:18:20 +010065
66 /**
Davide Pesavento7c4246c2021-03-12 01:35:22 -050067 * @brief Run the producer
Andrea Tosatto672b9a72016-01-05 16:18:20 +010068 */
69 void
70 run();
71
72private:
Andrea Tosatto672b9a72016-01-05 16:18:20 +010073 /**
74 * @brief Split the input stream in data packets and save them to the store
75 *
Davide Pesavento7c4246c2021-03-12 01:35:22 -050076 * Create data packets reading all the characters from the input stream until EOF or an
77 * error occurs. Each data packet has a maximum payload size of `m_options.maxSegmentSize`
78 * bytes and is stored in the vector `m_store`. An empty data packet is created and stored
79 * if the input stream is empty.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010080 *
81 * @return Number of data packets contained in the store after the operation
82 */
83 void
84 populateStore(std::istream& is);
85
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080086 /**
87 * @brief Respond with a metadata packet containing the versioned content name
88 */
Andrea Tosatto672b9a72016-01-05 16:18:20 +010089 void
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080090 processDiscoveryInterest(const Interest& interest);
91
92 /**
93 * @brief Respond with the requested segment of content
94 */
95 void
96 processSegmentInterest(const Interest& interest);
Davide Pesavento6f76afc2017-09-19 18:43:51 -040097
Andrea Tosatto672b9a72016-01-05 16:18:20 +010098PUBLIC_WITH_TESTS_ELSE_PRIVATE:
99 std::vector<shared_ptr<Data>> m_store;
100
101private:
102 Name m_prefix;
103 Name m_versionedPrefix;
104 Face& m_face;
105 KeyChain& m_keyChain;
Davide Pesavento6f76afc2017-09-19 18:43:51 -0400106 const Options m_options;
Andrea Tosatto672b9a72016-01-05 16:18:20 +0100107};
108
Davide Pesaventob3570c62022-02-19 19:19:00 -0500109} // namespace ndn::chunks
Andrea Tosatto672b9a72016-01-05 16:18:20 +0100110
111#endif // NDN_TOOLS_CHUNKS_PUTCHUNKS_PRODUCER_HPP