1
/***************************************************************************
2
copyright : (C) 2004 by Scott Wheeler
3
email : wheeler@kde.org
4
copyright : (C) 2006 by Aaron VonderHaar
5
email : avh4@users.sourceforge.net
6
***************************************************************************/
8
/***************************************************************************
9
* This library is free software; you can redistribute it and/or modify *
10
* it under the terms of the GNU Lesser General Public License version *
11
* 2.1 as published by the Free Software Foundation. *
13
* This library is distributed in the hope that it will be useful, but *
14
* WITHOUT ANY WARRANTY; without even the implied warranty of *
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16
* Lesser General Public License for more details. *
18
* You should have received a copy of the GNU Lesser General Public *
19
* License along with this library; if not, write to the Free Software *
20
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
22
***************************************************************************/
26
#include "generalencapsulatedobjectframe.h"
28
using namespace TagLib;
29
using namespace ID3v2;
31
class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate
34
GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {}
36
String::Type textEncoding;
43
////////////////////////////////////////////////////////////////////////////////
45
////////////////////////////////////////////////////////////////////////////////
47
GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : Frame("GEOB")
49
d = new GeneralEncapsulatedObjectFramePrivate;
52
GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : Frame(data)
54
d = new GeneralEncapsulatedObjectFramePrivate;
58
GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame()
63
String GeneralEncapsulatedObjectFrame::toString() const
65
String text = "[" + d->mimeType + "]";
67
if(!d->fileName.isEmpty())
68
text += " " + d->fileName;
70
if(!d->description.isEmpty())
71
text += " \"" + d->description + "\"";
76
String::Type GeneralEncapsulatedObjectFrame::textEncoding() const
78
return d->textEncoding;
81
void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding)
83
d->textEncoding = encoding;
86
String GeneralEncapsulatedObjectFrame::mimeType() const
91
void GeneralEncapsulatedObjectFrame::setMimeType(const String &type)
96
String GeneralEncapsulatedObjectFrame::fileName() const
101
void GeneralEncapsulatedObjectFrame::setFileName(const String &name)
106
String GeneralEncapsulatedObjectFrame::description() const
108
return d->description;
111
void GeneralEncapsulatedObjectFrame::setDescription(const String &desc)
113
d->description = desc;
116
ByteVector GeneralEncapsulatedObjectFrame::object() const
121
void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data)
126
////////////////////////////////////////////////////////////////////////////////
128
////////////////////////////////////////////////////////////////////////////////
130
void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data)
132
if(data.size() < 4) {
133
debug("An object frame must contain at least 4 bytes.");
139
d->textEncoding = String::Type(data[fieldStart]);
142
int fieldEnd = data.find(textDelimiter(String::Latin1), fieldStart);
144
if(fieldEnd < fieldStart)
147
d->mimeType = String(data.mid(fieldStart, fieldEnd - fieldStart), String::Latin1);
148
fieldStart = fieldEnd + 1;
150
if (d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) {
151
fieldEnd = data.find(textDelimiter(d->textEncoding), fieldStart);
153
if(fieldEnd < fieldStart)
156
d->fileName = String(data.mid(fieldStart, fieldEnd - fieldStart), d->textEncoding);
157
fieldStart = fieldEnd + 1;
159
fieldEnd = data.find(textDelimiter(d->textEncoding), fieldStart);
161
if(fieldEnd < fieldStart)
164
d->description = String(data.mid(fieldStart, fieldEnd - fieldStart), d->textEncoding);
165
fieldStart = fieldEnd + 1;
167
// use byteAlign = 2 to find $00 00 text delimiter
168
// find in subvector so that it works too when pos is odd
169
int len = data.mid(fieldStart).find(textDelimiter(d->textEncoding), 0, 2);
174
d->fileName = String(data.mid(fieldStart, len), d->textEncoding);
175
fieldStart += len + 2;
177
len = data.mid(fieldStart).find(textDelimiter(d->textEncoding), 0, 2);
182
d->description = String(data.mid(fieldStart, len), d->textEncoding);
183
fieldStart += len + 2;
186
d->data = data.mid(fieldStart);
189
ByteVector GeneralEncapsulatedObjectFrame::renderFields() const
193
data.append(char(d->textEncoding));
194
data.append(d->mimeType.data(String::Latin1));
195
data.append(textDelimiter(String::Latin1));
196
data.append(d->fileName.data(d->textEncoding));
197
data.append(textDelimiter(d->textEncoding));
198
data.append(d->description.data(d->textEncoding));
199
data.append(textDelimiter(d->textEncoding));
200
data.append(d->data);
205
////////////////////////////////////////////////////////////////////////////////
207
////////////////////////////////////////////////////////////////////////////////
209
GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : Frame(h)
211
d = new GeneralEncapsulatedObjectFramePrivate;
212
parseFields(fieldData(data));