CS 3377 Project

profilejohn_mnoko
Projectpart1.pdf

FileReader.cpp //

#include <fcntl.h> #include <cerrno> #include <unistd.h> #include <cstring> #include "FileReader.h" #include "FileModifyException.h" #include "Util.h"

using namespace std;

char nameFirst[50] = "A Programming Guide to Linux Commands, Editors, a"; char nameSecond[50] = "Advanced Programming in the UNIX Environment by S";

string FileReader::getErrnoString() { return strerror(errno);

}

void FileReader::verifyNumBytes(ssize_t expected, ssize_t actual) { if ( expected != actual) {

throw FileModifyException("Bytes read/written (" + to_string(expected) + ") don't match actual (" + to_string(actual) + ")");

} }

void FileReader::readEntries(std::list<EntryInfo>& entryList, const char* fileName) { int fileDescriptor = open(fileName, O_RDONLY); if ( fileDescriptor < 0) {

close(fileDescriptor); throw FileModifyException("Unable to open output file: " + getErrnoString());

} readEntries(entryList, fileDescriptor); close(fileDescriptor);

}

void FileReader::readEntries(list<EntryInfo> &entryList, int fileDescriptor) { int numItems; size_t amountRead = read(fileDescriptor, &numItems, sizeof(int)); if ( amountRead <= 0) {

close(fileDescriptor); throw FileModifyException("File is empty/error reading");

}

for (int i=0; i < numItems; i++) { EntryInfo incoming; verifyNumBytes(sizeof(time_t), read(fileDescriptor, &incoming.timestamp, sizeof(time_t))); verifyNumBytes(sizeof(int), read(fileDescriptor, &incoming.itemID, sizeof(int))); char* inputName = new char[50]; verifyNumBytes(50, read(fileDescriptor, inputName, 50 * sizeof(char)));

incoming.itemName = inputName; verifyNumBytes(sizeof(int), read(fileDescriptor, &incoming.quantity, sizeof(int))); verifyNumBytes(sizeof(float), read(fileDescriptor, &incoming.price, sizeof(float))); entryList.push_back(incoming);

} }

void FileReader::addMissingEntries(list<EntryInfo> & entries) { EntryInfo additionalFirst; additionalFirst.timestamp = 1612195200; // (2/1/2020 4 PM GMT) additionalFirst.itemID = 4636152; additionalFirst.itemName = nameFirst; additionalFirst.quantity = 70; additionalFirst.price = 70.99; entries.push_back(additionalFirst);

EntryInfo additionalSecond; additionalSecond.timestamp = 1613412000; //(2/15/2020 6 PM GMT) additionalSecond.itemID = 6530927; additionalSecond.itemName = nameSecond; additionalSecond.quantity = 68; additionalSecond.price = 89.99; entries.push_back(additionalSecond);

}

FileReader.h

//

#ifndef INC_21S_CS3377_PROJECT_FILEREADER_H #define INC_21S_CS3377_PROJECT_FILEREADER_H

#include <list> #include <string> #include "Util.h"

class FileReader { public:

void readEntries(std::list<EntryInfo>& entryList, const char* fileName); void readEntries(std::list<EntryInfo>& entryList, int fileDescriptor); static void addMissingEntries(std::list<EntryInfo>& entries);

private: static std::string getErrnoString(); static void verifyNumBytes(ssize_t expected, ssize_t actual);

};

#endif //INC_21S_CS3377_PROJECT_FILEREADER_H

FileWriter.h

//

#ifndef INC_21S_CS3377_PROJECT_FILEWRITER_H #define INC_21S_CS3377_PROJECT_FILEWRITER_H

#include <list> #include <string> #include "Util.h"

class FileWriter { public:

void addEntry(const EntryInfo& entryInfo); void writeFile(const char* fileToWrite); void writeFile(int fileDescriptor);

private: std::string getErrnoString();

std::list<EntryInfo> entries; };

#endif //INC_21S_CS3377_PROJECT_FILEWRITER_H

Part1SimpleFileModifier.cpp

/////

#include "Part1SimpleFileModifier.h" #include "FileModifyException.h" #include "FileReader.h" #include "FileWriter.h"

using namespace std;

void Part1SimpleFileModifier::modifyAndCopyFile(const char *sourceFile, const char *destFile) { FileReader fileReader; list<EntryInfo> entries; fileReader.readEntries(entries, sourceFile); fileReader.addMissingEntries(entries);

FileWriter fileWriter; for ( EntryInfo info : entries) {

fileWriter.addEntry(info); }

fileWriter.writeFile(destFile);

Part1SimpleFileModifier.h

//////

#ifndef INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H #define INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H

#include "Modifier.h"

class Part1SimpleFileModifier : public Modifier { public:

void doSetup(IOType ioType) override {} void modifyAndCopyFile(const char* sourceFile,

const char* destFile) override; };

#endif //INC_21S_CS3377_PROJECT_PART1SIMPLEFILEMODIFIER_H