From 9a29f9d63fbb427fd22b70d79eaccd504995309c Mon Sep 17 00:00:00 2001 From: Tiebe Groosman Date: Fri, 18 Jul 2025 00:40:36 +0200 Subject: [PATCH] Websocket support --- build.sh | 4 ++- rmfakecloud.xovi | 2 +- websocket-xovi.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++ websocket-xovi.h | 78 ++++++++++++++++++++++++++++++++++++++++ websocket.cpp | 42 ++++++++++++++++++++++ websocket.xovi | 4 +++ 6 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 websocket-xovi.c create mode 100644 websocket-xovi.h create mode 100644 websocket.cpp create mode 100644 websocket.xovi diff --git a/build.sh b/build.sh index e92a45c..134a636 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,6 @@ set -euxo pipefail python3 ../xovi/util/xovigen.py -o xovi.c -H xovi.h rmfakecloud.xovi -$CC -shared -fPIC main.cpp xovi.c `pkg-config --cflags --libs Qt6Network` -o rmfakecloud.so \ No newline at end of file +python3 ../xovi/util/xovigen.py -o websocket-xovi.c -H websocket-xovi.h websocket.xovi +$CC -shared -fPIC main.cpp xovi.c `pkg-config --cflags --libs Qt6Network` -o rmfakecloud.so +$CC -shared -fPIC websocket.cpp websocket-xovi.c `pkg-config --cflags --libs Qt6Network Qt6WebSockets` -o rmfakecloud-websocket.so diff --git a/rmfakecloud.xovi b/rmfakecloud.xovi index 23cfa7d..e779f9e 100644 --- a/rmfakecloud.xovi +++ b/rmfakecloud.xovi @@ -1,4 +1,4 @@ version 1.0.0 import? _ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice -override _ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice \ No newline at end of file +override _ZN21QNetworkAccessManager13createRequestENS_9OperationERK15QNetworkRequestP9QIODevice diff --git a/websocket-xovi.c b/websocket-xovi.c new file mode 100644 index 0000000..4bef940 --- /dev/null +++ b/websocket-xovi.c @@ -0,0 +1,92 @@ +// This file is autogenerated. Please do not alter it manually and instead run xovigen.py. +// XOVI extension / module base file +#ifdef __cplusplus +extern "C" { +#endif +#ifndef XOVI_PUBLIC_API +#define XOVI_PUBLIC_API +#define XOVI_VERSION "0.2.0" +#include + +#define LP1_F_TYPE_EXPORT 1 +#define LP1_F_TYPE_IMPORT 2 +#define LP1_F_TYPE_OVERRIDE 3 +#define LP1_F_TYPE_CONDITION 4 + +#define METADATA_TYPE_INT 1 +#define METADATA_TYPE_BOOL 2 +#define METADATA_TYPE_STRING 3 + +typedef union { + int i; + bool b; + struct { + int sLength; + const char *s; + }; +} XoviMetadataValue; + +struct XoviMetadataEntry { + const char *name; + char type; + XoviMetadataValue value; +}; + +// Public version of the metadata iterator. +struct ExtensionMetadataIterator { + const char *extensionName; + const char *functionName; + void *functionAddress; + char OPAQUE[sizeof(void *) * 4 + sizeof(bool)]; +}; + +struct XoViEnvironment { + char *(*getExtensionDirectory)(const char *family); + void (*requireExtension)(const char *name, unsigned char major, unsigned char minor, unsigned char patch); + + // 0.2.0 API - metadata: + int (*getExtensionCount)(); + int (*getExtensionNames)(const char **table, int maxCount); + int (*getExtensionFunctionCount)(const char *key); + int (*getExtensionFunctionNames)(const char *extension, const char **table, int maxCount); + + int (*getMetadataEntriesCountForFunction)(const char *extension, const char *function, int functionType); + struct XoviMetadataEntry **(*getMetadataChainForFunction)(const char *extension, const char *function, int functionType); + struct XoviMetadataEntry *(*getMetadataEntryForFunction)(const char *extension, const char *function, int functionType, const char *metadataEntryName); + + void (*createMetadataSearchingIterator)(struct ExtensionMetadataIterator *iterator, const char *metadataEntryName); + struct XoviMetadataEntry *(*nextFunctionMetadataEntry)(struct ExtensionMetadataIterator *iterator); +}; +#endif + + +// Deps +extern void override$_ZN10QWebSocket4openERK15QNetworkRequest(); + +// XOVI metadata +__attribute__((section(".xovi"))) const char *LINKTABLENAMES = "C_ZN10QWebSocket4openERK15QNetworkRequest\0I_ZN10QWebSocket4openERK15QNetworkRequest\0O_ZN10QWebSocket4openERK15QNetworkRequest\0\0"; +__attribute__((section(".xovi"))) const void *LINKTABLEVALUES[] = { (void *) 3, (void *) 0, (void *) 0, (void *) override$_ZN10QWebSocket4openERK15QNetworkRequest }; +__attribute__((section(".xovi"))) const void *Environment = 0; +__attribute__((section(".xovi_info"))) const int EXTENSIONVERSION = 65536; + +__attribute__((section(".xovi_info"))) const char __XOVIMETADATANAMES[] = ""; + +// Raw Metadata Entries + + +// Metadata Chains + + +// Main metadata list +__attribute__((section(".xovi"))) const struct XoviMetadataEntry **METADATAVALUES[] = { + (const struct XoviMetadataEntry **) 0, + (const struct XoviMetadataEntry **) 0, + (const struct XoviMetadataEntry **) 0, + (const struct XoviMetadataEntry **) 0, (const struct XoviMetadataEntry **) 1 +}; + +// Resources + +#ifdef __cplusplus +} +#endif diff --git a/websocket-xovi.h b/websocket-xovi.h new file mode 100644 index 0000000..39bb4f0 --- /dev/null +++ b/websocket-xovi.h @@ -0,0 +1,78 @@ +// XOVI project import / resource header file. This file is autogenerated. Do not edit. +#ifndef _XOVIGEN +#define _XOVIGEN +#ifdef __cplusplus +extern "C" { +#endif +#ifndef XOVI_PUBLIC_API +#define XOVI_PUBLIC_API +#define XOVI_VERSION "0.2.0" +#include + +#define LP1_F_TYPE_EXPORT 1 +#define LP1_F_TYPE_IMPORT 2 +#define LP1_F_TYPE_OVERRIDE 3 +#define LP1_F_TYPE_CONDITION 4 + +#define METADATA_TYPE_INT 1 +#define METADATA_TYPE_BOOL 2 +#define METADATA_TYPE_STRING 3 + +typedef union { + int i; + bool b; + struct { + int sLength; + const char *s; + }; +} XoviMetadataValue; + +struct XoviMetadataEntry { + const char *name; + char type; + XoviMetadataValue value; +}; + +// Public version of the metadata iterator. +struct ExtensionMetadataIterator { + const char *extensionName; + const char *functionName; + void *functionAddress; + char OPAQUE[sizeof(void *) * 4 + sizeof(bool)]; +}; + +struct XoViEnvironment { + char *(*getExtensionDirectory)(const char *family); + void (*requireExtension)(const char *name, unsigned char major, unsigned char minor, unsigned char patch); + + // 0.2.0 API - metadata: + int (*getExtensionCount)(); + int (*getExtensionNames)(const char **table, int maxCount); + int (*getExtensionFunctionCount)(const char *key); + int (*getExtensionFunctionNames)(const char *extension, const char **table, int maxCount); + + int (*getMetadataEntriesCountForFunction)(const char *extension, const char *function, int functionType); + struct XoviMetadataEntry **(*getMetadataChainForFunction)(const char *extension, const char *function, int functionType); + struct XoviMetadataEntry *(*getMetadataEntryForFunction)(const char *extension, const char *function, int functionType, const char *metadataEntryName); + + void (*createMetadataSearchingIterator)(struct ExtensionMetadataIterator *iterator, const char *metadataEntryName); + struct XoviMetadataEntry *(*nextFunctionMetadataEntry)(struct ExtensionMetadataIterator *iterator); +}; +#endif + + +extern const void *LINKTABLEVALUES[]; + +// Imports +#define $_ZN10QWebSocket4openERK15QNetworkRequest ((unsigned long long int (*)()) LINKTABLEVALUES[2]) + +// Resources + + +// Environment +extern const struct XoViEnvironment *Environment; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/websocket.cpp b/websocket.cpp new file mode 100644 index 0000000..1fc22ad --- /dev/null +++ b/websocket.cpp @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include +#include +#include "websocket-xovi.h" + +extern "C" void override$_ZN10QWebSocket4openERK15QNetworkRequest( + QWebSocket* self, + const QNetworkRequest& req +) { + const char* host = std::getenv("RMFAKECLOUD_HOST"); + + // set new url + QUrl newUrl = req.url(); + newUrl.setHost(QString(host)); + + // create a new request, so we don't have to modify the original request + QNetworkRequest newReq(req); + newReq.setUrl(newUrl); + + // get original function signature + using CreateFn = void*(*)(QWebSocket*, + const QNetworkRequest&); + CreateFn orig = reinterpret_cast( + $_ZN10QWebSocket4openERK15QNetworkRequest + ); + + // call original function, and return the result + orig(self, newReq); +} + +extern "C" void _xovi_construct() { + const char* host = std::getenv("RMFAKECLOUD_HOST"); + if (host == NULL) { + qCritical() << "[rmfakecloud-websocket] Environment variable \"RMFAKECLOUD_HOST\" not set!"; + abort(); + } + + qDebug() << "Loading rmfakecloud-websocket by Tiebe. Using host " << host; +} \ No newline at end of file diff --git a/websocket.xovi b/websocket.xovi new file mode 100644 index 0000000..84ee197 --- /dev/null +++ b/websocket.xovi @@ -0,0 +1,4 @@ +version 1.0.0 + +import? _ZN10QWebSocket4openERK15QNetworkRequest +override _ZN10QWebSocket4openERK15QNetworkRequest