00001 // $Id: frame.cpp,v 1.35 2002/08/10 10:42:42 t1mpy Exp $ 00002 00003 // id3lib: a C++ library for creating and manipulating id3v1/v2 tags 00004 // Copyright 1999, 2000 Scott Thomas Haug 00005 // Copyright 2002 Thijmen Klok (thijmen@id3lib.org) 00006 00007 // This library is free software; you can redistribute it and/or modify it 00008 // under the terms of the GNU Library General Public License as published by 00009 // the Free Software Foundation; either version 2 of the License, or (at your 00010 // option) any later version. 00011 // 00012 // This library is distributed in the hope that it will be useful, but WITHOUT 00013 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00014 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 00015 // License for more details. 00016 // 00017 // You should have received a copy of the GNU Library General Public License 00018 // along with this library; if not, write to the Free Software Foundation, 00019 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00020 00021 // The id3lib authors encourage improvements and optimisations to be sent to 00022 // the id3lib coordinator. Please see the README file for details on where to 00023 // send such submissions. See the AUTHORS file for a list of people who have 00024 // contributed to id3lib. See the ChangeLog file for a list of changes to 00025 // id3lib. These files are distributed with id3lib at 00026 // http://download.sourceforge.net/id3lib/ 00027 00028 #if defined HAVE_CONFIG_H 00029 #include <config.h> 00030 #endif 00031 00032 //#include "frame.h" 00033 #include "readers.h" 00034 #include "frame_impl.h" 00035 00062 ID3_Frame::ID3_Frame(ID3_FrameID id) 00063 : _impl(new ID3_FrameImpl(id)) 00064 { 00065 } 00066 00067 ID3_Frame::ID3_Frame(const ID3_Frame& frame) 00068 : _impl(new ID3_FrameImpl(frame)) 00069 { 00070 } 00071 00072 ID3_Frame::~ID3_Frame() 00073 { 00074 delete _impl; 00075 } 00076 00082 void ID3_Frame::Clear() 00083 { 00084 _impl->Clear(); 00085 } 00086 00094 ID3_FrameID ID3_Frame::GetID() const 00095 { 00096 return _impl->GetID(); 00097 } 00098 00116 bool ID3_Frame::SetID(ID3_FrameID id) 00117 { 00118 return _impl->SetID(id); 00119 } 00120 00121 bool ID3_Frame::SetSpec(ID3_V2Spec spec) 00122 { 00123 return _impl->SetSpec(spec); 00124 } 00125 00126 ID3_V2Spec ID3_Frame::GetSpec() const 00127 { 00128 return _impl->GetSpec(); 00129 } 00130 00142 ID3_Field& ID3_Frame::Field(ID3_FieldID fieldName) const 00143 { 00144 return *this->GetField(fieldName); 00145 } 00146 00147 ID3_Field* ID3_Frame::GetField(ID3_FieldID fieldName) const 00148 { 00149 return _impl->GetField(fieldName); 00150 } 00151 00152 size_t ID3_Frame::NumFields() const 00153 { 00154 return _impl->NumFields(); 00155 } 00156 00157 /* 00158 ID3_Field* ID3_Frame::GetFieldNum(size_t index) const 00159 { 00160 return _impl->GetFieldNum(index); 00161 } 00162 */ 00163 00164 size_t ID3_Frame::Size() 00165 { 00166 return _impl->Size(); 00167 } 00168 00169 00170 bool ID3_Frame::HasChanged() const 00171 { 00172 return _impl->HasChanged(); 00173 } 00174 00175 ID3_Frame& ID3_Frame::operator=( const ID3_Frame &rFrame ) 00176 { 00177 if (this != &rFrame) 00178 { 00179 *_impl = rFrame; 00180 } 00181 return *this; 00182 } 00183 00184 const char* ID3_Frame::GetDescription(ID3_FrameID id) 00185 { 00186 return ID3_FrameImpl::GetDescription(id); 00187 } 00188 00189 const char* ID3_Frame::GetDescription() const 00190 { 00191 return _impl->GetDescription(); 00192 } 00193 00194 const char* ID3_Frame::GetTextID() const 00195 { 00196 return _impl->GetTextID(); 00197 } 00198 00199 bool ID3_Frame::Parse(ID3_Reader& reader) 00200 { 00201 return _impl->Parse(reader); 00202 } 00203 00204 void ID3_Frame::Render(ID3_Writer& writer) const 00205 { 00206 _impl->Render(writer); 00207 } 00208 00209 bool ID3_Frame::Contains(ID3_FieldID id) const 00210 { 00211 return _impl->Contains(id); 00212 } 00213 00219 bool ID3_Frame::SetCompression(bool b) 00220 { 00221 return _impl->SetCompression(b); 00222 } 00223 00232 bool ID3_Frame::GetCompression() const 00233 { 00234 return _impl->GetCompression(); 00235 } 00236 00237 size_t ID3_Frame::GetDataSize() const 00238 { 00239 return _impl->GetDataSize(); 00240 } 00241 00242 bool ID3_Frame::SetEncryptionID(uchar id) 00243 { 00244 return _impl->SetEncryptionID(id); 00245 } 00246 00247 uchar ID3_Frame::GetEncryptionID() const 00248 { 00249 return _impl->GetEncryptionID(); 00250 } 00251 00252 bool ID3_Frame::SetGroupingID(uchar id) 00253 { 00254 return _impl->SetGroupingID(id); 00255 } 00256 00257 uchar ID3_Frame::GetGroupingID() const 00258 { 00259 return _impl->GetGroupingID(); 00260 } 00261 00262 namespace 00263 { 00264 class IteratorImpl : public ID3_Frame::Iterator 00265 { 00266 ID3_FrameImpl::iterator _cur; 00267 ID3_FrameImpl::iterator _end; 00268 public: 00269 IteratorImpl(ID3_FrameImpl& frame) 00270 : _cur(frame.begin()), _end(frame.end()) 00271 { 00272 } 00273 00274 ID3_Field* GetNext() 00275 { 00276 ID3_Field* next = NULL; 00277 while (next == NULL && _cur != _end) 00278 { 00279 next = *_cur; 00280 ++_cur; 00281 } 00282 return next; 00283 } 00284 }; 00285 00286 00287 class ConstIteratorImpl : public ID3_Frame::ConstIterator 00288 { 00289 ID3_FrameImpl::const_iterator _cur; 00290 ID3_FrameImpl::const_iterator _end; 00291 public: 00292 ConstIteratorImpl(ID3_FrameImpl& frame) 00293 : _cur(frame.begin()), _end(frame.end()) 00294 { 00295 } 00296 const ID3_Field* GetNext() 00297 { 00298 ID3_Field* next = NULL; 00299 while (next == NULL && _cur != _end) 00300 { 00301 next = *_cur; 00302 ++_cur; 00303 } 00304 return next; 00305 } 00306 }; 00307 } 00308 00309 ID3_Frame::Iterator* 00310 ID3_Frame::CreateIterator() 00311 { 00312 return new IteratorImpl(*_impl); 00313 } 00314 00315 ID3_Frame::ConstIterator* 00316 ID3_Frame::CreateIterator() const 00317 { 00318 return new ConstIteratorImpl(*_impl); 00319 } 00320