From 7f2dc607b7ba1192feeae00f4aeff50385e097ae Mon Sep 17 00:00:00 2001 From: ljfa-ag Date: Wed, 5 Aug 2015 14:37:07 +0200 Subject: Make tag_list::read_payload handle lists of tag_end --- include/tag.h | 5 ++++- include/tag_list.h | 4 ++++ src/tag_list.cpp | 18 +++++++++++++----- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/include/tag.h b/include/tag.h index 4b547e013c..58b99c082c 100644 --- a/include/tag.h +++ b/include/tag.h @@ -76,7 +76,10 @@ public: */ virtual tag& assign(tag&& rhs) = 0; - ///Reads the tag's payload from the stream + /** + * @brief Reads the tag's payload from the stream + * @throw io::stream_reader::input_error on failure + */ virtual void read_payload(io::stream_reader& reader) = 0; /** diff --git a/include/tag_list.h b/include/tag_list.h index 324d2de6d8..dff89c4fcc 100644 --- a/include/tag_list.h +++ b/include/tag_list.h @@ -158,6 +158,10 @@ public: const_iterator cbegin() const; const_iterator cend() const; + /** + * @inheritdoc + * In case of a list of tag_end, the content type will be undetermined. + */ void read_payload(io::stream_reader& reader) override; /** diff --git a/src/tag_list.cpp b/src/tag_list.cpp index c5d9eb5901..3bcc42e8b6 100644 --- a/src/tag_list.cpp +++ b/src/tag_list.cpp @@ -134,18 +134,26 @@ auto tag_list::cend() const -> const_iterator { return tags.cend(); } void tag_list::read_payload(io::stream_reader& reader) { - tag_type lt = reader.read_type(); + tag_type lt = reader.read_type(true); int32_t length; reader.read_num(length); if(length < 0 || !reader.get_istr()) throw io::stream_reader::input_error("Error reading length of tag_list"); - reset(lt); - tags.reserve(length); + if(lt != tag_type::End) + { + reset(lt); + tags.reserve(length); - for(int32_t i = 0; i < length; ++i) - tags.emplace_back(reader.read_payload(lt)); + for(int32_t i = 0; i < length; ++i) + tags.emplace_back(reader.read_payload(lt)); + } + else + { + //In case of tag_end, ignore the length and leave the type undetermined + reset(tag_type::Null); + } } bool operator==(const tag_list& lhs, const tag_list& rhs) -- cgit 0.0.5-2-1-g0f52