// 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 jan-08-2006 benski #ifndef ID3LIB_FIELD_H #define ID3LIB_FIELD_H #include #include "id3_types.h" #include "id3_error.h" // field flags #define ID3FF_NULL (1 << 0) #define ID3FF_NULLDIVIDE (1 << 1) #define ID3FF_ADJUSTENC (1 << 2) #define ID3FF_ADJUSTEDBY (1 << 3) enum ID3_TextEnc { ID3TE_ASCII = 0, ID3TE_UNICODE = 1, // UTF-16 ID3TE_UTF16_BE = 2, // UTF-16 big endian, no BOM ID3TE_UTF8 = 3, // UTF-8 }; enum ID3_FieldType { ID3FTY_INTEGER = 0, ID3FTY_BITFIELD, ID3FTY_BINARY, ID3FTY_ASCIISTRING, ID3FTY_UNICODESTRING, ID3FTY_UTF8STRING, }; enum ID3_FieldID { ID3FN_NOFIELD = 0, ID3FN_TEXTENC, ID3FN_TEXT, ID3FN_URL, ID3FN_DATA, ID3FN_DESCRIPTION, ID3FN_OWNER, ID3FN_EMAIL, ID3FN_RATING, ID3FN_FILENAME, ID3FN_LANGUAGE, ID3FN_PICTURETYPE, ID3FN_IMAGEFORMAT, ID3FN_MIMETYPE, ID3FN_TIMESTAMP, ID3FN_CONTENTTYPE, ID3FN_COUNTER, ID3FN_SYMBOL, ID3FN_VOLUMEADJ, ID3FN_NUMBITS, ID3FN_VOLCHGRIGHT, ID3FN_VOLCHGLEFT, ID3FN_PEAKVOLRIGHT, ID3FN_PEAKVOLLEFT, ID3FN_CD_TOC, ID3FN_LASTFIELDID }; enum ID3_FrameID { ID3FID_NOFRAME = 0, ID3FID_ENCODEDBY, ID3FID_ORIGALBUM, ID3FID_PUBLISHER, ID3FID_ENCODERSETTINGS, ID3FID_ORIGFILENAME, ID3FID_LANGUAGE, ID3FID_PARTINSET, ID3FID_DATE, ID3FID_TIME, ID3FID_RECORDINGDATES, ID3FID_MEDIATYPE, ID3FID_FILETYPE, ID3FID_NETRADIOSTATION, ID3FID_NETRADIOOWNER, ID3FID_LYRICIST, ID3FID_ORIGARTIST, ID3FID_ORIGLYRICIST, ID3FID_CONTENTGROUP, ID3FID_TITLE, ID3FID_SUBTITLE, ID3FID_LEADARTIST, ID3FID_BAND, ID3FID_CONDUCTOR, ID3FID_MIXARTIST, ID3FID_ALBUM, ID3FID_YEAR, ID3FID_COMPOSER, ID3FID_COPYRIGHT, ID3FID_PRODUCEDNOTICE, ID3FID_CONTENTTYPE, ID3FID_TRACKNUM, ID3FID_USERTEXT, ID3FID_COMMENT, ID3FID_TERMSOFUSE, ID3FID_UNSYNCEDLYRICS, ID3FID_SYNCEDLYRICS, ID3FID_SYNCEDTEMPOCODE, ID3FID_WWWAUDIOFILE, ID3FID_WWWARTIST, ID3FID_WWWAUDIOSOURCE, ID3FID_WWWCOMMERCIALINFO, ID3FID_WWWCOPYRIGHT, ID3FID_WWWPUBLISHER, ID3FID_WWWPAYMENT, ID3FID_WWWRADIOPAGE, ID3FID_WWWUSER, ID3FID_INVOLVEDPEOPLE, ID3FID_PICTURE, ID3FID_GENERALOBJECT, ID3FID_UNIQUEFILEID, ID3FID_PRIVATE, ID3FID_PLAYCOUNTER, ID3FID_POPULARIMETER, ID3FID_CRYPTOREG, ID3FID_GROUPINGREG, ID3FID_SIGNATURE, ID3FID_MCDI, ID3FID_BPM, ID3FID_KEY, ID3FID_MOOD, ID3FID_ISRC, ID3FID_RECORDINGTIME, ID3FID_COMPILATION, ID3FID_ALBUMSORT, ID3FID_ALBUMARTISTSORT, ID3FID_PERFORMERSORT, ID3FID_COMPOSERSORT, ID3FID_TITLESORT, ID3FID_REPLAYGAIN, ID3FID_VOLUMEADJ, ID3FID_INVOLVEDPEOPLE2, ID3FID_CREDITS, ID3FID_ENCODINGTIME, ID3FID_FILEOWNER, ID3FID_LENGTH, ID3FID_ORIGYEAR, ID3FID_ORIGRELEASETIME, ID3FID_RELEASETIME, ID3FID_SETSUBTITLE, ID3FID_TAGGINGTIME, ID3FID_PLAYLISTDELAY, ID3FID_PODCAST, ID3FID_PODCASTCATEGORY, ID3FID_PODCASTDESC, ID3FID_PODCASTID, ID3FID_PODCASTURL, }; enum ID3_VerCtl { ID3VC_HIGHER = 0, ID3VC_LOWER }; struct ID3_FieldDef { ID3_FieldID id; ID3_FieldType type; lsint fixedLength; uchar version; uchar revision; ID3_VerCtl control; luint flags; ID3_FieldID linkedField; }; class ID3_Frame; // TODO: add minimum/maximum version & revision struct ID3_FrameDef { ID3_FrameID id; char *shortTextID; char *longTextID; bool tagDiscard; bool fileDiscard; bool (*parseHandler)(ID3_Frame *frame); ID3_FieldDef *fieldDefs; }; class ID3_Field { public: ID3_Field(void); ~ID3_Field(void); void Clear(void); luint Size(void); luint GetNumTextItems(void); // integer field functions //ID3_Field& operator= (luint newData); void Set(luint newData); luint Get(void); // Unicode string field functions //ID3_Field& operator= (wchar_t *string); void SetUnicode(const wchar_t *string); luint GetUnicode(wchar_t *buffer, luint maxChars, luint itemNum = 1); void AddUnicode(const wchar_t *string); // ASCII string field functions //ID3_Field& operator= (char *string); void SetLatin(const char *string); void SetLocal(const char *string); void SetUTF8(const char *string); luint GetLocal(char *buffer, luint maxChars, luint itemNum = 1); luint GetLatin(char *buffer, luint maxChars, luint itemNum = 1); void AddLocal(const char *string); void AddLatin(const char *string); // binary field functions void Set(uchar *newData, luint newSize); void Get(uchar *buffer, luint buffLength); // *** PRIVATE INTERNAL DATA - DO NOT USE *** PRIVATE INTERNAL DATA - DO NOT USE *** luint BinSize(bool withExtras = true); bool HasChanged(void); void SetVersion(uchar ver, uchar rev); luint Render(uchar *buffer); luint Parse(uchar *buffer, luint posn, luint buffSize); ID3_FieldID name; // the ID of this field ID3_FieldType type; // what type is this field or should be lsint fixedLength; // if this is positive, the length of the field is fixed uchar ioVersion; // specific version uchar ioRevision; // specific revision ID3_VerCtl control; // render if ver/rev is higher, or lower than frame::version, frame::revision? luint flags; // special field flags uchar version; // the version being rendered/parsed uchar revision; // the revision being rendered/parsed bool hasChanged; // has the field changed since the last parse/render? protected: luint RenderInteger (uchar *buffer); luint RenderLatinString(uchar *buffer); luint RenderUnicodeString (uchar *buffer); luint RenderUTF8String(uchar *buffer); luint RenderBinary (uchar *buffer); luint ParseInteger (uchar *buffer, luint posn, luint buffSize); luint ParseASCIIString (uchar *buffer, luint posn, luint buffSize); luint ParseUnicodeString (uchar *buffer, luint posn, luint buffSize); luint ParseUTF8String(uchar *buffer, luint posn, luint buffSize); luint ParseBinary (uchar *buffer, luint posn, luint buffSize); uchar *data; luint size; }; ID3_FrameDef *ID3_FindFrameDef (ID3_FrameID id); ID3_FrameID ID3_FindFrameID(const char *id); #endif