#include "core/io/FileReader.hpp" #include "ErrorSimulator.hpp" #include "core/utils/Logger.hpp" Core::FileReader::FileReader() : file(nullptr), path() { } Core::FileReader::FileReader(FileReader&& other) : FileReader() { swap(other); } Core::FileReader::~FileReader() { if(file != nullptr) { int r = fclose(file); if(r != 0 || CORE_FILE_CLOSE_FAIL) { CORE_LOG_WARNING("Cannot close file #: #", path, r); } file = nullptr; } } Core::FileReader& Core::FileReader::operator=(FileReader&& other) { swap(other); return *this; } const Core::Path& Core::FileReader::getPath() const { return path; } Core::Error Core::FileReader::open(const Path& p) { if(file != nullptr) { return ErrorCode::INVALID_STATE; } path = p; file = fopen(path, "rb"); return file != nullptr ? ErrorCode::NONE : ErrorCode::CANNOT_OPEN_FILE; } Core::Error Core::FileReader::open(const char* p) { if(file != nullptr) { return ErrorCode::INVALID_STATE; } path.append(p); file = fopen(path, "rb"); return file != nullptr ? ErrorCode::NONE : ErrorCode::CANNOT_OPEN_FILE; } Core::Error Core::FileReader::readChar(int& c) { if(file == nullptr) { return ErrorCode::INVALID_STATE; } c = fgetc(file); return c == EOF ? ErrorCode::END_OF_FILE : ErrorCode::NONE; } Core::Error Core::FileReader::readChars(char* buffer, size_t bufferSize) { if(file == nullptr) { return ErrorCode::INVALID_STATE; } else if(bufferSize <= 0) { return ErrorCode::INVALID_ARGUMENT; } size_t size = bufferSize - 1; size_t readBytes = fread(buffer, 1, size, file); buffer[readBytes] = '\0'; return readBytes != size ? ErrorCode::END_OF_FILE : ErrorCode::NONE; } void Core::FileReader::swap(FileReader& other) { Core::swap(file, other.file); Core::swap(path, other.path); }