<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>src/frame_impl.cpp Source File</title> <link href="id3lib.css" rel="stylesheet" type="text/css"> </head><body bgcolor="#ffffff"> <!-- Generated by Doxygen 1.2.12 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> </center> <hr><h1>src/frame_impl.cpp</h1><a href="frame__impl_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <font class="comment">// $Id: frame_impl.cpp,v 1.8 2000/10/24 07:00:09 eldamitri Exp $</font> 00002 00003 <font class="comment">// id3lib: a C++ library for creating and manipulating id3v1/v2 tags</font> 00004 <font class="comment">// Copyright 1999, 2000 Scott Thomas Haug</font> 00005 00006 <font class="comment">// This library is free software; you can redistribute it and/or modify it</font> 00007 <font class="comment">// under the terms of the GNU Library General Public License as published by</font> 00008 <font class="comment">// the Free Software Foundation; either version 2 of the License, or (at your</font> 00009 <font class="comment">// option) any later version.</font> 00010 <font class="comment">//</font> 00011 <font class="comment">// This library is distributed in the hope that it will be useful, but WITHOUT</font> 00012 <font class="comment">// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or</font> 00013 <font class="comment">// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public</font> 00014 <font class="comment">// License for more details.</font> 00015 <font class="comment">//</font> 00016 <font class="comment">// You should have received a copy of the GNU Library General Public License</font> 00017 <font class="comment">// along with this library; if not, write to the Free Software Foundation,</font> 00018 <font class="comment">// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</font> 00019 00020 <font class="comment">// The id3lib authors encourage improvements and optimisations to be sent to</font> 00021 <font class="comment">// the id3lib coordinator. Please see the README file for details on where to</font> 00022 <font class="comment">// send such submissions. See the AUTHORS file for a list of people who have</font> 00023 <font class="comment">// contributed to id3lib. See the ChangeLog file for a list of changes to</font> 00024 <font class="comment">// id3lib. These files are distributed with id3lib at</font> 00025 <font class="comment">// http://download.sourceforge.net/id3lib/</font> 00026 00027 <font class="preprocessor">#if defined HAVE_CONFIG_H</font> 00028 <font class="preprocessor"></font><font class="preprocessor">#include <config.h></font> 00029 <font class="preprocessor">#endif</font> 00030 <font class="preprocessor"></font> 00031 <font class="preprocessor">#include <string.h></font> 00032 <font class="preprocessor">#include "<a class="code" href="tag_8h.html">tag.h</a>"</font> 00033 <font class="preprocessor">#include "<a class="code" href="frame__impl_8h.html">frame_impl.h</a>"</font> 00034 <font class="preprocessor">#include "<a class="code" href="field__impl_8h.html">field_impl.h</a>"</font> 00035 <font class="preprocessor">#include "<a class="code" href="frame__def_8h.html">frame_def.h</a>"</font> 00036 <font class="preprocessor">#include "<a class="code" href="field__def_8h.html">field_def.h</a>"</font> 00037 <a name="l00038"></a><a class="code" href="class_i_d3___frame_impl.html#a0">00038</a> <a class="code" href="class_i_d3___frame_impl.html#a0">ID3_FrameImpl::ID3_FrameImpl</a>(<a class="code" href="globals_8h.html#a219">ID3_FrameID</a> id) 00039 : _changed(false), 00040 _bitset(), 00041 _fields(), 00042 _encryption_id('\0'), 00043 _grouping_id('\0') 00044 { 00045 this-><a class="code" href="class_i_d3___frame_impl.html#a17">SetSpec</a>(<a class="code" href="globals_8h.html#a216a58">ID3V2_LATEST</a>); 00046 this-><a class="code" href="class_i_d3___frame_impl.html#a5">SetID</a>(id); 00047 } 00048 <a name="l00049"></a><a class="code" href="class_i_d3___frame_impl.html#a1">00049</a> <a class="code" href="class_i_d3___frame_impl.html#a0">ID3_FrameImpl::ID3_FrameImpl</a>(<font class="keyword">const</font> <a class="code" href="class_i_d3___frame_header.html">ID3_FrameHeader</a> &hdr) 00050 : _changed(false), 00051 _bitset(), 00052 _fields(), 00053 _hdr(hdr), 00054 _encryption_id('\0'), 00055 _grouping_id('\0') 00056 { 00057 this-><a class="code" href="class_i_d3___frame_impl.html#b2">_InitFields</a>(); 00058 } 00059 <a name="l00060"></a><a class="code" href="class_i_d3___frame_impl.html#a2">00060</a> <a class="code" href="class_i_d3___frame_impl.html#a0">ID3_FrameImpl::ID3_FrameImpl</a>(<font class="keyword">const</font> <a class="code" href="class_i_d3___frame.html">ID3_Frame</a>& frame) 00061 : _changed(false), 00062 _bitset(), 00063 _fields(), 00064 _encryption_id('\0'), 00065 _grouping_id('\0') 00066 { 00067 *<font class="keyword">this</font> = frame; 00068 } 00069 <a name="l00070"></a><a class="code" href="class_i_d3___frame_impl.html#a3">00070</a> <a class="code" href="class_i_d3___frame_impl.html#a3">ID3_FrameImpl::~ID3_FrameImpl</a>() 00071 { 00072 <a class="code" href="class_i_d3___frame_impl.html#a4">Clear</a>(); 00073 } 00074 <a name="l00075"></a><a class="code" href="class_i_d3___frame_impl.html#b1">00075</a> <font class="keywordtype">bool</font> <a class="code" href="class_i_d3___frame_impl.html#b1">ID3_FrameImpl::_ClearFields</a>() 00076 { 00077 <font class="keywordflow">for</font> (<a class="code" href="class_i_d3___frame_impl.html#s0">iterator</a> fi = _fields.begin(); fi != _fields.end(); ++fi) 00078 { 00079 <font class="keyword">delete</font> (<a class="code" href="class_i_d3___field_impl.html">ID3_FieldImpl</a>*) *fi; 00080 } 00081 00082 _fields.clear(); 00083 _bitset.reset(); 00084 00085 _changed = <font class="keyword">true</font>; 00086 <font class="keywordflow">return</font> <font class="keyword">true</font>; 00087 } 00088 <a name="l00089"></a><a class="code" href="class_i_d3___frame_impl.html#a4">00089</a> <font class="keywordtype">void</font> <a class="code" href="class_i_d3___frame_impl.html#a4">ID3_FrameImpl::Clear</a>() 00090 { 00091 this-><a class="code" href="class_i_d3___frame_impl.html#b1">_ClearFields</a>(); 00092 _hdr.<a class="code" href="class_i_d3___frame_header.html#a9">Clear</a>(); 00093 _encryption_id = <font class="charliteral">'\0'</font>; 00094 _grouping_id = <font class="charliteral">'\0'</font>; 00095 } 00096 <a name="l00097"></a><a class="code" href="class_i_d3___frame_impl.html#b2">00097</a> <font class="keywordtype">void</font> <a class="code" href="class_i_d3___frame_impl.html#b2">ID3_FrameImpl::_InitFields</a>() 00098 { 00099 <font class="keyword">const</font> <a class="code" href="struct_i_d3___frame_def.html">ID3_FrameDef</a>* info = _hdr.<a class="code" href="class_i_d3___frame_header.html#a8">GetFrameDef</a>(); 00100 <font class="keywordflow">if</font> (<a class="code" href="globals_8h.html#a24">NULL</a> == info) 00101 { 00102 <font class="comment">// log this</font> 00103 <a class="code" href="class_i_d3___field.html">ID3_Field</a>* fld = <font class="keyword">new</font> <a class="code" href="class_i_d3___field_impl.html">ID3_FieldImpl</a>(<a class="code" href="struct_i_d3___field_def.html#p0">ID3_FieldDef::DEFAULT</a>[0]); 00104 _fields.push_back(fld); 00105 _bitset.set(fld-><a class="code" href="class_i_d3___field.html#a28">GetID</a>()); 00106 } 00107 <font class="keywordflow">else</font> 00108 { 00109 00110 <font class="keywordflow">for</font> (size_t i = 0; info-><a class="code" href="struct_i_d3___frame_def.html#m5">aeFieldDefs</a>[i].<a class="code" href="struct_i_d3___field_def.html#m0">_id</a> != <a class="code" href="globals_8h.html#a218a70">ID3FN_NOFIELD</a>; ++i) 00111 { 00112 <a class="code" href="class_i_d3___field.html">ID3_Field</a>* fld = <font class="keyword">new</font> <a class="code" href="class_i_d3___field_impl.html">ID3_FieldImpl</a>(info-><a class="code" href="struct_i_d3___frame_def.html#m5">aeFieldDefs</a>[i]); 00113 _fields.push_back(fld); 00114 _bitset.set(fld-><a class="code" href="class_i_d3___field.html#a28">GetID</a>()); 00115 } 00116 00117 _changed = <font class="keyword">true</font>; 00118 } 00119 } 00120 <a name="l00121"></a><a class="code" href="class_i_d3___frame_impl.html#a5">00121</a> <font class="keywordtype">bool</font> <a class="code" href="class_i_d3___frame_impl.html#a5">ID3_FrameImpl::SetID</a>(<a class="code" href="globals_8h.html#a219">ID3_FrameID</a> id) 00122 { 00123 <font class="keywordtype">bool</font> changed = (this-><a class="code" href="class_i_d3___frame_impl.html#a6">GetID</a>() != id); 00124 <font class="keywordflow">if</font> (changed) 00125 { 00126 this-><a class="code" href="class_i_d3___frame_impl.html#b0">_SetID</a>(id); 00127 _changed = <font class="keyword">true</font>; 00128 } 00129 <font class="keywordflow">return</font> changed; 00130 } 00131 <a name="l00132"></a><a class="code" href="class_i_d3___frame_impl.html#b0">00132</a> <font class="keywordtype">bool</font> <a class="code" href="class_i_d3___frame_impl.html#b0">ID3_FrameImpl::_SetID</a>(<a class="code" href="globals_8h.html#a219">ID3_FrameID</a> id) 00133 { 00134 <font class="keywordtype">bool</font> changed = this-><a class="code" href="class_i_d3___frame_impl.html#b1">_ClearFields</a>(); 00135 changed = _hdr.<a class="code" href="class_i_d3___frame_header.html#a5">SetFrameID</a>(id) || changed; 00136 this-><a class="code" href="class_i_d3___frame_impl.html#b2">_InitFields</a>(); 00137 <font class="keywordflow">return</font> changed; 00138 } 00139 <a name="l00140"></a><a class="code" href="class_i_d3___frame_impl.html#a17">00140</a> <font class="keywordtype">bool</font> <a class="code" href="class_i_d3___frame_impl.html#a17">ID3_FrameImpl::SetSpec</a>(<a class="code" href="globals_8h.html#a216">ID3_V2Spec</a> spec) 00141 { 00142 <font class="keywordflow">return</font> _hdr.<a class="code" href="class_i_d3___header.html#a2">SetSpec</a>(spec); 00143 } 00144 <a name="l00145"></a><a class="code" href="class_i_d3___frame_impl.html#a18">00145</a> <a class="code" href="globals_8h.html#a216">ID3_V2Spec</a> <a class="code" href="class_i_d3___frame_impl.html#a18">ID3_FrameImpl::GetSpec</a>()<font class="keyword"> const</font> 00146 <font class="keyword"></font>{ 00147 <font class="keywordflow">return</font> _hdr.<a class="code" href="class_i_d3___header.html#a3">GetSpec</a>(); 00148 } 00149 <a name="l00150"></a><a class="code" href="class_i_d3___frame_impl.html#a7">00150</a> <a class="code" href="class_i_d3___field.html">ID3_Field</a>* <a class="code" href="class_i_d3___frame_impl.html#a7">ID3_FrameImpl::GetField</a>(<a class="code" href="globals_8h.html#a218">ID3_FieldID</a> fieldName)<font class="keyword"> const</font> 00151 <font class="keyword"></font>{ 00152 <a class="code" href="class_i_d3___field.html">ID3_Field</a>* field = <a class="code" href="globals_8h.html#a24">NULL</a>; 00153 <font class="keywordflow">if</font> (this-><a class="code" href="class_i_d3___frame_impl.html#a16">Contains</a>(fieldName)) 00154 { 00155 <font class="keywordflow">for</font> (<a class="code" href="class_i_d3___frame_impl.html#s1">const_iterator</a> fi = _fields.begin(); fi != _fields.end(); ++fi) 00156 { 00157 <font class="keywordflow">if</font> ((*fi)->GetID() == fieldName) 00158 { 00159 field = *fi; 00160 <font class="keywordflow">break</font>; 00161 } 00162 } 00163 } 00164 <font class="keywordflow">return</font> field; 00165 } 00166 <a name="l00167"></a><a class="code" href="class_i_d3___frame_impl.html#a8">00167</a> size_t <a class="code" href="class_i_d3___frame_impl.html#a8">ID3_FrameImpl::NumFields</a>()<font class="keyword"> const</font> 00168 <font class="keyword"></font>{ 00169 <font class="keywordflow">return</font> _fields.size(); 00170 } 00171 <a name="l00172"></a><a class="code" href="class_i_d3___frame_impl.html#a15">00172</a> size_t <a class="code" href="class_i_d3___frame_impl.html#a15">ID3_FrameImpl::Size</a>() 00173 { 00174 size_t bytesUsed = _hdr.<a class="code" href="class_i_d3___frame_header.html#a2">Size</a>(); 00175 00176 <font class="keywordflow">if</font> (this-><a class="code" href="class_i_d3___frame_impl.html#a23">GetEncryptionID</a>()) 00177 { 00178 bytesUsed++; 00179 } 00180 00181 <font class="keywordflow">if</font> (this-><a class="code" href="class_i_d3___frame_impl.html#a25">GetGroupingID</a>()) 00182 { 00183 bytesUsed++; 00184 } 00185 00186 <a class="code" href="globals_8h.html#a214">ID3_TextEnc</a> enc = <a class="code" href="globals_8h.html#a214a47">ID3TE_ASCII</a>; 00187 <font class="keywordflow">for</font> (<a class="code" href="class_i_d3___frame_impl.html#s0">iterator</a> fi = _fields.begin(); fi != _fields.end(); ++fi) 00188 { 00189 <font class="keywordflow">if</font> (*fi && (*fi)->InScope(this->GetSpec())) 00190 { 00191 <font class="keywordflow">if</font> ((*fi)->GetID() == <a class="code" href="globals_8h.html#a218a71">ID3FN_TEXTENC</a>) 00192 { 00193 enc = (ID3_TextEnc) (*fi)->Get(); 00194 } 00195 <font class="keywordflow">else</font> 00196 { 00197 (*fi)->SetEncoding(enc); 00198 } 00199 bytesUsed += (*fi)->BinSize(); 00200 } 00201 } 00202 00203 <font class="keywordflow">return</font> bytesUsed; 00204 } 00205 00206 <a name="l00207"></a><a class="code" href="class_i_d3___frame_impl.html#a12">00207</a> <font class="keywordtype">bool</font> <a class="code" href="class_i_d3___frame_impl.html#a12">ID3_FrameImpl::HasChanged</a>()<font class="keyword"> const</font> 00208 <font class="keyword"></font>{ 00209 <font class="keywordtype">bool</font> changed = _changed; 00210 00211 <font class="keywordflow">for</font> (<a class="code" href="class_i_d3___frame_impl.html#s1">const_iterator</a> fi = _fields.begin(); fi != _fields.end(); ++fi) 00212 { 00213 <font class="keywordflow">if</font> (*fi && (*fi)->InScope(this->GetSpec())) 00214 { 00215 changed = (*fi)->HasChanged(); 00216 } 00217 } 00218 00219 <font class="keywordflow">return</font> changed; 00220 } 00221 00222 <a class="code" href="class_i_d3___frame_impl.html">ID3_FrameImpl</a> & <a name="l00223"></a><a class="code" href="class_i_d3___frame_impl.html#a11">00223</a> <a class="code" href="class_i_d3___frame_impl.html#a11">ID3_FrameImpl::operator=</a>( <font class="keyword">const</font> <a class="code" href="class_i_d3___frame.html">ID3_Frame</a> &rFrame ) 00224 { 00225 <a class="code" href="globals_8h.html#a219">ID3_FrameID</a> eID = rFrame.<a class="code" href="class_i_d3___frame.html#a5">GetID</a>(); 00226 this-><a class="code" href="class_i_d3___frame_impl.html#a5">SetID</a>(eID); 00227 <a class="code" href="class_i_d3___frame_1_1_const_iterator.html">ID3_Frame::ConstIterator</a>* ri = rFrame.<a class="code" href="class_i_d3___frame.html#a25">CreateIterator</a>(); 00228 <a class="code" href="class_i_d3___frame_impl.html#s0">iterator</a> li = this-><a class="code" href="class_i_d3___frame_impl.html#a26">begin</a>(); 00229 <font class="keywordflow">while</font> (li != this-><a class="code" href="class_i_d3___frame_impl.html#a27">end</a>()) 00230 { 00231 <a class="code" href="class_i_d3___field.html">ID3_Field</a>* thisFld = *li++; 00232 <font class="keyword">const</font> <a class="code" href="class_i_d3___field.html">ID3_Field</a>* thatFld = ri-><a class="code" href="class_i_d3___frame_1_1_const_iterator.html#a0">GetNext</a>(); 00233 <font class="keywordflow">if</font> (thisFld != <a class="code" href="globals_8h.html#a24">NULL</a> && thatFld != <a class="code" href="globals_8h.html#a24">NULL</a>) 00234 { 00235 *thisFld = *thatFld; 00236 } 00237 } 00238 <font class="keyword">delete</font> ri; 00239 this-><a class="code" href="class_i_d3___frame_impl.html#a22">SetEncryptionID</a>(rFrame.<a class="code" href="class_i_d3___frame.html#a22">GetEncryptionID</a>()); 00240 this-><a class="code" href="class_i_d3___frame_impl.html#a24">SetGroupingID</a>(rFrame.<a class="code" href="class_i_d3___frame.html#a24">GetGroupingID</a>()); 00241 this-><a class="code" href="class_i_d3___frame_impl.html#a19">SetCompression</a>(rFrame.<a class="code" href="class_i_d3___frame.html#a19">GetCompression</a>()); 00242 this-><a class="code" href="class_i_d3___frame_impl.html#a17">SetSpec</a>(rFrame.<a class="code" href="class_i_d3___frame.html#a17">GetSpec</a>()); 00243 _changed = <font class="keyword">false</font>; 00244 00245 <font class="keywordflow">return</font> *<font class="keyword">this</font>; 00246 } 00247 <a name="l00248"></a><a class="code" href="class_i_d3___frame_impl.html#d0">00248</a> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="class_i_d3___frame_impl.html#a9">ID3_FrameImpl::GetDescription</a>(<a class="code" href="globals_8h.html#a219">ID3_FrameID</a> id) 00249 { 00250 <a class="code" href="struct_i_d3___frame_def.html">ID3_FrameDef</a>* myFrameDef = <a class="code" href="field__impl_8h.html#a19">ID3_FindFrameDef</a>(id); 00251 <font class="keywordflow">if</font> (myFrameDef != <a class="code" href="globals_8h.html#a24">NULL</a>) 00252 { 00253 <font class="keywordflow">return</font> myFrameDef-><a class="code" href="struct_i_d3___frame_def.html#m6">sDescription</a>; 00254 } 00255 <font class="keywordflow">return</font> <a class="code" href="globals_8h.html#a24">NULL</a>; 00256 } 00257 <a name="l00258"></a><a class="code" href="class_i_d3___frame_impl.html#a9">00258</a> <font class="keyword">const</font> <font class="keywordtype">char</font>* <a class="code" href="class_i_d3___frame_impl.html#a9">ID3_FrameImpl::GetDescription</a>()<font class="keyword"> const</font> 00259 <font class="keyword"></font>{ 00260 <font class="keyword">const</font> <a class="code" href="struct_i_d3___frame_def.html">ID3_FrameDef</a>* def = _hdr.<a class="code" href="class_i_d3___frame_header.html#a8">GetFrameDef</a>(); 00261 <font class="keywordflow">if</font> (def) 00262 { 00263 <font class="keywordflow">return</font> def-><a class="code" href="struct_i_d3___frame_def.html#m6">sDescription</a>; 00264 } 00265 <font class="keywordflow">return</font> <a class="code" href="globals_8h.html#a24">NULL</a>; 00266 } 00267 </pre></div><hr><address><small>Generated on Thu Jan 3 07:35:55 2002 for id3lib by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.gif" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.12 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>, © 1997-2001</small></address> </body> </html>