From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/apev2/item.cpp | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 Src/apev2/item.cpp (limited to 'Src/apev2/item.cpp') diff --git a/Src/apev2/item.cpp b/Src/apev2/item.cpp new file mode 100644 index 00000000..c757620f --- /dev/null +++ b/Src/apev2/item.cpp @@ -0,0 +1,221 @@ +#include "item.h" +#include "flags.h" +#include "util.h" +#include +#include + +/* +http://wiki.hydrogenaudio.org/index.php?title=APE_Tag_Item +*/ + +APEv2::Item::Item() +{ + refCount=1; + len=0; + flags=0; + key=0; + value=0; +} + +APEv2::Item::~Item() +{ + free(key); + free(value); +} + +void APEv2::Item::Retain() +{ + refCount++; +} + +void APEv2::Item::Release() +{ + if (--refCount == 0) + delete this; +} + +int APEv2::Item::Read(void *_data, size_t datalen, void **new_data, size_t *new_len) +{ + char *data = (char *)_data; + + if (datalen < 4) + return APEV2_TOO_SMALL; + memcpy(&len, data, 4); + len = ATON32(len); + data+=4; + datalen-=4; + + if (datalen < 4) + return APEV2_TOO_SMALL; + memcpy(&flags, data, 4); + flags = ATON32(flags); + data+=4; + datalen-=4; + + uint32_t key_len=0; + for (uint32_t i=0;i