winamp/Src/id3v2/id3_field.cpp

521 lines
24 KiB
C++
Raw Normal View History

2024-09-24 13:54:57 +01:00
// 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;
}