src/field.cpp

Go to the documentation of this file.
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 

Generated on Mon Aug 20 17:48:46 2007 for id3lib by  doxygen 1.5.2