aboutsummaryrefslogtreecommitdiff
path: root/libs/esptk/src/record.cpp
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
commit7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch)
tree27fb39be241fdb5ac2734c574de678977d1856d0 /libs/esptk/src/record.cpp
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 <noreply@anthropic.com>
Diffstat (limited to 'libs/esptk/src/record.cpp')
-rw-r--r--libs/esptk/src/record.cpp40
1 files changed, 40 insertions, 0 deletions
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 <cstring>
+
+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<char*>(&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<char*>(m_Data.data()), m_Header.dataSize);
+ }
+ if (!stream) {
+ throw ESP::InvalidRecordException("record incomplete");
+ }
+ return true;
+}