1 #ifndef TAG_PARSER_ID3V2FRAME_H
2 #define TAG_PARSER_ID3V2FRAME_H
6 #include "../generictagfield.h"
7 #include "../tagvalue.h"
9 #include <c++utilities/conversion/stringconversion.h>
10 #include <c++utilities/io/binaryreader.h>
11 #include <c++utilities/io/binarywriter.h>
26 void make(CppUtilities::BinaryWriter &writer);
28 const std::unique_ptr<char[]> &data()
const;
29 std::uint32_t dataSize()
const;
30 std::uint32_t requiredSize()
const;
37 std::uint32_t m_frameId;
38 const std::uint8_t m_version;
39 std::unique_ptr<char[]> m_data;
40 std::uint32_t m_dataSize;
41 std::uint32_t m_decompressedSize;
42 std::uint32_t m_requiredSize;
74 return m_requiredSize;
95 void parse(CppUtilities::BinaryReader &reader, std::uint32_t
version, std::uint32_t maximalSize,
Diagnostics &diag);
97 void make(CppUtilities::BinaryWriter &writer, std::uint8_t
version,
Diagnostics &diag);
100 const std::vector<TagValue> &additionalValues()
const;
101 std::vector<TagValue> &additionalValues();
102 bool isAdditionalTypeInfoUsed()
const;
103 bool isValid()
const;
104 bool hasPaddingReached()
const;
105 std::uint16_t flag()
const;
106 void setFlag(std::uint16_t value);
107 std::uint32_t totalSize()
const;
108 std::uint32_t dataSize()
const;
109 bool toDiscardWhenUnknownAndTagIsAltered()
const;
110 bool toDiscardWhenUnknownAndFileIsAltered()
const;
111 bool isReadOnly()
const;
112 bool isCompressed()
const;
113 bool isEncrypted()
const;
114 bool hasGroupInformation()
const;
115 bool isUnsynchronized()
const;
116 bool hasDataLengthIndicator()
const;
117 std::uint8_t group()
const;
118 void setGroup(std::uint8_t value);
119 std::uint32_t parsedVersion()
const;
120 bool supportsNestedFields()
const;
124 std::tuple<const char *, std::size_t, const char *> parseSubstring(
126 std::string parseString(
const char *buffer, std::size_t maxSize,
TagTextEncoding &encoding,
bool addWarnings,
Diagnostics &diag);
127 std::u16string parseWideString(
const char *buffer, std::size_t dataSize,
TagTextEncoding &encoding,
bool addWarnings,
Diagnostics &diag);
128 void parseLegacyPicture(
const char *buffer, std::size_t maxSize,
TagValue &tagValue, std::uint8_t &typeInfo,
Diagnostics &diag);
129 void parsePicture(
const char *buffer, std::size_t maxSize,
TagValue &tagValue, std::uint8_t &typeInfo,
Diagnostics &diag);
130 void parseComment(
const char *buffer, std::size_t maxSize,
TagValue &tagValue,
Diagnostics &diag);
134 static std::uint8_t makeTextEncodingByte(
TagTextEncoding textEncoding);
136 static void makeLegacyPicture(
137 std::unique_ptr<
char[]> &buffer, std::uint32_t &bufferSize,
const TagValue &picture, std::uint8_t typeInfo,
Diagnostics &diag);
138 static void makePicture(std::unique_ptr<
char[]> &buffer, std::uint32_t &bufferSize,
const TagValue &picture, std::uint8_t typeInfo,
140 static void makeComment(
143 static IdentifierType fieldIdFromString(
const char *idString, std::size_t idStringSize = std::string::npos);
148 std::string ignoreAdditionalValuesDiagMsg()
const;
150 std::vector<TagValue> m_additionalValues;
151 std::uint32_t m_parsedVersion;
152 std::uint32_t m_dataSize;
153 std::uint32_t m_totalSize;
154 std::uint16_t m_flag;
155 std::uint8_t m_group;
165 return m_additionalValues;
174 return m_additionalValues;
238 return m_flag & 0x8000;
246 return m_flag & 0x4000;
254 return m_flag & 0x2000;
262 return m_parsedVersion >= 4 ? m_flag & 0x8 : m_flag & 0x80;
271 return m_parsedVersion >= 4 ? m_flag & 0x4 : m_flag & 0x40;
279 return m_parsedVersion >= 4 ? m_flag & 0x40 : m_flag & 0x20;
287 return m_parsedVersion >= 4 ? m_flag & 0x2 :
false;
295 return m_parsedVersion >= 4 ? m_flag & 0x1 :
isCompressed();
320 return m_parsedVersion;
336 switch (idStringSize != std::string::npos ? idStringSize : std::strlen(idString)) {
338 return CppUtilities::BE::toUInt24(idString);
340 return CppUtilities::BE::toUInt32(idString);
342 throw CppUtilities::ConversionException(
"ID3v2 ID must be 3 or 4 chars");
356 #endif // TAG_PARSER_ID3V2FRAME_H