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