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
00029 #ifndef _ID3LIB_HEADER_H_
00030 #define _ID3LIB_HEADER_H_
00031
00032 #include "id3/globals.h"
00033 #include "flags.h"
00034
00035 class ID3_Reader;
00036 class ID3_Writer;
00037
00038 class ID3_Header
00039 {
00040 public:
00041 struct Info
00042 {
00043 uchar frame_bytes_id;
00044 uchar frame_bytes_size;
00045 uchar frame_bytes_flags;
00046 bool is_extended;
00047 size_t extended_bytes;
00048 bool is_experimental;
00049 };
00050
00051 ID3_Header()
00052 : _spec (ID3V2_UNKNOWN),
00053 _data_size (0),
00054 _changed (false)
00055 {
00056 this->Clear();
00057 _changed = false;
00058 }
00059 virtual ~ID3_Header() { ; }
00060
00061 virtual bool SetSpec(ID3_V2Spec);
00062 ID3_V2Spec GetSpec() const { return _spec; }
00063
00064 bool SetDataSize(size_t size)
00065 {
00066 bool changed = size != _data_size;
00067 _changed = _changed || changed;
00068 _data_size = size;
00069 return changed;
00070 }
00071 size_t GetDataSize() const { return _data_size; }
00072
00073 virtual bool Clear()
00074 {
00075 bool changed = this->SetDataSize(0);
00076 if (this->GetSpec() == ID3V2_UNKNOWN)
00077 {
00078 this->SetSpec(ID3V2_LATEST);
00079 changed = true;
00080 }
00081 changed = _flags.clear() || changed;
00082 _changed = changed || _changed;
00083 return changed;
00084 }
00085 virtual size_t Size() const = 0;
00086
00087 virtual void Render(ID3_Writer&) const = 0;
00088 virtual bool Parse(ID3_Reader&) = 0;
00089
00090 ID3_Header &operator=( const ID3_Header &rhs)
00091 {
00092 if (this != &rhs)
00093 {
00094 this->SetSpec(rhs.GetSpec());
00095 this->SetDataSize(rhs.GetSpec());
00096 this->_flags = rhs._flags;
00097 }
00098 return *this;
00099 }
00100
00101 protected:
00102 ID3_V2Spec _spec;
00103 size_t _data_size;
00104 ID3_Flags _flags;
00105 Info* _info;
00106 bool _changed;
00107 }
00108 ;
00109
00110 #endif