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