summaryrefslogtreecommitdiff
path: root/src/rwplg.h
diff options
context:
space:
mode:
authorclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
committerclaude-bot <[email protected]>2026-07-13 12:40:03 +0000
commit847962910f0bff071f3bf07c9abb87764fb6cac3 (patch)
treeddcd429e134c7fd5f72ddc97ced175de8d66fcd0 /src/rwplg.h
downloadlibrw-847962910f0bff071f3bf07c9abb87764fb6cac3.tar.gz
librw-847962910f0bff071f3bf07c9abb87764fb6cac3.zip
Import aap/librw @ masterHEADmaster
Snapshot for re3/reVC vendoring, per @lzcnt. Source: https://github.com/aap/librw (master).
Diffstat (limited to 'src/rwplg.h')
-rw-r--r--src/rwplg.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/rwplg.h b/src/rwplg.h
new file mode 100644
index 0000000..ad2116a
--- /dev/null
+++ b/src/rwplg.h
@@ -0,0 +1,85 @@
+namespace rw {
+
+#define PLUGINOFFSET(type, base, offset) \
+ ((type*)((char*)(base) + (offset)))
+
+typedef void *(*Constructor)(void *object, int32 offset, int32 size);
+typedef void *(*Destructor)(void *object, int32 offset, int32 size);
+typedef void *(*CopyConstructor)(void *dst, void *src, int32 offset, int32 size);
+typedef Stream *(*StreamRead)(Stream *stream, int32 length, void *object, int32 offset, int32 size);
+typedef Stream *(*StreamWrite)(Stream *stream, int32 length, void *object, int32 offset, int32 size);
+typedef int32 (*StreamGetSize)(void *object, int32 offset, int32 size);
+typedef void (*RightsCallback)(void *object, int32 offset, int32 size, uint32 data);
+typedef void (*AlwaysCallback)(void *object, int32 offset, int32 size);
+
+struct PluginList
+{
+ int32 size;
+ int32 defaultSize;
+ LinkList plugins;
+
+ PluginList(void) {}
+ PluginList(int32 defSize)
+ : size(defSize), defaultSize(defSize)
+ { plugins.init(); }
+
+ static void open(void);
+ static void close(void);
+
+ void construct(void *);
+ void destruct(void *);
+ void copy(void *dst, void *src);
+ bool streamRead(Stream *stream, void *);
+ void streamWrite(Stream *stream, void *);
+ int streamGetSize(void *);
+ void streamSkip(Stream *stream);
+ void assertRights(void *, uint32 pluginID, uint32 data);
+
+ int32 registerPlugin(int32 size, uint32 id,
+ Constructor, Destructor, CopyConstructor);
+ int32 registerStream(uint32 id, StreamRead, StreamWrite, StreamGetSize);
+ int32 setStreamRightsCallback(uint32 id, RightsCallback cb);
+ int32 setStreamAlwaysCallback(uint32 id, AlwaysCallback cb);
+ int32 getPluginOffset(uint32 id);
+};
+
+struct Plugin
+{
+ int32 offset;
+ int32 size;
+ uint32 id;
+ Constructor constructor;
+ Destructor destructor;
+ CopyConstructor copy;
+ StreamRead read;
+ StreamWrite write;
+ StreamGetSize getSize;
+ RightsCallback rightsCallback;
+ AlwaysCallback alwaysCallback;
+ PluginList *parentList;
+ LLLink inParentList;
+ LLLink inGlobalList;
+};
+
+#define PLUGINBASE \
+ static PluginList s_plglist; \
+ static int32 registerPlugin(int32 size, uint32 id, Constructor ctor, \
+ Destructor dtor, CopyConstructor copy){ \
+ return s_plglist.registerPlugin(size, id, ctor, dtor, copy); \
+ } \
+ static int32 registerPluginStream(uint32 id, StreamRead read, \
+ StreamWrite write, StreamGetSize getSize){ \
+ return s_plglist.registerStream(id, read, write, getSize); \
+ } \
+ static int32 setStreamRightsCallback(uint32 id, RightsCallback cb){ \
+ return s_plglist.setStreamRightsCallback(id, cb); \
+ } \
+ static int32 setStreamAlwaysCallback(uint32 id, AlwaysCallback cb){ \
+ return s_plglist.setStreamAlwaysCallback(id, cb); \
+ } \
+ static int32 getPluginOffset(uint32 id){ \
+ return s_plglist.getPluginOffset(id); \
+ }
+
+
+}