4 #include "../flac/flacmetadata.h" 6 #include "../ogg/oggiterator.h" 8 #include "../id3/id3v2frame.h" 10 #include "../exceptions.h" 12 #include <c++utilities/io/binaryreader.h> 13 #include <c++utilities/io/binarywriter.h> 14 #include <c++utilities/io/catchiofailure.h> 15 #include <c++utilities/conversion/binaryconversion.h> 16 #include <c++utilities/conversion/stringconversion.h> 35 VorbisCommentField::VorbisCommentField()
41 VorbisCommentField::VorbisCommentField(
const identifierType &
id,
const TagValue &value) :
48 template<
class StreamType>
49 void VorbisCommentField::internalParse(StreamType &stream, uint64 &maxSize)
51 static const string context(
"parsing Vorbis comment field");
60 if(
const auto size = LE::toUInt32(buff)) {
64 auto data = make_unique<char []>(size);
65 stream.read(data.get(), size);
67 for(
const char *i = data.get(), *end = data.get() + size; i != end && *i !=
'='; ++i, ++idSize);
69 setId(
string(data.get(), idSize));
77 auto decoded = decodeBase64(data.get() + idSize + 1, size - idSize - 1);
78 stringstream bufferStream(ios_base::in | ios_base::out | ios_base::binary);
79 bufferStream.exceptions(ios_base::failbit | ios_base::badbit);
80 bufferStream.rdbuf()->pubsetbuf(reinterpret_cast<char *>(decoded.first.get()), decoded.second);
82 pictureBlock.
parse(bufferStream, decoded.second);
87 }
catch(
const ConversionException &) {
95 }
else if(
id().size() + 1 < size) {
119 internalParse(iterator, maxSize);
134 internalParse(iterator, maxSize);
149 internalParse(stream, maxSize);
163 static const string context(
"making Vorbis comment field");
184 auto buffer = make_unique<char[]>(requiredSize);
185 stringstream bufferStream(ios_base::in | ios_base::out | ios_base::binary);
186 bufferStream.exceptions(ios_base::failbit | ios_base::badbit);
187 bufferStream.rdbuf()->pubsetbuf(buffer.get(), requiredSize);
189 pictureBlock.
make(bufferStream);
190 valueString = encodeBase64(reinterpret_cast<byte *>(buffer.get()), requiredSize);
200 writer.writeUInt32LE(
id().size() + 1 + valueString.size());
201 writer.writeString(
id());
202 writer.writeChar(
'=');
203 writer.writeString(valueString);
204 }
catch(
const ConversionException &) {
Contains utility classes helping to read and write streams.