From 06826ca53dd54e73169514b3de2f81f2a7ca31f4 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Thu, 12 Mar 2026 07:20:42 -0500 Subject: Add native Root Builder and OMOD Installer plugins - libs/rootbuilder_native/: Native C++ port of rootbuilder.py (IPluginTool) - Root/ dir scanning, copy (reflink/CoW) and symlink modes - JSON manifest tracking, backup/restore, auto-deploy hooks - Legacy migration and third-party conflict detection - libs/installer_omod_native/: Native C++ port of installer_omod.py - Handles .omod archives (Oblivion Mod Manager format) - Binary config parsing, .NET string format, CRC file parsing - zlib raw deflate and LZMA decompression - Repackages to zip for MO2's installation manager - Added both to build-inner.sh plugin packaging Co-Authored-By: Claude Opus 4.6 --- libs/rootbuilder_native/src/rootbuilder.h | 79 +++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 libs/rootbuilder_native/src/rootbuilder.h (limited to 'libs/rootbuilder_native/src/rootbuilder.h') diff --git a/libs/rootbuilder_native/src/rootbuilder.h b/libs/rootbuilder_native/src/rootbuilder.h new file mode 100644 index 0000000..121bcc1 --- /dev/null +++ b/libs/rootbuilder_native/src/rootbuilder.h @@ -0,0 +1,79 @@ +#ifndef ROOTBUILDER_NATIVE_H +#define ROOTBUILDER_NATIVE_H + +#include + +#include +#include + +class RootBuilderNative : public MOBase::IPluginTool +{ + Q_OBJECT + Q_INTERFACES(MOBase::IPlugin MOBase::IPluginTool) + Q_PLUGIN_METADATA(IID "com.tannin.ModOrganizer.PluginTool/1.0") + +public: + RootBuilderNative(); + + // IPlugin + bool init(MOBase::IOrganizer* organizer) override; + QString name() const override; + QString localizedName() const override; + QString author() const override; + QString description() const override; + MOBase::VersionInfo version() const override; + QList settings() const override; + bool enabledByDefault() const override; + + // IPluginTool + QString displayName() const override; + QString tooltip() const override; + QIcon icon() const override; + +public slots: + void display() const override; + +private: + // Storage paths + QString storageDir() const; + QString backupDir() const; + QString manifestPath() const; + QString settingsPath() const; + + // Settings (own JSON, not pluginSetting) + QJsonObject loadSettings() const; + void saveSettings(const QJsonObject& settings) const; + bool isAutoEnabled() const; + + // Manifest + QJsonObject loadManifest() const; + void saveManifest(const QJsonObject& manifest) const; + void removeManifest() const; + + // Legacy migration + void migrateLegacy() const; + + // Third-party conflict detection + void checkThirdPartyRootBuilder() const; + + // Build / Clear + int build() const; + int clear() const; + + // File operations + static QString findRootDir(const QString& modPath); + static void reflinkCopy(const QString& src, const QString& dst); + static void ensureReadable(const QString& path); + static void ensureWritable(const QString& path); + static bool forceRemove(const QString& path); + static void cleanupEmptyDirs(const QString& baseDir, + const QStringList& paths); + + // Hooks + bool onAboutToRun(const QString& executable); + void onFinishedRun(const QString& executable, unsigned int exitCode); + + MOBase::IOrganizer* m_organizer = nullptr; +}; + +#endif // ROOTBUILDER_NATIVE_H -- cgit v1.3.1