From a292d8cd5a59915ccf4dfdc7fade6066e7d3db14 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 27 Jul 2019 16:37:48 +0200 Subject: [PATCH] LibCore: Add CFileStreamReader, a simple streaming CFile reader. This is extremely barebones right now, but can be used to easily read binary data from a CFile piece by piece. --- Libraries/LibCore/CFileStreamReader.h | 31 +++++++++++++++++++++++++++ Libraries/LibCore/CIODevice.cpp | 7 ++++++ Libraries/LibCore/CIODevice.h | 3 +++ 3 files changed, 41 insertions(+) create mode 100644 Libraries/LibCore/CFileStreamReader.h diff --git a/Libraries/LibCore/CFileStreamReader.h b/Libraries/LibCore/CFileStreamReader.h new file mode 100644 index 0000000000..1f6d6438aa --- /dev/null +++ b/Libraries/LibCore/CFileStreamReader.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +class CFileStreamReader { +public: + CFileStreamReader(CFile& file) + : m_file(file) + { + } + + bool handle_read_failure() + { + return exchange(m_had_failure, false); + } + + template + CFileStreamReader& operator>>(T& value) + { + int nread = m_file.read((u8*)&value, sizeof(T)); + ASSERT(nread == sizeof(T)); + if (nread != sizeof(T)) + m_had_failure = true; + return *this; + } + +private: + CFile& m_file; + bool m_had_failure { false }; +}; diff --git a/Libraries/LibCore/CIODevice.cpp b/Libraries/LibCore/CIODevice.cpp index 90f24f8bfe..a585e1a8dd 100644 --- a/Libraries/LibCore/CIODevice.cpp +++ b/Libraries/LibCore/CIODevice.cpp @@ -22,6 +22,13 @@ const char* CIODevice::error_string() const return strerror(m_error); } +int CIODevice::read(u8* buffer, int length) +{ + auto read_buffer = read(length); + memcpy(buffer, read_buffer.data(), length); + return read_buffer.size(); +} + ByteBuffer CIODevice::read(int max_size) { if (m_fd < 0) diff --git a/Libraries/LibCore/CIODevice.h b/Libraries/LibCore/CIODevice.h index 2af344542c..b50e8135b8 100644 --- a/Libraries/LibCore/CIODevice.h +++ b/Libraries/LibCore/CIODevice.h @@ -28,6 +28,9 @@ public: bool has_error() const { return m_error != 0; } + + int read(u8* buffer, int length); + ByteBuffer read(int max_size); ByteBuffer read_line(int max_size); ByteBuffer read_all();