Replace boolean fields in MediaFileInfo with flag enums

This commit is contained in:
Martchus 2021-05-13 15:30:22 +02:00
parent 0e29c98b9f
commit 32cd02217b
2 changed files with 50 additions and 25 deletions

View File

@ -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<OggContainer>(*this, m_containerOffset);
static_cast<OggContainer *>(m_container.get())->setChecksumValidationEnabled(m_forceFullParse);
static_cast<OggContainer *>(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;
}

View File

@ -11,6 +11,8 @@
#include <unordered_set>
#include <vector>
#include <c++utilities/misc/flagenumclass.h>
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<std::streamoff> m_actualId3v2TagOffsets;
std::unique_ptr<AbstractContainer> 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