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()) {
27 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
31 identifyCollectionType();
32 if (readerInput->isEOF()) {
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()) {
43 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] readInput EOF reached.\n", __FILE__, __LINE__);
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';
54 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] got line: %s\n", __FILE__, __LINE__, line);
55 ED2KLink* ed2kLink = ED2KLink::parseED2KLink(line);
63 void CollectionReader::readMoreBytes() {
67 readBytes = readerInput->read(buffer, 1024);
68 growingBuffer.write(buffer, readBytes);
71 void CollectionReader::identifyCollectionType() {
75 readBytes = readerInput->read(&version, 4);
76 if ((readBytes < 4) || readerInput->isEOF()) {
79 if (version == 0x01) {
80 isTextCollection = false;
82 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] identified binary collection, version 1\n", __FILE__, __LINE__);
83 } else if (version == 0x02) {
84 isTextCollection = false;
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__);
92 GlobalSettings::isVerbose() && fprintf(stderr, "[%s:%d] could not identify collection!\n", __FILE__, __LINE__);