free line after parsing link
[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                 free(line);
57                 return ed2kLink;
58         } else {
59         }
60         return NULL;
61 }
62
63 void CollectionReader::readMoreBytes() {
64         char buffer[1024];
65         size_t readBytes;
66
67         readBytes = readerInput->read(buffer, 1024);
68         growingBuffer.write(buffer, readBytes);
69 }
70
71 void CollectionReader::identifyCollectionType() {
72         int version;
73         size_t readBytes;
74
75         readBytes = readerInput->read(&version, 4);
76         if ((readBytes < 4) || readerInput->isEOF()) {
77                 return;
78         }
79         if (version == 0x01) {
80                 isTextCollection = false;
81                 this->version = 1;
82                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 1\n", __FILE__, __LINE__);
83         } else if (version == 0x02) {
84                 isTextCollection = false;
85                 this->version = 2;
86                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 2\n", __FILE__, __LINE__);
87         } else if (!strncmp("ed2k", (char*) &version, 4)) {
88                 isTextCollection = true;
89                 growingBuffer.write(&version, 4);
90                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified text collection\n", __FILE__, __LINE__);
91         } else  {
92                 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not identify collection!\n", __FILE__, __LINE__);
93         }
94 }
95