5 #include "../exceptions.h"
7 #include <c++utilities/io/binarywriter.h>
24 MatroskaTagField::MatroskaTagField()
31 MatroskaTagField::MatroskaTagField(
const string &
id,
const TagValue &value)
48 string context(
"parsing Matroska tag field");
49 simpleTagElement.
parse(diag);
50 bool tagDefaultFound =
false;
55 diag.emplace_back(DiagLevel::Critical,
"Unable to parse children of \"SimpleTag\"-element.", context);
58 switch (child->id()) {
61 setId(child->readString());
62 context =
"parsing Matroska tag field " +
id();
64 diag.emplace_back(DiagLevel::Warning,
65 "\"SimpleTag\"-element contains multiple \"TagName\"-elements. Surplus TagName elements will be ignored.", context);
70 if (
value().isEmpty()) {
71 unique_ptr<char[]> buffer = make_unique<char[]>(child->dataSize());
72 child->stream().seekg(
static_cast<streamoff
>(child->dataOffset()));
73 child->stream().read(buffer.get(),
static_cast<streamoff
>(child->dataSize()));
74 switch (child->id()) {
83 diag.emplace_back(DiagLevel::Warning,
84 "\"SimpleTag\"-element contains multiple \"TagString\"/\"TagBinary\"-elements. Surplus \"TagName\"/\"TagBinary\"-elements will "
91 string lng = child->readString();
96 diag.emplace_back(DiagLevel::Warning,
97 "\"SimpleTag\"-element contains multiple \"TagLanguage\"-elements. Surplus \"TagLanguage\"-elements will be ignored.", context);
101 if (!tagDefaultFound) {
103 tagDefaultFound =
true;
105 diag.emplace_back(DiagLevel::Warning,
106 "\"SimpleTag\"-element contains multiple \"TagDefault\" elements. Surplus \"TagDefault\"-elements will be ignored.", context);
110 if (parseNestedFields) {
114 diag.emplace_back(DiagLevel::Warning,
115 "Nested fields are currently not supported. Nested tags can not be displayed and will be discarded when rewriting the file.",
123 diag.emplace_back(DiagLevel::Warning,
125 "\"SimpleTag\"-element contains unknown element ", child->idToString(),
" at ", child->startOffset(),
". It will be ignored."),
143 static const string context(
"making Matroska \"SimpleTag\" element.");
146 diag.emplace_back(DiagLevel::Critical,
"Can not make \"SimpleTag\" element with empty \"TagName\".", context);
151 }
catch (
const ConversionException &) {
152 diag.emplace_back(DiagLevel::Critical,
"The assigned tag value can not be converted to be written appropriately.", context);
184 m_stringValue = m_field.value().toString();
185 }
catch (
const ConversionException &) {
186 diag.emplace_back(DiagLevel::Warning,
187 "The assigned tag value can not be converted to a string and is treated as binary value (which is likely not what you want since "
188 "official Matroska specifiecation doesn't list any binary fields).",
189 "making Matroska \"SimpleTag\" element.");
192 size_t languageSize = m_field.value().language().size();
199 + m_field.id().size()
210 m_nestedMaker.emplace_back(nestedField.prepareMaking(diag));
211 m_simpleTagSize += m_nestedMaker.back().m_totalSize;
225 BinaryWriter writer(&stream);
230 stream.write(buff, sizeDenotationLen);
234 stream.write(buff, sizeDenotationLen);
235 stream.write(m_field.
id().c_str(), m_field.
id().size());
239 stream.put(
static_cast<ostream::char_type
>(0x80 | 3));
240 stream.write(
"und", 3);
243 stream.write(buff, sizeDenotationLen);
248 stream.put(
static_cast<ostream::char_type
>(0x80 | 1));
254 stream.write(buff, sizeDenotationLen);
259 stream.write(buff, sizeDenotationLen);
260 stream.write(m_stringValue.data(), m_stringValue.size());
263 for (
const auto &maker : m_nestedMaker) {