From 2e311f5feab0d242fc617dc070305185242f7aad Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Sat, 5 Jul 2008 23:40:17 +0200 Subject: [PATCH] start implementation of binary parsing --- CollectionReader.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/CollectionReader.cpp b/CollectionReader.cpp index f58e5bc..ade7622 100644 --- a/CollectionReader.cpp +++ b/CollectionReader.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "CollectionReader.h" #include "GlobalSettings.h" @@ -67,6 +68,54 @@ ED2KLink* CollectionReader::getNextLink() { free(line); return ed2kLink; } else { + /* read header */ + if (!ensureBufferCapacity(4)) { + return NULL; + } + uint32_t headerTagCount = 0; + growingBuffer.read(&headerTagCount, 4); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] will read %d header tags.\n", __FILE__, __LINE__, headerTagCount); + for (uint32_t headerTagIndex = 0; headerTagIndex < headerTagCount; headerTagIndex++) { + uint8_t tagType = 0; + if (!ensureBufferCapacity(1)) { + return NULL; + } + growingBuffer.read(&tagType, 1); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] read tag type %d.\n", __FILE__, __LINE__, tagType); + if (tagType == 0x02) { + uint16_t unknown = 0; + if (!ensureBufferCapacity(2)) { + return NULL; + } + growingBuffer.read(&unknown, 2); + uint8_t tagName = 0; + if (!ensureBufferCapacity(1)) { + return NULL; + } + growingBuffer.read(&tagName, 1); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] read tag name %d.\n", __FILE__, __LINE__, tagName); + uint16_t tagLength = 0; + if (!ensureBufferCapacity(2)) { + return NULL; + } + growingBuffer.read(&tagLength, 2); + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] read tag length %d.\n", __FILE__, __LINE__, tagLength); + char* tagValue = (char*) malloc(tagLength + 1); + if (!ensureBufferCapacity(tagLength)) { + return NULL; + } + growingBuffer.read(tagValue, tagLength); + tagValue[tagLength] = '\0'; + if (tagName == 0x01) { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] read FT_FILENAME: “%s”.\n", __FILE__, __LINE__, tagValue); + } else if (tagName == 0x31) { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] read FT_COLLECTIONAUTHOR: “%s”.\n", __FILE__, __LINE__, tagValue); + } else { + GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] unknown tag: “%s”.\n", __FILE__, __LINE__, tagValue); + } + } else if (tagType == 0x07) { + } + } } return NULL; } -- 2.7.4