00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #if defined HAVE_CONFIG_H
00028 #include <config.h>
00029 #endif
00030
00031
00032
00033 #include <string.h>
00034
00035 #include "tag_impl.h"
00036 #include "field.h"
00037 #include "utils.h"
00038
00039 using namespace dami;
00040
00041 ID3_TagImpl::const_iterator ID3_TagImpl::Find(const ID3_Frame *frame) const
00042 {
00043 const_iterator cur = _frames.begin();
00044
00045 for (; cur != _frames.end(); ++cur)
00046 {
00047 if (*cur == frame)
00048 {
00049 break;
00050 }
00051 }
00052
00053 return cur;
00054 }
00055
00056 ID3_TagImpl::iterator ID3_TagImpl::Find(const ID3_Frame *frame)
00057 {
00058 iterator cur = _frames.begin();
00059
00060 for (; cur != _frames.end(); ++cur)
00061 {
00062 if (*cur == frame)
00063 {
00064 break;
00065 }
00066 }
00067
00068 return cur;
00069 }
00070
00071 ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id) const
00072 {
00073 ID3_Frame *frame = NULL;
00074
00075
00076 if (_frames.end() == _cursor)
00077 {
00078 _cursor = _frames.begin();
00079 }
00080
00081
00082 for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
00083 {
00084
00085
00086
00087
00088
00089
00090 const_iterator
00091 begin = (0 == iCount ? _cursor : _frames.begin()),
00092 end = (0 == iCount ? _frames.end() : _cursor);
00093
00094 for (const_iterator cur = begin; cur != end; ++cur)
00095 {
00096 if ((*cur != NULL) && ((*cur)->GetID() == id))
00097 {
00098
00099 frame = *cur;
00100 _cursor = ++cur;
00101 break;
00102 }
00103 }
00104 }
00105
00106 return frame;
00107 }
00108
00109 ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id, ID3_FieldID fldID, String data) const
00110 {
00111 ID3_Frame *frame = NULL;
00112 ID3D_NOTICE( "Find: looking for comment with data = " << data.c_str() );
00113
00114
00115 if (_frames.end() == _cursor)
00116 {
00117 _cursor = _frames.begin();
00118 ID3D_NOTICE( "Find: resetting cursor" );
00119 }
00120
00121 for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
00122 {
00123 ID3D_NOTICE( "Find: iCount = " << iCount );
00124
00125
00126
00127
00128
00129
00130 const_iterator
00131 begin = (0 == iCount ? _cursor : _frames.begin()),
00132 end = (0 == iCount ? _frames.end() : _cursor);
00133
00134 for (const_iterator cur = begin; cur != end; ++cur)
00135 {
00136 ID3D_NOTICE( "Find: frame = 0x" << hex << (uint32) *cur << dec );
00137 if ((*cur != NULL) && ((*cur)->GetID() == id) &&
00138 (*cur)->Contains(fldID))
00139 {
00140 ID3_Field* fld = (*cur)->GetField(fldID);
00141 if (NULL == fld)
00142 {
00143 continue;
00144 ID3D_NOTICE( "Find: didn't have the right field" );
00145 }
00146
00147 String text(fld->GetRawText(), fld->Size());
00148 ID3D_NOTICE( "Find: text = " << text.c_str() );
00149
00150 if (text == data)
00151 {
00152
00153 frame = *cur;
00154 _cursor = ++cur;
00155 break;
00156 }
00157 }
00158 }
00159 }
00160
00161 return frame;
00162 }
00163
00164 ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id, ID3_FieldID fldID, WString data) const
00165 {
00166 ID3_Frame *frame = NULL;
00167
00168
00169 if (_frames.end() == _cursor)
00170 {
00171 _cursor = _frames.begin();
00172 }
00173
00174 for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
00175 {
00176
00177
00178
00179
00180
00181
00182 const_iterator
00183 begin = (0 == iCount ? _cursor : _frames.begin()),
00184 end = (0 == iCount ? _frames.end() : _cursor);
00185
00186 for (const_iterator cur = begin; cur != end; ++cur)
00187 {
00188 if ((*cur != NULL) && ((*cur)->GetID() == id) &&
00189 (*cur)->Contains(fldID))
00190 {
00191 ID3_Field* fld = (*cur)->GetField(fldID);
00192 if (NULL == fld)
00193 {
00194 continue;
00195 }
00196 WString text = toWString(fld->GetRawUnicodeText(), fld->Size());
00197
00198 if (text == data)
00199 {
00200
00201 frame = *cur;
00202 _cursor = ++cur;
00203 break;
00204 }
00205 }
00206 }
00207 }
00208
00209 return frame;
00210 }
00211
00212 ID3_Frame *ID3_TagImpl::Find(ID3_FrameID id, ID3_FieldID fldID, uint32 data) const
00213 {
00214 ID3_Frame *frame = NULL;
00215
00216
00217 if (_frames.end() == _cursor)
00218 {
00219 _cursor = _frames.begin();
00220 }
00221
00222 for (int iCount = 0; iCount < 2 && frame == NULL; iCount++)
00223 {
00224
00225
00226
00227
00228
00229
00230 const_iterator
00231 begin = (0 == iCount ? _cursor : _frames.begin()),
00232 end = (0 == iCount ? _frames.end() : _cursor);
00233
00234 for (const_iterator cur = begin; cur != end; ++cur)
00235 {
00236 if ((*cur != NULL) && ((*cur)->GetID() == id) &&
00237 ((*cur)->GetField(fldID)->Get() == data))
00238 {
00239
00240 frame = *cur;
00241 _cursor = ++cur;
00242 break;
00243 }
00244 }
00245 }
00246
00247 return frame;
00248 }
00249