From 32cd02217b7b23f34d7a929f711f9eac7e19dcaf Mon Sep 17 00:00:00 2001 From: Martchus Date: Thu, 13 May 2021 15:30:22 +0200 Subject: [PATCH] Replace boolean fields in MediaFileInfo with flag enums --- mediafileinfo.cpp | 23 ++++++++++----------- mediafileinfo.h | 52 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/mediafileinfo.cpp b/mediafileinfo.cpp index afd040e..e2c6b7d 100644 --- a/mediafileinfo.cpp +++ b/mediafileinfo.cpp @@ -85,7 +85,8 @@ MediaFileInfo::MediaFileInfo(std::string &&path) , m_containerParsingStatus(ParsingStatus::NotParsedYet) , m_containerFormat(ContainerFormat::Unknown) , m_containerOffset(0) - , m_actualExistingId3v1Tag(false) + , m_paddingSize(0) + , m_fileStructureFlags(MediaFileStructureFlags::None) , m_tracksParsingStatus(ParsingStatus::NotParsedYet) , m_tagsParsingStatus(ParsingStatus::NotParsedYet) , m_chaptersParsingStatus(ParsingStatus::NotParsedYet) @@ -95,10 +96,8 @@ MediaFileInfo::MediaFileInfo(std::string &&path) , m_preferredPadding(0) , m_tagPosition(ElementPosition::BeforeData) , m_indexPosition(ElementPosition::BeforeData) - , m_forceFullParse(MEDIAINFO_CPP_FORCE_FULL_PARSE) - , m_forceRewrite(true) - , m_forceTagPosition(true) - , m_forceIndexPosition(true) + , m_fileHandlingFlags((MEDIAINFO_CPP_FORCE_FULL_PARSE ? MediaFileHandlingFlags::ForceFullParse : MediaFileHandlingFlags::None) + | MediaFileHandlingFlags::ForceRewrite | MediaFileHandlingFlags::ForceTagPosition | MediaFileHandlingFlags::ForceIndexPosition) { } @@ -238,7 +237,7 @@ startParsingSignature: } else if (container->documentType() == "webm") { m_containerFormat = ContainerFormat::Webm; } - if (m_forceFullParse) { + if (isForcingFullParse()) { // validating the element structure of Matroska files takes too long when // parsing big files so do this only when explicitely desired container->validateElementStructure(diag, progress, &m_paddingSize); @@ -255,7 +254,7 @@ startParsingSignature: case ContainerFormat::Ogg: // Ogg is handled by OggContainer instance m_container = make_unique(*this, m_containerOffset); - static_cast(m_container.get())->setChecksumValidationEnabled(m_forceFullParse); + static_cast(m_container.get())->setChecksumValidationEnabled(isForcingFullParse()); break; case ContainerFormat::Unknown: // check for magic numbers at odd offsets @@ -387,7 +386,7 @@ void MediaFileInfo::parseTags(Diagnostics &diag, AbortableProgressFeedback &prog try { stream().seekg(-128, ios_base::end); m_id3v1Tag->parse(stream(), diag); - m_actualExistingId3v1Tag = true; + m_fileStructureFlags += MediaFileStructureFlags::ActualExistingId3v1Tag; } catch (const NoDataFoundException &) { m_id3v1Tag.reset(); } catch (const OperationAbortedException &) { @@ -1331,7 +1330,7 @@ void MediaFileInfo::clearParsingResults() m_id3v1Tag.reset(); m_id3v2Tags.clear(); m_actualId3v2TagOffsets.clear(); - m_actualExistingId3v1Tag = false; + m_fileStructureFlags = MediaFileStructureFlags::None; m_container.reset(); m_singleTrack.reset(); } @@ -1540,7 +1539,7 @@ void MediaFileInfo::makeMp3File(Diagnostics &diag, AbortableProgressFeedback &pr // alter ID3v1 tag if (!m_id3v1Tag) { // remove ID3v1 tag - if (!m_actualExistingId3v1Tag) { + if (!(m_fileStructureFlags & MediaFileStructureFlags::ActualExistingId3v1Tag)) { diag.emplace_back(DiagLevel::Information, "Nothing to be changed.", context); return; } @@ -1555,7 +1554,7 @@ void MediaFileInfo::makeMp3File(Diagnostics &diag, AbortableProgressFeedback &pr return; } else { // add or update ID3v1 tag - if (m_actualExistingId3v1Tag) { + if (m_fileStructureFlags & MediaFileStructureFlags::ActualExistingId3v1Tag) { progress.updateStep("Updating existing ID3v1 tag ..."); // ensure the file is still open / not readonly open(); @@ -1740,7 +1739,7 @@ void MediaFileInfo::makeMp3File(Diagnostics &diag, AbortableProgressFeedback &pr // copy / skip actual stream data // -> determine media data size std::uint64_t mediaDataSize = size() - streamOffset; - if (m_actualExistingId3v1Tag) { + if (m_fileStructureFlags & MediaFileStructureFlags::ActualExistingId3v1Tag) { mediaDataSize -= 128; } diff --git a/mediafileinfo.h b/mediafileinfo.h index 79da0bb..48532eb 100644 --- a/mediafileinfo.h +++ b/mediafileinfo.h @@ -11,6 +11,8 @@ #include #include +#include + namespace TagParser { class Tag; @@ -42,6 +44,33 @@ enum class ParsingStatus : std::uint8_t { CriticalFailure /**< tried to parse the part, but critical errors occurred */ }; +/*! + * \brief The MediaFileStructureFlags enum specifies flags which describing the structure of a media file. + */ +enum class MediaFileStructureFlags : std::uint64_t { + None, /**< all flags disabled */ + ActualExistingId3v1Tag = (1 << 0), /**< whether an ID3v1 tag was found when parsing the file */ +}; + +/*! + * \brief The MediaFileHandlingFlags enum specifies flags which controls the behavior of MediaFileInfo objects. + */ +enum class MediaFileHandlingFlags : std::uint64_t { + None, /**< all flags disabled */ + ForceFullParse + = (1 << 0), /**< causes the parser to analyse the file strucutre as deep as possible; might cause long loading times for big files */ + ForceRewrite = (1 << 1), /**< enforces a re-write of the file when applying changes */ + ForceTagPosition = (1 << 2), /**< enforces the tag position when applying changes, see remarks of MediaFileInfo::setTagPosition() */ + ForceIndexPosition = (1 << 3), /**< enforces the index position when applying changes, see remarks of MediaFileInfo::setIndexPosition() */ +}; + +} // namespace TagParser + +CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(TagParser, TagParser::MediaFileStructureFlags) +CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(TagParser, TagParser::MediaFileHandlingFlags) + +namespace TagParser { + class TAG_PARSER_EXPORT MediaFileInfo : public BasicFileInfo { public: // constructor, destructor @@ -164,9 +193,9 @@ private: ContainerFormat m_containerFormat; std::streamoff m_containerOffset; std::uint64_t m_paddingSize; - bool m_actualExistingId3v1Tag; std::vector m_actualId3v2TagOffsets; std::unique_ptr m_container; + MediaFileStructureFlags m_fileStructureFlags; // fields related to the tracks ParsingStatus m_tracksParsingStatus; @@ -190,10 +219,7 @@ private: std::size_t m_preferredPadding; ElementPosition m_tagPosition; ElementPosition m_indexPosition; - bool m_forceFullParse; - bool m_forceRewrite; - bool m_forceTagPosition; - bool m_forceIndexPosition; + MediaFileHandlingFlags m_fileHandlingFlags; }; /*! @@ -454,7 +480,7 @@ inline AbstractContainer *MediaFileInfo::container() const */ inline bool MediaFileInfo::isForcingFullParse() const { - return m_forceFullParse; + return m_fileHandlingFlags & MediaFileHandlingFlags::ForceFullParse; } /*! @@ -464,7 +490,7 @@ inline bool MediaFileInfo::isForcingFullParse() const */ inline void MediaFileInfo::setForceFullParse(bool forceFullParse) { - m_forceFullParse = forceFullParse; + CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceFullParse, forceFullParse); } /*! @@ -472,7 +498,7 @@ inline void MediaFileInfo::setForceFullParse(bool forceFullParse) */ inline bool MediaFileInfo::isForcingRewrite() const { - return m_forceRewrite; + return m_fileHandlingFlags & MediaFileHandlingFlags::ForceRewrite; } /*! @@ -480,7 +506,7 @@ inline bool MediaFileInfo::isForcingRewrite() const */ inline void MediaFileInfo::setForceRewrite(bool forceRewrite) { - m_forceRewrite = forceRewrite; + CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceRewrite, forceRewrite); } /*! @@ -591,7 +617,7 @@ inline void MediaFileInfo::setTagPosition(ElementPosition tagPosition) */ inline bool MediaFileInfo::forceTagPosition() const { - return m_forceTagPosition; + return m_fileHandlingFlags & MediaFileHandlingFlags::ForceTagPosition; } /*! @@ -601,7 +627,7 @@ inline bool MediaFileInfo::forceTagPosition() const */ inline void MediaFileInfo::setForceTagPosition(bool forceTagPosition) { - m_forceTagPosition = forceTagPosition; + CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceTagPosition, forceTagPosition); } /*! @@ -631,7 +657,7 @@ inline void MediaFileInfo::setIndexPosition(ElementPosition indexPosition) */ inline bool MediaFileInfo::forceIndexPosition() const { - return m_forceIndexPosition; + return m_fileHandlingFlags & MediaFileHandlingFlags::ForceIndexPosition; } /*! @@ -641,7 +667,7 @@ inline bool MediaFileInfo::forceIndexPosition() const */ inline void MediaFileInfo::setForceIndexPosition(bool forceIndexPosition) { - m_forceIndexPosition = forceIndexPosition; + CppUtilities::modFlagEnum(m_fileHandlingFlags, MediaFileHandlingFlags::ForceIndexPosition, forceIndexPosition); } } // namespace TagParser