diff options
Diffstat (limited to 'Src/replicant/nsid3v2/extendedheader.cpp')
-rw-r--r-- | Src/replicant/nsid3v2/extendedheader.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/Src/replicant/nsid3v2/extendedheader.cpp b/Src/replicant/nsid3v2/extendedheader.cpp new file mode 100644 index 00000000..b0440ae7 --- /dev/null +++ b/Src/replicant/nsid3v2/extendedheader.cpp @@ -0,0 +1,108 @@ +#include "extendedheader.h" +#include "util.h" +#include <string.h> +#include <stdlib.h> +#include "foundation/error.h" + +ID3v2_21::ExtendedHeaderBase::ExtendedHeaderBase(const ID3v2::Header &_tagHeader) : tagHeader(_tagHeader) +{ + memset(&headerData, 0, sizeof(ExtendedHeaderData)); + data = 0; + data_size = 0; +} + +uint32_t ID3v2_21::ExtendedHeaderBase::Size() const +{ + return headerData.size; +} + +int ID3v2_21::ExtendedHeaderBase::Parse(const void *_data, size_t len, size_t *bytes_read) +{ + if (len < SIZE) + return 1; + + if (tagHeader.Unsynchronised()) + { + *bytes_read = ID3v2::Util::UnsynchroniseTo(&headerData, _data, SIZE); + } + else + { + memcpy(&headerData, _data, SIZE); + *bytes_read = SIZE; + } + + _data = (const uint8_t *)_data+SIZE; + + /* read any data after the header */ + data_size = Size(); + if (data_size) + { + /* sanity check size */ + if (tagHeader.Unsynchronised()) + { + if (ID3v2::Util::UnsynchronisedInputSize(_data, data_size) > len) + return 1; + } + else if (data_size > len) + return 1; + + /* allocate and read data */ + data = malloc(data_size); + if (tagHeader.Unsynchronised()) + { + *bytes_read += ID3v2::Util::UnsynchroniseTo(data, _data, data_size); + } + else + { + memcpy(data, _data, data_size); + *bytes_read += data_size; + } + } + + return 0; +} + +/* === ID3v2.3 === */ +ID3v2_3::ExtendedHeader::ExtendedHeader(const ID3v2::Header &_tagHeader) : ID3v2_21::ExtendedHeaderBase(_tagHeader) +{ +} + +/* === ID3v2.4 === */ +ID3v2_4::ExtendedHeader::ExtendedHeader(const ID3v2::Header &_tagHeader) : ID3v2_21::ExtendedHeaderBase(_tagHeader) +{ +} + +uint32_t ID3v2_4::ExtendedHeader::Size() const +{ + return ID3v2::Util::Int28To32(headerData.size); +} + +int ID3v2_4::ExtendedHeader::Parse(const void *_data, size_t len, size_t *bytes_read) +{ + if (len < SIZE) + return 1; + + memcpy(&headerData, _data, SIZE); + *bytes_read = SIZE; + + + _data = (const uint8_t *)_data+SIZE; + + /* read any data after the header */ + data_size = Size(); + if (data_size) + { + /* sanity check size */ + if (data_size > len) + return 1; + + /* allocate and read data */ + data = malloc(data_size); + if (!data) + return NErr_OutOfMemory; + memcpy(data, _data, data_size); + *bytes_read += data_size; + } + + return 0; +} |