blob: 5199092df912b43f01f7aa83529ba520b4ef0441 [file] [log] [blame]
// $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
// id3lib: a C++ library for creating and manipulating id3v1/v2 tags
// Copyright 1999, 2000 Scott Thomas Haug
// Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Library General Public License as published by
// the Free Software Foundation; either version 2 of the License, or (at your
// option) any later version.
//
// This library is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
// License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with this library; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// The id3lib authors encourage improvements and optimisations to be sent to
// the id3lib coordinator. Please see the README file for details on where to
// send such submissions. See the AUTHORS file for a list of people who have
// contributed to id3lib. See the ChangeLog file for a list of changes to
// id3lib. These files are distributed with id3lib at
// http://download.sourceforge.net/id3lib/
#include "field_impl.h"
#include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
#include "field_def.h"
#include "frame_def.h"
#include "readers.h"
#include <assert.h>
using namespace dami;
// This is used for unimplemented frames so that their data is preserved when
// parsing and rendering
static ID3_FieldDef ID3FD_Unimplemented[] =
{
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
const ID3_FieldDef* ID3_FieldDef::DEFAULT = ID3FD_Unimplemented;
static ID3_FieldDef ID3FD_URL[] =
{
{
ID3FN_URL, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_UserURL[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_URL, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_Text[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_UserText[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_GeneralText[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_LANGUAGE, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
3, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_TermsOfUse[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_LANGUAGE, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
3, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_LinkedInfo[] =
{
{
ID3FN_ID, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
3, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_2_1, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_ID, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
4, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_URL, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_Picture[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_IMAGEFORMAT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
3, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_2_1, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_MIMETYPE, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_PICTURETYPE, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_GEO[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_MIMETYPE, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_FILENAME, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_UFI[] =
{
{
ID3FN_OWNER, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_PlayCounter[] =
{
{
ID3FN_COUNTER, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
4, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_Popularimeter[] =
{
{
ID3FN_EMAIL, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_RATING, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_COUNTER, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
4, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_Private[] =
{
{
ID3FN_OWNER, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_Registration[] =
{
{
ID3FN_OWNER, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_ID, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_3_0, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_InvolvedPeople[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TEXT, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_TEXTLIST, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
static ID3_FieldDef ID3FD_CDM[] =
{
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_2_1, // INITIAL SPEC
ID3V2_2_1, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
}
};
static ID3_FieldDef ID3FD_SyncLyrics[] =
{
{
ID3FN_TEXTENC, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_LANGUAGE, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
3, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_TIMESTAMPFORMAT, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_CONTENTTYPE, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DESCRIPTION, // FIELD NAME
ID3FTY_TEXTSTRING, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_DATA, // FIELD NAME
ID3FTY_BINARY, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
/*
* Currently unused
*/
#if defined _UNDEFINED_
static ID3_FieldDef ID3FD_Volume[] =
{
{
ID3FN_VOLUMEADJ, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_NUMBITS, // FIELD NAME
ID3FTY_INTEGER, // FIELD TYPE
1, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_NONE, // FLAGS
ID3FN_NOFIELD // LINKED FIELD
},
{
ID3FN_VOLCHGRIGHT, // FIELD NAME
ID3FTY_BITFIELD, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ADJUSTEDBY, // FLAGS
ID3FN_NUMBITS // LINKED FIELD
},
{
ID3FN_VOLCHGLEFT, // FIELD NAME
ID3FTY_BITFIELD, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ADJUSTEDBY, // FLAGS
ID3FN_NUMBITS // LINKED FIELD
},
{
ID3FN_PEAKVOLRIGHT, // FIELD NAME
ID3FTY_BITFIELD, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ADJUSTEDBY, // FLAGS
ID3FN_NUMBITS // LINKED FIELD
},
{
ID3FN_PEAKVOLLEFT, // FIELD NAME
ID3FTY_BITFIELD, // FIELD TYPE
0, // FIXED LEN
ID3V2_EARLIEST, // INITIAL SPEC
ID3V2_LATEST, // ENDING SPEC
ID3FF_ADJUSTEDBY, // FLAGS
ID3FN_NUMBITS // LINKED FIELD
},
{ ID3FN_NOFIELD }
};
#endif /* _UNDEFINED_ */
// **** Currently Implemented Frames
// APIC PIC ID3FID_PICTURE Attached picture
// COMM COM ID3FID_COMMENT Comments
// ENCR ID3FID_CRYPTOREG Encryption method registration
// GEOB GEO ID3FID_GENERALOBJECT General encapsulated object
// GRID ID3FID_GROUPINGREG Group identification registration
// IPLS IPL ID3FID_INVOLVEDPEOPLE Involved people list
// LINK LNK ID3FID_LINKEDINFO Linked information
// PCNT CNT ID3FID_PLAYCOUNTER Play counter
// POPM POP ID3FID_POPULARIMETER Popularimeter
// PRIV ID3FID_PRIVATE Private frame
// SYLT SLT ID3FID_SYNCEDLYRICS Synchronized lyric/text
// TALB TAL ID3FID_ALBUM Album/Movie/Show title
// TBPM TBP ID3FID_BPM BPM (beats per minute)
// TCOM TCM ID3FID_COMPOSER Composer
// TCON TCO ID3FID_CONTENTTYPE Content type
// TCOP TCR ID3FID_COPYRIGHT Copyright message
// TDAT TDA ID3FID_DATE Date
// TDLY TDY ID3FID_PLAYLISTDELAY Playlist delay
// TENC TEN ID3FID_ENCODEDBY Encoded by
// TEXT TXT ID3FID_LYRICIST Lyricist/Text writer
// TFLT TFT ID3FID_FILETYPE File type
// TIME TKE ID3FID_TIME Time
// TIT1 TIM ID3FID_CONTENTGROUP Content group description
// TIT2 TT1 ID3FID_TITLE Title/songname/content description
// TIT3 TT2 ID3FID_SUBTITLE Subtitle/Description refinement
// TKEY TT3 ID3FID_INITIALKEY Initial key
// TLAN TLA ID3FID_LANGUAGE Language(s)
// TLEN TLE ID3FID_SONGLEN Length
// TMED TMT ID3FID_MEDIATYPE Media type
// TOAL TOT ID3FID_ORIGALBUM Original album/movie/show title
// TOFN TOF ID3FID_ORIGFILENAME Original filename
// TOLY TOL ID3FID_ORIGLYRICIST Original lyricist(s)/text writer(s)
// TOPE TOA ID3FID_ORIGARTIST Original artist(s)/performer(s)
// TORY TOR ID3FID_ORIGYEAR Original release year
// TOWN ID3FID_FILEOWNER File owner/licensee
// TPE1 TP1 ID3FID_LEADARTIST Lead performer(s)/Soloist(s)
// TPE2 TP2 ID3FID_BAND Band/orchestra/accompaniment
// TPE3 TP3 ID3FID_CONDUCTOR Conductor/performer refinement
// TPE4 TP4 ID3FID_MIXARTIST Interpreted, remixed, or otherwise modified
// TPOS TPA ID3FID_PARTINSET Part of a set
// TPUB TPB ID3FID_PUBLISHER Publisher
// TRCK TRK ID3FID_TRACKNUM Track number/Position in set
// TRDA TRD ID3FID_RECORDINGDATES Recording dates
// TRSN TRN ID3FID_NETRADIOSTATION Internet radio station name
// TRSO TRO ID3FID_NETRADIOOWNER Internet radio station owner
// TSIZ TSI ID3FID_SIZE Size
// TSRC TRC ID3FID_ISRC ISRC (international standard recording code)
// TSSE TSS ID3FID_ENCODERSETTINGS Software/Hardware and encoding settings
// TXXX TXX ID3FID_USERTEXT User defined text information
// TYER TYE ID3FID_YEAR Year
// UFID UFI ID3FID_UNIQUEFILEID Unique file identifier
// USER ID3FID_TERMSOFUSE Terms of use
// USLT ULT ID3FID_UNSYNCEDLYRICS Unsynchronized lyric/text transcription
// WCOM WCM ID3FID_WWWCOMMERCIALINFO Commercial information
// WCOP WCM ID3FID_WWWCOPYRIGHT Copyright/Legal infromation
// WOAF WCP ID3FID_WWWAUDIOFILE Official audio file webpage
// WOAR WAF ID3FID_WWWARTIST Official artist/performer webpage
// WOAS WAR ID3FID_WWWAUDIOSOURCE Official audio source webpage
// WORS WAS ID3FID_WWWRADIOPAGE Official internet radio station homepage
// WPAY WRA ID3FID_WWWPAYMENT Payment
// WPUB WPY ID3FID_WWWPUBLISHER Official publisher webpage
// WXXX WXX ID3FID_WWWUSER User defined URL link
// CDM ID3FID_METACOMPRESSION Compressed data meta frame
// **** Currently unimplemented frames
// AENC CRA ID3FID_AUDIOCRYPTO Audio encryption
// COMR ID3FID_COMMERCIAL Commercial frame
// EQUA EQU ID3FID_EQUALIZATION Equalization
// ETCO ETC ID3FID_EVENTTIMING Event timing codes
// MCDI MCI ID3FID_CDID Music CD identifier
// MLLT MLL ID3FID_MPEGLOOKUP MPEG location lookup table
// OWNE ID3FID_OWNERSHIP Ownership frame
// POSS ID3FID_POSITIONSYNC Position synchronisation frame
// RBUF BUF ID3FID_BUFFERSIZE Recommended buffer size
// RVAD RVA ID3FID_VOLUMEADJ Relative volume adjustment
// RVRB REV ID3FID_REVERB Reverb
// SYTC STC ID3FID_SYNCEDTEMPO Synchronized tempo codes
// CRM ID3FID_METACRYPTO Encrypted meta frame
static ID3_FrameDef ID3_FrameDefs[] =
{
// short long tag file
// frame id id id discrd discrd field defs description
{ID3FID_AUDIOCRYPTO, "CRA", "AENC", false, false, ID3FD_Unimplemented, "Audio encryption"},
{ID3FID_PICTURE, "PIC", "APIC", false, false, ID3FD_Picture, "Attached picture"},
{ID3FID_COMMENT, "COM", "COMM", false, false, ID3FD_GeneralText, "Comments"},
{ID3FID_COMMERCIAL, "" , "COMR", false, false, ID3FD_Unimplemented, "Commercial"},
{ID3FID_CRYPTOREG, "" , "ENCR", false, false, ID3FD_Registration, "Encryption method registration"},
{ID3FID_EQUALIZATION, "EQU", "EQUA", false, true, ID3FD_Unimplemented, "Equalization"},
{ID3FID_EVENTTIMING, "ETC", "ETCO", false, true, ID3FD_Unimplemented, "Event timing codes"},
{ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, ID3FD_GEO, "General encapsulated object"},
{ID3FID_GROUPINGREG, "" , "GRID", false, false, ID3FD_Registration, "Group identification registration"},
{ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, ID3FD_InvolvedPeople,"Involved people list"},
{ID3FID_LINKEDINFO, "LNK", "LINK", false, false, ID3FD_LinkedInfo, "Linked information"},
{ID3FID_CDID, "MCI", "MCDI", false, false, ID3FD_Unimplemented, "Music CD identifier"},
{ID3FID_MPEGLOOKUP, "MLL", "MLLT", false, true, ID3FD_Unimplemented, "MPEG location lookup table"},
{ID3FID_OWNERSHIP, "" , "OWNE", false, false, ID3FD_Unimplemented, "Ownership frame"},
{ID3FID_PRIVATE, "" , "PRIV", false, false, ID3FD_Private, "Private frame"},
{ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, ID3FD_PlayCounter, "Play counter"},
{ID3FID_POPULARIMETER, "POP", "POPM", false, false, ID3FD_Popularimeter, "Popularimeter"},
{ID3FID_POSITIONSYNC, "" , "POSS", false, true, ID3FD_Unimplemented, "Position synchronisation frame"},
{ID3FID_BUFFERSIZE, "BUF", "RBUF", false, false, ID3FD_Unimplemented, "Recommended buffer size"},
{ID3FID_VOLUMEADJ, "RVA", "RVAD", false, true, ID3FD_Unimplemented, "Relative volume adjustment"},
{ID3FID_REVERB, "REV", "RVRB", false, false, ID3FD_Unimplemented, "Reverb"},
{ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, ID3FD_SyncLyrics, "Synchronized lyric/text"},
{ID3FID_SYNCEDTEMPO, "STC", "SYTC", false, true, ID3FD_Unimplemented, "Synchronized tempo codes"},
{ID3FID_ALBUM, "TAL", "TALB", false, false, ID3FD_Text, "Album/Movie/Show title"},
{ID3FID_BPM, "TBP", "TBPM", false, false, ID3FD_Text, "BPM (beats per minute)"},
{ID3FID_COMPOSER, "TCM", "TCOM", false, false, ID3FD_Text, "Composer"},
{ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, ID3FD_Text, "Content type"},
{ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, ID3FD_Text, "Copyright message"},
{ID3FID_DATE, "TDA", "TDAT", false, false, ID3FD_Text, "Date"},
{ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, ID3FD_Text, "Playlist delay"},
{ID3FID_ENCODEDBY, "TEN", "TENC", false, true, ID3FD_Text, "Encoded by"},
{ID3FID_LYRICIST, "TXT", "TEXT", false, false, ID3FD_Text, "Lyricist/Text writer"},
{ID3FID_FILETYPE, "TFT", "TFLT", false, false, ID3FD_Text, "File type"},
{ID3FID_TIME, "TIM", "TIME", false, false, ID3FD_Text, "Time"},
{ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, ID3FD_Text, "Content group description"},
{ID3FID_TITLE, "TT2", "TIT2", false, false, ID3FD_Text, "Title/songname/content description"},
{ID3FID_SUBTITLE, "TT3", "TIT3", false, false, ID3FD_Text, "Subtitle/Description refinement"},
{ID3FID_INITIALKEY, "TKE", "TKEY", false, false, ID3FD_Text, "Initial key"},
{ID3FID_LANGUAGE, "TLA", "TLAN", false, false, ID3FD_Text, "Language(s)"},
{ID3FID_SONGLEN, "TLE", "TLEN", false, true, ID3FD_Text, "Length"},
{ID3FID_MEDIATYPE, "TMT", "TMED", false, false, ID3FD_Text, "Media type"},
{ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, ID3FD_Text, "Original album/movie/show title"},
{ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, ID3FD_Text, "Original filename"},
{ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, ID3FD_Text, "Original lyricist(s)/text writer(s)"},
{ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, ID3FD_Text, "Original artist(s)/performer(s)"},
{ID3FID_ORIGYEAR, "TOR", "TORY", false, false, ID3FD_Text, "Original release year"},
{ID3FID_FILEOWNER, "" , "TOWN", false, false, ID3FD_Text, "File owner/licensee"},
{ID3FID_LEADARTIST, "TP1", "TPE1", false, false, ID3FD_Text, "Lead performer(s)/Soloist(s)"},
{ID3FID_BAND, "TP2", "TPE2", false, false, ID3FD_Text, "Band/orchestra/accompaniment"},
{ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, ID3FD_Text, "Conductor/performer refinement"},
{ID3FID_MIXARTIST, "TP4", "TPE4", false, false, ID3FD_Text, "Interpreted, remixed, or otherwise modified by"},
{ID3FID_PARTINSET, "TPA", "TPOS", false, false, ID3FD_Text, "Part of a set"},
{ID3FID_PUBLISHER, "TPB", "TPUB", false, false, ID3FD_Text, "Publisher"},
{ID3FID_TRACKNUM, "TRK", "TRCK", false, false, ID3FD_Text, "Track number/Position in set"},
{ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, ID3FD_Text, "Recording dates"},
{ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, ID3FD_Text, "Internet radio station name"},
{ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, ID3FD_Text, "Internet radio station owner"},
{ID3FID_SIZE, "TSI", "TSIZ", false, true, ID3FD_Text, "Size"},
{ID3FID_ISRC, "TRC", "TSRC", false, false, ID3FD_Text, "ISRC (international standard recording code)"},
{ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, ID3FD_Text, "Software/Hardware and settings used for encoding"},
{ID3FID_USERTEXT, "TXX", "TXXX", false, false, ID3FD_UserText, "User defined text information"},
{ID3FID_YEAR, "TYE", "TYER", false, false, ID3FD_Text, "Year"},
{ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, ID3FD_UFI, "Unique file identifier"},
{ID3FID_TERMSOFUSE, "" , "USER", false, false, ID3FD_TermsOfUse, "Terms of use"},
{ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, ID3FD_GeneralText, "Unsynchronized lyric/text transcription"},
{ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, ID3FD_URL, "Commercial information"},
{ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, ID3FD_URL, "Copyright/Legal infromation"},
{ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, ID3FD_URL, "Official audio file webpage"},
{ID3FID_WWWARTIST, "WAR", "WOAR", false, false, ID3FD_URL, "Official artist/performer webpage"},
{ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, ID3FD_URL, "Official audio source webpage"},
{ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, ID3FD_URL, "Official internet radio station homepage"},
{ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, ID3FD_URL, "Payment"},
{ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, ID3FD_URL, "Official publisher webpage"},
{ID3FID_WWWUSER, "WXX", "WXXX", false, false, ID3FD_UserURL, "User defined URL link"},
{ID3FID_METACRYPTO, "CRM", "" , false, false, ID3FD_Unimplemented, "Encrypted meta frame"},
{ID3FID_METACOMPRESSION, "CDM", "" , false, false, ID3FD_CDM, "Compressed data meta frame"},
{ID3FID_ITUNESCOMPILATION, "TCP", "TCMP", false, false, ID3FD_Unimplemented, "iTunes Compilation Flag"},
{ID3FID_NOFRAME}
};
/** \class ID3_Field field.h id3/field.h
** \brief The representative class of an ID3v2 field.
**
** As a general rule, you need never create an object of this type. id3lib
** uses them internally as part of the id3_frame class. You must know how to
** interact with these objects, though, and that's what this section is about.
**
** The ID3_Field contains many overloaded methods to provide these facilities
** for four different data types: integers, ASCII strings, Unicode strings,
** and binary data.
**
** An integer field supports the Get(), Set(uint32), and operator=(uint32)
** methods.
**
** Both types of strings support the GetNumTextItems() method.
**
** An ASCII string field supports the Get(char*, size_t, size_t)),
** Set(const char*), Add(const char*), and operator=(const char*) methods.
**
** A Unicode field also supports Get(unicode_t*, size_t, size_t),
** Set(const unicode_t*), Add(const unicode_t*), and
** operator=(const unicode_t*). Without elaborating, the Unicode
** methods behave exactly the same as their ASCII counterparts, taking
** \c unicode_t pointers in place of \c char pointers.
**
** All strings in id3lib are handled internally as Unicode. This means that
** when you set a field with an ASCII source type, it will be converted and
** stored internally as a Unicode string. id3lib will handle all necessary
** conversions when parsing, rendering, and retrieving. If you set a field as
** an ASCII string, then try to read the string into a \c unicode_t buffer,
** id3lib will automatically convert the string into Unicode so this will
** function as expected. The same holds true in reverse. Of course, when
** converting from Unicode to ASCII, you will experience problems when the
** Unicode string contains characters that don't map to ISO-8859-1.
**
** A binary field supports the Get(uchar*, size_t), Set(const uchar*, size_t),
** FromFile(const char*), and ToFile(const char*) methods. The binary field
** holds miscellaneous data that can't easily be described any other way, such
** as a JPEG image.
**
** As a general implementation note, you should be prepared to support all
** fields in an id3lib frame, even if all fields in the id3lib version of the
** frame aren't present in the id3v2 version. This is because of frames like
** the picture frame, which changed slightly from one version of the id3v2
** standard to the next (the IMAGEFORMAT format in 2.0 changed to a MIMETYPE
** in 3.0). If you support all id3lib fields in a given frame, id3lib can
** generate the correct id3v2 frame for the id3v2 version you wish to support.
** Alternatively, just support the fields you know will be used in, say, 3.0
** if you only plan to generate 3.0 tags.
**
** @author Dirk Mahoney
** @version $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
** \sa ID3_Tag
** \sa ID3_Frame
** \sa ID3_Err
**/
ID3_FieldImpl::ID3_FieldImpl()
: _id(ID3FN_NOFIELD),
_type(ID3FTY_INTEGER),
_spec_begin(ID3V2_EARLIEST),
_spec_end(ID3V2_LATEST),
_flags(0),
_changed(false),
_fixed_size(0),
_num_items(0),
_enc(ID3TE_NONE)
{
this->Clear();
}
ID3_FieldImpl::ID3_FieldImpl(const ID3_FieldDef& def)
: _id(def._id),
_type(def._type),
_spec_begin(def._spec_begin),
_spec_end(def._spec_end),
_flags(def._flags),
_changed(false),
_fixed_size(def._fixed_size),
_num_items(0),
_enc((_type == ID3FTY_TEXTSTRING) ? ID3TE_ASCII : ID3TE_NONE)
{
this->Clear();
}
ID3_FieldImpl::~ID3_FieldImpl()
{
}
/** Clears any data and frees any memory associated with the field
**
** \sa ID3_Tag::Clear()
** \sa ID3_Frame::Clear()
**/
void ID3_FieldImpl::Clear()
{
switch (_type)
{
case ID3FTY_INTEGER:
{
_integer = 0;
break;
}
case ID3FTY_BINARY:
{
_binary.erase();
if (_fixed_size > 0)
{
_binary.assign(_fixed_size, '\0');
}
break;
}
case ID3FTY_TEXTSTRING:
{
_text.erase();
if (_fixed_size > 0)
{
if (ID3TE_IS_DOUBLE_BYTE_ENC(this->GetEncoding()))
{
_text.assign(_fixed_size * 2, '\0');
}
else if (ID3TE_IS_SINGLE_BYTE_ENC(this->GetEncoding()))
{
_text.assign(_fixed_size, '\0');
}
}
break;
}
default:
{
break;
}
}
_changed = true;
return ;
}
bool
ID3_FieldImpl::HasChanged() const
{
return _changed;
}
/** \fn size_t ID3_Field::Size() const
** \brief Returns the size of a field.
**
** The value returned is dependent on the type of the field. For ASCII
** strings, this returns the number of characters in the field, not including
** any NULL-terminator. The same holds true for Unicode---it returns the
** number of characters in the field, not bytes, and this does not include
** the Unicode BOM, which isn't put in a Unicode string obtained by the
** Get(unicode_t*, size_t, size_t) method anyway. For binary and
** integer fields, this returns the number of bytes in the field.
**
** \code
** size_t howBig = myFrame.GetField(ID3FN_DATA)->Size();
** \endcode
**
** \return The size of the field, either in bytes (for binary or integer
** fields) or characters (for strings).
**/
size_t ID3_FieldImpl::BinSize() const
{
if (_fixed_size > 0)
{
return _fixed_size;
}
size_t size = this->Size();
if (_type == ID3FTY_TEXTSTRING)
{
ID3_TextEnc enc = this->GetEncoding();
if (ID3TE_IS_DOUBLE_BYTE_ENC(enc) && size > 0)
{
size++;
}
if (_flags & ID3FF_CSTR)
{
size++;
}
if (ID3TE_IS_DOUBLE_BYTE_ENC(enc))
{
size *= 2; // FIXME: I guess this is wrong
}
}
return size;
}
size_t ID3_FieldImpl::Size() const
{
size_t size = 0;
// check to see if we are within the legal limit for this field 0 means
// arbitrary length field
if (_fixed_size > 0)
{
size = _fixed_size;
}
else if (_type == ID3FTY_INTEGER)
{
size = sizeof(uint32);
}
else if (_type == ID3FTY_TEXTSTRING)
{
size = _text.size();
}
else
{
size = _binary.size();
}
return size;
}
bool ID3_FieldImpl::Parse(ID3_Reader& reader)
{
bool success = false;
switch (this->GetType())
{
case ID3FTY_INTEGER:
{
success = this->ParseInteger(reader);
break;
}
case ID3FTY_BINARY:
{
success = this->ParseBinary(reader);
break;
}
case ID3FTY_TEXTSTRING:
{
success = this->ParseText(reader);
break;
}
default:
{
ID3D_WARNING( "ID3_FieldImpl::Parse(): unknown field type" );
break;
}
}
return success;
}
ID3_FrameDef* ID3_FindFrameDef(ID3_FrameID id)
{
ID3_FrameDef *info = NULL;
for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
{
if (ID3_FrameDefs[cur].eID == id)
{
info = &ID3_FrameDefs[cur];
break;
}
}
return info;
}
ID3_FrameID
ID3_FindFrameID(const char *id)
{
ID3_FrameID fid = ID3FID_NOFRAME;
const int slen = strlen(id);
for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
{
if (((strcmp(ID3_FrameDefs[cur].sShortTextID, id) == 0) &&
slen == 3) ||
((strcmp(ID3_FrameDefs[cur].sLongTextID, id) == 0) &&
slen == 4))
{
fid = ID3_FrameDefs[cur].eID;
break;
}
}
return fid;
}
void ID3_FieldImpl::Render(ID3_Writer& writer) const
{
switch (this->GetType())
{
case ID3FTY_INTEGER:
{
RenderInteger(writer);
break;
}
case ID3FTY_BINARY:
{
RenderBinary(writer);
break;
}
case ID3FTY_TEXTSTRING:
{
RenderText(writer);
break;
}
default:
{
ID3D_WARNING ( "ID3D_FieldImpl::Render(): unknown field type" );
break;
}
}
}
/** Copies the content of one field to another.
* WOW, this is another strange conditional function.
* It copies the content BUT only if the types match from the start.
* Strange (Ralf)
*/
ID3_Field &
ID3_FieldImpl::operator=( const ID3_Field &rhs )
{
const ID3_FieldImpl* fld = (const ID3_FieldImpl*) &rhs;
if (this != &rhs && this->GetType() == fld->GetType())
{
switch (fld->GetType())
{
case ID3FTY_INTEGER:
{
this->SetInteger(fld->GetInteger());
break;
}
case ID3FTY_TEXTSTRING:
{
this->SetEncoding(fld->GetEncoding());
this->SetText(fld->GetText());
break;
}
case ID3FTY_BINARY:
{
this->SetBinary(fld->GetBinary());
break;
}
default:
{
break;
}
}
}
return *this;
}
/** Sets the encoding of the underlaying text.
* Please note that the id3-spec does not allow size-limited texts with encodings other than ASCII.
* Also note that you should set the matching encoding field or because write operations are made
* with the TEXT_ENC field value.
*/
bool ID3_FieldImpl::SetEncoding(ID3_TextEnc enc)
{
bool changed = this->IsEncodable() && (enc != this->GetEncoding()) &&
(ID3TE_NONE < enc && enc < ID3TE_NUMENCODINGS);
if (changed)
{
_text = convert(_text, _enc, enc);
_enc = enc;
_changed = true;
}
return changed;
}
/** \class ID3_FrameInfo field.h id3/field.h
** \brief Provides information about the frame and field types supported by id3lib
**
** You normally only need (at most) one instance of the ID3_FrameInfo. It
** has no member data -- only methods which provide information about the
** frame types (and their component fields) supported by id3lib as defined
** in field.cpp .
**
** Usage is straightforward. The following function uses ID3_FrameInfo
** to display a summary of all the frames known to id3lib:
** \code
**
** void ShowKnownFrameInfo {
** ID3_FrameInfo myFrameInfo;
** for (int cur = ID3FID_NOFRAME+1; cur <= myFrameInfo.MaxFrameID(); cur ++)
** {
** cout << "Short ID: " << myFrameInfo.ShortName(ID3_FrameID(cur)) <<
** " Long ID: " << myFrameInfo.LongName(ID3_FrameID(cur)) <<
** " Desription: " << myFrameInfo.Description(ID3_FrameID(cur)) << endl;
** }
** }
** \endcode
**
** Functions are also provided to glean more information about the individual
** fields which make up any given frame type. The following for() loop,
** embedded into the previous for() loop would provide a raw look at such
** information. Realize, of course, that the field type is meaningless
** when printed. Only when it is taken in the context of the ID3_FieldType enum
** does it take on any meaningful significance.
**
** \code
** for (int cur = ID3FID_NOFRAME+1; cur <= fi.MaxFrameID(); cur ++)
** {
** int numfields = fi.NumFields(ID3_FrameID(cur));
**
** cout << "ID: " << fi.LongName(ID3_FrameID(cur)) <<
** " FIELDS: " << numfields << endl;
** for(int i=0;i<numfields;i++) {
** cout << "TYPE: " << fi.FieldType(ID3_FrameID(cur),i) <<
** " SIZE: " << fi.FieldSize(ID3_FrameID(cur),i) <<
** " FLAGS: " << fi.FieldFlags(ID3_FrameID(cur),i) << endl;
**
** }
**
** cout << endl;
**
** }
** \endcode
**
** @author Cedric Tefft
** @version $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
**/
char *ID3_FrameInfo::ShortName(ID3_FrameID frameID)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return pFD->sShortTextID;
else
return NULL;
}
char *ID3_FrameInfo::LongName(ID3_FrameID frameID)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return pFD->sLongTextID;
else
return NULL;
}
const char *ID3_FrameInfo::Description(ID3_FrameID frameID)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return pFD->sDescription;
else
return NULL;
}
int ID3_FrameInfo::MaxFrameID()
{
return ID3FID_LASTFRAMEID-1;
}
int ID3_FrameInfo::NumFields(ID3_FrameID frameID)
{
int fieldnum=0;
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
{
while (pFD->aeFieldDefs[fieldnum]._id != ID3FN_NOFIELD)
{
++fieldnum;
}
}
return fieldnum;
}
ID3_FieldType ID3_FrameInfo::FieldType(ID3_FrameID frameID, int fieldnum)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return (pFD->aeFieldDefs[fieldnum]._type);
else
return ID3FTY_NONE;
}
size_t ID3_FrameInfo::FieldSize(ID3_FrameID frameID, int fieldnum)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return (pFD->aeFieldDefs[fieldnum]._fixed_size);
else
return 0;
}
flags_t ID3_FrameInfo::FieldFlags(ID3_FrameID frameID, int fieldnum)
{
ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
if (pFD!=NULL)
return (pFD->aeFieldDefs[fieldnum]._flags);
else
return 0;
}