diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nsapev2/header.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/replicant/nsapev2/header.cpp')
-rw-r--r-- | Src/replicant/nsapev2/header.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Src/replicant/nsapev2/header.cpp b/Src/replicant/nsapev2/header.cpp new file mode 100644 index 00000000..eee96b9a --- /dev/null +++ b/Src/replicant/nsapev2/header.cpp @@ -0,0 +1,91 @@ +#include "header.h" +#include "flags.h" +#include "util.h" +#include "nu/ByteReader.h" +#include "nu/ByteWriter.h" +#include <limits.h> +#include <stdlib.h> +#include <string.h> + +static char apev2_preamble[] = { 'A', 'P', 'E', 'T', 'A', 'G', 'E', 'X' }; +APEv2::Header::Header() +{ + memcpy(preamble, apev2_preamble, 8); + version=2000; + size=0; + items=0; + flags=0; + reserved=0; +} + +APEv2::Header::Header(const void *data) +{ + bytereader_value_t byte_reader; + bytereader_init(&byte_reader, data, Header::SIZE); + + bytereader_read_n(&byte_reader, preamble, 8); + version=bytereader_read_u32_le(&byte_reader); + size=bytereader_read_u32_le(&byte_reader); + items=bytereader_read_u32_le(&byte_reader); + flags=bytereader_read_u32_le(&byte_reader); + bytereader_read_n(&byte_reader, &reserved, 8); +} + +uint32_t APEv2::Header::GetFlags() const +{ + return flags; +} + +bool APEv2::Header::Valid() const +{ + return !memcmp(preamble, apev2_preamble, 8) && reserved == 0; +} + +uint32_t APEv2::Header::TagSize() const +{ + size_t size = this->size; + if (IsHeader() && HasFooter()) + size+=SIZE; + if (IsFooter() && HasHeader()) + size+=SIZE; + + if (size > ULONG_MAX) + return 0; + + return (uint32_t)size; +} + +bool APEv2::Header::HasHeader() const +{ + return !!(flags & FLAG_HEADER_HAS_HEADER); +} + +bool APEv2::Header::HasFooter() const +{ + return !(flags & FLAG_HEADER_NO_FOOTER); +} + +bool APEv2::Header::IsFooter() const +{ + return !(flags & FLAG_HEADER_IS_HEADER); +} + +bool APEv2::Header::IsHeader() const +{ + return !!(flags & FLAG_HEADER_IS_HEADER); +} + +int APEv2::Header::Encode(bytewriter_t byte_writer) const +{ + if (bytewriter_size(byte_writer) < 32) + return NErr_Insufficient; + + bytewriter_write_n(byte_writer, apev2_preamble, 8); + bytewriter_write_u32_le(byte_writer, version); + bytewriter_write_u32_le(byte_writer, size); + bytewriter_write_u32_le(byte_writer, items); + bytewriter_write_u32_le(byte_writer, flags); + bytewriter_write_zero_n(byte_writer, 8); + + return NErr_Success; +}
\ No newline at end of file |