id3lib 3.8.3

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 #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