From 8db01a09576edf5084d3e2b86e999422efb879ac Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:52:54 +0100 Subject: [PATCH] Adding Spectre/System/Log/FileWriter class. --- engine.cmake | 1 + include/Spectre/System/Log/FileWriter.h | 30 +++++++++++ source/System/Log/FileWriter.cpp | 66 +++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 include/Spectre/System/Log/FileWriter.h create mode 100644 source/System/Log/FileWriter.cpp diff --git a/engine.cmake b/engine.cmake index 3c7bb22..f8d1494 100644 --- a/engine.cmake +++ b/engine.cmake @@ -21,6 +21,7 @@ set( ENGINE_SRC source/System/MessageQueue.cpp source/System/Path.cpp source/System/Stopwatch.cpp + source/System/Log/FileWriter.cpp # Platform source/Platform/PlatformApplication.cpp diff --git a/include/Spectre/System/Log/FileWriter.h b/include/Spectre/System/Log/FileWriter.h new file mode 100644 index 0000000..3034243 --- /dev/null +++ b/include/Spectre/System/Log/FileWriter.h @@ -0,0 +1,30 @@ +#ifndef SPECTRE_SYSTEM_LOG_FILEWRITER_H +#define SPECTRE_SYSTEM_LOG_FILEWRITER_H + +#include +#include +#include + +namespace sp { namespace log { + +class FileWriter : public Writer +{ +public: + FileWriter(const std::string file = ""); + ~FileWriter(); + + bool open(const std::string file); + + bool close(); + + size_t write(const void *data, size_t len); + +protected: + + FILE *m_fd; +}; + + +} } // sp::log + +#endif /* SPECTRE_SYSTEM_LOG_FILEWRITER_H */ \ No newline at end of file diff --git a/source/System/Log/FileWriter.cpp b/source/System/Log/FileWriter.cpp new file mode 100644 index 0000000..d050f85 --- /dev/null +++ b/source/System/Log/FileWriter.cpp @@ -0,0 +1,66 @@ + +#include + +namespace sp { namespace log { + +FileWriter::FileWriter(const std::string file) : +m_fd (NULL) +{ + if (file.length() > 0) { + open(file); + } +} + +FileWriter::~FileWriter() +{ + if (m_fd) { + close(); + } +} + +bool FileWriter::open(const std::string file) +{ + if (!close()) { + return false; + } + + if (file == "stderr") { + m_fd = stderr; + return true; + } + + if (file == "stdout") { + m_fd = stdout; + return true; + } + + m_fd = fopen(file.c_str(), "a"); + if (m_fd == NULL) { + return false; + } + + return true; +} + +bool FileWriter::close() +{ + if (m_fd) { + // stdout and stderr can not be closed. + if (m_fd == stdout || m_fd == stderr) { + m_fd = NULL; + return true; + } + if (fclose(m_fd) < 0) { + return false; + } + m_fd = NULL; + } + return true; +} + +size_t FileWriter::write(const void *data, size_t len) +{ + return fwrite(data, 1, len, m_fd); +} + +} } // sp::log \ No newline at end of file