improve parsing
[ecparse.git] / CollectionReader.cpp
1 /**
2  * © 2008 by David Roden <droden@gmail.com>
3  */
4
5 #include <stdlib.h>
6 #include <string.h>
7 #include "CollectionReader.h"
8 #include "GlobalSettings.h"
9
10 CollectionReader::CollectionReader(ReaderInput* readerInput) {
11         this->readerInput = readerInput;
12         firstLink = true;
13 }
14
15 CollectionReader::~CollectionReader() {
16 }
17
18 bool CollectionReader::isLineBreakPresent() {
19         size_t indexOfLineBreak = growingBuffer.indexOf('\n');
20         GlobalSettings::isVerbose() && (indexOfLineBreak != (size_t) -1) && fprintf(stderr, "[%s:%d] found line break at %d.\n", __FILE__, __LINE__, indexOfLineBreak);
21         GlobalSettings::isVerbose() && (indexOfLineBreak == (size_t) -1) && fprintf(stderr, "[%s:%d] could not find line break.\n", __FILE__, __LINE__);
22         return indexOfLineBreak != (size_t) -1;
23 }
24
25 ED2KLink* CollectionReader::getNextLink() {
26         if (readerInput->isEOF()) {
27                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
28                 return NULL;
29         }
30         if (firstLink) {
31                 identifyCollectionType();
32                 if (readerInput->isEOF()) {
33                         GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
34                         return NULL;
35                 }
36                 firstLink = false;
37         }
38         if (isTextCollection) {
39                 while (!readerInput->isEOF() && !isLineBreakPresent()) {
40                         readMoreBytes();
41                 }
42                 if (readerInput->isEOF()) {
43                         GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
44                         return NULL;
45                 }
46                 size_t indexOfLineBreak = growingBuffer.indexOf('\n');
47                 char* line = (char*) calloc(indexOfLineBreak + 1, 1);
48                 growingBuffer.read(line, indexOfLineBreak + 1);
49                 line[indexOfLineBreak] = '\0';
50                 if (line[indexOfLineBreak - 1] == '\r') {
51                         line[indexOfLineBreak - 1] = '\0';
52                 }
53                 growingBuffer.cut();
54                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] got line: %s\n", __FILE__, __LINE__, line);
55                 ED2KLink* ed2kLink = ED2KLink::parseED2KLink(line);
56                 return ed2kLink;
57         } else {
58         }
59         return NULL;
60 }
61
62 void CollectionReader::readMoreBytes() {
63         char buffer[1024];
64         size_t readBytes;
65
66         readBytes = readerInput->read(buffer, 1024);
67         growingBuffer.write(buffer, readBytes);
68 }
69
70 void CollectionReader::identifyCollectionType() {
71         int version;
72         size_t readBytes;
73
74         readBytes = readerInput->read(&version, 4);
75         if ((readBytes < 4) || readerInput->isEOF()) {
76                 return;
77         }
78         if (version == 0x01) {
79                 isTextCollection = false;
80                 this->version = 1;
81                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 1\n", __FILE__, __LINE__);
82         } else if (version == 0x02) {
83                 isTextCollection = false;
84                 this->version = 2;
85                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 2\n", __FILE__, __LINE__);
86         } else if (!strncmp("ed2k", (char*) &version, 4)) {
87                 isTextCollection = true;
88                 growingBuffer.write(&version, 4);
89                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified text collection\n", __FILE__, __LINE__);
90         } else  {
91                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not identify collection!\n", __FILE__, __LINE__);
92         }
93 }
94