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
00028
00029 #include "field_impl.h"
00030 #include "id3/utils.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
00039
00040 static ID3_FieldDef ID3FD_Unimplemented[] =
00041 {
00042 {
00043 ID3FN_DATA,
00044 ID3FTY_BINARY,
00045 0,
00046 ID3V2_EARLIEST,
00047 ID3V2_LATEST,
00048 ID3FF_NONE,
00049 ID3FN_NOFIELD
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,
00060 ID3FTY_TEXTSTRING,
00061 0,
00062 ID3V2_EARLIEST,
00063 ID3V2_LATEST,
00064 ID3FF_NONE,
00065 ID3FN_NOFIELD
00066 },
00067 { ID3FN_NOFIELD }
00068 };
00069
00070 static ID3_FieldDef ID3FD_UserURL[] =
00071 {
00072 {
00073 ID3FN_TEXTENC,
00074 ID3FTY_INTEGER,
00075 1,
00076 ID3V2_EARLIEST,
00077 ID3V2_LATEST,
00078 ID3FF_NONE,
00079 ID3FN_NOFIELD
00080 },
00081 {
00082 ID3FN_DESCRIPTION,
00083 ID3FTY_TEXTSTRING,
00084 0,
00085 ID3V2_EARLIEST,
00086 ID3V2_LATEST,
00087 ID3FF_CSTR | ID3FF_ENCODABLE,
00088 ID3FN_NOFIELD
00089 },
00090 {
00091 ID3FN_URL,
00092 ID3FTY_TEXTSTRING,
00093 0,
00094 ID3V2_EARLIEST,
00095 ID3V2_LATEST,
00096 ID3FF_NONE,
00097 ID3FN_NOFIELD
00098 },
00099 { ID3FN_NOFIELD }
00100 };
00101
00102 static ID3_FieldDef ID3FD_Text[] =
00103 {
00104 {
00105 ID3FN_TEXTENC,
00106 ID3FTY_INTEGER,
00107 1,
00108 ID3V2_EARLIEST,
00109 ID3V2_LATEST,
00110 ID3FF_NONE,
00111 ID3FN_NOFIELD
00112 },
00113 {
00114 ID3FN_TEXT,
00115 ID3FTY_TEXTSTRING,
00116 0,
00117 ID3V2_EARLIEST,
00118 ID3V2_LATEST,
00119 ID3FF_ENCODABLE,
00120 ID3FN_NOFIELD
00121 },
00122 { ID3FN_NOFIELD }
00123 };
00124
00125
00126 static ID3_FieldDef ID3FD_UserText[] =
00127 {
00128 {
00129 ID3FN_TEXTENC,
00130 ID3FTY_INTEGER,
00131 1,
00132 ID3V2_EARLIEST,
00133 ID3V2_LATEST,
00134 ID3FF_NONE,
00135 ID3FN_NOFIELD
00136 },
00137 {
00138 ID3FN_DESCRIPTION,
00139 ID3FTY_TEXTSTRING,
00140 0,
00141 ID3V2_EARLIEST,
00142 ID3V2_LATEST,
00143 ID3FF_CSTR | ID3FF_ENCODABLE,
00144 ID3FN_NOFIELD
00145 },
00146 {
00147 ID3FN_TEXT,
00148 ID3FTY_TEXTSTRING,
00149 0,
00150 ID3V2_EARLIEST,
00151 ID3V2_LATEST,
00152 ID3FF_ENCODABLE,
00153 ID3FN_NOFIELD
00154 },
00155 { ID3FN_NOFIELD }
00156 };
00157
00158
00159 static ID3_FieldDef ID3FD_GeneralText[] =
00160 {
00161 {
00162 ID3FN_TEXTENC,
00163 ID3FTY_INTEGER,
00164 1,
00165 ID3V2_EARLIEST,
00166 ID3V2_LATEST,
00167 ID3FF_NONE,
00168 ID3FN_NOFIELD
00169 },
00170 {
00171 ID3FN_LANGUAGE,
00172 ID3FTY_TEXTSTRING,
00173 3,
00174 ID3V2_EARLIEST,
00175 ID3V2_LATEST,
00176 ID3FF_NONE,
00177 ID3FN_NOFIELD
00178 },
00179 {
00180 ID3FN_DESCRIPTION,
00181 ID3FTY_TEXTSTRING,
00182 0,
00183 ID3V2_EARLIEST,
00184 ID3V2_LATEST,
00185 ID3FF_CSTR | ID3FF_ENCODABLE,
00186 ID3FN_NOFIELD
00187 },
00188 {
00189 ID3FN_TEXT,
00190 ID3FTY_TEXTSTRING,
00191 0,
00192 ID3V2_EARLIEST,
00193 ID3V2_LATEST,
00194 ID3FF_ENCODABLE,
00195 ID3FN_NOFIELD
00196 },
00197 { ID3FN_NOFIELD }
00198 };
00199
00200 static ID3_FieldDef ID3FD_TermsOfUse[] =
00201 {
00202 {
00203 ID3FN_TEXTENC,
00204 ID3FTY_INTEGER,
00205 1,
00206 ID3V2_3_0,
00207 ID3V2_LATEST,
00208 ID3FF_NONE,
00209 ID3FN_NOFIELD
00210 },
00211 {
00212 ID3FN_LANGUAGE,
00213 ID3FTY_TEXTSTRING,
00214 3,
00215 ID3V2_3_0,
00216 ID3V2_LATEST,
00217 ID3FF_NONE,
00218 ID3FN_NOFIELD
00219 },
00220 {
00221 ID3FN_TEXT,
00222 ID3FTY_TEXTSTRING,
00223 0,
00224 ID3V2_3_0,
00225 ID3V2_LATEST,
00226 ID3FF_ENCODABLE,
00227 ID3FN_NOFIELD
00228 },
00229 { ID3FN_NOFIELD }
00230 };
00231
00232 static ID3_FieldDef ID3FD_LinkedInfo[] =
00233 {
00234 {
00235 ID3FN_ID,
00236 ID3FTY_TEXTSTRING,
00237 3,
00238 ID3V2_EARLIEST,
00239 ID3V2_2_1,
00240 ID3FF_NONE,
00241 ID3FN_NOFIELD
00242 },
00243 {
00244 ID3FN_ID,
00245 ID3FTY_TEXTSTRING,
00246 4,
00247 ID3V2_3_0,
00248 ID3V2_LATEST,
00249 ID3FF_NONE,
00250 ID3FN_NOFIELD
00251 },
00252 {
00253 ID3FN_URL,
00254 ID3FTY_TEXTSTRING,
00255 0,
00256 ID3V2_EARLIEST,
00257 ID3V2_LATEST,
00258 ID3FF_CSTR,
00259 ID3FN_NOFIELD
00260 },
00261 {
00262 ID3FN_TEXT,
00263 ID3FTY_TEXTSTRING,
00264 0,
00265 ID3V2_EARLIEST,
00266 ID3V2_LATEST,
00267 ID3FF_NONE,
00268 ID3FN_NOFIELD
00269 },
00270 { ID3FN_NOFIELD }
00271 };
00272
00273 static ID3_FieldDef ID3FD_Picture[] =
00274 {
00275 {
00276 ID3FN_TEXTENC,
00277 ID3FTY_INTEGER,
00278 1,
00279 ID3V2_EARLIEST,
00280 ID3V2_LATEST,
00281 ID3FF_NONE,
00282 ID3FN_NOFIELD
00283 },
00284 {
00285 ID3FN_IMAGEFORMAT,
00286 ID3FTY_TEXTSTRING,
00287 3,
00288 ID3V2_EARLIEST,
00289 ID3V2_2_1,
00290 ID3FF_NONE,
00291 ID3FN_NOFIELD
00292 },
00293 {
00294 ID3FN_MIMETYPE,
00295 ID3FTY_TEXTSTRING,
00296 0,
00297 ID3V2_3_0,
00298 ID3V2_LATEST,
00299 ID3FF_CSTR,
00300 ID3FN_NOFIELD
00301 },
00302 {
00303 ID3FN_PICTURETYPE,
00304 ID3FTY_INTEGER,
00305 1,
00306 ID3V2_EARLIEST,
00307 ID3V2_LATEST,
00308 ID3FF_NONE,
00309 ID3FN_NOFIELD
00310 },
00311 {
00312 ID3FN_DESCRIPTION,
00313 ID3FTY_TEXTSTRING,
00314 0,
00315 ID3V2_EARLIEST,
00316 ID3V2_LATEST,
00317 ID3FF_CSTR | ID3FF_ENCODABLE,
00318 ID3FN_NOFIELD
00319 },
00320 {
00321 ID3FN_DATA,
00322 ID3FTY_BINARY,
00323 0,
00324 ID3V2_EARLIEST,
00325 ID3V2_LATEST,
00326 ID3FF_NONE,
00327 ID3FN_NOFIELD
00328 },
00329 { ID3FN_NOFIELD }
00330 };
00331
00332 static ID3_FieldDef ID3FD_GEO[] =
00333 {
00334 {
00335 ID3FN_TEXTENC,
00336 ID3FTY_INTEGER,
00337 1,
00338 ID3V2_EARLIEST,
00339 ID3V2_LATEST,
00340 ID3FF_NONE,
00341 ID3FN_NOFIELD
00342 },
00343 {
00344 ID3FN_MIMETYPE,
00345 ID3FTY_TEXTSTRING,
00346 0,
00347 ID3V2_EARLIEST,
00348 ID3V2_LATEST,
00349 ID3FF_CSTR,
00350 ID3FN_NOFIELD
00351 },
00352 {
00353 ID3FN_FILENAME,
00354 ID3FTY_TEXTSTRING,
00355 0,
00356 ID3V2_EARLIEST,
00357 ID3V2_LATEST,
00358 ID3FF_CSTR | ID3FF_ENCODABLE,
00359 ID3FN_NOFIELD
00360 },
00361 {
00362 ID3FN_DESCRIPTION,
00363 ID3FTY_TEXTSTRING,
00364 0,
00365 ID3V2_EARLIEST,
00366 ID3V2_LATEST,
00367 ID3FF_CSTR | ID3FF_ENCODABLE,
00368 ID3FN_NOFIELD
00369 },
00370 {
00371 ID3FN_DATA,
00372 ID3FTY_BINARY,
00373 0,
00374 ID3V2_EARLIEST,
00375 ID3V2_LATEST,
00376 ID3FF_NONE,
00377 ID3FN_NOFIELD
00378 },
00379 { ID3FN_NOFIELD }
00380 };
00381
00382 static ID3_FieldDef ID3FD_UFI[] =
00383 {
00384 {
00385 ID3FN_OWNER,
00386 ID3FTY_TEXTSTRING,
00387 0,
00388 ID3V2_EARLIEST,
00389 ID3V2_LATEST,
00390 ID3FF_CSTR,
00391 ID3FN_NOFIELD
00392 },
00393 {
00394 ID3FN_DATA,
00395 ID3FTY_BINARY,
00396 0,
00397 ID3V2_EARLIEST,
00398 ID3V2_LATEST,
00399 ID3FF_NONE,
00400 ID3FN_NOFIELD
00401 },
00402 { ID3FN_NOFIELD }
00403 };
00404
00405 static ID3_FieldDef ID3FD_PlayCounter[] =
00406 {
00407 {
00408 ID3FN_COUNTER,
00409 ID3FTY_INTEGER,
00410 4,
00411 ID3V2_EARLIEST,
00412 ID3V2_LATEST,
00413 ID3FF_NONE,
00414 ID3FN_NOFIELD
00415 },
00416 { ID3FN_NOFIELD }
00417 };
00418
00419 static ID3_FieldDef ID3FD_Popularimeter[] =
00420 {
00421 {
00422 ID3FN_EMAIL,
00423 ID3FTY_TEXTSTRING,
00424 0,
00425 ID3V2_EARLIEST,
00426 ID3V2_LATEST,
00427 ID3FF_CSTR,
00428 ID3FN_NOFIELD
00429 },
00430 {
00431 ID3FN_RATING,
00432 ID3FTY_INTEGER,
00433 1,
00434 ID3V2_EARLIEST,
00435 ID3V2_LATEST,
00436 ID3FF_NONE,
00437 ID3FN_NOFIELD
00438 },
00439 {
00440 ID3FN_COUNTER,
00441 ID3FTY_INTEGER,
00442 4,
00443 ID3V2_EARLIEST,
00444 ID3V2_LATEST,
00445 ID3FF_NONE,
00446 ID3FN_NOFIELD
00447 },
00448 { ID3FN_NOFIELD }
00449 };
00450
00451 static ID3_FieldDef ID3FD_Private[] =
00452 {
00453 {
00454 ID3FN_OWNER,
00455 ID3FTY_TEXTSTRING,
00456 0,
00457 ID3V2_3_0,
00458 ID3V2_LATEST,
00459 ID3FF_CSTR,
00460 ID3FN_NOFIELD
00461 },
00462 {
00463 ID3FN_DATA,
00464 ID3FTY_BINARY,
00465 0,
00466 ID3V2_3_0,
00467 ID3V2_LATEST,
00468 ID3FF_NONE,
00469 ID3FN_NOFIELD
00470 },
00471 { ID3FN_NOFIELD }
00472 };
00473
00474
00475 static ID3_FieldDef ID3FD_Registration[] =
00476 {
00477 {
00478 ID3FN_OWNER,
00479 ID3FTY_TEXTSTRING,
00480 0,
00481 ID3V2_3_0,
00482 ID3V2_LATEST,
00483 ID3FF_CSTR,
00484 ID3FN_NOFIELD
00485 },
00486 {
00487 ID3FN_ID,
00488 ID3FTY_INTEGER,
00489 1,
00490 ID3V2_3_0,
00491 ID3V2_LATEST,
00492 ID3FF_NONE,
00493 ID3FN_NOFIELD
00494 },
00495 {
00496 ID3FN_DATA,
00497 ID3FTY_BINARY,
00498 0,
00499 ID3V2_3_0,
00500 ID3V2_LATEST,
00501 ID3FF_NONE,
00502 ID3FN_NOFIELD
00503 },
00504 { ID3FN_NOFIELD }
00505 };
00506
00507 static ID3_FieldDef ID3FD_InvolvedPeople[] =
00508 {
00509 {
00510 ID3FN_TEXTENC,
00511 ID3FTY_INTEGER,
00512 1,
00513 ID3V2_EARLIEST,
00514 ID3V2_LATEST,
00515 ID3FF_NONE,
00516 ID3FN_NOFIELD
00517 },
00518 {
00519 ID3FN_TEXT,
00520 ID3FTY_TEXTSTRING,
00521 0,
00522 ID3V2_EARLIEST,
00523 ID3V2_LATEST,
00524 ID3FF_TEXTLIST,
00525 ID3FN_NOFIELD
00526 },
00527 { ID3FN_NOFIELD }
00528 };
00529
00530 static ID3_FieldDef ID3FD_CDM[] =
00531 {
00532 {
00533 ID3FN_DATA,
00534 ID3FTY_BINARY,
00535 0,
00536 ID3V2_2_1,
00537 ID3V2_2_1,
00538 ID3FF_NONE,
00539 ID3FN_NOFIELD
00540 }
00541 };
00542
00543 static ID3_FieldDef ID3FD_SyncLyrics[] =
00544 {
00545 {
00546 ID3FN_TEXTENC,
00547 ID3FTY_INTEGER,
00548 1,
00549 ID3V2_EARLIEST,
00550 ID3V2_LATEST,
00551 ID3FF_NONE,
00552 ID3FN_NOFIELD
00553 },
00554 {
00555 ID3FN_LANGUAGE,
00556 ID3FTY_TEXTSTRING,
00557 3,
00558 ID3V2_EARLIEST,
00559 ID3V2_LATEST,
00560 ID3FF_NONE,
00561 ID3FN_NOFIELD
00562 },
00563 {
00564 ID3FN_TIMESTAMPFORMAT,
00565 ID3FTY_INTEGER,
00566 1,
00567 ID3V2_EARLIEST,
00568 ID3V2_LATEST,
00569 ID3FF_NONE,
00570 ID3FN_NOFIELD
00571 },
00572 {
00573 ID3FN_CONTENTTYPE,
00574 ID3FTY_INTEGER,
00575 1,
00576 ID3V2_EARLIEST,
00577 ID3V2_LATEST,
00578 ID3FF_NONE,
00579 ID3FN_NOFIELD
00580 },
00581 {
00582 ID3FN_DESCRIPTION,
00583 ID3FTY_TEXTSTRING,
00584 0,
00585 ID3V2_EARLIEST,
00586 ID3V2_LATEST,
00587 ID3FF_CSTR | ID3FF_ENCODABLE,
00588 ID3FN_NOFIELD
00589 },
00590 {
00591 ID3FN_DATA,
00592 ID3FTY_BINARY,
00593 0,
00594 ID3V2_EARLIEST,
00595 ID3V2_LATEST,
00596 ID3FF_NONE,
00597 ID3FN_NOFIELD
00598 },
00599 { ID3FN_NOFIELD }
00600 };
00601
00602
00603
00604
00605
00606 #if defined _UNDEFINED_
00607 static ID3_FieldDef ID3FD_Volume[] =
00608 {
00609 {
00610 ID3FN_VOLUMEADJ,
00611 ID3FTY_INTEGER,
00612 1,
00613 ID3V2_EARLIEST,
00614 ID3V2_LATEST,
00615 ID3FF_NONE,
00616 ID3FN_NOFIELD
00617 },
00618 {
00619 ID3FN_NUMBITS,
00620 ID3FTY_INTEGER,
00621 1,
00622 ID3V2_EARLIEST,
00623 ID3V2_LATEST,
00624 ID3FF_NONE,
00625 ID3FN_NOFIELD
00626 },
00627 {
00628 ID3FN_VOLCHGRIGHT,
00629 ID3FTY_BITFIELD,
00630 0,
00631 ID3V2_EARLIEST,
00632 ID3V2_LATEST,
00633 ID3FF_ADJUSTEDBY,
00634 ID3FN_NUMBITS
00635 },
00636 {
00637 ID3FN_VOLCHGLEFT,
00638 ID3FTY_BITFIELD,
00639 0,
00640 ID3V2_EARLIEST,
00641 ID3V2_LATEST,
00642 ID3FF_ADJUSTEDBY,
00643 ID3FN_NUMBITS
00644 },
00645 {
00646 ID3FN_PEAKVOLRIGHT,
00647 ID3FTY_BITFIELD,
00648 0,
00649 ID3V2_EARLIEST,
00650 ID3V2_LATEST,
00651 ID3FF_ADJUSTEDBY,
00652 ID3FN_NUMBITS
00653 },
00654 {
00655 ID3FN_PEAKVOLLEFT,
00656 ID3FTY_BITFIELD,
00657 0,
00658 ID3V2_EARLIEST,
00659 ID3V2_LATEST,
00660 ID3FF_ADJUSTEDBY,
00661 ID3FN_NUMBITS
00662 },
00663 { ID3FN_NOFIELD }
00664 };
00665 #endif
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746 static ID3_FrameDef ID3_FrameDefs[] =
00747 {
00748
00749
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
01022
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