aboutsummaryrefslogtreecommitdiff
path: root/Src/apev2/header.cpp
diff options
context:
space:
mode:
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