aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/transports/transport-sdk/include/serverplugin.h39
-rw-r--r--src/zenserver/plugins/pluginservice.cpp186
-rw-r--r--src/zenserver/plugins/pluginservice.h43
3 files changed, 261 insertions, 7 deletions
diff --git a/src/transports/transport-sdk/include/serverplugin.h b/src/transports/transport-sdk/include/serverplugin.h
new file mode 100644
index 000000000..c5c02dea9
--- /dev/null
+++ b/src/transports/transport-sdk/include/serverplugin.h
@@ -0,0 +1,39 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#pragma once
+
+#include <stdint.h>
+
+namespace zen {
+
+class ServerAPI
+{
+public:
+ virtual uint32_t GetCurrentPort();
+};
+
+class ServerPlugin
+{
+public:
+ virtual uint32_t AddRef() const = 0;
+ virtual uint32_t Release() const = 0;
+ virtual void Configure(const char* OptionTag, const char* OptionValue) = 0;
+ virtual void Initialize(const uint32_t APIVersion, ServerAPI* ServerInterface) = 0;
+ virtual void Shutdown() = 0;
+ virtual const char* GetDebugName() = 0;
+};
+
+} // namespace zen
+
+#if defined(_MSC_VER)
+# define DLL_TRANSPORT_API __declspec(dllexport)
+#else
+# define DLL_TRANSPORT_API
+#endif
+
+extern "C"
+{
+ DLL_TRANSPORT_API zen::ServerPlugin* CreateServerPlugin();
+}
+
+typedef zen::ServerPlugin* (*PfnCreateServerPlugin)();
diff --git a/src/zenserver/plugins/pluginservice.cpp b/src/zenserver/plugins/pluginservice.cpp
index 9e022733e..a6675a11c 100644
--- a/src/zenserver/plugins/pluginservice.cpp
+++ b/src/zenserver/plugins/pluginservice.cpp
@@ -1,5 +1,187 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#include "pluginservice.h"
+
+#ifndef ZEN_WITH_PLUGINSERVICE
+ #define ZEN_WITH_PLUGINSERVICE 1
+#endif
+
+// #include <zencore/compactbinarybuilder.h>
+
+namespace zen {
+
+using namespace std::literals;
+
+#if ZEN_WITH_PLUGINSERVICE
+
+//////////////////////////////////////////////////////////////////////////
+
+//bool
+//GetContentAsCbObject(HttpServerRequest& HttpReq, CbObject& Cb)
+//{
+// IoBuffer Payload = HttpReq.ReadPayload();
+// HttpContentType PayloadContentType = HttpReq.RequestContentType();
+//
+// switch (PayloadContentType)
+// {
+// case HttpContentType::kJSON:
+// case HttpContentType::kUnknownContentType:
+// case HttpContentType::kText:
+// {
+// std::string JsonText(reinterpret_cast<const char*>(Payload.GetData()), Payload.GetSize());
+// Cb = LoadCompactBinaryFromJson(JsonText).AsObject();
+// if (!Cb)
+// {
+// HttpReq.WriteResponse(HttpResponseCode::BadRequest,
+// HttpContentType::kText,
+// "Content format not supported, expected JSON format");
+// return false;
+// }
+// }
+// break;
+// case HttpContentType::kCbObject:
+// Cb = LoadCompactBinaryObject(Payload);
+// if (!Cb)
+// {
+// HttpReq.WriteResponse(HttpResponseCode::BadRequest,
+// HttpContentType::kText,
+// "Content format not supported, expected compact binary format");
+// return false;
+// }
+// break;
+// default:
+// HttpReq.WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Invalid request content type");
+// return false;
+// }
+//
+// return true;
+//}
+//
+////////////////////////////////////////////////////////////////////////////
+////
+//// to test:
+////
+//// echo {"method": "mount", "params": {"path": "d:\\VFS_ROOT"}} | curl.exe http://localhost:8558/vfs --data-binary @-
+//// echo {"method": "unmount"} | curl.exe http://localhost:8558/vfs --data-binary @-
+//
+//VfsService::VfsService()
+//{
+// m_Impl = new Impl;
+//
+// m_Router.RegisterRoute(
+// "info",
+// [&](HttpRouterRequest& Request) {
+// CbObjectWriter Cbo;
+// Cbo << "running" << m_Impl->IsVfsRunning();
+// Cbo << "rootpath" << m_Impl->GetMountpointPath();
+//
+// Request.ServerRequest().WriteResponse(HttpResponseCode::OK, Cbo.Save());
+// },
+// HttpVerb::kGet | HttpVerb::kHead);
+//
+// m_Router.RegisterRoute(
+// "",
+// [&](HttpRouterRequest& Req) {
+// CbObject Payload;
//
-// Created by dmytro.ivanov on 9/27/2024.
+// if (!GetContentAsCbObject(Req.ServerRequest(), Payload))
+// return;
//
+// std::string_view RpcName = Payload["method"sv].AsString();
+//
+// if (RpcName == "mount"sv)
+// {
+// CbObjectView Params = Payload["params"sv].AsObjectView();
+// std::string_view Mountpath = Params["path"sv].AsString();
+//
+// if (Mountpath.empty())
+// {
+// return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "no path specified");
+// }
+//
+// if (m_Impl->IsVfsRunning())
+// {
+// return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "VFS already mounted");
+// }
+//
+// try
+// {
+// m_Impl->Mount(Mountpath);
+// }
+// catch (const std::exception& Ex)
+// {
+// return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, Ex.what());
+// }
+//
+// Req.ServerRequest().WriteResponse(HttpResponseCode::OK);
+// }
+// else if (RpcName == "unmount"sv)
+// {
+// if (!m_Impl->IsVfsRunning())
+// {
+// return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "VFS not active");
+// }
+//
+// try
+// {
+// m_Impl->Unmount();
+// }
+// catch (const std::exception& Ex)
+// {
+// return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, Ex.what());
+// }
+//
+// Req.ServerRequest().WriteResponse(HttpResponseCode::OK);
+// }
+// else
+// {
+// Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "unknown RPC"sv);
+// }
+// },
+// HttpVerb::kPost);
+//}
+//
+//VfsService::~VfsService()
+//{
+// delete m_Impl;
+//}
+//
+//void
+//VfsService::Mount(std::string_view MountPoint)
+//{
+// m_Impl->Mount(MountPoint);
+//}
+//
+//void
+//VfsService::Unmount()
+//{
+// m_Impl->Unmount();
+//}
+//
+//void
+//VfsService::AddService(Ref<ProjectStore>&& Ps)
+//{
+// m_Impl->AddService(std::move(Ps));
+//}
+//
+//void
+//VfsService::AddService(Ref<ZenCacheStore>&& Z$)
+//{
+// m_Impl->AddService(std::move(Z$));
+//}
-#include "pluginservice.h"
+#endif
+
+const char*
+PluginService::BaseUri() const
+{
+ return "/plugin/";
+}
+
+void
+PluginService::HandleRequest(HttpServerRequest& HttpServiceRequest)
+{
+ //m_Router.HandleRequest(HttpServiceRequest);
+}
+
+} // namespace zen
diff --git a/src/zenserver/plugins/pluginservice.h b/src/zenserver/plugins/pluginservice.h
index a1111133a..5c46d3b9e 100644
--- a/src/zenserver/plugins/pluginservice.h
+++ b/src/zenserver/plugins/pluginservice.h
@@ -1,8 +1,41 @@
+// Copyright Epic Games, Inc. All Rights Reserved.
+
+#pragma once
+
+#include <zenbase/refcount.h>
+#include <zenhttp/httpserver.h>
+#include <zenvfs/vfs.h>
+
+#include <memory>
+
+namespace zen {
+
+//class ProjectStore;
+//class ZenCacheStore;
+
+class PluginService : public HttpService
+{
+public:
+ PluginService();
+ ~PluginService();
+
+// void Mount(std::string_view MountPoint);
+// void Unmount();
//
-// Created by dmytro.ivanov on 9/27/2024.
-//
+// void AddService(Ref<ProjectStore>&&);
+// void AddService(Ref<ZenCacheStore>&&);
+
+protected:
+ virtual const char* BaseUri() const override;
+ virtual void HandleRequest(HttpServerRequest& HttpServiceRequest) override;
+
+private:
+ //struct Impl;
+ //Impl* m_Impl = nullptr;
+
+ //HttpRequestRouter m_Router;
-#ifndef ZEN_PLUGINSERVICE_H
-#define ZEN_PLUGINSERVICE_H
+ //friend struct VfsServiceDataSource;
+};
-#endif // ZEN_PLUGINSERVICE_H
+} // namespace zen