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 #include <stdio.h>
00028
00029 #include <memory.h>
00030
00031 #include "field_impl.h"
00032 #include "reader.h"
00033 #include "writer.h"
00034 #include "io_helpers.h"
00035 #include "id3/utils.h"
00036
00037 using namespace dami;
00038
00039 size_t ID3_FieldImpl::Set(const uchar* data, size_t len)
00040 {
00041 size_t size = 0;
00042 if ((this->GetType() == ID3FTY_BINARY) && data && len)
00043 {
00044 BString str(data, len);
00045 size = dami::min(len, this->SetBinary(str));
00046 }
00047 return size;
00048 }
00049
00055 size_t ID3_FieldImpl::SetBinary(BString data)
00056 {
00057 size_t size = 0;
00058 if (this->GetType() == ID3FTY_BINARY)
00059 {
00060 this->Clear();
00061 size_t fixed = _fixed_size;
00062 size = data.size();
00063 if (fixed == 0)
00064 {
00065 _binary = data;
00066 }
00067 else
00068 {
00069 _binary.assign(data, 0, dami::min(size, fixed));
00070 if (size < fixed)
00071 {
00072 _binary.append(fixed - size, '\0');
00073 }
00074 }
00075 size = _binary.size();
00076 _changed = true;
00077 }
00078 return size;
00079 }
00080
00081 BString ID3_FieldImpl::GetBinary() const
00082 {
00083 BString data;
00084 if (this->GetType() == ID3FTY_BINARY)
00085 {
00086 data = _binary;
00087 }
00088 return data;
00089 }
00090
00091
00092 const uchar* ID3_FieldImpl::GetRawBinary() const
00093 {
00094 const uchar* data = NULL;
00095 if (this->GetType() == ID3FTY_BINARY)
00096 {
00097 data = _binary.data();
00098 }
00099 return data;
00100 }
00101
00102
00113 size_t ID3_FieldImpl::Get(uchar *buffer,
00114 size_t max_bytes
00115 ) const
00116 {
00117 size_t bytes = 0;
00118 if (this->GetType() == ID3FTY_BINARY)
00119 {
00120 bytes = dami::min(max_bytes, this->Size());
00121 if (NULL != buffer && bytes > 0)
00122 {
00123 ::memcpy(buffer, _binary.data(), bytes);
00124 }
00125 }
00126 return bytes;
00127 }
00128
00129
00136 void ID3_FieldImpl::FromFile(const char *info
00137 )
00138 {
00139 if (this->GetType() != ID3FTY_BINARY || NULL == info)
00140 {
00141 return;
00142 }
00143
00144 FILE* temp_file = ::fopen(info, "rb");
00145 if (temp_file != NULL)
00146 {
00147 ::fseek(temp_file, 0, SEEK_END);
00148 size_t fileSize = ::ftell(temp_file);
00149 ::fseek(temp_file, 0, SEEK_SET);
00150
00151 uchar* buffer = new uchar[fileSize];
00152 if (buffer != NULL)
00153 {
00154 ::fread(buffer, 1, fileSize, temp_file);
00155
00156 this->Set(buffer, fileSize);
00157
00158 delete [] buffer;
00159 }
00160
00161 ::fclose(temp_file);
00162 }
00163 }
00164
00165
00172 void ID3_FieldImpl::ToFile(const char *info
00173 ) const
00174 {
00175 if (this->GetType() != ID3FTY_BINARY || NULL == info)
00176 {
00177 return;
00178 }
00179
00180 size_t size = this->Size();
00181 if (size > 0)
00182 {
00183 FILE* temp_file = ::fopen(info, "wb");
00184 if (temp_file != NULL)
00185 {
00186 ::fwrite(_binary.data(), 1, size, temp_file);
00187 ::fclose(temp_file);
00188 }
00189 }
00190
00191 return ;
00192 }
00193
00194
00195 bool ID3_FieldImpl::ParseBinary(ID3_Reader& reader)
00196 {
00197
00198
00199 _binary = io::readAllBinary(reader);
00200 return true;
00201 }
00202
00203 void ID3_FieldImpl::RenderBinary(ID3_Writer& writer) const
00204 {
00205 writer.writeChars(this->GetRawBinary(), this->Size());
00206 }
00207