From 7ee008e150bc5bcf76082d726f719ee0fdfda982 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Wed, 11 Feb 2026 02:37:39 -0600 Subject: Fluorine Manager: full Linux port of Mod Organizer 2 Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 --- libs/esptk/src/record.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 libs/esptk/src/record.cpp (limited to 'libs/esptk/src/record.cpp') diff --git a/libs/esptk/src/record.cpp b/libs/esptk/src/record.cpp new file mode 100644 index 0000000..7c66dc4 --- /dev/null +++ b/libs/esptk/src/record.cpp @@ -0,0 +1,40 @@ +#include "record.h" +#include "espexceptions.h" +#include + +ESP::Record::Record() : m_Header(), m_FormVersion(), m_Data(), m_OblivionStyle(false) {} + +bool ESP::Record::flagSet(ESP::Record::EFlag flag) const +{ + return (m_Header.flags & flag) != 0; +} + +bool ESP::Record::readFrom(std::istream& stream) +{ + if (!stream.read(reinterpret_cast(&m_Header), sizeof(Header))) { + if (stream.gcount() == 0) { + return false; + } else { + throw ESP::InvalidRecordException("record incomplete"); + } + } + + char buf[4]; + stream.read(buf, 4); + if (memcmp(buf, "HEDR", 4) == 0) { + m_OblivionStyle = true; + stream.seekg(-4, std::istream::cur); + // Oblivion-style plugins don't have a form version + } else { + memcpy(&m_FormVersion, buf, sizeof(uint16_t)); + } + + m_Data.resize(m_Header.dataSize); + if (m_Header.dataSize > 0) { + stream.read(reinterpret_cast(m_Data.data()), m_Header.dataSize); + } + if (!stream) { + throw ESP::InvalidRecordException("record incomplete"); + } + return true; +} -- cgit v1.3.1