6 #include <c++utilities/conversion/binaryconversion.h> 7 #include <c++utilities/conversion/stringconversion.h> 8 #include <c++utilities/conversion/conversionexception.h> 35 m_mimeType(other.m_mimeType),
37 m_labeledAsReadonly(other.m_labeledAsReadonly),
38 m_encoding(other.m_encoding),
39 m_descEncoding(other.m_descEncoding)
42 m_ptr = make_unique<char []>(m_size);
43 std::copy(other.m_ptr.get(), other.m_ptr.get() + other.m_size, m_ptr.get());
53 m_size = other.m_size;
54 m_type = other.m_type;
55 m_desc = other.m_desc;
56 m_mimeType = other.m_mimeType;
58 m_labeledAsReadonly = other.m_labeledAsReadonly;
59 m_encoding = other.m_encoding;
60 m_descEncoding = other.m_descEncoding;
64 m_ptr = make_unique<char[]>(m_size);
65 std::copy(other.m_ptr.get(), other.m_ptr.get() + other.m_size, m_ptr.get());
79 if(m_desc != other.m_desc || (!m_desc.empty() && m_descEncoding != other.m_descEncoding)
80 || m_mimeType != other.m_mimeType || m_lng != other.m_lng || m_labeledAsReadonly != other.m_labeledAsReadonly) {
83 if(m_type == other.m_type) {
86 if(m_size != other.m_size && m_encoding != other.m_encoding) {
89 return strncmp(m_ptr.get(), other.m_ptr.get(), m_size) == 0;
103 if(m_size != other.m_size) {
106 return strncmp(m_ptr.get(), other.m_ptr.get(), m_size) == 0;
116 }
catch(
const ConversionException &) {
140 m_labeledAsReadonly =
false;
166 return ConversionUtilities::stringToNumber<int32>(string(m_ptr.get(), m_size));
170 if(m_size ==
sizeof(int32)) {
171 auto res = *
reinterpret_cast<int32 *
>(m_ptr.get());
174 throw ConversionException(
"Can not convert assigned data to integer because the data size is not appropriate.");
178 throw ConversionException(
"Can not convert binary data/picture/time span/date time to integer.");
195 string s(m_ptr.get(), m_size);
197 index = ConversionUtilities::stringToNumber<int32>(s);
198 }
catch (ConversionException &) {
204 if(m_size ==
sizeof(
int)) {
205 index = *
reinterpret_cast<int *
>(m_ptr.get());
207 throw ConversionException(
"The assigned data is of unappropriate size.");
211 throw ConversionException(
"It is not possible to convert assigned data to a number because of its incompatible type.");
216 throw ConversionException(
"The assigned number is not a valid standard genre index.");
240 return PositionInSet(u16string(reinterpret_cast<char16_t *>(m_ptr.get()), m_size / 2));
246 return PositionInSet(*(reinterpret_cast<int32 *>(m_ptr.get())));
247 case 2 *
sizeof(int32):
248 return PositionInSet(*(reinterpret_cast<int32 *>(m_ptr.get())), *(
reinterpret_cast<int32 *
>(m_ptr.get() +
sizeof(int32))));
250 throw ConversionException(
"The size of the assigned data is not appropriate.");
253 throw ConversionException(
"Can not convert binary data/genre index/picture to \"position in set\".");
269 return TimeSpan::fromString(
string(m_ptr.get(), m_size));
274 return TimeSpan(*(reinterpret_cast<int32 *>(m_ptr.get())));
276 return TimeSpan(*(reinterpret_cast<int64 *>(m_ptr.get())));
278 throw ConversionException(
"The size of the assigned data is not appropriate.");
281 throw ConversionException(
"Can not convert binary data/genre index/position in set/picture to time span.");
297 return DateTime::fromString(
string(m_ptr.get(), m_size));
300 if(m_size ==
sizeof(int32)) {
301 return DateTime(*(reinterpret_cast<int32 *>(m_ptr.get())));
302 }
else if(m_size ==
sizeof(int64)) {
303 return DateTime(*(reinterpret_cast<int64 *>(m_ptr.get())));
305 throw ConversionException(
"The assigned data is of unappropriate size.");
308 throw ConversionException(
"Can not convert binary data/genre index/position in set/picture to date time.");
319 switch(tagTextEncoding) {
321 return make_pair(
"ISO-8859-1", 1.0f);
323 return make_pair(
"UTF-8", 1.0f);
325 return make_pair(
"UTF-16LE", 2.0f);
327 return make_pair(
"UTF-16BE", 2.0f);
329 return make_pair(
nullptr, 0.0f);
344 if(m_encoding != encoding) {
346 StringData encodedData;
352 encodedData = convertLatin1ToUtf8(m_ptr.get(), m_size);
355 encodedData = convertUtf16LEToUtf8(m_ptr.get(), m_size);
358 encodedData = convertUtf16BEToUtf8(m_ptr.get(), m_size);
368 encodedData = convertString(inputParameter.first, outputParameter.first, m_ptr.get(), m_size, outputParameter.second / inputParameter.second);
372 m_ptr = make_unique<char []>(m_size = encodedData.second);
373 copy(encodedData.first.get(), encodedData.first.get() + encodedData.second, m_ptr.get());
375 m_encoding = encoding;
405 result.assign(m_ptr.get(), m_size);
407 StringData encodedData;
413 encodedData = convertLatin1ToUtf8(m_ptr.get(), m_size);
416 encodedData = convertUtf16LEToUtf8(m_ptr.get(), m_size);
419 encodedData = convertUtf16BEToUtf8(m_ptr.get(), m_size);
429 encodedData = convertString(inputParameter.first, outputParameter.first, m_ptr.get(), m_size, outputParameter.second / inputParameter.second);
432 result.assign(encodedData.first.get(), encodedData.second);
436 result = ConversionUtilities::numberToString(
toInteger());
443 result.assign(genreName);
446 throw ConversionException(
"No string representation for the assigned standard genre index available.");
452 throw ConversionException(
"Can not convert binary data/picture to string.");
456 ? convertUtf8ToUtf16LE(result.data(), result.size())
457 : convertUtf8ToUtf16BE(result.data(), result.size());
458 result.assign(encodedData.first.get(), encodedData.second);
475 string regularStrRes;
479 result.assign(reinterpret_cast<const char16_t *>(m_ptr.get()), m_size /
sizeof(char16_t));
481 StringData encodedData;
487 encodedData = convertLatin1ToUtf8(m_ptr.get(), m_size);
490 encodedData = convertUtf16LEToUtf8(m_ptr.get(), m_size);
493 encodedData = convertUtf16BEToUtf8(m_ptr.get(), m_size);
503 encodedData = convertString(inputParameter.first, outputParameter.first, m_ptr.get(), m_size, outputParameter.second / inputParameter.second);
506 result.assign(reinterpret_cast<const char16_t *>(encodedData.first.get()), encodedData.second /
sizeof(char16_t));
510 regularStrRes = ConversionUtilities::numberToString(
toInteger());
517 regularStrRes.assign(genreName);
520 throw ConversionException(
"No string representation for the assigned standard genre index available.");
526 throw ConversionException(
"Can not convert binary data/picture to string.");
530 ? convertUtf8ToUtf16LE(regularStrRes.data(), result.size())
531 : convertUtf8ToUtf16BE(regularStrRes.data(), result.size());
532 result.assign(reinterpret_cast<const char16_t *>(encodedData.first.get()), encodedData.second /
sizeof(
const char16_t));
554 m_ptr = make_unique<char []>(m_size = textSize);
555 copy(text, text + textSize, m_ptr.get());
557 StringData encodedData;
558 switch(textEncoding) {
563 encodedData = convertUtf8ToLatin1(text, textSize);
566 encodedData = convertUtf8ToUtf16LE(text, textSize);
569 encodedData = convertUtf8ToUtf16BE(text, textSize);
579 encodedData = convertString(inputParameter.first, outputParameter.first, text, textSize, outputParameter.second / inputParameter.second);
583 m_ptr = make_unique<char []>(m_size = encodedData.second);
584 copy(encodedData.first.get(), encodedData.first.get() + encodedData.second, m_ptr.get());
598 m_size =
sizeof(value);
599 m_ptr = make_unique<char []>(m_size);
600 std::copy(reinterpret_cast<const char *>(&value), reinterpret_cast<const char *>(&value) + m_size, m_ptr.get());
626 if(length > m_size) {
627 m_ptr = make_unique<char[]>(length);
630 std::copy(data, data + length, m_ptr.get());
636 m_encoding = encoding;
654 m_encoding = encoding;
664 return emptyTagValue;