aboutsummaryrefslogtreecommitdiff
path: root/Src/apev2/header.cpp
diff options
context:
space:
mode:
authorJean-Francois Mauguit <jfmauguit@mac.com>2024-09-24 09:03:25 -0400
committerGitHub <noreply@github.com>2024-09-24 09:03:25 -0400
commitbab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/apev2/header.cpp
parent4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff)
parent20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff)
downloadwinamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/apev2/header.cpp')
-rw-r--r--Src/apev2/header.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/Src/apev2/header.cpp b/Src/apev2/header.cpp
new file mode 100644
index 00000000..bb92c784
--- /dev/null
+++ b/Src/apev2/header.cpp
@@ -0,0 +1,88 @@
+#include "header.h"
+#include "flags.h"
+#include "util.h"
+#include <limits.h>
+
+static char preamble[] = { 'A', 'P', 'E', 'T', 'A', 'G', 'E', 'X' };
+
+APEv2::Header::Header(void *data)
+{
+ memcpy(&headerData, data, sizeof(headerData));
+
+ // covert to host endian
+ //headerData.preamble=htons(headerData.preamble);
+ headerData.version=ATON16(headerData.version);
+ headerData.size=ATON32(headerData.size);
+ headerData.items=ATON32(headerData.items);
+ headerData.flags=ATON32(headerData.flags);
+}
+
+APEv2::Header::Header(const HeaderData *data)
+{
+ memcpy(&headerData.preamble, preamble, sizeof(headerData.preamble));
+ headerData.version = NTOA32(2000);
+ headerData.size = data->size;
+ headerData.items = data->items;
+ headerData.flags = data->flags;
+ headerData.reserved = 0;
+}
+
+uint32_t APEv2::Header::GetFlags()
+{
+ return headerData.flags;
+}
+
+bool APEv2::Header::Valid()
+{
+ return !memcmp(&headerData.preamble, preamble, 8) && headerData.reserved == 0;
+}
+
+uint32_t APEv2::Header::TagSize()
+{
+ size_t size = headerData.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()
+{
+ return !!(headerData.flags & FLAG_HEADER_HAS_HEADER);
+}
+
+bool APEv2::Header::HasFooter()
+{
+ return !(headerData.flags & FLAG_HEADER_NO_FOOTER);
+}
+
+bool APEv2::Header::IsFooter()
+{
+ return !(headerData.flags & FLAG_HEADER_IS_HEADER);
+}
+
+bool APEv2::Header::IsHeader()
+{
+ return !!(headerData.flags & FLAG_HEADER_IS_HEADER);
+}
+
+int APEv2::Header::Encode(void *data, size_t len)
+{
+ if (len < 32)
+ return APEV2_TOO_SMALL;
+
+ HeaderData endianCorrectData = headerData;
+
+ endianCorrectData.version=NTOA16(endianCorrectData.version);
+ endianCorrectData.size=NTOA32(endianCorrectData.size);
+ endianCorrectData.items=NTOA32(endianCorrectData.items);
+ endianCorrectData.flags=NTOA32(endianCorrectData.flags);
+
+ memcpy(data, &endianCorrectData, sizeof(endianCorrectData));
+ return APEV2_SUCCESS;
+} \ No newline at end of file