id3lib 3.8.3
|
00001 // $Id: field.cpp,v 1.47 2002/11/03 00:41:27 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 00029 #include "field_impl.h" 00030 #include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h" 00031 #include "field_def.h" 00032 #include "frame_def.h" 00033 #include "readers.h" 00034 #include <assert.h> 00035 00036 using namespace dami; 00037 00038 // This is used for unimplemented frames so that their data is preserved when 00039 // parsing and rendering 00040 static ID3_FieldDef ID3FD_Unimplemented[] = 00041 { 00042 { 00043 ID3FN_DATA, // FIELD NAME 00044 ID3FTY_BINARY, // FIELD TYPE 00045 0, // FIXED LEN 00046 ID3V2_EARLIEST, // INITIAL SPEC 00047 ID3V2_LATEST, // ENDING SPEC 00048 ID3FF_NONE, // FLAGS 00049 ID3FN_NOFIELD // LINKED FIELD 00050 }, 00051 { ID3FN_NOFIELD } 00052 }; 00053 00054 const ID3_FieldDef* ID3_FieldDef::DEFAULT = ID3FD_Unimplemented; 00055 00056 static ID3_FieldDef ID3FD_URL[] = 00057 { 00058 { 00059 ID3FN_URL, // FIELD NAME 00060 ID3FTY_TEXTSTRING, // FIELD TYPE 00061 0, // FIXED LEN 00062 ID3V2_EARLIEST, // INITIAL SPEC 00063 ID3V2_LATEST, // ENDING SPEC 00064 ID3FF_NONE, // FLAGS 00065 ID3FN_NOFIELD // LINKED FIELD 00066 }, 00067 { ID3FN_NOFIELD } 00068 }; 00069 00070 static ID3_FieldDef ID3FD_UserURL[] = 00071 { 00072 { 00073 ID3FN_TEXTENC, // FIELD NAME 00074 ID3FTY_INTEGER, // FIELD TYPE 00075 1, // FIXED LEN 00076 ID3V2_EARLIEST, // INITIAL SPEC 00077 ID3V2_LATEST, // ENDING SPEC 00078 ID3FF_NONE, // FLAGS 00079 ID3FN_NOFIELD // LINKED FIELD 00080 }, 00081 { 00082 ID3FN_DESCRIPTION, // FIELD NAME 00083 ID3FTY_TEXTSTRING, // FIELD TYPE 00084 0, // FIXED LEN 00085 ID3V2_EARLIEST, // INITIAL SPEC 00086 ID3V2_LATEST, // ENDING SPEC 00087 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00088 ID3FN_NOFIELD // LINKED FIELD 00089 }, 00090 { 00091 ID3FN_URL, // FIELD NAME 00092 ID3FTY_TEXTSTRING, // FIELD TYPE 00093 0, // FIXED LEN 00094 ID3V2_EARLIEST, // INITIAL SPEC 00095 ID3V2_LATEST, // ENDING SPEC 00096 ID3FF_NONE, // FLAGS 00097 ID3FN_NOFIELD // LINKED FIELD 00098 }, 00099 { ID3FN_NOFIELD } 00100 }; 00101 00102 static ID3_FieldDef ID3FD_Text[] = 00103 { 00104 { 00105 ID3FN_TEXTENC, // FIELD NAME 00106 ID3FTY_INTEGER, // FIELD TYPE 00107 1, // FIXED LEN 00108 ID3V2_EARLIEST, // INITIAL SPEC 00109 ID3V2_LATEST, // ENDING SPEC 00110 ID3FF_NONE, // FLAGS 00111 ID3FN_NOFIELD // LINKED FIELD 00112 }, 00113 { 00114 ID3FN_TEXT, // FIELD NAME 00115 ID3FTY_TEXTSTRING, // FIELD TYPE 00116 0, // FIXED LEN 00117 ID3V2_EARLIEST, // INITIAL SPEC 00118 ID3V2_LATEST, // ENDING SPEC 00119 ID3FF_ENCODABLE, // FLAGS 00120 ID3FN_NOFIELD // LINKED FIELD 00121 }, 00122 { ID3FN_NOFIELD } 00123 }; 00124 00125 00126 static ID3_FieldDef ID3FD_UserText[] = 00127 { 00128 { 00129 ID3FN_TEXTENC, // FIELD NAME 00130 ID3FTY_INTEGER, // FIELD TYPE 00131 1, // FIXED LEN 00132 ID3V2_EARLIEST, // INITIAL SPEC 00133 ID3V2_LATEST, // ENDING SPEC 00134 ID3FF_NONE, // FLAGS 00135 ID3FN_NOFIELD // LINKED FIELD 00136 }, 00137 { 00138 ID3FN_DESCRIPTION, // FIELD NAME 00139 ID3FTY_TEXTSTRING, // FIELD TYPE 00140 0, // FIXED LEN 00141 ID3V2_EARLIEST, // INITIAL SPEC 00142 ID3V2_LATEST, // ENDING SPEC 00143 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00144 ID3FN_NOFIELD // LINKED FIELD 00145 }, 00146 { 00147 ID3FN_TEXT, // FIELD NAME 00148 ID3FTY_TEXTSTRING, // FIELD TYPE 00149 0, // FIXED LEN 00150 ID3V2_EARLIEST, // INITIAL SPEC 00151 ID3V2_LATEST, // ENDING SPEC 00152 ID3FF_ENCODABLE, // FLAGS 00153 ID3FN_NOFIELD // LINKED FIELD 00154 }, 00155 { ID3FN_NOFIELD } 00156 }; 00157 00158 00159 static ID3_FieldDef ID3FD_GeneralText[] = 00160 { 00161 { 00162 ID3FN_TEXTENC, // FIELD NAME 00163 ID3FTY_INTEGER, // FIELD TYPE 00164 1, // FIXED LEN 00165 ID3V2_EARLIEST, // INITIAL SPEC 00166 ID3V2_LATEST, // ENDING SPEC 00167 ID3FF_NONE, // FLAGS 00168 ID3FN_NOFIELD // LINKED FIELD 00169 }, 00170 { 00171 ID3FN_LANGUAGE, // FIELD NAME 00172 ID3FTY_TEXTSTRING, // FIELD TYPE 00173 3, // FIXED LEN 00174 ID3V2_EARLIEST, // INITIAL SPEC 00175 ID3V2_LATEST, // ENDING SPEC 00176 ID3FF_NONE, // FLAGS 00177 ID3FN_NOFIELD // LINKED FIELD 00178 }, 00179 { 00180 ID3FN_DESCRIPTION, // FIELD NAME 00181 ID3FTY_TEXTSTRING, // FIELD TYPE 00182 0, // FIXED LEN 00183 ID3V2_EARLIEST, // INITIAL SPEC 00184 ID3V2_LATEST, // ENDING SPEC 00185 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00186 ID3FN_NOFIELD // LINKED FIELD 00187 }, 00188 { 00189 ID3FN_TEXT, // FIELD NAME 00190 ID3FTY_TEXTSTRING, // FIELD TYPE 00191 0, // FIXED LEN 00192 ID3V2_EARLIEST, // INITIAL SPEC 00193 ID3V2_LATEST, // ENDING SPEC 00194 ID3FF_ENCODABLE, // FLAGS 00195 ID3FN_NOFIELD // LINKED FIELD 00196 }, 00197 { ID3FN_NOFIELD } 00198 }; 00199 00200 static ID3_FieldDef ID3FD_TermsOfUse[] = 00201 { 00202 { 00203 ID3FN_TEXTENC, // FIELD NAME 00204 ID3FTY_INTEGER, // FIELD TYPE 00205 1, // FIXED LEN 00206 ID3V2_3_0, // INITIAL SPEC 00207 ID3V2_LATEST, // ENDING SPEC 00208 ID3FF_NONE, // FLAGS 00209 ID3FN_NOFIELD // LINKED FIELD 00210 }, 00211 { 00212 ID3FN_LANGUAGE, // FIELD NAME 00213 ID3FTY_TEXTSTRING, // FIELD TYPE 00214 3, // FIXED LEN 00215 ID3V2_3_0, // INITIAL SPEC 00216 ID3V2_LATEST, // ENDING SPEC 00217 ID3FF_NONE, // FLAGS 00218 ID3FN_NOFIELD // LINKED FIELD 00219 }, 00220 { 00221 ID3FN_TEXT, // FIELD NAME 00222 ID3FTY_TEXTSTRING, // FIELD TYPE 00223 0, // FIXED LEN 00224 ID3V2_3_0, // INITIAL SPEC 00225 ID3V2_LATEST, // ENDING SPEC 00226 ID3FF_ENCODABLE, // FLAGS 00227 ID3FN_NOFIELD // LINKED FIELD 00228 }, 00229 { ID3FN_NOFIELD } 00230 }; 00231 00232 static ID3_FieldDef ID3FD_LinkedInfo[] = 00233 { 00234 { 00235 ID3FN_ID, // FIELD NAME 00236 ID3FTY_TEXTSTRING, // FIELD TYPE 00237 3, // FIXED LEN 00238 ID3V2_EARLIEST, // INITIAL SPEC 00239 ID3V2_2_1, // ENDING SPEC 00240 ID3FF_NONE, // FLAGS 00241 ID3FN_NOFIELD // LINKED FIELD 00242 }, 00243 { 00244 ID3FN_ID, // FIELD NAME 00245 ID3FTY_TEXTSTRING, // FIELD TYPE 00246 4, // FIXED LEN 00247 ID3V2_3_0, // INITIAL SPEC 00248 ID3V2_LATEST, // ENDING SPEC 00249 ID3FF_NONE, // FLAGS 00250 ID3FN_NOFIELD // LINKED FIELD 00251 }, 00252 { 00253 ID3FN_URL, // FIELD NAME 00254 ID3FTY_TEXTSTRING, // FIELD TYPE 00255 0, // FIXED LEN 00256 ID3V2_EARLIEST, // INITIAL SPEC 00257 ID3V2_LATEST, // ENDING SPEC 00258 ID3FF_CSTR, // FLAGS 00259 ID3FN_NOFIELD // LINKED FIELD 00260 }, 00261 { 00262 ID3FN_TEXT, // FIELD NAME 00263 ID3FTY_TEXTSTRING, // FIELD TYPE 00264 0, // FIXED LEN 00265 ID3V2_EARLIEST, // INITIAL SPEC 00266 ID3V2_LATEST, // ENDING SPEC 00267 ID3FF_NONE, // FLAGS 00268 ID3FN_NOFIELD // LINKED FIELD 00269 }, 00270 { ID3FN_NOFIELD } 00271 }; 00272 00273 static ID3_FieldDef ID3FD_Picture[] = 00274 { 00275 { 00276 ID3FN_TEXTENC, // FIELD NAME 00277 ID3FTY_INTEGER, // FIELD TYPE 00278 1, // FIXED LEN 00279 ID3V2_EARLIEST, // INITIAL SPEC 00280 ID3V2_LATEST, // ENDING SPEC 00281 ID3FF_NONE, // FLAGS 00282 ID3FN_NOFIELD // LINKED FIELD 00283 }, 00284 { 00285 ID3FN_IMAGEFORMAT, // FIELD NAME 00286 ID3FTY_TEXTSTRING, // FIELD TYPE 00287 3, // FIXED LEN 00288 ID3V2_EARLIEST, // INITIAL SPEC 00289 ID3V2_2_1, // ENDING SPEC 00290 ID3FF_NONE, // FLAGS 00291 ID3FN_NOFIELD // LINKED FIELD 00292 }, 00293 { 00294 ID3FN_MIMETYPE, // FIELD NAME 00295 ID3FTY_TEXTSTRING, // FIELD TYPE 00296 0, // FIXED LEN 00297 ID3V2_3_0, // INITIAL SPEC 00298 ID3V2_LATEST, // ENDING SPEC 00299 ID3FF_CSTR, // FLAGS 00300 ID3FN_NOFIELD // LINKED FIELD 00301 }, 00302 { 00303 ID3FN_PICTURETYPE, // FIELD NAME 00304 ID3FTY_INTEGER, // FIELD TYPE 00305 1, // FIXED LEN 00306 ID3V2_EARLIEST, // INITIAL SPEC 00307 ID3V2_LATEST, // ENDING SPEC 00308 ID3FF_NONE, // FLAGS 00309 ID3FN_NOFIELD // LINKED FIELD 00310 }, 00311 { 00312 ID3FN_DESCRIPTION, // FIELD NAME 00313 ID3FTY_TEXTSTRING, // FIELD TYPE 00314 0, // FIXED LEN 00315 ID3V2_EARLIEST, // INITIAL SPEC 00316 ID3V2_LATEST, // ENDING SPEC 00317 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00318 ID3FN_NOFIELD // LINKED FIELD 00319 }, 00320 { 00321 ID3FN_DATA, // FIELD NAME 00322 ID3FTY_BINARY, // FIELD TYPE 00323 0, // FIXED LEN 00324 ID3V2_EARLIEST, // INITIAL SPEC 00325 ID3V2_LATEST, // ENDING SPEC 00326 ID3FF_NONE, // FLAGS 00327 ID3FN_NOFIELD // LINKED FIELD 00328 }, 00329 { ID3FN_NOFIELD } 00330 }; 00331 00332 static ID3_FieldDef ID3FD_GEO[] = 00333 { 00334 { 00335 ID3FN_TEXTENC, // FIELD NAME 00336 ID3FTY_INTEGER, // FIELD TYPE 00337 1, // FIXED LEN 00338 ID3V2_EARLIEST, // INITIAL SPEC 00339 ID3V2_LATEST, // ENDING SPEC 00340 ID3FF_NONE, // FLAGS 00341 ID3FN_NOFIELD // LINKED FIELD 00342 }, 00343 { 00344 ID3FN_MIMETYPE, // FIELD NAME 00345 ID3FTY_TEXTSTRING, // FIELD TYPE 00346 0, // FIXED LEN 00347 ID3V2_EARLIEST, // INITIAL SPEC 00348 ID3V2_LATEST, // ENDING SPEC 00349 ID3FF_CSTR, // FLAGS 00350 ID3FN_NOFIELD // LINKED FIELD 00351 }, 00352 { 00353 ID3FN_FILENAME, // FIELD NAME 00354 ID3FTY_TEXTSTRING, // FIELD TYPE 00355 0, // FIXED LEN 00356 ID3V2_EARLIEST, // INITIAL SPEC 00357 ID3V2_LATEST, // ENDING SPEC 00358 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00359 ID3FN_NOFIELD // LINKED FIELD 00360 }, 00361 { 00362 ID3FN_DESCRIPTION, // FIELD NAME 00363 ID3FTY_TEXTSTRING, // FIELD TYPE 00364 0, // FIXED LEN 00365 ID3V2_EARLIEST, // INITIAL SPEC 00366 ID3V2_LATEST, // ENDING SPEC 00367 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00368 ID3FN_NOFIELD // LINKED FIELD 00369 }, 00370 { 00371 ID3FN_DATA, // FIELD NAME 00372 ID3FTY_BINARY, // FIELD TYPE 00373 0, // FIXED LEN 00374 ID3V2_EARLIEST, // INITIAL SPEC 00375 ID3V2_LATEST, // ENDING SPEC 00376 ID3FF_NONE, // FLAGS 00377 ID3FN_NOFIELD // LINKED FIELD 00378 }, 00379 { ID3FN_NOFIELD } 00380 }; 00381 00382 static ID3_FieldDef ID3FD_UFI[] = 00383 { 00384 { 00385 ID3FN_OWNER, // FIELD NAME 00386 ID3FTY_TEXTSTRING, // FIELD TYPE 00387 0, // FIXED LEN 00388 ID3V2_EARLIEST, // INITIAL SPEC 00389 ID3V2_LATEST, // ENDING SPEC 00390 ID3FF_CSTR, // FLAGS 00391 ID3FN_NOFIELD // LINKED FIELD 00392 }, 00393 { 00394 ID3FN_DATA, // FIELD NAME 00395 ID3FTY_BINARY, // FIELD TYPE 00396 0, // FIXED LEN 00397 ID3V2_EARLIEST, // INITIAL SPEC 00398 ID3V2_LATEST, // ENDING SPEC 00399 ID3FF_NONE, // FLAGS 00400 ID3FN_NOFIELD // LINKED FIELD 00401 }, 00402 { ID3FN_NOFIELD } 00403 }; 00404 00405 static ID3_FieldDef ID3FD_PlayCounter[] = 00406 { 00407 { 00408 ID3FN_COUNTER, // FIELD NAME 00409 ID3FTY_INTEGER, // FIELD TYPE 00410 4, // FIXED LEN 00411 ID3V2_EARLIEST, // INITIAL SPEC 00412 ID3V2_LATEST, // ENDING SPEC 00413 ID3FF_NONE, // FLAGS 00414 ID3FN_NOFIELD // LINKED FIELD 00415 }, 00416 { ID3FN_NOFIELD } 00417 }; 00418 00419 static ID3_FieldDef ID3FD_Popularimeter[] = 00420 { 00421 { 00422 ID3FN_EMAIL, // FIELD NAME 00423 ID3FTY_TEXTSTRING, // FIELD TYPE 00424 0, // FIXED LEN 00425 ID3V2_EARLIEST, // INITIAL SPEC 00426 ID3V2_LATEST, // ENDING SPEC 00427 ID3FF_CSTR, // FLAGS 00428 ID3FN_NOFIELD // LINKED FIELD 00429 }, 00430 { 00431 ID3FN_RATING, // FIELD NAME 00432 ID3FTY_INTEGER, // FIELD TYPE 00433 1, // FIXED LEN 00434 ID3V2_EARLIEST, // INITIAL SPEC 00435 ID3V2_LATEST, // ENDING SPEC 00436 ID3FF_NONE, // FLAGS 00437 ID3FN_NOFIELD // LINKED FIELD 00438 }, 00439 { 00440 ID3FN_COUNTER, // FIELD NAME 00441 ID3FTY_INTEGER, // FIELD TYPE 00442 4, // FIXED LEN 00443 ID3V2_EARLIEST, // INITIAL SPEC 00444 ID3V2_LATEST, // ENDING SPEC 00445 ID3FF_NONE, // FLAGS 00446 ID3FN_NOFIELD // LINKED FIELD 00447 }, 00448 { ID3FN_NOFIELD } 00449 }; 00450 00451 static ID3_FieldDef ID3FD_Private[] = 00452 { 00453 { 00454 ID3FN_OWNER, // FIELD NAME 00455 ID3FTY_TEXTSTRING, // FIELD TYPE 00456 0, // FIXED LEN 00457 ID3V2_3_0, // INITIAL SPEC 00458 ID3V2_LATEST, // ENDING SPEC 00459 ID3FF_CSTR, // FLAGS 00460 ID3FN_NOFIELD // LINKED FIELD 00461 }, 00462 { 00463 ID3FN_DATA, // FIELD NAME 00464 ID3FTY_BINARY, // FIELD TYPE 00465 0, // FIXED LEN 00466 ID3V2_3_0, // INITIAL SPEC 00467 ID3V2_LATEST, // ENDING SPEC 00468 ID3FF_NONE, // FLAGS 00469 ID3FN_NOFIELD // LINKED FIELD 00470 }, 00471 { ID3FN_NOFIELD } 00472 }; 00473 00474 00475 static ID3_FieldDef ID3FD_Registration[] = 00476 { 00477 { 00478 ID3FN_OWNER, // FIELD NAME 00479 ID3FTY_TEXTSTRING, // FIELD TYPE 00480 0, // FIXED LEN 00481 ID3V2_3_0, // INITIAL SPEC 00482 ID3V2_LATEST, // ENDING SPEC 00483 ID3FF_CSTR, // FLAGS 00484 ID3FN_NOFIELD // LINKED FIELD 00485 }, 00486 { 00487 ID3FN_ID, // FIELD NAME 00488 ID3FTY_INTEGER, // FIELD TYPE 00489 1, // FIXED LEN 00490 ID3V2_3_0, // INITIAL SPEC 00491 ID3V2_LATEST, // ENDING SPEC 00492 ID3FF_NONE, // FLAGS 00493 ID3FN_NOFIELD // LINKED FIELD 00494 }, 00495 { 00496 ID3FN_DATA, // FIELD NAME 00497 ID3FTY_BINARY, // FIELD TYPE 00498 0, // FIXED LEN 00499 ID3V2_3_0, // INITIAL SPEC 00500 ID3V2_LATEST, // ENDING SPEC 00501 ID3FF_NONE, // FLAGS 00502 ID3FN_NOFIELD // LINKED FIELD 00503 }, 00504 { ID3FN_NOFIELD } 00505 }; 00506 00507 static ID3_FieldDef ID3FD_InvolvedPeople[] = 00508 { 00509 { 00510 ID3FN_TEXTENC, // FIELD NAME 00511 ID3FTY_INTEGER, // FIELD TYPE 00512 1, // FIXED LEN 00513 ID3V2_EARLIEST, // INITIAL SPEC 00514 ID3V2_LATEST, // ENDING SPEC 00515 ID3FF_NONE, // FLAGS 00516 ID3FN_NOFIELD // LINKED FIELD 00517 }, 00518 { 00519 ID3FN_TEXT, // FIELD NAME 00520 ID3FTY_TEXTSTRING, // FIELD TYPE 00521 0, // FIXED LEN 00522 ID3V2_EARLIEST, // INITIAL SPEC 00523 ID3V2_LATEST, // ENDING SPEC 00524 ID3FF_TEXTLIST, // FLAGS 00525 ID3FN_NOFIELD // LINKED FIELD 00526 }, 00527 { ID3FN_NOFIELD } 00528 }; 00529 00530 static ID3_FieldDef ID3FD_CDM[] = 00531 { 00532 { 00533 ID3FN_DATA, // FIELD NAME 00534 ID3FTY_BINARY, // FIELD TYPE 00535 0, // FIXED LEN 00536 ID3V2_2_1, // INITIAL SPEC 00537 ID3V2_2_1, // ENDING SPEC 00538 ID3FF_NONE, // FLAGS 00539 ID3FN_NOFIELD // LINKED FIELD 00540 } 00541 }; 00542 00543 static ID3_FieldDef ID3FD_SyncLyrics[] = 00544 { 00545 { 00546 ID3FN_TEXTENC, // FIELD NAME 00547 ID3FTY_INTEGER, // FIELD TYPE 00548 1, // FIXED LEN 00549 ID3V2_EARLIEST, // INITIAL SPEC 00550 ID3V2_LATEST, // ENDING SPEC 00551 ID3FF_NONE, // FLAGS 00552 ID3FN_NOFIELD // LINKED FIELD 00553 }, 00554 { 00555 ID3FN_LANGUAGE, // FIELD NAME 00556 ID3FTY_TEXTSTRING, // FIELD TYPE 00557 3, // FIXED LEN 00558 ID3V2_EARLIEST, // INITIAL SPEC 00559 ID3V2_LATEST, // ENDING SPEC 00560 ID3FF_NONE, // FLAGS 00561 ID3FN_NOFIELD // LINKED FIELD 00562 }, 00563 { 00564 ID3FN_TIMESTAMPFORMAT, // FIELD NAME 00565 ID3FTY_INTEGER, // FIELD TYPE 00566 1, // FIXED LEN 00567 ID3V2_EARLIEST, // INITIAL SPEC 00568 ID3V2_LATEST, // ENDING SPEC 00569 ID3FF_NONE, // FLAGS 00570 ID3FN_NOFIELD // LINKED FIELD 00571 }, 00572 { 00573 ID3FN_CONTENTTYPE, // FIELD NAME 00574 ID3FTY_INTEGER, // FIELD TYPE 00575 1, // FIXED LEN 00576 ID3V2_EARLIEST, // INITIAL SPEC 00577 ID3V2_LATEST, // ENDING SPEC 00578 ID3FF_NONE, // FLAGS 00579 ID3FN_NOFIELD // LINKED FIELD 00580 }, 00581 { 00582 ID3FN_DESCRIPTION, // FIELD NAME 00583 ID3FTY_TEXTSTRING, // FIELD TYPE 00584 0, // FIXED LEN 00585 ID3V2_EARLIEST, // INITIAL SPEC 00586 ID3V2_LATEST, // ENDING SPEC 00587 ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS 00588 ID3FN_NOFIELD // LINKED FIELD 00589 }, 00590 { 00591 ID3FN_DATA, // FIELD NAME 00592 ID3FTY_BINARY, // FIELD TYPE 00593 0, // FIXED LEN 00594 ID3V2_EARLIEST, // INITIAL SPEC 00595 ID3V2_LATEST, // ENDING SPEC 00596 ID3FF_NONE, // FLAGS 00597 ID3FN_NOFIELD // LINKED FIELD 00598 }, 00599 { ID3FN_NOFIELD } 00600 }; 00601 00602 00603 /* 00604 * Currently unused 00605 */ 00606 #if defined _UNDEFINED_ 00607 static ID3_FieldDef ID3FD_Volume[] = 00608 { 00609 { 00610 ID3FN_VOLUMEADJ, // FIELD NAME 00611 ID3FTY_INTEGER, // FIELD TYPE 00612 1, // FIXED LEN 00613 ID3V2_EARLIEST, // INITIAL SPEC 00614 ID3V2_LATEST, // ENDING SPEC 00615 ID3FF_NONE, // FLAGS 00616 ID3FN_NOFIELD // LINKED FIELD 00617 }, 00618 { 00619 ID3FN_NUMBITS, // FIELD NAME 00620 ID3FTY_INTEGER, // FIELD TYPE 00621 1, // FIXED LEN 00622 ID3V2_EARLIEST, // INITIAL SPEC 00623 ID3V2_LATEST, // ENDING SPEC 00624 ID3FF_NONE, // FLAGS 00625 ID3FN_NOFIELD // LINKED FIELD 00626 }, 00627 { 00628 ID3FN_VOLCHGRIGHT, // FIELD NAME 00629 ID3FTY_BITFIELD, // FIELD TYPE 00630 0, // FIXED LEN 00631 ID3V2_EARLIEST, // INITIAL SPEC 00632 ID3V2_LATEST, // ENDING SPEC 00633 ID3FF_ADJUSTEDBY, // FLAGS 00634 ID3FN_NUMBITS // LINKED FIELD 00635 }, 00636 { 00637 ID3FN_VOLCHGLEFT, // FIELD NAME 00638 ID3FTY_BITFIELD, // FIELD TYPE 00639 0, // FIXED LEN 00640 ID3V2_EARLIEST, // INITIAL SPEC 00641 ID3V2_LATEST, // ENDING SPEC 00642 ID3FF_ADJUSTEDBY, // FLAGS 00643 ID3FN_NUMBITS // LINKED FIELD 00644 }, 00645 { 00646 ID3FN_PEAKVOLRIGHT, // FIELD NAME 00647 ID3FTY_BITFIELD, // FIELD TYPE 00648 0, // FIXED LEN 00649 ID3V2_EARLIEST, // INITIAL SPEC 00650 ID3V2_LATEST, // ENDING SPEC 00651 ID3FF_ADJUSTEDBY, // FLAGS 00652 ID3FN_NUMBITS // LINKED FIELD 00653 }, 00654 { 00655 ID3FN_PEAKVOLLEFT, // FIELD NAME 00656 ID3FTY_BITFIELD, // FIELD TYPE 00657 0, // FIXED LEN 00658 ID3V2_EARLIEST, // INITIAL SPEC 00659 ID3V2_LATEST, // ENDING SPEC 00660 ID3FF_ADJUSTEDBY, // FLAGS 00661 ID3FN_NUMBITS // LINKED FIELD 00662 }, 00663 { ID3FN_NOFIELD } 00664 }; 00665 #endif /* _UNDEFINED_ */ 00666 00667 // **** Currently Implemented Frames 00668 // APIC PIC ID3FID_PICTURE Attached picture 00669 // COMM COM ID3FID_COMMENT Comments 00670 // ENCR ID3FID_CRYPTOREG Encryption method registration 00671 // GEOB GEO ID3FID_GENERALOBJECT General encapsulated object 00672 // GRID ID3FID_GROUPINGREG Group identification registration 00673 // IPLS IPL ID3FID_INVOLVEDPEOPLE Involved people list 00674 // LINK LNK ID3FID_LINKEDINFO Linked information 00675 // PCNT CNT ID3FID_PLAYCOUNTER Play counter 00676 // POPM POP ID3FID_POPULARIMETER Popularimeter 00677 // PRIV ID3FID_PRIVATE Private frame 00678 // SYLT SLT ID3FID_SYNCEDLYRICS Synchronized lyric/text 00679 // TALB TAL ID3FID_ALBUM Album/Movie/Show title 00680 // TBPM TBP ID3FID_BPM BPM (beats per minute) 00681 // TCOM TCM ID3FID_COMPOSER Composer 00682 // TCON TCO ID3FID_CONTENTTYPE Content type 00683 // TCOP TCR ID3FID_COPYRIGHT Copyright message 00684 // TDAT TDA ID3FID_DATE Date 00685 // TDLY TDY ID3FID_PLAYLISTDELAY Playlist delay 00686 // TENC TEN ID3FID_ENCODEDBY Encoded by 00687 // TEXT TXT ID3FID_LYRICIST Lyricist/Text writer 00688 // TFLT TFT ID3FID_FILETYPE File type 00689 // TIME TKE ID3FID_TIME Time 00690 // TIT1 TIM ID3FID_CONTENTGROUP Content group description 00691 // TIT2 TT1 ID3FID_TITLE Title/songname/content description 00692 // TIT3 TT2 ID3FID_SUBTITLE Subtitle/Description refinement 00693 // TKEY TT3 ID3FID_INITIALKEY Initial key 00694 // TLAN TLA ID3FID_LANGUAGE Language(s) 00695 // TLEN TLE ID3FID_SONGLEN Length 00696 // TMED TMT ID3FID_MEDIATYPE Media type 00697 // TOAL TOT ID3FID_ORIGALBUM Original album/movie/show title 00698 // TOFN TOF ID3FID_ORIGFILENAME Original filename 00699 // TOLY TOL ID3FID_ORIGLYRICIST Original lyricist(s)/text writer(s) 00700 // TOPE TOA ID3FID_ORIGARTIST Original artist(s)/performer(s) 00701 // TORY TOR ID3FID_ORIGYEAR Original release year 00702 // TOWN ID3FID_FILEOWNER File owner/licensee 00703 // TPE1 TP1 ID3FID_LEADARTIST Lead performer(s)/Soloist(s) 00704 // TPE2 TP2 ID3FID_BAND Band/orchestra/accompaniment 00705 // TPE3 TP3 ID3FID_CONDUCTOR Conductor/performer refinement 00706 // TPE4 TP4 ID3FID_MIXARTIST Interpreted, remixed, or otherwise modified 00707 // TPOS TPA ID3FID_PARTINSET Part of a set 00708 // TPUB TPB ID3FID_PUBLISHER Publisher 00709 // TRCK TRK ID3FID_TRACKNUM Track number/Position in set 00710 // TRDA TRD ID3FID_RECORDINGDATES Recording dates 00711 // TRSN TRN ID3FID_NETRADIOSTATION Internet radio station name 00712 // TRSO TRO ID3FID_NETRADIOOWNER Internet radio station owner 00713 // TSIZ TSI ID3FID_SIZE Size 00714 // TSRC TRC ID3FID_ISRC ISRC (international standard recording code) 00715 // TSSE TSS ID3FID_ENCODERSETTINGS Software/Hardware and encoding settings 00716 // TXXX TXX ID3FID_USERTEXT User defined text information 00717 // TYER TYE ID3FID_YEAR Year 00718 // UFID UFI ID3FID_UNIQUEFILEID Unique file identifier 00719 // USER ID3FID_TERMSOFUSE Terms of use 00720 // USLT ULT ID3FID_UNSYNCEDLYRICS Unsynchronized lyric/text transcription 00721 // WCOM WCM ID3FID_WWWCOMMERCIALINFO Commercial information 00722 // WCOP WCM ID3FID_WWWCOPYRIGHT Copyright/Legal infromation 00723 // WOAF WCP ID3FID_WWWAUDIOFILE Official audio file webpage 00724 // WOAR WAF ID3FID_WWWARTIST Official artist/performer webpage 00725 // WOAS WAR ID3FID_WWWAUDIOSOURCE Official audio source webpage 00726 // WORS WAS ID3FID_WWWRADIOPAGE Official internet radio station homepage 00727 // WPAY WRA ID3FID_WWWPAYMENT Payment 00728 // WPUB WPY ID3FID_WWWPUBLISHER Official publisher webpage 00729 // WXXX WXX ID3FID_WWWUSER User defined URL link 00730 // CDM ID3FID_METACOMPRESSION Compressed data meta frame 00731 00732 // **** Currently unimplemented frames 00733 // AENC CRA ID3FID_AUDIOCRYPTO Audio encryption 00734 // COMR ID3FID_COMMERCIAL Commercial frame 00735 // EQUA EQU ID3FID_EQUALIZATION Equalization 00736 // ETCO ETC ID3FID_EVENTTIMING Event timing codes 00737 // MCDI MCI ID3FID_CDID Music CD identifier 00738 // MLLT MLL ID3FID_MPEGLOOKUP MPEG location lookup table 00739 // OWNE ID3FID_OWNERSHIP Ownership frame 00740 // POSS ID3FID_POSITIONSYNC Position synchronisation frame 00741 // RBUF BUF ID3FID_BUFFERSIZE Recommended buffer size 00742 // RVAD RVA ID3FID_VOLUMEADJ Relative volume adjustment 00743 // RVRB REV ID3FID_REVERB Reverb 00744 // SYTC STC ID3FID_SYNCEDTEMPO Synchronized tempo codes 00745 // CRM ID3FID_METACRYPTO Encrypted meta frame 00746 static ID3_FrameDef ID3_FrameDefs[] = 00747 { 00748 // short long tag file 00749 // frame id id id discrd discrd field defs description 00750 {ID3FID_AUDIOCRYPTO, "CRA", "AENC", false, false, ID3FD_Unimplemented, "Audio encryption"}, 00751 {ID3FID_PICTURE, "PIC", "APIC", false, false, ID3FD_Picture, "Attached picture"}, 00752 {ID3FID_COMMENT, "COM", "COMM", false, false, ID3FD_GeneralText, "Comments"}, 00753 {ID3FID_COMMERCIAL, "" , "COMR", false, false, ID3FD_Unimplemented, "Commercial"}, 00754 {ID3FID_CRYPTOREG, "" , "ENCR", false, false, ID3FD_Registration, "Encryption method registration"}, 00755 {ID3FID_EQUALIZATION, "EQU", "EQUA", false, true, ID3FD_Unimplemented, "Equalization"}, 00756 {ID3FID_EVENTTIMING, "ETC", "ETCO", false, true, ID3FD_Unimplemented, "Event timing codes"}, 00757 {ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, ID3FD_GEO, "General encapsulated object"}, 00758 {ID3FID_GROUPINGREG, "" , "GRID", false, false, ID3FD_Registration, "Group identification registration"}, 00759 {ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, ID3FD_InvolvedPeople,"Involved people list"}, 00760 {ID3FID_LINKEDINFO, "LNK", "LINK", false, false, ID3FD_LinkedInfo, "Linked information"}, 00761 {ID3FID_CDID, "MCI", "MCDI", false, false, ID3FD_Unimplemented, "Music CD identifier"}, 00762 {ID3FID_MPEGLOOKUP, "MLL", "MLLT", false, true, ID3FD_Unimplemented, "MPEG location lookup table"}, 00763 {ID3FID_OWNERSHIP, "" , "OWNE", false, false, ID3FD_Unimplemented, "Ownership frame"}, 00764 {ID3FID_PRIVATE, "" , "PRIV", false, false, ID3FD_Private, "Private frame"}, 00765 {ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, ID3FD_PlayCounter, "Play counter"}, 00766 {ID3FID_POPULARIMETER, "POP", "POPM", false, false, ID3FD_Popularimeter, "Popularimeter"}, 00767 {ID3FID_POSITIONSYNC, "" , "POSS", false, true, ID3FD_Unimplemented, "Position synchronisation frame"}, 00768 {ID3FID_BUFFERSIZE, "BUF", "RBUF", false, false, ID3FD_Unimplemented, "Recommended buffer size"}, 00769 {ID3FID_VOLUMEADJ, "RVA", "RVAD", false, true, ID3FD_Unimplemented, "Relative volume adjustment"}, 00770 {ID3FID_REVERB, "REV", "RVRB", false, false, ID3FD_Unimplemented, "Reverb"}, 00771 {ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, ID3FD_SyncLyrics, "Synchronized lyric/text"}, 00772 {ID3FID_SYNCEDTEMPO, "STC", "SYTC", false, true, ID3FD_Unimplemented, "Synchronized tempo codes"}, 00773 {ID3FID_ALBUM, "TAL", "TALB", false, false, ID3FD_Text, "Album/Movie/Show title"}, 00774 {ID3FID_BPM, "TBP", "TBPM", false, false, ID3FD_Text, "BPM (beats per minute)"}, 00775 {ID3FID_COMPOSER, "TCM", "TCOM", false, false, ID3FD_Text, "Composer"}, 00776 {ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, ID3FD_Text, "Content type"}, 00777 {ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, ID3FD_Text, "Copyright message"}, 00778 {ID3FID_DATE, "TDA", "TDAT", false, false, ID3FD_Text, "Date"}, 00779 {ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, ID3FD_Text, "Playlist delay"}, 00780 {ID3FID_ENCODEDBY, "TEN", "TENC", false, true, ID3FD_Text, "Encoded by"}, 00781 {ID3FID_LYRICIST, "TXT", "TEXT", false, false, ID3FD_Text, "Lyricist/Text writer"}, 00782 {ID3FID_FILETYPE, "TFT", "TFLT", false, false, ID3FD_Text, "File type"}, 00783 {ID3FID_TIME, "TIM", "TIME", false, false, ID3FD_Text, "Time"}, 00784 {ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, ID3FD_Text, "Content group description"}, 00785 {ID3FID_TITLE, "TT2", "TIT2", false, false, ID3FD_Text, "Title/songname/content description"}, 00786 {ID3FID_SUBTITLE, "TT3", "TIT3", false, false, ID3FD_Text, "Subtitle/Description refinement"}, 00787 {ID3FID_INITIALKEY, "TKE", "TKEY", false, false, ID3FD_Text, "Initial key"}, 00788 {ID3FID_LANGUAGE, "TLA", "TLAN", false, false, ID3FD_Text, "Language(s)"}, 00789 {ID3FID_SONGLEN, "TLE", "TLEN", false, true, ID3FD_Text, "Length"}, 00790 {ID3FID_MEDIATYPE, "TMT", "TMED", false, false, ID3FD_Text, "Media type"}, 00791 {ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, ID3FD_Text, "Original album/movie/show title"}, 00792 {ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, ID3FD_Text, "Original filename"}, 00793 {ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, ID3FD_Text, "Original lyricist(s)/text writer(s)"}, 00794 {ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, ID3FD_Text, "Original artist(s)/performer(s)"}, 00795 {ID3FID_ORIGYEAR, "TOR", "TORY", false, false, ID3FD_Text, "Original release year"}, 00796 {ID3FID_FILEOWNER, "" , "TOWN", false, false, ID3FD_Text, "File owner/licensee"}, 00797 {ID3FID_LEADARTIST, "TP1", "TPE1", false, false, ID3FD_Text, "Lead performer(s)/Soloist(s)"}, 00798 {ID3FID_BAND, "TP2", "TPE2", false, false, ID3FD_Text, "Band/orchestra/accompaniment"}, 00799 {ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, ID3FD_Text, "Conductor/performer refinement"}, 00800 {ID3FID_MIXARTIST, "TP4", "TPE4", false, false, ID3FD_Text, "Interpreted, remixed, or otherwise modified by"}, 00801 {ID3FID_PARTINSET, "TPA", "TPOS", false, false, ID3FD_Text, "Part of a set"}, 00802 {ID3FID_PUBLISHER, "TPB", "TPUB", false, false, ID3FD_Text, "Publisher"}, 00803 {ID3FID_TRACKNUM, "TRK", "TRCK", false, false, ID3FD_Text, "Track number/Position in set"}, 00804 {ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, ID3FD_Text, "Recording dates"}, 00805 {ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, ID3FD_Text, "Internet radio station name"}, 00806 {ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, ID3FD_Text, "Internet radio station owner"}, 00807 {ID3FID_SIZE, "TSI", "TSIZ", false, true, ID3FD_Text, "Size"}, 00808 {ID3FID_ISRC, "TRC", "TSRC", false, false, ID3FD_Text, "ISRC (international standard recording code)"}, 00809 {ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, ID3FD_Text, "Software/Hardware and settings used for encoding"}, 00810 {ID3FID_USERTEXT, "TXX", "TXXX", false, false, ID3FD_UserText, "User defined text information"}, 00811 {ID3FID_YEAR, "TYE", "TYER", false, false, ID3FD_Text, "Year"}, 00812 {ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, ID3FD_UFI, "Unique file identifier"}, 00813 {ID3FID_TERMSOFUSE, "" , "USER", false, false, ID3FD_TermsOfUse, "Terms of use"}, 00814 {ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, ID3FD_GeneralText, "Unsynchronized lyric/text transcription"}, 00815 {ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, ID3FD_URL, "Commercial information"}, 00816 {ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, ID3FD_URL, "Copyright/Legal infromation"}, 00817 {ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, ID3FD_URL, "Official audio file webpage"}, 00818 {ID3FID_WWWARTIST, "WAR", "WOAR", false, false, ID3FD_URL, "Official artist/performer webpage"}, 00819 {ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, ID3FD_URL, "Official audio source webpage"}, 00820 {ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, ID3FD_URL, "Official internet radio station homepage"}, 00821 {ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, ID3FD_URL, "Payment"}, 00822 {ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, ID3FD_URL, "Official publisher webpage"}, 00823 {ID3FID_WWWUSER, "WXX", "WXXX", false, false, ID3FD_UserURL, "User defined URL link"}, 00824 {ID3FID_METACRYPTO, "CRM", "" , false, false, ID3FD_Unimplemented, "Encrypted meta frame"}, 00825 {ID3FID_METACOMPRESSION, "CDM", "" , false, false, ID3FD_CDM, "Compressed data meta frame"}, 00826 {ID3FID_NOFRAME} 00827 }; 00828 00886 ID3_FieldImpl::ID3_FieldImpl() 00887 : _id(ID3FN_NOFIELD), 00888 _type(ID3FTY_INTEGER), 00889 _spec_begin(ID3V2_EARLIEST), 00890 _spec_end(ID3V2_LATEST), 00891 _flags(0), 00892 _changed(false), 00893 _fixed_size(0), 00894 _num_items(0), 00895 _enc(ID3TE_NONE) 00896 { 00897 this->Clear(); 00898 } 00899 00900 ID3_FieldImpl::ID3_FieldImpl(const ID3_FieldDef& def) 00901 : _id(def._id), 00902 _type(def._type), 00903 _spec_begin(def._spec_begin), 00904 _spec_end(def._spec_end), 00905 _flags(def._flags), 00906 _changed(false), 00907 _fixed_size(def._fixed_size), 00908 _num_items(0), 00909 _enc((_type == ID3FTY_TEXTSTRING) ? ID3TE_ASCII : ID3TE_NONE) 00910 { 00911 this->Clear(); 00912 } 00913 00914 ID3_FieldImpl::~ID3_FieldImpl() 00915 { 00916 } 00917 00923 void ID3_FieldImpl::Clear() 00924 { 00925 switch (_type) 00926 { 00927 case ID3FTY_INTEGER: 00928 { 00929 _integer = 0; 00930 break; 00931 } 00932 case ID3FTY_BINARY: 00933 { 00934 _binary.erase(); 00935 if (_fixed_size > 0) 00936 { 00937 _binary.assign(_fixed_size, '\0'); 00938 } 00939 break; 00940 } 00941 case ID3FTY_TEXTSTRING: 00942 { 00943 _text.erase(); 00944 if (_fixed_size > 0) 00945 { 00946 if (this->GetEncoding() == ID3TE_UNICODE) 00947 { 00948 _text.assign(_fixed_size * 2, '\0'); 00949 } 00950 else if (this->GetEncoding() == ID3TE_ASCII) 00951 { 00952 _text.assign(_fixed_size, '\0'); 00953 } 00954 } 00955 break; 00956 } 00957 default: 00958 { 00959 break; 00960 } 00961 } 00962 _changed = true; 00963 00964 return ; 00965 } 00966 00967 bool 00968 ID3_FieldImpl::HasChanged() const 00969 { 00970 return _changed; 00971 } 00972 00992 size_t ID3_FieldImpl::BinSize() const 00993 { 00994 if (_fixed_size > 0) 00995 { 00996 return _fixed_size; 00997 } 00998 size_t size = this->Size(); 00999 if (_type == ID3FTY_TEXTSTRING) 01000 { 01001 ID3_TextEnc enc = this->GetEncoding(); 01002 if (enc == ID3TE_UNICODE && size > 0) 01003 { 01004 size++; 01005 } 01006 if (_flags & ID3FF_CSTR) 01007 { 01008 size++; 01009 } 01010 if (enc == ID3TE_UNICODE) 01011 { 01012 size *= 2; 01013 } 01014 } 01015 return size; 01016 } 01017 01018 size_t ID3_FieldImpl::Size() const 01019 { 01020 size_t size = 0; 01021 // check to see if we are within the legal limit for this field 0 means 01022 // arbitrary length field 01023 if (_fixed_size > 0) 01024 { 01025 size = _fixed_size; 01026 } 01027 else if (_type == ID3FTY_INTEGER) 01028 { 01029 size = sizeof(uint32); 01030 } 01031 else if (_type == ID3FTY_TEXTSTRING) 01032 { 01033 size = _text.size(); 01034 } 01035 else 01036 { 01037 size = _binary.size(); 01038 } 01039 01040 return size; 01041 } 01042 01043 bool ID3_FieldImpl::Parse(ID3_Reader& reader) 01044 { 01045 bool success = false; 01046 switch (this->GetType()) 01047 { 01048 case ID3FTY_INTEGER: 01049 { 01050 success = this->ParseInteger(reader); 01051 break; 01052 } 01053 01054 case ID3FTY_BINARY: 01055 { 01056 success = this->ParseBinary(reader); 01057 break; 01058 } 01059 01060 case ID3FTY_TEXTSTRING: 01061 { 01062 success = this->ParseText(reader); 01063 break; 01064 } 01065 01066 default: 01067 { 01068 ID3D_WARNING( "ID3_FieldImpl::Parse(): unknown field type" ); 01069 break; 01070 } 01071 } 01072 return success; 01073 } 01074 01075 ID3_FrameDef* ID3_FindFrameDef(ID3_FrameID id) 01076 { 01077 ID3_FrameDef *info = NULL; 01078 01079 for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur) 01080 { 01081 if (ID3_FrameDefs[cur].eID == id) 01082 { 01083 info = &ID3_FrameDefs[cur]; 01084 break; 01085 } 01086 } 01087 01088 return info; 01089 } 01090 01091 ID3_FrameID 01092 ID3_FindFrameID(const char *id) 01093 { 01094 ID3_FrameID fid = ID3FID_NOFRAME; 01095 const int slen = strlen(id); 01096 01097 for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur) 01098 { 01099 if (((strcmp(ID3_FrameDefs[cur].sShortTextID, id) == 0) && 01100 slen == 3) || 01101 ((strcmp(ID3_FrameDefs[cur].sLongTextID, id) == 0) && 01102 slen == 4)) 01103 { 01104 fid = ID3_FrameDefs[cur].eID; 01105 break; 01106 } 01107 } 01108 01109 return fid; 01110 } 01111 01112 void ID3_FieldImpl::Render(ID3_Writer& writer) const 01113 { 01114 switch (this->GetType()) 01115 { 01116 case ID3FTY_INTEGER: 01117 { 01118 RenderInteger(writer); 01119 break; 01120 } 01121 01122 case ID3FTY_BINARY: 01123 { 01124 RenderBinary(writer); 01125 break; 01126 } 01127 01128 case ID3FTY_TEXTSTRING: 01129 { 01130 RenderText(writer); 01131 break; 01132 } 01133 01134 default: 01135 { 01136 ID3D_WARNING ( "ID3D_FieldImpl::Render(): unknown field type" ); 01137 break; 01138 } 01139 } 01140 } 01141 01142 ID3_Field & 01143 ID3_FieldImpl::operator=( const ID3_Field &rhs ) 01144 { 01145 const ID3_FieldImpl* fld = (const ID3_FieldImpl*) &rhs; 01146 if (this != &rhs && this->GetType() == fld->GetType()) 01147 { 01148 switch (fld->GetType()) 01149 { 01150 case ID3FTY_INTEGER: 01151 { 01152 this->SetInteger(fld->GetInteger()); 01153 break; 01154 } 01155 case ID3FTY_TEXTSTRING: 01156 { 01157 this->SetEncoding(fld->GetEncoding()); 01158 this->SetText(fld->GetText()); 01159 break; 01160 } 01161 case ID3FTY_BINARY: 01162 { 01163 this->SetBinary(fld->GetBinary()); 01164 break; 01165 } 01166 default: 01167 { 01168 break; 01169 } 01170 } 01171 } 01172 return *this; 01173 } 01174 01175 bool ID3_FieldImpl::SetEncoding(ID3_TextEnc enc) 01176 { 01177 bool changed = this->IsEncodable() && (enc != this->GetEncoding()) && 01178 (ID3TE_NONE < enc && enc < ID3TE_NUMENCODINGS); 01179 if (changed) 01180 { 01181 _text = convert(_text, _enc, enc); 01182 _enc = enc; 01183 _changed = true; 01184 } 01185 return changed; 01186 } 01187 01242 char *ID3_FrameInfo::ShortName(ID3_FrameID frameID) 01243 { 01244 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01245 if (pFD!=NULL) 01246 return pFD->sShortTextID; 01247 else 01248 return NULL; 01249 } 01250 01251 char *ID3_FrameInfo::LongName(ID3_FrameID frameID) 01252 { 01253 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01254 if (pFD!=NULL) 01255 return pFD->sLongTextID; 01256 else 01257 return NULL; 01258 } 01259 01260 const char *ID3_FrameInfo::Description(ID3_FrameID frameID) 01261 { 01262 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01263 if (pFD!=NULL) 01264 return pFD->sDescription; 01265 else 01266 return NULL; 01267 } 01268 01269 int ID3_FrameInfo::MaxFrameID() 01270 { 01271 return ID3FID_LASTFRAMEID-1; 01272 } 01273 01274 int ID3_FrameInfo::NumFields(ID3_FrameID frameID) 01275 { 01276 int fieldnum=0; 01277 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01278 if (pFD!=NULL) 01279 { 01280 while (pFD->aeFieldDefs[fieldnum]._id != ID3FN_NOFIELD) 01281 { 01282 ++fieldnum; 01283 } 01284 } 01285 return fieldnum; 01286 } 01287 01288 ID3_FieldType ID3_FrameInfo::FieldType(ID3_FrameID frameID, int fieldnum) 01289 { 01290 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01291 if (pFD!=NULL) 01292 return (pFD->aeFieldDefs[fieldnum]._type); 01293 else 01294 return ID3FTY_NONE; 01295 } 01296 01297 size_t ID3_FrameInfo::FieldSize(ID3_FrameID frameID, int fieldnum) 01298 { 01299 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01300 if (pFD!=NULL) 01301 return (pFD->aeFieldDefs[fieldnum]._fixed_size); 01302 else 01303 return 0; 01304 } 01305 01306 flags_t ID3_FrameInfo::FieldFlags(ID3_FrameID frameID, int fieldnum) 01307 { 01308 ID3_FrameDef *pFD = ID3_FindFrameDef(frameID); 01309 if (pFD!=NULL) 01310 return (pFD->aeFieldDefs[fieldnum]._flags); 01311 else 01312 return 0; 01313 } 01314