Go to the documentation of this file.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