1 #ifndef TAG_PARSER_ID3V2TAG_H
2 #define TAG_PARSER_ID3V2TAG_H
6 #include "../fieldbasedtag.h"
15 bool operator()(std::uint32_t lhs, std::uint32_t rhs)
const;
22 void make(std::ostream &stream, std::uint32_t padding,
Diagnostics &diag);
24 std::uint64_t requiredSize()
const;
30 std::uint32_t m_framesSize;
31 std::uint32_t m_requiredSize;
32 std::vector<Id3v2FrameMaker> m_maker;
49 return m_requiredSize;
69 static constexpr
const char *tagName =
"ID3v2 tag";
70 static constexpr
TagTextEncoding defaultTextEncoding = TagTextEncoding::Utf16LittleEndian;
73 bool supportsDescription(
KnownField field)
const override;
74 bool supportsMimeType(
KnownField field)
const override;
75 bool supportsMultipleValues(
KnownField field)
const override;
76 void ensureTextValuesAreProperlyEncoded()
override;
78 void parse(std::istream &sourceStream,
const std::uint64_t maximalSize,
Diagnostics &diag);
80 void make(std::ostream &targetStream, std::uint32_t padding,
Diagnostics &diag);
82 std::uint8_t majorVersion()
const;
83 std::uint8_t revisionVersion()
const;
84 void setVersion(std::uint8_t majorVersion, std::uint8_t revisionVersion);
85 bool isVersionSupported()
const;
86 std::uint8_t flags()
const;
87 bool isUnsynchronisationUsed()
const;
88 bool hasExtendedHeader()
const;
89 bool isExperimental()
const;
90 bool hasFooter()
const;
91 std::uint32_t extendedHeaderSize()
const;
92 std::uint32_t paddingSize()
const;
95 IdentifierType internallyGetFieldId(
KnownField field)
const;
96 KnownField internallyGetKnownField(
const IdentifierType &
id)
const;
97 TagDataType internallyGetProposedDataType(
const std::uint32_t &
id)
const;
98 std::vector<const TagValue *> internallyGetValues(
const IdentifierType &
id)
const;
99 bool internallySetValues(
const IdentifierType &
id,
const std::vector<TagValue> &values);
102 void convertOldRecordDateFields(
const std::string &diagContext,
Diagnostics &diag);
103 void removeOldRecordDateRelatedFields();
104 void prepareRecordDataForMaking(
const std::string &diagContext,
Diagnostics &diag);
107 std::uint8_t m_majorVersion;
108 std::uint8_t m_revisionVersion;
109 std::uint8_t m_flags;
110 std::uint32_t m_sizeExcludingHeader;
111 std::uint32_t m_extendedHeaderSize;
112 std::uint32_t m_paddingSize;
120 , m_revisionVersion(0)
122 , m_sizeExcludingHeader(0)
123 , m_extendedHeaderSize(0)
135 return encoding == TagTextEncoding::Latin1 || (encoding ==
TagTextEncoding::Utf8 && m_majorVersion > 3)
136 || encoding == TagTextEncoding::Utf16BigEndian || encoding == TagTextEncoding::Utf16LittleEndian;
144 case KnownField::SynchronizedLyrics:
161 return m_majorVersion;
169 return m_revisionVersion;
180 return m_majorVersion == 2 || m_majorVersion == 3 || m_majorVersion == 4;
196 return m_flags & 0x80;
204 return (m_majorVersion >= 3) && (m_flags & 0x40);
212 return (m_majorVersion >= 3) && (m_flags & 0x20);
220 return (m_majorVersion >= 3) && (m_flags & 0x10);
228 return m_extendedHeaderSize;
237 return m_paddingSize;
242 #endif // TAG_PARSER_ID3V2TAG_H