blob: 46b25d968dc5fec5f6d410551ba9df91f0f06ee8 [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 Pesavento5748e822024-01-26 18:40:22 -05003 * Copyright (c) 2016-2024, 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 Pesavento5748e822024-01-26 18:40:22 -050035#include <ndn-cxx/face.hpp>
36#include <ndn-cxx/security/key-chain.hpp>
37
38#include <vector>
39
Davide Pesaventob3570c62022-02-19 19:19:00 -050040namespace ndn::chunks {
Andrea Tosatto672b9a72016-01-05 16:18:20 +010041
42/**
Davide Pesaventob61e3e22022-11-11 14:38:52 -050043 * @brief Segmented & versioned data publisher.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010044 *
Davide Pesavento7c4246c2021-03-12 01:35:22 -050045 * Packetizes and publishes data from an input stream as `/prefix/<version>/<segment number>`.
46 * Unless another value is provided, the current time is used as the version number.
47 * The packet store always has at least one item, even when the input is empty.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010048 */
49class Producer : noncopyable
50{
51public:
Davide Pesavento6f76afc2017-09-19 18:43:51 -040052 struct Options
53 {
54 security::SigningInfo signingInfo;
Davide Pesavento7c4246c2021-03-12 01:35:22 -050055 time::milliseconds freshnessPeriod = 10_s;
56 size_t maxSegmentSize = 8000;
Davide Pesavento6f76afc2017-09-19 18:43:51 -040057 bool isQuiet = false;
58 bool isVerbose = false;
59 bool wantShowVersion = false;
60 };
61
Andrea Tosatto672b9a72016-01-05 16:18:20 +010062 /**
Davide Pesaventob61e3e22022-11-11 14:38:52 -050063 * @brief Create the producer.
Davide Pesavento6f76afc2017-09-19 18:43:51 -040064 * @param prefix prefix used to publish data; if the last component is not a valid
65 * version number, the current system time is used as version number.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010066 */
Davide Pesavento6f76afc2017-09-19 18:43:51 -040067 Producer(const Name& prefix, Face& face, KeyChain& keyChain, std::istream& is,
68 const Options& opts);
Andrea Tosatto672b9a72016-01-05 16:18:20 +010069
70 /**
Davide Pesaventob61e3e22022-11-11 14:38:52 -050071 * @brief Run the producer.
Andrea Tosatto672b9a72016-01-05 16:18:20 +010072 */
73 void
74 run();
75
76private:
Andrea Tosatto672b9a72016-01-05 16:18:20 +010077 /**
Davide Pesaventob61e3e22022-11-11 14:38:52 -050078 * @brief Respond with a metadata packet containing the versioned content name.
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080079 */
Andrea Tosatto672b9a72016-01-05 16:18:20 +010080 void
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080081 processDiscoveryInterest(const Interest& interest);
82
83 /**
Davide Pesaventob61e3e22022-11-11 14:38:52 -050084 * @brief Respond with the requested segment of content.
Chavoosh Ghasemi79991a02019-01-28 21:22:31 -080085 */
86 void
87 processSegmentInterest(const Interest& interest);
Davide Pesavento6f76afc2017-09-19 18:43:51 -040088
Andrea Tosatto672b9a72016-01-05 16:18:20 +010089PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Davide Pesavento5748e822024-01-26 18:40:22 -050090 std::vector<std::shared_ptr<Data>> m_store;
Andrea Tosatto672b9a72016-01-05 16:18:20 +010091
92private:
93 Name m_prefix;
94 Name m_versionedPrefix;
95 Face& m_face;
96 KeyChain& m_keyChain;
Davide Pesavento6f76afc2017-09-19 18:43:51 -040097 const Options m_options;
Andrea Tosatto672b9a72016-01-05 16:18:20 +010098};
99
Davide Pesaventob3570c62022-02-19 19:19:00 -0500100} // namespace ndn::chunks
Andrea Tosatto672b9a72016-01-05 16:18:20 +0100101
102#endif // NDN_TOOLS_CHUNKS_PUTCHUNKS_PRODUCER_HPP