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 #include <memory.h>
00029 #include "header_frame.h"
00030 #include "id3/utils.h"
00031 #include "frame_def.h"
00032 #include "field_def.h"
00033 #include "field_impl.h"
00034 #include "io_helpers.h"
00035
00036 using namespace dami;
00037
00038 void ID3_FrameHeader::SetUnknownFrame(const char* id)
00039 {
00040 Clear();
00041 _frame_def = new ID3_FrameDef;
00042 if (NULL == _frame_def)
00043 {
00044
00045 return;
00046 }
00047 _frame_def->eID = ID3FID_NOFRAME;
00048 _frame_def->bTagDiscard = false;
00049 _frame_def->bFileDiscard = false;
00050 _frame_def->aeFieldDefs = ID3_FieldDef::DEFAULT;
00051 _frame_def->sDescription = NULL;
00052 if (strlen(id) <= 3)
00053 {
00054 strcpy(_frame_def->sShortTextID, id);
00055 strcpy(_frame_def->sLongTextID, "");
00056 }
00057 else
00058 {
00059 strcpy(_frame_def->sLongTextID, id);
00060 strcpy(_frame_def->sShortTextID, "");
00061 }
00062 _dyn_frame_def = true;
00063 }
00064
00065 bool ID3_FrameHeader::SetFrameID(ID3_FrameID id)
00066 {
00067 if (id == ID3FID_NOFRAME || id == this->GetFrameID())
00068 {
00069 return false;
00070 }
00071 _frame_def = ID3_FindFrameDef(id);
00072 _flags.set(TAGALTER, _frame_def->bTagDiscard);
00073 _flags.set(FILEALTER, _frame_def->bFileDiscard);
00074
00075 _changed = true;
00076 return true;
00077 }
00078
00079 size_t ID3_FrameHeader::Size() const
00080 {
00081 if (!_info)
00082 {
00083 return 0;
00084 }
00085 return
00086 _info->frame_bytes_id +
00087 _info->frame_bytes_size +
00088 _info->frame_bytes_flags;
00089 }
00090
00091 bool ID3_FrameHeader::Parse(ID3_Reader& reader)
00092 {
00093 ID3D_NOTICE( "ID3_FrameHeader::Parse(): getCur() = " << reader.getCur() );
00094 io::ExitTrigger et(reader);
00095 if (!_info)
00096 {
00097 return false;
00098 }
00099 if (reader.getEnd() < reader.getCur() + 10)
00100 {
00101 return false;
00102 }
00103
00104 String textID = io::readText(reader, _info->frame_bytes_id);
00105
00106 ID3D_NOTICE( "ID3_FrameHeader::Parse: textID = " << textID );
00107 ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
00108
00109 ID3_FrameID fid = ID3_FindFrameID(textID.c_str());
00110 if (ID3FID_NOFRAME == fid)
00111 {
00112 this->SetUnknownFrame(textID.c_str());
00113 ID3D_NOTICE( "ID3_FrameHeader::Parse: unknown frame id" );
00114 }
00115 else
00116 {
00117 this->SetFrameID(fid);
00118 }
00119
00120 uint32 dataSize = io::readBENumber(reader, _info->frame_bytes_size);
00121 ID3D_NOTICE( "ID3_FrameHeader::Parse: dataSize = " << dataSize );
00122 ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
00123 this->SetDataSize(dataSize);
00124
00125 uint32 flags = io::readBENumber(reader, _info->frame_bytes_flags);
00126 _flags.add(flags);
00127
00128 ID3D_NOTICE( "ID3_FrameHeader::Parse: flags = " << flags );
00129 ID3D_NOTICE( "ID3_FrameHeader::Parse: getCur() = " << reader.getCur() );
00130 et.setExitPos(reader.getCur());
00131
00132 return true;
00133 }
00134
00135 void ID3_FrameHeader::Render(ID3_Writer& writer) const
00136 {
00137 size_t size = 0;
00138
00139 if (NULL == _frame_def)
00140 {
00141
00142 ID3D_WARNING( "ID3_FrameHeader::Render(): _frame_def is NULL!" );
00143 return;
00144
00145 }
00146 char *textID;
00147 if (_info->frame_bytes_id == strlen(_frame_def->sShortTextID))
00148 {
00149 textID = _frame_def->sShortTextID;
00150 }
00151 else
00152 {
00153 textID = _frame_def->sLongTextID;
00154 }
00155
00156 ID3D_NOTICE( "ID3_FrameHeader::Render(): writing " << textID << ", " << (int) _info->frame_bytes_size << " bytes");
00157 writer.writeChars((uchar *) textID, _info->frame_bytes_id);
00158
00159 io::writeBENumber(writer, _data_size, _info->frame_bytes_size);
00160 io::writeBENumber(writer, _flags.get(), _info->frame_bytes_flags);
00161 }
00162
00163 const char* ID3_FrameHeader::GetTextID() const
00164 {
00165 char *textID = "";
00166 if (_info && _frame_def)
00167 {
00168 if (_info->frame_bytes_id == strlen(_frame_def->sShortTextID))
00169 {
00170 textID = _frame_def->sShortTextID;
00171 }
00172 else
00173 {
00174 textID = _frame_def->sLongTextID;
00175 }
00176 }
00177 return textID;
00178 }
00179
00180 ID3_FrameHeader& ID3_FrameHeader::operator=(const ID3_FrameHeader& hdr)
00181 {
00182 if (this != &hdr)
00183 {
00184 this->Clear();
00185 this->ID3_Header::operator=(hdr);
00186 if (!hdr._dyn_frame_def)
00187 {
00188 _frame_def = hdr._frame_def;
00189 }
00190 else
00191 {
00192 _frame_def = new ID3_FrameDef;
00193 if (NULL == _frame_def)
00194 {
00195
00196 }
00197 _frame_def->eID = hdr._frame_def->eID;
00198 _frame_def->bTagDiscard = hdr._frame_def->bTagDiscard;
00199 _frame_def->bFileDiscard = hdr._frame_def->bFileDiscard;
00200 _frame_def->aeFieldDefs = hdr._frame_def->aeFieldDefs;
00201 strcpy(_frame_def->sShortTextID, hdr._frame_def->sShortTextID);
00202 strcpy(_frame_def->sLongTextID, hdr._frame_def->sLongTextID);
00203 _dyn_frame_def = true;
00204 }
00205 }
00206 return *this;
00207 }
00208
00209 ID3_FrameID ID3_FrameHeader::GetFrameID() const
00210 {
00211 ID3_FrameID eID = ID3FID_NOFRAME;
00212 if (NULL != _frame_def)
00213 {
00214 eID = _frame_def->eID;
00215 }
00216
00217 return eID;
00218 }
00219
00220 const ID3_FrameDef *ID3_FrameHeader::GetFrameDef() const
00221 {
00222 return _frame_def;
00223 }
00224
00225 bool ID3_FrameHeader::Clear()
00226 {
00227 bool changed = this->ID3_Header::Clear();
00228 if (_dyn_frame_def)
00229 {
00230 delete _frame_def;
00231 _dyn_frame_def = false;
00232 changed = true;
00233 }
00234 if (_frame_def)
00235 {
00236 _frame_def = NULL;
00237 changed = true;
00238 }
00239 return changed;
00240 }
00241