From 6f5e8a1c8162c29f497dbcb709a3b97f2dde40f7 Mon Sep 17 00:00:00 2001 From: PabloMK7 Date: Sun, 30 Mar 2025 00:44:52 +0100 Subject: [PATCH] Add built-in server log method. --- includes/ArticProtocolCommon.hpp | 6 ++++ sources/ArticProtocolServer.cpp | 61 +++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/includes/ArticProtocolCommon.hpp b/includes/ArticProtocolCommon.hpp index 71e2f60..ee59fd5 100644 --- a/includes/ArticProtocolCommon.hpp +++ b/includes/ArticProtocolCommon.hpp @@ -26,6 +26,12 @@ namespace ArticProtocolCommon { IN_SMALL_BUFFER = 4, IN_BIG_BUFFER = 5, }; + enum class LogOnServerType : u8 { + LOG_DEBUG = 0, + LOG_INFO = 1, + LOG_WARNING = 2, + LOG_ERROR = 3, + }; struct RequestParameter { RequestParameterType type; union { diff --git a/sources/ArticProtocolServer.cpp b/sources/ArticProtocolServer.cpp index c66f5c6..1dca8d7 100644 --- a/sources/ArticProtocolServer.cpp +++ b/sources/ArticProtocolServer.cpp @@ -385,22 +385,57 @@ void ArticProtocolServer::RequestHandler::Serve() { std::array methodArray = {0}; memcpy(methodArray.data(), req.reqPacket.method.data(), req.reqPacket.method.size()); - auto it = ArticFunctions::functionHandlers.find(std::string(methodArray.data())); - if (it == ArticFunctions::functionHandlers.end()) { - respPacket.resp.articResult = ArticProtocolCommon::ResponseMethod::ArticResult::METHOD_NOT_FOUND; - logger.Error("Worker %d: Method not found: %s", id, methodArray.data()); - if (!Write(accept_fd, &respPacket, sizeof(respPacket))) { - if (run) - logger.Error("Worker %d: Error writing to socket", id); - return; - } - continue; - } - logger.Debug("Worker %d: Processing %s (rID %d)", id, methodArray.data(), req.reqPacket.requestID); MethodInterface mi(req, workBuffer, workBufferSize, accept_fd); - it->second(mi); + if (strcmp(methodArray.data(), "__log") == 0) { + bool good = true; + s8 log_mode; + void* dataPtr; size_t dataPtrSize; + if (good) good = mi.GetParameterS8(log_mode); + if (good) good = mi.GetParameterBuffer(dataPtr, dataPtrSize); + + if (good) good = mi.FinishInputParameters(); + + if (good) { + std::string str(reinterpret_cast(dataPtr), dataPtrSize); + switch (static_cast(log_mode)) + { + case ArticProtocolCommon::LogOnServerType::LOG_DEBUG: + logger.Debug(str.c_str()); + break; + case ArticProtocolCommon::LogOnServerType::LOG_INFO: + logger.Info(str.c_str()); + break; + case ArticProtocolCommon::LogOnServerType::LOG_WARNING: + logger.Warning(str.c_str()); + break; + case ArticProtocolCommon::LogOnServerType::LOG_ERROR: + logger.Error(str.c_str()); + break; + default: + break; + } + + mi.FinishGood(0); + } + } else { + auto it = ArticFunctions::functionHandlers.find(std::string(methodArray.data())); + if (it == ArticFunctions::functionHandlers.end()) { + respPacket.resp.articResult = ArticProtocolCommon::ResponseMethod::ArticResult::METHOD_NOT_FOUND; + logger.Error("Worker %d: Method not found: %s", id, methodArray.data()); + if (!Write(accept_fd, &respPacket, sizeof(respPacket))) { + if (run) + logger.Error("Worker %d: Error writing to socket", id); + return; + } + continue; + } + + logger.Debug("Worker %d: Processing %s (rID %d)", id, methodArray.data(), req.reqPacket.requestID); + it->second(mi); + } + ArticProtocolCommon::MethodState mState = mi.GetMethodState(); if (mState != ArticProtocolCommon::MethodState::FINISHED) { respPacket.resp.articResult = ArticProtocolCommon::ResponseMethod::ArticResult::METHOD_ERROR;