Tag Parser 12.4.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
id3v2frame.h
Go to the documentation of this file.
1#ifndef TAG_PARSER_ID3V2FRAME_H
2#define TAG_PARSER_ID3V2FRAME_H
3
4#include "./id3v2frameids.h"
5
7#include "../tagvalue.h"
8
9#include <c++utilities/conversion/stringconversion.h>
10#include <c++utilities/io/binaryreader.h>
11#include <c++utilities/io/binarywriter.h>
12
13#include <iosfwd>
14#include <string>
15#include <vector>
16
17namespace TagParser {
18
19class Id3v2Frame;
20class Diagnostics;
21
22class TAG_PARSER_EXPORT Id3v2FrameMaker {
23 friend class Id3v2Frame;
24
25public:
26 void make(CppUtilities::BinaryWriter &writer);
27 const Id3v2Frame &field() const;
28 const std::unique_ptr<char[]> &data() const;
29 std::uint32_t dataSize() const;
30 std::uint32_t requiredSize() const;
31
32private:
33 Id3v2FrameMaker(Id3v2Frame &frame, std::uint8_t version, Diagnostics &diag);
34 void makeSubstring(const TagValue &value, Diagnostics &diag, const std::string &context);
35
36 Id3v2Frame &m_frame;
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;
43};
44
49{
50 return m_frame;
51}
52
56inline const std::unique_ptr<char[]> &Id3v2FrameMaker::data() const
57{
58 return m_data;
59}
60
64inline std::uint32_t Id3v2FrameMaker::dataSize() const
65{
66 return m_dataSize;
67}
68
72inline std::uint32_t Id3v2FrameMaker::requiredSize() const
73{
74 return m_requiredSize;
75}
76
81public:
82 using IdentifierType = std::uint32_t;
83 using TypeInfoType = std::uint8_t;
84};
85
86class TAG_PARSER_EXPORT Id3v2Frame : public TagField<Id3v2Frame> {
87 friend class TagField<Id3v2Frame>;
88 friend class Id3v2FrameMaker;
89
90public:
91 Id3v2Frame();
92 Id3v2Frame(const IdentifierType &id, const TagValue &value, std::uint8_t group = 0, std::uint16_t flag = 0);
93
94 // parsing/making
95 void parse(CppUtilities::BinaryReader &reader, std::uint32_t version, std::uint32_t maximalSize, Diagnostics &diag);
96 Id3v2FrameMaker prepareMaking(std::uint8_t version, Diagnostics &diag);
97 void make(CppUtilities::BinaryWriter &writer, std::uint8_t version, Diagnostics &diag);
98
99 // member access
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;
121
122 // parsing helper
123 TagTextEncoding parseTextEncodingByte(std::uint8_t textEncodingByte, Diagnostics &diag);
124 std::tuple<const char *, std::size_t, const char *> parseSubstring(
125 const char *buffer, std::size_t maxSize, TagTextEncoding &encoding, bool addWarnings, Diagnostics &diag);
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);
131 void parseBom(const char *buffer, std::size_t maxSize, TagTextEncoding &encoding, Diagnostics &diag);
132
133 // making helper
134 static std::uint8_t makeTextEncodingByte(TagTextEncoding textEncoding);
135 static std::size_t makeBom(char *buffer, TagTextEncoding encoding);
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,
139 std::uint8_t version, Diagnostics &diag);
140 static void makeComment(
141 std::unique_ptr<char[]> &buffer, std::uint32_t &bufferSize, const TagValue &comment, std::uint8_t version, Diagnostics &diag);
142
143 static IdentifierType fieldIdFromString(std::string_view idString);
144 static std::string fieldIdToString(IdentifierType id);
145
146private:
147 void internallyClearValue();
148 void internallyClearFurtherData();
149 std::string ignoreAdditionalValuesDiagMsg() const;
150
151 std::vector<TagValue> m_additionalValues;
152 std::uint32_t m_parsedVersion;
153 std::uint32_t m_dataSize;
154 std::uint32_t m_totalSize;
155 std::uint16_t m_flag;
156 std::uint8_t m_group;
157 bool m_padding;
158};
159
164inline const std::vector<TagValue> &Id3v2Frame::additionalValues() const
165{
166 return m_additionalValues;
167}
168
173inline std::vector<TagValue> &Id3v2Frame::additionalValues()
174{
175 return m_additionalValues;
176}
177
182{
184}
185
189inline bool Id3v2Frame::isValid() const
190{
191 return !(id() == 0 || value().isEmpty() || m_padding);
192}
193
198{
199 return m_padding;
200}
201
205inline std::uint16_t Id3v2Frame::flag() const
206{
207 return m_flag;
208}
209
213inline void Id3v2Frame::setFlag(std::uint16_t value)
214{
215 m_flag = value;
216}
217
221inline std::uint32_t Id3v2Frame::totalSize() const
222{
223 return m_totalSize;
224}
225
229inline std::uint32_t Id3v2Frame::dataSize() const
230{
231 return m_dataSize;
232}
233
238{
239 return m_flag & 0x8000;
240}
241
246{
247 return m_flag & 0x4000;
248}
249
253inline bool Id3v2Frame::isReadOnly() const
254{
255 return m_flag & 0x2000;
256}
257
261inline bool Id3v2Frame::isCompressed() const
262{
263 return m_parsedVersion >= 4 ? m_flag & 0x8 : m_flag & 0x80;
264}
265
270inline bool Id3v2Frame::isEncrypted() const
271{
272 return m_parsedVersion >= 4 ? m_flag & 0x4 : m_flag & 0x40;
273}
274
279{
280 return m_parsedVersion >= 4 ? m_flag & 0x40 : m_flag & 0x20;
281}
282
287{
288 return m_parsedVersion >= 4 ? m_flag & 0x2 : false;
289}
290
295{
296 return m_parsedVersion >= 4 ? m_flag & 0x1 : isCompressed();
297}
298
303inline std::uint8_t Id3v2Frame::group() const
304{
305 return m_group;
306}
307
311inline void Id3v2Frame::setGroup(std::uint8_t value)
312{
313 m_group = value;
314}
315
319inline std::uint32_t Id3v2Frame::parsedVersion() const
320{
321 return m_parsedVersion;
322}
323
328{
329 return true;
330}
331
336{
337 switch (idString.size()) {
338 case 3:
339 return CppUtilities::BE::toUInt24(idString.data());
340 case 4:
341 return CppUtilities::BE::toInt<std::uint32_t>(idString.data());
342 default:
343 throw CppUtilities::ConversionException("ID3v2 ID must be 3 or 4 chars");
344 }
345}
346
351{
352 return CppUtilities::interpretIntegerAsString<std::uint32_t>(id, Id3v2FrameIds::isLongId(id) ? 0 : 1);
353}
354
355} // namespace TagParser
356
357#endif // TAG_PARSER_ID3V2FRAME_H
The Diagnostics class is a container for DiagMessage.
The Id3v2FrameMaker class helps making ID3v2 frames.
std::uint32_t dataSize() const
Returns the size of the array returned by data().
Definition id3v2frame.h:64
const std::unique_ptr< char[]> & data() const
Returns the frame data.
Definition id3v2frame.h:56
std::uint32_t requiredSize() const
Returns number of bytes which will be written when making the frame.
Definition id3v2frame.h:72
const Id3v2Frame & field() const
Returns the associated frame.
Definition id3v2frame.h:48
The Id3v2Frame class is used by Id3v2Tag to store the fields.
bool isEncrypted() const
Returns whether the frame is encrypted.
Definition id3v2frame.h:270
std::uint32_t dataSize() const
Returns the size of the data stored in the frame in bytes.
Definition id3v2frame.h:229
std::uint32_t parsedVersion() const
Returns the version of the frame (read when parsing the frame).
Definition id3v2frame.h:319
bool isReadOnly() const
Returns whether the frame is flagged as read-only.
Definition id3v2frame.h:253
static IdentifierType fieldIdFromString(std::string_view idString)
Converts the specified ID string representation to an actual ID.
Definition id3v2frame.h:335
bool supportsNestedFields() const
Returns whether nested fields are supported.
Definition id3v2frame.h:327
bool hasDataLengthIndicator() const
Returns whether the frame has a data length indicator.
Definition id3v2frame.h:294
const std::vector< TagValue > & additionalValues() const
Returns additional values.
Definition id3v2frame.h:164
bool toDiscardWhenUnknownAndFileIsAltered() const
Returns whether the frame is flagged to be discarded when it is unknown and the file (but NOT the tag...
Definition id3v2frame.h:245
bool hasGroupInformation() const
Returns whether the frame contains group information.
Definition id3v2frame.h:278
bool isAdditionalTypeInfoUsed() const
Returns whether the instance uses the additional type info.
Definition id3v2frame.h:181
std::uint16_t flag() const
Returns the flags.
Definition id3v2frame.h:205
void setGroup(std::uint8_t value)
Sets the group information.
Definition id3v2frame.h:311
bool toDiscardWhenUnknownAndTagIsAltered() const
Returns whether the frame is flagged to be discarded when it is unknown and the tag is altered.
Definition id3v2frame.h:237
bool isUnsynchronized() const
Returns whether the frame is unsynchronized.
Definition id3v2frame.h:286
std::uint32_t totalSize() const
Returns the total size of the frame in bytes.
Definition id3v2frame.h:221
bool isCompressed() const
Returns whether the frame is compressed.
Definition id3v2frame.h:261
static std::string fieldIdToString(IdentifierType id)
Returns the string representation for the specified id.
Definition id3v2frame.h:350
bool hasPaddingReached() const
Returns whether the padding has reached.
Definition id3v2frame.h:197
void setFlag(std::uint16_t value)
Sets the flags.
Definition id3v2frame.h:213
bool isValid() const
Returns whether the frame is valid.
Definition id3v2frame.h:189
std::uint8_t group() const
Returns the group.
Definition id3v2frame.h:303
Defines traits for the specified ImplementationType.
The TagField class is used by FieldMapBasedTag to store the fields.
typename TagFieldTraits< Id3v2Frame >::IdentifierType IdentifierType
The TagValue class wraps values of different types.
bool isEmpty() const
Returns whether no or an empty value is assigned.
Definition tagvalue.h:490
#define TAG_PARSER_EXPORT
Marks the symbol to be exported by the tagparser library.
Definition global.h:14
constexpr bool isLongId(std::uint32_t id)
Returns an indication whether the specified id is a long frame id.
Contains all classes and functions of the TagInfo library.
Definition aaccodebook.h:10
TagTextEncoding
Specifies the text encoding.
Definition tagvalue.h:29