Added TagLib (with AUTORS and COPYING files)
[someplayer] / src / taglib / mpeg / id3v2 / frames / urllinkframe.cpp
1 /***************************************************************************
2     copyright            : (C) 2002 - 2008 by Scott Wheeler
3     email                : wheeler@kde.org
4     copyright            : (C) 2006 by Urs Fleisch
5     email                : ufleisch@users.sourceforge.net
6  ***************************************************************************/
7
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.                     *
12  *                                                                         *
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.                       *
17  *                                                                         *
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  *
21  *   USA                                                                   *
22  *                                                                         *
23  *   Alternatively, this file is available under the Mozilla Public        *
24  *   License Version 1.1.  You may obtain a copy of the License at         *
25  *   http://www.mozilla.org/MPL/                                           *
26  ***************************************************************************/
27
28 #include "urllinkframe.h"
29 #include <tdebug.h>
30 #include <tstringlist.h>
31
32 using namespace TagLib;
33 using namespace ID3v2;
34
35 class UrlLinkFrame::UrlLinkFramePrivate
36 {
37 public:
38   String url;
39 };
40
41 class UserUrlLinkFrame::UserUrlLinkFramePrivate
42 {
43 public:
44   UserUrlLinkFramePrivate() : textEncoding(String::Latin1) {}
45   String::Type textEncoding;
46   String description;
47 };
48
49 UrlLinkFrame::UrlLinkFrame(const ByteVector &data) :
50   Frame(data)
51 {
52   d = new UrlLinkFramePrivate;
53   setData(data);
54 }
55
56 UrlLinkFrame::~UrlLinkFrame()
57 {
58   delete d;
59 }
60
61 void UrlLinkFrame::setUrl(const String &s)
62 {
63   d->url = s;
64 }
65
66 String UrlLinkFrame::url() const
67 {
68   return d->url;
69 }
70
71 void UrlLinkFrame::setText(const String &s)
72 {
73   setUrl(s);
74 }
75
76 String UrlLinkFrame::toString() const
77 {
78   return url();
79 }
80
81 void UrlLinkFrame::parseFields(const ByteVector &data)
82 {
83   d->url = String(data);
84 }
85
86 ByteVector UrlLinkFrame::renderFields() const
87 {
88   return d->url.data(String::Latin1);
89 }
90
91 UrlLinkFrame::UrlLinkFrame(const ByteVector &data, Header *h) : Frame(h)
92 {
93   d = new UrlLinkFramePrivate;
94   parseFields(fieldData(data));
95 }
96
97
98 UserUrlLinkFrame::UserUrlLinkFrame(String::Type encoding) :
99   UrlLinkFrame("WXXX")
100 {
101   d = new UserUrlLinkFramePrivate;
102   d->textEncoding = encoding;
103 }
104
105 UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data) :
106   UrlLinkFrame(data)
107 {
108   d = new UserUrlLinkFramePrivate;
109   setData(data);
110 }
111
112 UserUrlLinkFrame::~UserUrlLinkFrame()
113 {
114   delete d;
115 }
116
117 String UserUrlLinkFrame::toString() const
118 {
119   return "[" + description() + "] " + url();
120 }
121
122 String::Type UserUrlLinkFrame::textEncoding() const
123 {
124   return d->textEncoding;
125 }
126
127 void UserUrlLinkFrame::setTextEncoding(String::Type encoding)
128 {
129   d->textEncoding = encoding;
130 }
131
132 String UserUrlLinkFrame::description() const
133 {
134   return d->description;
135 }
136
137 void UserUrlLinkFrame::setDescription(const String &s)
138 {
139   d->description = s;
140 }
141
142 void UserUrlLinkFrame::parseFields(const ByteVector &data)
143 {
144   if(data.size() < 2) {
145     debug("A user URL link frame must contain at least 2 bytes.");
146     return;
147   }
148
149   int pos = 0;
150
151   d->textEncoding = String::Type(data[0]);
152   pos += 1;
153
154   if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) {
155     int offset = data.find(textDelimiter(d->textEncoding), pos);
156     if(offset < pos)
157       return;
158
159     d->description = String(data.mid(pos, offset - pos), d->textEncoding);
160     pos = offset + 1;
161   }
162   else {
163     int len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2);
164     if(len < 0)
165       return;
166
167     d->description = String(data.mid(pos, len), d->textEncoding);
168     pos += len + 2;
169   }
170
171   setUrl(String(data.mid(pos)));
172 }
173
174 ByteVector UserUrlLinkFrame::renderFields() const
175 {
176   ByteVector v;
177
178   String::Type encoding = checkEncoding(d->description, d->textEncoding);
179
180   v.append(char(encoding));
181   v.append(d->description.data(encoding));
182   v.append(textDelimiter(encoding));
183   v.append(url().data(String::Latin1));
184
185   return v;
186 }
187
188 UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data, Header *h) : UrlLinkFrame(data, h)
189 {
190   d = new UserUrlLinkFramePrivate;
191   parseFields(fieldData(data));
192 }