18 #include <core/manifest_format.h>
19 #include <hicn/transport/core/content_object.h>
20 #include <hicn/transport/core/name.h>
28 using typename core::Name;
29 using typename core::Packet;
30 using typename core::PayloadType;
32 template <
typename Base,
typename FormatTraits,
typename ManifestImpl>
34 static_assert(std::is_base_of<Packet, Base>::value,
35 "Base must inherit from packet!");
40 using Encoder =
typename FormatTraits::Encoder;
41 using Decoder =
typename FormatTraits::Decoder;
43 Manifest(std::size_t signature_size = 0)
44 : Base(HF_INET6_TCP_AH, signature_size),
45 encoder_(*
this, signature_size),
47 Base::setPayloadType(PayloadType::MANIFEST);
51 : Base(name, HF_INET6_TCP_AH, signature_size),
52 encoder_(*
this, signature_size),
54 Base::setPayloadType(PayloadType::MANIFEST);
59 : Base(std::forward<T &&>(base)),
60 encoder_(*
this, 0,
false),
62 Base::setPayloadType(PayloadType::MANIFEST);
67 std::size_t estimateManifestSize(std::size_t additional_entries = 0) {
68 return static_cast<ManifestImpl &
>(*this).estimateManifestSizeImpl(
76 Manifest &encode() {
return static_cast<ManifestImpl &
>(*this).encodeImpl(); }
79 Manifest::decoder_.decode();
81 manifest_type_ = decoder_.getManifestType();
82 hash_algorithm_ = decoder_.getHashAlgorithm();
83 is_last_ = decoder_.getIsFinalManifest();
85 return static_cast<ManifestImpl &
>(*this).decodeImpl();
88 static std::size_t getManifestHeaderSize() {
89 return Encoder::getManifestHeaderSize();
92 static std::size_t getManifestEntrySize() {
93 return Encoder::getManifestEntrySize();
96 Manifest &setManifestType(ManifestType type) {
97 manifest_type_ = type;
98 encoder_.setManifestType(manifest_type_);
102 Manifest &setHashAlgorithm(auth::CryptoHashType hash_algorithm) {
103 hash_algorithm_ = hash_algorithm;
104 encoder_.setHashAlgorithm(hash_algorithm_);
108 auth::CryptoHashType getHashAlgorithm() {
return hash_algorithm_; }
110 ManifestType getManifestType()
const {
return manifest_type_; }
112 bool isFinalManifest()
const {
return is_last_; }
114 Manifest &setVersion(ManifestVersion version) {
115 encoder_.setVersion(version);
119 Manifest &setFinalBlockNumber(std::uint32_t final_block_number) {
120 encoder_.setFinalBlockNumber(final_block_number);
124 uint32_t getFinalBlockNumber()
const {
125 return decoder_.getFinalBlockNumber();
128 ManifestVersion getVersion()
const {
return decoder_.getVersion(); }
130 Manifest &setFinalManifest(
bool is_final_manifest) {
131 encoder_.setIsFinalManifest(is_final_manifest);
132 is_last_ = is_final_manifest;
143 ManifestType manifest_type_;
144 auth::CryptoHashType hash_algorithm_;