2 * © 2008 by David Roden <droden@gmail.com>
7 #include "CollectionReader.h"
8 #include "GlobalSettings.h"
10 CollectionReader::CollectionReader(ReaderInput* readerInput) {
11 this->readerInput = readerInput;
15 CollectionReader::~CollectionReader() {
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;
25 ED2KLink* CollectionReader::getNextLink() {
26 if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
27 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
31 identifyCollectionType();
32 if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
33 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
38 if (isTextCollection) {
39 while (!readerInput->isEOF() && !isLineBreakPresent()) {
42 if (readerInput->isEOF() && !growingBuffer.getRemaining()) {
43 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
46 size_t indexOfLineBreak = growingBuffer.indexOf('\n');
48 if (indexOfLineBreak == (size_t) -1) {
49 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not find line break, using remainder of file.\n", __FILE__, __LINE__);
50 indexOfLineBreak = growingBuffer.getRemaining();
51 line = (char*) malloc(indexOfLineBreak + 1);
52 growingBuffer.read(line, indexOfLineBreak);
53 line[indexOfLineBreak] = '\0';
55 line = (char*) malloc(indexOfLineBreak + 1);
56 growingBuffer.read(line, indexOfLineBreak + 1);
57 if (line[indexOfLineBreak] == '\n') {
58 line[indexOfLineBreak] = '\0';
60 if (line[indexOfLineBreak - 1] == '\r') {
61 line[indexOfLineBreak - 1] = '\0';
65 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] got line: %s\n", __FILE__, __LINE__, line);
66 ED2KLink* ed2kLink = ED2KLink::parseED2KLink(line);
74 void CollectionReader::readMoreBytes() {
78 readBytes = readerInput->read(buffer, 1024);
79 growingBuffer.write(buffer, readBytes);
82 void CollectionReader::identifyCollectionType() {
86 readBytes = readerInput->read(&version, 4);
87 if ((readBytes < 4) || readerInput->isEOF()) {
90 if (version == 0x01) {
91 isTextCollection = false;
93 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 1\n", __FILE__, __LINE__);
94 } else if (version == 0x02) {
95 isTextCollection = false;
97 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 2\n", __FILE__, __LINE__);
98 } else if (!strncmp("ed2k", (char*) &version, 4)) {
99 isTextCollection = true;
100 growingBuffer.write(&version, 4);
101 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified text collection\n", __FILE__, __LINE__);
103 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not identify collection!\n", __FILE__, __LINE__);