/* * Copyright (c) 2017-2019 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include extern "C" { #include } #include namespace transport { namespace core { class JSONManifestEncoder; class JSONManifestDecoder; class Packet; struct JSON { using Encoder = JSONManifestEncoder; using Decoder = JSONManifestDecoder; }; template struct JSONKey; template <> struct JSONKey { static const constexpr char *key = "hash_algorithm"; }; template <> struct JSONKey { static const constexpr char *key = "manifest_type"; }; template <> struct JSONKey { static const constexpr char *key = "next_segment_strategy"; }; template <> struct JSONKey { static const constexpr char *key = "name_hash_list"; }; template <> struct JSONKey { static const constexpr char *key = "suffix_hash_list"; }; template <> struct JSONKey { static const constexpr char *key = "base_name"; }; template <> struct JSONKey { static const constexpr char *final_manifest = "final_manifest"; }; // template <> // struct JSONKey { // static const std::string key = "name_hash_list"; //}; // namespace JSONManifestEncoding { // static const std::string base_name = "base_name"; // static const std::string final_chunk_number = "final_chunk_number"; // static const std::string hash_algorithm = "hash_algorithm"; // static const std::string manifest_type = "manifest_type"; // static const std::string name_hash_list = "name_hash_list"; // static const std::string next_segment_strategy = "next_segment_strategy"; //} class JSONManifestEncoder : public ManifestEncoder { public: JSONManifestEncoder(); ~JSONManifestEncoder(); JSONManifestEncoder &encodeImpl(Packet &packet); JSONManifestEncoder &clearImpl(); JSONManifestEncoder &setManifestTypeImpl(ManifestType manifest_type); JSONManifestEncoder &setHashAlgorithmImpl(HashAlgorithm algorithm); JSONManifestEncoder &setNextSegmentCalculationStrategyImpl( NextSegmentCalculationStrategy strategy); JSONManifestEncoder &setSuffixHashListImpl( const SuffixHashList &name_hash_list); JSONManifestEncoder &setBaseNameImpl(const core::Name &base_name); JSONManifestEncoder &addSuffixAndHashImpl(uint32_t suffix, uint64_t hash); JSONManifestEncoder &setIsFinalManifestImpl(bool is_last); private: PARCJSON *root_; }; class JSONManifestDecoder : public ManifestDecoder { public: JSONManifestDecoder(); ~JSONManifestDecoder(); void decodeImpl(const uint8_t *payload, std::size_t payload_size); JSONManifestDecoder &clearImpl(); ManifestType getManifestTypeImpl() const; HashAlgorithm getHashAlgorithmImpl() const; uint32_t getFinalChunkImpl() const; NextSegmentCalculationStrategy getNextSegmentCalculationStrategyImpl() const; SuffixHashList getSuffixHashListImpl(); core::Name getBaseNameImpl() const; bool getIsFinalManifestImpl(); private: PARCJSON *root_; }; } // namespace core } // namespace transport