aboutsummaryrefslogtreecommitdiff
path: root/Src/id3v2/id3_field.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/id3v2/id3_field.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/id3v2/id3_field.cpp')
-rw-r--r--Src/id3v2/id3_field.cpp520
1 files changed, 520 insertions, 0 deletions
diff --git a/Src/id3v2/id3_field.cpp b/Src/id3v2/id3_field.cpp
new file mode 100644
index 00000000..4b21cb77
--- /dev/null
+++ b/Src/id3v2/id3_field.cpp
@@ -0,0 +1,520 @@
+// The authors have released ID3Lib as Public Domain (PD) and claim no copyright,
+// patent or other intellectual property protection in this work. This means that
+// it may be modified, redistributed and used in commercial and non-commercial
+// software and hardware without restrictions. ID3Lib is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
+//
+// The ID3Lib authors encourage improvements and optimisations to be sent to the
+// ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org). Approved
+// submissions may be altered, and will be included and released under these terms.
+//
+// Mon Nov 23 18:34:01 1998
+
+// improved/optimized/whatever 10/30/00 JF
+
+#include <windows.h>
+#include <string.h>
+#include "id3_field.h"
+
+static ID3_FieldDef ID3FD_URL[] =
+{
+ {ID3FN_URL, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD},
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_UserURL[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_URL, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Text[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_TEXT, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_UserText[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_TEXT, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_GeneralText[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_LANGUAGE, ID3FTY_ASCIISTRING, 3, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_TEXT, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Picture[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_IMAGEFORMAT, ID3FTY_ASCIISTRING, 3, 2, 0, ID3VC_LOWER, NULL, ID3FN_NOFIELD },
+ {ID3FN_MIMETYPE, ID3FTY_ASCIISTRING, -1, 3, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_PICTURETYPE, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_GEO[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_MIMETYPE, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_FILENAME, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_UFI[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_OWNER, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_PRIVATE[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_OWNER, ID3FTY_ASCIISTRING, -1, 3, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 3, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_PlayCounter[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_COUNTER, ID3FTY_INTEGER, 4, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Popularimeter[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_EMAIL, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_RATING, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_COUNTER, ID3FTY_INTEGER, 4, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Registration[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_OWNER, ID3FTY_ASCIISTRING, -1, 3, 0, ID3VC_HIGHER, ID3FF_NULL, ID3FN_NOFIELD },
+ {ID3FN_SYMBOL, ID3FTY_INTEGER, 1, 3, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 3, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_InvolvedPeople[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_TEXT, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_NULLDIVIDE | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+
+static ID3_FieldDef ID3FD_Volume[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_VOLUMEADJ, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NUMBITS, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_VOLCHGRIGHT, ID3FTY_BITFIELD, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTEDBY, ID3FN_NUMBITS },
+ {ID3FN_VOLCHGLEFT, ID3FTY_BITFIELD, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTEDBY, ID3FN_NUMBITS },
+ {ID3FN_PEAKVOLRIGHT, ID3FTY_BITFIELD, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTEDBY, ID3FN_NUMBITS },
+ {ID3FN_PEAKVOLLEFT, ID3FTY_BITFIELD, -1, 2, 0, ID3VC_HIGHER, ID3FF_ADJUSTEDBY, ID3FN_NUMBITS },
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_MCDI[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_CD_TOC, ID3FTY_BINARY, -1, 3, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD},
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Text_v2_4[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 4, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_TEXT, ID3FTY_ASCIISTRING, -1, 4, 0, ID3VC_HIGHER, ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Timestamp1[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TIMESTAMP, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DATA, ID3FTY_BINARY, -1, 3, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FieldDef ID3FD_Timestamp2[] =
+{
+ // FIELD FIELD FIXED RENDER IF OR
+ // NAME TYPE LEN VER REV WHAT? FLAGS LINKED FIELD
+ {ID3FN_TEXTENC, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_LANGUAGE, ID3FTY_ASCIISTRING, 3, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_TIMESTAMP, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_CONTENTTYPE, ID3FTY_INTEGER, 1, 2, 0, ID3VC_HIGHER, NULL, ID3FN_NOFIELD },
+ {ID3FN_DESCRIPTION, ID3FTY_ASCIISTRING, -1, 2, 0, ID3VC_HIGHER, ID3FF_NULL | ID3FF_ADJUSTENC, ID3FN_NOFIELD },
+ {ID3FN_NOFIELD }
+};
+
+static ID3_FrameDef ID3_FrameDefs[] =
+{
+ //FRAME ID SHORTID LONGID PRI TAGDISCARD FILEDISCARD HANDLER FIELDDEFS
+ {ID3FID_ENCODEDBY, "TEN", "TENC", false, true, NULL, ID3FD_Text },
+ {ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, NULL, ID3FD_Text },
+ {ID3FID_PUBLISHER, "TPB", "TPUB", false, false, NULL, ID3FD_Text },
+ {ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, NULL, ID3FD_Text },
+ {ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, NULL, ID3FD_Text },
+ {ID3FID_LANGUAGE, "TLA", "TLAN", false, false, NULL, ID3FD_Text },
+ {ID3FID_PARTINSET, "TPA", "TPOS", false, false, NULL, ID3FD_Text },
+ {ID3FID_DATE, "TDA", "TDAT", false, false, NULL, ID3FD_Text },
+ {ID3FID_TIME, "TIM", "TIME", false, false, NULL, ID3FD_Text },
+ {ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, NULL, ID3FD_Text },
+ {ID3FID_MEDIATYPE, "TMT", "TMED", false, false, NULL, ID3FD_Text },
+ {ID3FID_FILETYPE, "TFT", "TFLT", false, false, NULL, ID3FD_Text },
+ {ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, NULL, ID3FD_Text },
+ {ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, NULL, ID3FD_Text },
+ {ID3FID_LYRICIST, "TXT", "TEXT", false, false, NULL, ID3FD_Text },
+ {ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, NULL, ID3FD_Text },
+ {ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, NULL, ID3FD_Text },
+ {ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, NULL, ID3FD_Text },
+ {ID3FID_TITLE, "TT2", "TIT2", false, false, NULL, ID3FD_Text },
+ {ID3FID_SUBTITLE, "TT3", "TIT3", false, false, NULL, ID3FD_Text },
+ {ID3FID_LEADARTIST, "TP1", "TPE1", false, false, NULL, ID3FD_Text },
+ {ID3FID_BAND, "TP2", "TPE2", false, false, NULL, ID3FD_Text },
+ {ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, NULL, ID3FD_Text },
+ {ID3FID_MIXARTIST, "TP4", "TPE4", false, false, NULL, ID3FD_Text },
+ {ID3FID_ALBUM, "TAL", "TALB", false, false, NULL, ID3FD_Text },
+ {ID3FID_YEAR, "TYE", "TYER", false, false, NULL, ID3FD_Text },
+ {ID3FID_COMPOSER, "TCM", "TCOM", false, false, NULL, ID3FD_Text },
+ {ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, NULL, ID3FD_Text },
+ {ID3FID_PRODUCEDNOTICE, " ", "TPRO", false, false, NULL, ID3FD_Text },
+ {ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, NULL, ID3FD_Text },
+ {ID3FID_TRACKNUM, "TRK", "TRCK", false, false, NULL, ID3FD_Text },
+ {ID3FID_USERTEXT, "TXX", "TXXX", false, false, NULL, ID3FD_UserText },
+ {ID3FID_COMMENT, "COM", "COMM", false, false, NULL, ID3FD_GeneralText },
+ {ID3FID_TERMSOFUSE, " ", "USER", false, false, NULL, ID3FD_GeneralText },
+ {ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, NULL, ID3FD_GeneralText },
+ {ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, NULL, ID3FD_Timestamp2 },
+ {ID3FID_SYNCEDTEMPOCODE, "STC", "SYTC", false, false, NULL, ID3FD_Timestamp1 },
+ // URL Frames
+ {ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWARTIST, "WAR", "WOAR", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, NULL, ID3FD_URL },
+ {ID3FID_WWWUSER, "WXX", "WXXX", false, false, NULL, ID3FD_UserURL },
+ // misc frames
+ {ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, NULL, ID3FD_InvolvedPeople },
+ {ID3FID_PICTURE, "PIC", "APIC", false, false, NULL, ID3FD_Picture },
+ {ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, NULL, ID3FD_GEO },
+ {ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, NULL, ID3FD_UFI },
+ {ID3FID_PRIVATE, " ", "PRIV", false, false, NULL, ID3FD_PRIVATE },
+ {ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, NULL, ID3FD_PlayCounter },
+ {ID3FID_POPULARIMETER, "POP", "POPM", false, false, NULL, ID3FD_Popularimeter },
+ {ID3FID_CRYPTOREG, " ", "ENCR", false, false, NULL, ID3FD_Registration },
+ {ID3FID_GROUPINGREG, " ", "GRID", false, false, NULL, ID3FD_Registration },
+ {ID3FID_SIGNATURE, " ", "SIGN", false, false, NULL, ID3FD_Registration },
+ {ID3FID_MCDI, "MCI", "MCDI", false, false, NULL, ID3FD_MCDI},
+ {ID3FID_BPM, "TBP", "TBPM", false, false, NULL, ID3FD_Text},
+ {ID3FID_KEY, "TKE", "TKEY", false, false, NULL, ID3FD_Text},
+ {ID3FID_MOOD, " ", "TMOO", false, false, NULL, ID3FD_Text},
+ {ID3FID_ISRC, "TRC", "TSRC", false, false, NULL, ID3FD_Text},
+ {ID3FID_RECORDINGTIME, " ", "TDRC", false, false, NULL, ID3FD_Text},
+ {ID3FID_COMPILATION, "TCP", "TCMP", false, false, NULL, ID3FD_Text},
+ {ID3FID_ALBUMSORT, "TSA", "TSOA", false, false, NULL, ID3FD_Text},
+ {ID3FID_ALBUMARTISTSORT, "TS2", "TSO2", false, false, NULL, ID3FD_Text},
+ {ID3FID_PERFORMERSORT, "TSP", "TSOP", false, false, NULL, ID3FD_Text},
+ {ID3FID_COMPOSERSORT, "TSC", "TSOC", false, false, NULL, ID3FD_Text},
+ {ID3FID_TITLESORT, "TST", "TSOT", false, false, NULL, ID3FD_Text},
+ {ID3FID_REPLAYGAIN, " ", "RGAD", false, false, NULL, ID3FD_UserText },
+ {ID3FID_VOLUMEADJ, "RVA", "RVAD", false, false, NULL, ID3FD_Volume },
+ {ID3FID_INVOLVEDPEOPLE2, " ", "TIPL", false, false, NULL, ID3FD_InvolvedPeople },
+ {ID3FID_CREDITS, " ", "TMCL", false, false, NULL, ID3FD_InvolvedPeople },
+ {ID3FID_ENCODINGTIME, " ", "TDEN", false, false, NULL, ID3FD_Text },
+ {ID3FID_FILEOWNER, " ", "TOWN", false, false, NULL, ID3FD_Text },
+ {ID3FID_LENGTH, "TLE", "TLEN", false, false, NULL, ID3FD_Text },
+ {ID3FID_ORIGYEAR, "TOR", "TORY", false, false, NULL, ID3FD_Text },
+ {ID3FID_ORIGRELEASETIME, " ", "TDOR", false, false, NULL, ID3FD_Text },
+ {ID3FID_RELEASETIME, " ", "TDRL", false, false, NULL, ID3FD_Text },
+ {ID3FID_SETSUBTITLE, " ", "TSST", false, false, NULL, ID3FD_Text },
+ {ID3FID_TAGGINGTIME, " ", "TDTG", false, false, NULL, ID3FD_Text },
+ {ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, NULL, ID3FD_Text },
+ {ID3FID_PODCAST, " ", "PCST", false, false, NULL, ID3FD_Text },
+ {ID3FID_PODCASTCATEGORY, " ", "TCAT", false, false, NULL, ID3FD_Text },
+ {ID3FID_PODCASTDESC, " ", "TDES", false, false, NULL, ID3FD_Text },
+ {ID3FID_PODCASTID, " ", "TGID", false, false, NULL, ID3FD_Text },
+ {ID3FID_PODCASTURL, " ", "WFED", false, false, NULL, ID3FD_URL },
+ {ID3FID_NOFRAME }
+};
+
+ID3_Field::ID3_Field(void)
+{
+ name = ID3FN_NOFIELD;
+ type = ID3FTY_INTEGER;
+ data = 0;
+ size = 0;
+ flags = 0;
+ //SetVersion(3,0);
+ version = 3;
+ revision = 0;
+ fixedLength = -1;
+ ioVersion = 3;
+ ioRevision = 0;
+ control = ID3VC_HIGHER;
+
+ Clear();
+}
+
+ID3_Field::~ID3_Field(void)
+{
+ Clear();
+}
+
+void ID3_Field::Clear(void)
+{
+ if (data && type != ID3FTY_INTEGER) free(data);
+
+ type = ID3FTY_INTEGER;
+ data = 0;
+ size = sizeof (luint);
+ hasChanged = true;
+
+ return;
+}
+
+void ID3_Field::SetVersion (uchar ver, uchar rev)
+{
+ if (version != ver || revision != rev) hasChanged = true;
+
+ version = ver;
+ revision = rev;
+
+ return;
+}
+
+
+bool ID3_Field::HasChanged (void)
+{
+ return hasChanged;
+}
+
+
+luint ID3_Field::Size(void)
+{
+ return BinSize (false);
+}
+
+
+luint ID3_Field::BinSize(bool withExtras)
+{
+ luint bytes = 0;
+
+ if (control == ID3VC_HIGHER)
+ {
+ if (version < ioVersion || revision < ioRevision)
+ return 0;
+ }
+ else
+ {
+ if (version > ioVersion || revision > ioRevision)
+ return 0;
+ }
+
+ bytes = size;
+
+ if (withExtras)
+ {
+ if (!data && size)
+ {
+ if (flags & ID3FF_NULL)
+ bytes = 2;
+ else
+ bytes = 0;
+ }
+
+ // if we are a Unicode string, add 2 bytes for the BOM (but
+ // only if there is a string to render - regardless of NULL)
+ if (type == ID3FTY_UNICODESTRING && data && size) bytes += 2;
+
+ // if we are an ASCII string, divide by sizeof (wchar_t)
+ // because internally we store the string as Unicode, so
+ // the ASCII version will only be half as long
+ if (type == ID3FTY_UTF8STRING)
+ {
+ if (data && size)
+ bytes = WideCharToMultiByte(CP_UTF8, 0, (const wchar_t *)data, (int)(size/sizeof(wchar_t)), 0, 0, 0, 0);
+ else
+ bytes /= sizeof(wchar_t);
+ }
+
+ if (type == ID3FTY_ASCIISTRING)
+ {
+ // TODO: this statement isn't correct (especially for double byte)
+ // we could use WideCharToMultiByte to determine an exact byte count
+ bytes /= sizeof (wchar_t);
+ }
+ }
+ else
+ {
+ // because it seems that the application called us via ID3_Field::Size()
+ // we are going to return the number of characters, not bytes, so if
+ // the string is Unicode, we will half the 'bytes' variable because
+ // Unicode strings have twice as many bytes as they do characters
+ if (type == ID3FTY_UNICODESTRING)
+ bytes /= sizeof(wchar_t);
+ }
+
+ // check to see if we are within the legal limit for this field
+ // -1 means arbitrary length field
+ if (fixedLength != -1)
+ bytes = fixedLength;
+
+ return bytes;
+}
+
+
+luint ID3_Field::Parse(uchar *buffer, luint posn, luint buffSize)
+{
+ if (control == ID3VC_HIGHER)
+ {
+ if (version < ioVersion || revision < ioRevision)
+ return 0;
+ }
+ else
+ {
+ if (version > ioVersion || revision > ioRevision)
+ return 0;
+ }
+
+ switch(type)
+ {
+ case ID3FTY_INTEGER:
+ return ParseInteger(buffer, posn, buffSize);
+ case ID3FTY_BINARY:
+ return ParseBinary(buffer, posn, buffSize);
+ case ID3FTY_ASCIISTRING:
+ return ParseASCIIString(buffer, posn, buffSize);
+ case ID3FTY_UNICODESTRING:
+ return ParseUnicodeString(buffer, posn, buffSize);
+ case ID3FTY_UTF8STRING:
+ return ParseUTF8String(buffer, posn, buffSize);
+ default:
+ //ID3_THROW (ID3E_UnknownFieldType);
+ break;
+ }
+
+ return 0;
+}
+
+ID3_FrameDef *ID3_FindFrameDef(ID3_FrameID id)
+{
+ luint cur = 0;
+ while (1)
+ {
+ if (ID3_FrameDefs[cur].id == id)
+ return &ID3_FrameDefs[cur];
+ if (ID3_FrameDefs[cur].id == ID3FID_NOFRAME)
+ return NULL;
+ cur++;
+ }
+}
+
+ID3_FrameID ID3_FindFrameID(const char *id)
+{
+ luint cur = 0;
+ while (1)
+ {
+ if (ID3_FrameDefs[cur].id == ID3FID_NOFRAME)
+ return ID3FID_NOFRAME;
+ if (((strncmp(ID3_FrameDefs[cur].shortTextID, id, 3) == 0) && strlen (id) == 3)
+ || ((strncmp(ID3_FrameDefs[cur].longTextID, id, 4) == 0) && strlen (id) == 4))
+ return ID3_FrameDefs[cur].id;
+ cur++;
+ }
+}
+
+luint ID3_Field::Render(uchar *buffer)
+{
+ if (control == ID3VC_HIGHER)
+ {
+ if (version < ioVersion || revision < ioRevision)
+ return 0;
+ }
+ else
+ {
+ if (version > ioVersion || revision > ioRevision)
+ return 0;
+ }
+
+ switch(type)
+ {
+ case ID3FTY_INTEGER:
+ return RenderInteger(buffer);
+ case ID3FTY_BINARY:
+ return RenderBinary(buffer);
+ case ID3FTY_ASCIISTRING:
+ return RenderLatinString(buffer);
+ case ID3FTY_UNICODESTRING:
+ return RenderUnicodeString(buffer);
+ case ID3FTY_UTF8STRING:
+ return RenderUTF8String(buffer);
+ default:
+ // ID3_THROW (ID3E_UnknownFieldType);
+ break;
+ }
+ return 0;
+}
+
+