00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _ID3LIB_FIELD_IMPL_H_
00029 #define _ID3LIB_FIELD_IMPL_H_
00030
00031 #include <stdlib.h>
00032 #include "field.h"
00033 #include "strings.h"
00034
00035 struct ID3_FieldDef;
00036 struct ID3_FrameDef;
00037 class ID3_Frame;
00038 class ID3_Reader;
00039
00040 class ID3_FieldImpl : public ID3_Field
00041 {
00042 friend class ID3_FrameImpl;
00043 public:
00044 ~ID3_FieldImpl();
00045
00046 void Clear();
00047
00048 size_t Size() const;
00049 size_t BinSize() const;
00050 size_t GetNumTextItems() const;
00051
00052
00053 ID3_Field& operator= (uint32 val) { this->Set(val); return *this; }
00054 void Set(uint32);
00055 uint32 Get() const;
00056
00057 void SetInteger(uint32);
00058 uint32 GetInteger() const;
00059
00060
00061 ID3_Field& operator= (const char* s) { this->Set(s); return *this; }
00062 size_t Set(const char* data);
00063 size_t Get(char*, size_t) const;
00064 size_t Get(char*, size_t, index_t) const;
00065 const char* GetRawText() const;
00066 const char* GetRawTextItem(index_t) const;
00067 size_t Add(const char* data);
00068
00069 dami::String GetText() const;
00070 dami::String GetTextItem(index_t) const;
00071 size_t SetText(dami::String);
00072 size_t AddText(dami::String);
00073
00074
00075 ID3_Field& operator= (const unicode_t* s) { this->Set(s); return *this; }
00076 size_t Set(const unicode_t*);
00077 size_t Get(unicode_t *buffer, size_t) const;
00078 size_t Get(unicode_t *buffer, size_t, index_t) const;
00079 size_t Add(const unicode_t*);
00080 const unicode_t* GetRawUnicodeText() const;
00081 const unicode_t* GetRawUnicodeTextItem(index_t) const;
00082
00083
00084 size_t Set(const uchar* buf, size_t size);
00085 size_t Set(const char* buf, size_t size)
00086 {
00087 return this->Set(reinterpret_cast<const uchar *>(buf), size);
00088 }
00089 size_t Get(uchar*, size_t) const;
00090 const uchar* GetRawBinary() const;
00091 void FromFile(const char*);
00092 void ToFile(const char *sInfo) const;
00093
00094 size_t SetBinary(dami::BString);
00095 dami::BString GetBinary() const;
00096
00097
00098 ID3_Field& operator=( const ID3_Field & );
00099 bool InScope(ID3_V2Spec spec) const
00100 { return _spec_begin <= spec && spec <= _spec_end; }
00101
00102 ID3_FieldID GetID() const { return _id; }
00103 ID3_FieldType GetType() const { return _type; }
00104 bool SetEncoding(ID3_TextEnc enc);
00105 ID3_TextEnc GetEncoding() const { return _enc; }
00106 bool IsEncodable() const { return (_flags & ID3FF_ENCODABLE) > 0; }
00107
00108
00109 void Render(ID3_Writer&) const;
00110 bool Parse(ID3_Reader&);
00111 bool HasChanged() const;
00112
00113 private:
00114 size_t SetText_i(dami::String);
00115 size_t AddText_i(dami::String);
00116
00117 private:
00118
00119 ID3_FieldImpl();
00120 ID3_FieldImpl(const ID3_FieldDef&);
00121
00122 const ID3_FieldID _id;
00123 const ID3_FieldType _type;
00124 const ID3_V2Spec _spec_begin;
00125 const ID3_V2Spec _spec_end;
00126 const flags_t _flags;
00127 mutable bool _changed;
00128
00129 dami::BString _binary;
00130 dami::String _text;
00131 uint32 _integer;
00132
00133 const size_t _fixed_size;
00134 size_t _num_items;
00135 ID3_TextEnc _enc;
00136 protected:
00137 void RenderInteger(ID3_Writer&) const;
00138 void RenderText(ID3_Writer&) const;
00139 void RenderBinary(ID3_Writer&) const;
00140
00141 bool ParseInteger(ID3_Reader&);
00142 bool ParseText(ID3_Reader&);
00143 bool ParseBinary(ID3_Reader&);
00144
00145 };
00146
00147
00148
00149 ID3_FrameDef *ID3_FindFrameDef(ID3_FrameID id);
00150 ID3_FrameID ID3_FindFrameID(const char *id);
00151
00152 #endif