From 59024a66a0108a468034f57df30c2b59eac76738 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 11 Mar 2018 22:27:12 +0100 Subject: [PATCH] Don't clear field before parsing by default --- generictagfield.h | 4 ++-- id3/id3v2frame.cpp | 5 ++--- id3/id3v2frame.h | 4 +--- id3/id3v2tag.cpp | 11 ++++------- matroska/matroskatag.cpp | 7 +++---- matroska/matroskatagfield.cpp | 1 - matroska/matroskatagfield.h | 8 ++++---- mp4/mp4tag.cpp | 4 ++-- mp4/mp4tagfield.cpp | 5 ++--- mp4/mp4tagfield.h | 4 +--- vorbis/vorbiscomment.cpp | 5 ++--- vorbis/vorbiscommentfield.h | 8 +++----- 12 files changed, 26 insertions(+), 40 deletions(-) diff --git a/generictagfield.h b/generictagfield.h index 704d6f7..a48b486 100644 --- a/generictagfield.h +++ b/generictagfield.h @@ -221,7 +221,7 @@ template inline void TagField::se } /*! - * \brief Clears id, value, type info and sets default flag to false. + * \brief Clears id, value, type info, sets default flag to false and resets further implementation specific values. */ template void TagField::clear() { @@ -230,7 +230,7 @@ template void TagField::clear() m_typeInfo = TypeInfoType(); m_typeInfoAssigned = false; m_default = true; - static_cast(this)->cleared(); + static_cast(this)->reset(); } /*! diff --git a/id3/id3v2frame.cpp b/id3/id3v2frame.cpp index 70f5cc0..8015806 100644 --- a/id3/id3v2frame.cpp +++ b/id3/id3v2frame.cpp @@ -111,7 +111,6 @@ template int parseGenreIndex(const stringtype &denotation) */ void Id3v2Frame::parse(BinaryReader &reader, uint32 version, uint32 maximalSize, Diagnostics &diag) { - clear(); static const string defaultContext("parsing ID3v2 frame"); string context; @@ -335,9 +334,9 @@ void Id3v2Frame::make(BinaryWriter &writer, byte version, Diagnostics &diag) } /*! - * \brief Ensures the field is cleared. + * \brief Resets ID3v2-specific values. Called via clear(). */ -void Id3v2Frame::clear() +void Id3v2Frame::reset() { m_flag = 0; m_group = 0; diff --git a/id3/id3v2frame.h b/id3/id3v2frame.h index f575483..c0d0059 100644 --- a/id3/id3v2frame.h +++ b/id3/id3v2frame.h @@ -138,10 +138,8 @@ public: static IdentifierType fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos); static std::string fieldIdToString(IdentifierType id); -protected: - void clear(); - private: + void reset(); uint32 m_parsedVersion; uint32 m_dataSize; uint32 m_totalSize; diff --git a/id3/id3v2tag.cpp b/id3/id3v2tag.cpp index e6cf0db..8243cea 100644 --- a/id3/id3v2tag.cpp +++ b/id3/id3v2tag.cpp @@ -300,20 +300,17 @@ void Id3v2Tag::parse(istream &stream, const uint64 maximalSize, Diagnostics &dia // read frames auto pos = stream.tellg(); - Id3v2Frame frame; while (bytesRemaining) { // seek to next frame stream.seekg(pos); // parse frame + Id3v2Frame frame; try { frame.parse(reader, majorVersion, bytesRemaining, diag); - if (frame.id()) { - // add frame if parsing was successfull - if (Id3v2FrameIds::isTextFrame(frame.id()) && fields().count(frame.id()) == 1) { - diag.emplace_back(DiagLevel::Warning, "The text frame " % frame.frameIdString() + " exists more than once.", context); - } - fields().insert(make_pair(frame.id(), frame)); + if (Id3v2FrameIds::isTextFrame(frame.id()) && fields().count(frame.id()) == 1) { + diag.emplace_back(DiagLevel::Warning, "The text frame " % frame.frameIdString() + " exists more than once.", context); } + fields().emplace(frame.id(), move(frame)); } catch (const NoDataFoundException &) { if (frame.hasPaddingReached()) { m_paddingSize = startOffset + m_size - pos; diff --git a/matroska/matroskatag.cpp b/matroska/matroskatag.cpp index 0ee11cb..2905a7c 100644 --- a/matroska/matroskatag.cpp +++ b/matroska/matroskatag.cpp @@ -115,18 +115,17 @@ void MatroskaTag::parse(EbmlElement &tagElement, Diagnostics &diag) static const string context("parsing Matroska tag"); tagElement.parse(diag); m_size = tagElement.totalSize(); - MatroskaTagField field; for (EbmlElement *child = tagElement.firstChild(); child; child = child->nextSibling()) { child->parse(diag); switch (child->id()) { - case MatroskaIds::SimpleTag: { + case MatroskaIds::SimpleTag: try { + MatroskaTagField field; field.reparse(*child, diag, true); - fields().insert(make_pair(field.id(), field)); + fields().emplace(field.id(), move(field)); } catch (const Failure &) { } break; - } case MatroskaIds::Targets: parseTargets(*child, diag); break; diff --git a/matroska/matroskatagfield.cpp b/matroska/matroskatagfield.cpp index df3ac9e..a6c3f98 100644 --- a/matroska/matroskatagfield.cpp +++ b/matroska/matroskatagfield.cpp @@ -47,7 +47,6 @@ MatroskaTagField::MatroskaTagField(const string &id, const TagValue &value) void MatroskaTagField::reparse(EbmlElement &simpleTagElement, Diagnostics &diag, bool parseNestedFields) { string context("parsing Matroska tag field"); - clear(); simpleTagElement.parse(diag); bool tagDefaultFound = false; for (EbmlElement *child = simpleTagElement.firstChild(); child; child = child->nextSibling()) { diff --git a/matroska/matroskatagfield.h b/matroska/matroskatagfield.h index aac38c0..dd8017a 100644 --- a/matroska/matroskatagfield.h +++ b/matroska/matroskatagfield.h @@ -78,8 +78,8 @@ public: static typename std::string fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos); static std::string fieldIdToString(const std::string &id); -protected: - void cleared(); +private: + void reset(); }; /*! @@ -117,9 +117,9 @@ inline std::string MatroskaTagField::fieldIdToString(const std::string &id) } /*! - * \brief Ensures the field is cleared. + * \brief Resets Matroska-specific values. Called via clear(). */ -inline void MatroskaTagField::cleared() +inline void MatroskaTagField::reset() { } diff --git a/mp4/mp4tag.cpp b/mp4/mp4tag.cpp index 8403a91..38c2226 100644 --- a/mp4/mp4tag.cpp +++ b/mp4/mp4tag.cpp @@ -352,12 +352,12 @@ void Mp4Tag::parse(Mp4Atom &metaAtom, Diagnostics &diag) diag.emplace_back(DiagLevel::Critical, "Unable to parse child atoms of meta atom (stores hdlr and ilst atoms).", context); } if (subAtom) { - Mp4TagField tagField; for (auto *child = subAtom->firstChild(); child; child = child->nextSibling()) { + Mp4TagField tagField; try { child->parse(diag); tagField.reparse(*child, diag); - fields().emplace(child->id(), tagField); + fields().emplace(child->id(), move(tagField)); } catch (const Failure &) { } } diff --git a/mp4/mp4tagfield.cpp b/mp4/mp4tagfield.cpp index 5798263..bed847f 100644 --- a/mp4/mp4tagfield.cpp +++ b/mp4/mp4tagfield.cpp @@ -77,7 +77,6 @@ void Mp4TagField::reparse(Mp4Atom &ilstChild, Diagnostics &diag) using namespace Mp4AtomIds; using namespace Mp4TagAtomIds; string context("parsing MP4 tag field"); - clear(); // clear old values ilstChild.parse(diag); // ensure child has been parsed setId(ilstChild.id()); context = "parsing MP4 tag field " + ilstChild.idToString(); @@ -425,9 +424,9 @@ uint32 Mp4TagField::appropriateRawDataType() const } /*! - * \brief Ensures the field is cleared. + * \brief Resets MP4-specific values. Called via clear(). */ -void Mp4TagField::cleared() +void Mp4TagField::reset() { m_name.clear(); m_mean.clear(); diff --git a/mp4/mp4tagfield.h b/mp4/mp4tagfield.h index bad34a3..7858232 100644 --- a/mp4/mp4tagfield.h +++ b/mp4/mp4tagfield.h @@ -121,10 +121,8 @@ public: static IdentifierType fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos); static std::string fieldIdToString(IdentifierType id); -protected: - void cleared(); - private: + void reset(); std::string m_name; std::string m_mean; uint32 m_parsedRawDataType; diff --git a/vorbis/vorbiscomment.cpp b/vorbis/vorbiscomment.cpp index 5bb207a..70fb26b 100644 --- a/vorbis/vorbiscomment.cpp +++ b/vorbis/vorbiscomment.cpp @@ -144,13 +144,12 @@ template void VorbisComment::internalParse(StreamType &stream CHECK_MAX_SIZE(4); stream.read(sig, 4); uint32 fieldCount = LE::toUInt32(sig); - VorbisCommentField field; - const string &fieldId = field.id(); for (uint32 i = 0; i < fieldCount; ++i) { // read fields + VorbisCommentField field; try { field.parse(stream, maxSize, diag); - fields().emplace(fieldId, field); + fields().emplace(field.id(), move(field)); } catch (const TruncatedDataException &) { throw; } catch (const Failure &) { diff --git a/vorbis/vorbiscommentfield.h b/vorbis/vorbiscommentfield.h index 04b5005..c15bb81 100644 --- a/vorbis/vorbiscommentfield.h +++ b/vorbis/vorbiscommentfield.h @@ -61,10 +61,8 @@ public: static typename std::string fieldIdFromString(const char *idString, std::size_t idStringSize = std::string::npos); static std::string fieldIdToString(const std::string &id); -protected: - void cleared(); - private: + void reset(); template void internalParse(StreamType &stream, uint64 &maxSize, Diagnostics &diag); }; @@ -103,9 +101,9 @@ inline std::string VorbisCommentField::fieldIdToString(const std::string &id) } /*! - * \brief Ensures the field is cleared. + * \brief Resets Vorbis Comment-specific values. Called via clear(). */ -inline void VorbisCommentField::cleared() +inline void VorbisCommentField::reset() { }