diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/transports/transport-sdk/include/serverplugin.h | 39 | ||||
| -rw-r--r-- | src/zenserver/plugins/pluginservice.cpp | 186 | ||||
| -rw-r--r-- | src/zenserver/plugins/pluginservice.h | 43 |
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 |