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_TAG_IMPL_H_
00030
#define _ID3LIB_TAG_IMPL_H_
00031
00032
#include <list>
00033
#include <stdio.h>
00034
#include "tag.h"
00035
#include "header_tag.h"
00036
#include "mp3_header.h"
00037
00038
class ID3_Reader;
00039
class ID3_Writer;
00040
00041 namespace dami
00042 {
00043 namespace id3
00044 {
00045 namespace v1
00046 {
00047
bool parse(
ID3_TagImpl&,
ID3_Reader&);
00048
void render(
ID3_Writer&,
const ID3_TagImpl&);
00049 };
00050 namespace v2
00051 {
00052
bool parse(
ID3_TagImpl& tag,
ID3_Reader& rdr);
00053
void render(
ID3_Writer& writer,
const ID3_TagImpl& tag);
00054 };
00055 };
00056 namespace lyr3
00057 {
00058 namespace v1
00059 {
00060
bool parse(
ID3_TagImpl&,
ID3_Reader&);
00061 };
00062 namespace v2
00063 {
00064
bool parse(
ID3_TagImpl&,
ID3_Reader&);
00065 };
00066 };
00067 namespace mm
00068 {
00069
bool parse(
ID3_TagImpl&,
ID3_Reader&);
00070 };
00071 };
00072
00073 class ID3_TagImpl
00074 {
00075
typedef std::list<ID3_Frame *> Frames;
00076
public:
00077 typedef Frames::iterator
iterator;
00078 typedef Frames::const_iterator
const_iterator;
00079
public:
00080
ID3_TagImpl(
const char *name = NULL);
00081
ID3_TagImpl(
const ID3_Tag &tag);
00082
virtual ~ID3_TagImpl();
00083
00084
void Clear();
00085
bool HasChanged() const;
00086 void SetChanged(
bool b) { _changed = b; }
00087 size_t
Size() const;
00088
00089
bool SetUnsync(
bool);
00090
bool SetExtended(
bool);
00091
bool SetExperimental(
bool);
00092
bool SetPadding(
bool);
00093
00094
bool GetUnsync() const;
00095
bool GetExtended() const;
00096
bool GetExperimental() const;
00097
bool GetFooter() const;
00098
00099 size_t GetExtendedBytes() const;
00100
00101
void AddFrame(const
ID3_Frame&);
00102
void AddFrame(const ID3_Frame*);
00103
bool AttachFrame(ID3_Frame*);
00104 ID3_Frame* RemoveFrame(const ID3_Frame *);
00105
00106 size_t Link(const
char *fileInfo, flags_t = (flags_t) ID3TT_ALL);
00107 size_t Link(
ID3_Reader &reader, flags_t = (flags_t) ID3TT_ALL);
00108 flags_t Update(flags_t = (flags_t) ID3TT_ALL);
00109 flags_t Strip(flags_t = (flags_t) ID3TT_ALL);
00110
00111 size_t GetPrependedBytes()
const {
return _prepended_bytes; }
00112 size_t
GetAppendedBytes()
const {
return _appended_bytes; }
00113 size_t
GetFileSize()
const {
return _file_size; }
00114 dami::String
GetFileName()
const {
return _file_name; }
00115
00116
ID3_Frame* Find(ID3_FrameID
id)
const;
00117
ID3_Frame* Find(ID3_FrameID
id, ID3_FieldID fld, uint32 data)
const;
00118
ID3_Frame* Find(ID3_FrameID
id, ID3_FieldID fld, dami::String) const;
00119
ID3_Frame* Find(ID3_FrameID
id, ID3_FieldID fld, dami::WString) const;
00120
00121 size_t NumFrames()
const {
return _frames.size(); }
00122
ID3_TagImpl& operator=(
const ID3_Tag & );
00123
00124 bool HasTagType(ID3_TagType tt)
const {
return _file_tags.
test(tt); }
00125
ID3_V2Spec GetSpec() const;
00126
bool SetSpec(ID3_V2Spec);
00127
00128 static size_t IsV2Tag(
ID3_Reader&);
00129
00130 const
Mp3_Headerinfo* GetMp3HeaderInfo()
const {
if (_mp3_info)
return _mp3_info->
GetMp3HeaderInfo();
else return NULL; }
00131
00132 iterator begin() {
return _frames.begin(); }
00133 iterator end() {
return _frames.end(); }
00134 const_iterator begin()
const {
return _frames.begin(); }
00135 const_iterator end() const {
return _frames.end(); }
00136
00137
00138 void AddNewFrame(
ID3_Frame* f) { this->
AttachFrame(f); }
00139 size_t Link(
const char *fileInfo,
bool parseID3v1,
bool parseLyrics3);
00140 void SetCompression(
bool) { ; }
00141
void AddFrames(
const ID3_Frame *, size_t);
00142 bool HasLyrics()
const {
return this->HasTagType(
ID3TT_LYRICS); }
00143 bool HasV2Tag() const {
return this->HasTagType(
ID3TT_ID3V2); }
00144 bool HasV1Tag() const {
return this->HasTagType(
ID3TT_ID3V1); }
00145 size_t PaddingSize(size_t) const;
00146
00147 protected:
00148 const_iterator Find(const
ID3_Frame *) const;
00149 iterator Find(const
ID3_Frame *);
00150
00151
void RenderExtHeader(uchar *);
00152
00153
void ParseFile();
00154
void ParseReader(
ID3_Reader &reader);
00155
00156 private:
00157
ID3_TagHeader _hdr;
00158
bool _is_padded;
00159
00160 Frames _frames;
00161
00162 mutable const_iterator _cursor;
00163 mutable
bool _changed;
00164
00165
00166 dami::String _file_name;
00167 size_t _file_size;
00168 size_t _prepended_bytes;
00169 size_t _appended_bytes;
00170
bool _is_file_writable;
00171
ID3_Flags _tags_to_parse;
00172
ID3_Flags _file_tags;
00173
Mp3Info *_mp3_info;
00174 };
00175
00176 size_t ID3_GetDataSize(const
ID3_TagImpl&);
00177
00178 #endif
00179