Loading EtsiServerGen/patches/applyPatches.sh +4 −1 Original line number Original line Diff line number Diff line Loading @@ -5,3 +5,6 @@ patch -u ../api/RelocalizationInformationApi.cpp -i fixRelocInfoJSONIssue.patch patch -u ../api/TrackablesApi.cpp -i fixCppTrackable.patch patch -u ../api/TrackablesApi.cpp -i fixCppTrackable.patch patch -u ../api/WorldAnchorsApi.cpp -i fixCppWorldAnchor.patch patch -u ../api/WorldAnchorsApi.cpp -i fixCppWorldAnchor.patch patch -u ../api/WorldLinksApi.cpp -i fixCppWorldLink.patch patch -u ../api/WorldLinksApi.cpp -i fixCppWorldLink.patch patch -u ../model/WorldLink.cpp -i fixCppWorldLinkModel.patch patch -u ../model/WorldAnchor.cpp -i fixCppWorldAnchorModel.patch patch -u ../model/Trackable.cpp -i fixCppTrackableModel.patch No newline at end of file EtsiServerGen/patches/fixCppTrackable.patch +288 −72 Original line number Original line Diff line number Diff line --- TrackablesApi.cpp 2024-04-15 17:52:21.000357100 +0200 --- ../../../world-storage-cpp-server/EtsiServerGen/api/TrackablesApi.cpp 2024-04-15 17:47:05.542444638 +0200 +++ TrackablesApi_patched.cpp 2024-04-15 18:08:32.955228320 +0200 +++ ../api/TrackablesApi.cpp 2024-04-22 18:14:43.144871367 +0200 @@ -201,7 +201,7 @@ @@ -20,9 +20,12 @@ } #include <boost/property_tree/json_parser.hpp> #include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> - +#include <iostream> +#include <stdlib.h> #include "TrackablesApi.h" result = resultObject; + - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 200, result, responseHeaders); namespace org { return; namespace openapitools { } namespace server { if (status_code == 201) { @@ -80,6 +83,13 @@ @@ -211,7 +211,7 @@ boost::property_tree::json_parser::read_json(sstream, pt); } result = resultObject; auto model = MODEL_T(pt); - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 201, result, responseHeaders); + if constexpr(std::is_same_v<MODEL_T, Trackable>) { return; + auto unitStr = pt.get<std::string>("unit", ""); + UnitSystem unit; + unit.fromString(unitStr);// Convertir unitStr en UnitSystem + model.setUnit(unit); + } return model; } } if (status_code == 400) { @@ -219,7 +219,7 @@ result = "Bad request."; result = resultObject; @@ -159,86 +169,102 @@ - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); session->close(status, result, { {"Connection", "close"} }); + returnResponse(session, 400, result, responseHeaders); return; } } if (status_code == 409) { @@ -227,15 +227,14 @@ result = "Invalid UUID, id must be a Nil value."; result = resultObject; + +void extractBodyContentAsync( + const std::shared_ptr<restbed::Session>& session, + int content_length, + std::function<void(const std::string&)> callback) +{ + session->fetch(content_length, + [callback](const std::shared_ptr<restbed::Session> session, + const restbed::Bytes &body) { + std::string bodyContent = restbed::String::format( + "%.*s\n", (int)body.size(), body.data()); + callback(bodyContent); + }); +} void TrackablesResource::handler_POST_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); - // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); - auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); - // Getting the headers - std::string token = request->get_header("token", ""); - - int status_code = 500; - std::string resultObject = ""; - std::string result = ""; - - try { - std::tie(status_code, resultObject) = - handler_POST(trackable, token); - } - catch(const TrackablesApiException& e) { - std::tie(status_code, result) = handleTrackablesApiException(e); - } - catch(const std::exception& e) { - std::tie(status_code, result) = handleStdException(e); - } - catch(...) { - std::tie(status_code, result) = handleUnspecifiedException(); - } - - std::multimap< std::string, std::string > responseHeaders {}; - static const std::vector<std::string> contentTypes{ - "text/plain","application/json", - }; - static const std::string acceptTypes{ - "application/json, " - }; - - if (status_code == 200) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 201) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 400) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Bad request."; - - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 409) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Invalid UUID, id must be a Nil value."; - - result = resultObject; - returnResponse(session, 409, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 409, result.empty() ? "{}" : result, responseHeaders); + returnResponse(session, 409, result, responseHeaders); - return; return; - } } - if (status_code == 0) { if (status_code == 0) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Unexpected error."; result = "Unexpected error."; - - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - return; - } - defaultSessionClose(session, status_code, result); + int content_length = request->get_header("Content-Length", 0); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + + + std::string token = request->get_header("token", ""); + + int status_code = 500; + std::string resultObject = ""; + std::string result = ""; + + auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); + + try { + std::tie(status_code, resultObject) = + handler_POST(trackable, token); + } + catch (const TrackablesApiException& e) { + std::tie(status_code, result) = handleTrackablesApiException(e); + } + catch (const std::exception& e) { + std::tie(status_code, result) = handleStdException(e); + } + catch (...) { + std::tie(status_code, result) = handleUnspecifiedException(); + } + + std::multimap< std::string, std::string > responseHeaders {}; + static const std::vector<std::string> contentTypes{ + "text/plain","application/json", + }; + static const std::string acceptTypes{ + "application/json, " + }; + + if (status_code == 200) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + return; + } + if (status_code == 201) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 201, result, responseHeaders); + return; + } + if (status_code == 400) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Bad request."; + + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + return; + } + if (status_code == 409) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Invalid UUID, id must be a Nil value."; + + auto result = resultObject; + returnResponse(session, 409, result, responseHeaders); + return; + } + if (status_code == 0) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Unexpected error."; + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; + return; + } + defaultSessionClose(session, status_code, result); + }); } } defaultSessionClose(session, status_code, result); @@ -277,8 +276,12 @@ // x-extension @@ -277,8 +303,11 @@ if (!acceptTypes.empty()) { if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } - - - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + std::string response; + std::string rep; + for (const Trackable& item : resultObject) { + for (const Trackable& item : resultObject) { + response += item.toJsonString() + ",\n"; + rep += item.toJsonString() + ",\n"; + } + } + + returnResponse(session, 200, rep, responseHeaders); + returnResponse(session, 200, response, responseHeaders); return; return; } } if (status_code == 201) { if (status_code == 201) { @@ -286,17 +289,18 @@ @@ -286,17 +315,20 @@ if (!acceptTypes.empty()) { if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } - - - result = resultObject; - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); + std::string response; + std::string rep; + for (const Trackable& item : resultObject) { + for (const Trackable& item : resultObject) { + response += item.toJsonString() + ",\n"; + rep += item.toJsonString() + ",\n"; + } + } + returnResponse(session, 201, response, responseHeaders); + + returnResponse(session, 201, rep, responseHeaders); return; return; } } if (status_code == 0) { if (status_code == 0) { Loading @@ -80,33 +243,51 @@ - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -343,7 +347,7 @@ @@ -304,8 +336,11 @@ // x-extension void TrackablesResource::handler_PUT_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -342,35 +377,36 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } result = resultObject; - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + returnResponse(session, 200, result, responseHeaders); return; return; } } if (status_code == 400) { if (status_code == 400) { @@ -351,7 +355,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Bad request."; result = "Bad request."; result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + returnResponse(session, 400, result, responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { @@ -359,15 +363,15 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, result, responseHeaders); return; return; } } Loading @@ -116,39 +297,74 @@ - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + result = resultObject; + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -494,7 +498,7 @@ + }); } std::pair<int, std::string> TrackablesResource::handler_POST( @@ -390,9 +426,13 @@ return handler_PUT_func(trackable, token); } -std::string TrackablesResource::extractBodyContent(const std::shared_ptr<restbed::Session>& session) { + + +std::string TrackablesResource::extractBodyContent( + const std::shared_ptr<restbed::Session>& session) { const auto request = session->get_request(); int content_length = request->get_header("Content-Length", 0); + std::string bodyContent; session->fetch(content_length, [&bodyContent](const std::shared_ptr<restbed::Session> session, @@ -400,8 +440,10 @@ bodyContent = restbed::String::format( "%.*s\n", (int)body.size(), body.data()); }); - return bodyContent; + return bodyContent; } } + + result = resultObject; std::string TrackablesResource::extractFormParamsFromBody(const std::string& paramName, const std::string& body) { const auto uri = restbed::Uri("urlencoded?" + body, true); @@ -493,24 +535,24 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + returnResponse(session, 200, result, responseHeaders); return; return; } } if (status_code == 400) { if (status_code == 400) { @@ -502,7 +506,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; result = "Invalid UUID supplied."; result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400,result, responseHeaders); + returnResponse(session, 400,result, responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { @@ -510,7 +514,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -556,23 +560,23 @@ @@ -556,23 +598,23 @@ } } result = resultObject.toJsonString(); result = resultObject.toJsonString(); Loading @@ -162,8 +378,8 @@ - result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + result = resultObject.toJsonString(); + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + returnResponse(session, 400, "{}", responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { Loading @@ -172,8 +388,8 @@ - result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + result = resultObject.toJsonString(); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, "{}", responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); EtsiServerGen/patches/fixCppTrackableModel.patch 0 → 100644 +18 −0 Original line number Original line Diff line number Diff line --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/model/Trackable.cpp 2024-04-23 15:04:24.911615729 +0200 +++ ../model/Trackable.cpp 2024-04-22 18:23:44.610773480 +0200 @@ -41,6 +41,7 @@ } + std::string Trackable::toJsonString(bool prettyJson /* = false */) const { std::stringstream ss; @@ -51,6 +52,7 @@ return result; } + void Trackable::fromJsonString(std::string const& jsonString) { std::stringstream ss(jsonString); EtsiServerGen/patches/fixCppWorldAnchor.patch +74 −8 Original line number Original line Diff line number Diff line --- WorldAnchorsApi.cpp 2024-04-18 15:54:51.026541100 +0200 --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/api/WorldAnchorsApi.cpp 2024-04-23 11:31:29.141217249 +0200 +++ WorldAnchorsApi_patched.cpp 2024-04-11 15:19:00.660580000 +0200 +++ ../api/WorldAnchorsApi.cpp 2024-04-22 10:38:47.298434241 +0200 @@ -234,7 +234,7 @@ @@ -20,7 +20,7 @@ #include <boost/property_tree/json_parser.hpp> #include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> - +#include <iostream> #include "WorldAnchorsApi.h" namespace org { @@ -159,11 +159,26 @@ session->close(status, result, { {"Connection", "close"} }); } +void extractBodyContentAsync( + const std::shared_ptr<restbed::Session>& session, + int content_length, + std::function<void(const std::string&)> callback) +{ + session->fetch(content_length, + [callback](const std::shared_ptr<restbed::Session> session, + const restbed::Bytes &body) { + std::string bodyContent = restbed::String::format( + "%.*s\n", (int)body.size(), body.data()); + callback(bodyContent); + }); +} void WorldAnchorsResource::handler_POST_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { auto worldAnchor = extractJsonModelBodyParam<WorldAnchor>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -234,11 +249,12 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; result = "Unexpected error."; Loading @@ -9,7 +46,12 @@ returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -278,7 +278,11 @@ defaultSessionClose(session, status_code, result); + }); } // x-extension @@ -278,7 +294,11 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } Loading @@ -22,7 +64,7 @@ return; return; } } if (status_code == 201) { if (status_code == 201) { @@ -287,16 +291,20 @@ @@ -287,16 +307,20 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } Loading @@ -47,7 +89,19 @@ return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -366,8 +374,8 @@ @@ -304,8 +328,10 @@ // x-extension void WorldAnchorsResource::handler_PUT_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { auto worldAnchor = extractJsonModelBodyParam<WorldAnchor>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -366,11 +392,12 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; result = "Unexpected error."; Loading @@ -58,7 +112,11 @@ return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -563,7 +571,7 @@ + }); } std::pair<int, std::string> WorldAnchorsResource::handler_POST( @@ -563,7 +590,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; result = "Invalid UUID supplied."; Loading @@ -67,7 +125,7 @@ returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -571,7 +579,7 @@ @@ -571,7 +598,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; Loading @@ -76,3 +134,11 @@ returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -590,6 +617,7 @@ return handler_GET_func(worldAnchorUUID, token); } + std::string WorldAnchorsWorldAnchorUUIDResource::extractBodyContent(const std::shared_ptr<restbed::Session>& session) { const auto request = session->get_request(); int content_length = request->get_header("Content-Length", 0); EtsiServerGen/patches/fixCppWorldAnchorModel.patch 0 → 100644 +18 −0 Original line number Original line Diff line number Diff line --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/model/WorldAnchor.cpp 2024-04-23 11:31:29.041217253 +0200 +++ ../model/WorldAnchor.cpp 2024-04-23 09:52:17.137467999 +0200 @@ -66,6 +66,7 @@ pt.put("UUID", m_UUID); pt.put("name", m_Name); pt.put("creatorUUID", m_CreatorUUID); + pt.put("unit", m_Unit.getEnumValue()); // generate tree for LocalCRS tmp_node.clear(); if (!m_LocalCRS.empty()) { @@ -95,6 +96,7 @@ m_UUID = pt.get("UUID", ""); m_Name = pt.get("name", ""); m_CreatorUUID = pt.get("creatorUUID", ""); + m_Unit.setEnumValue(pt.get("unit","")); // push all items of LocalCRS into member if (pt.get_child_optional("localCRS")) { m_LocalCRS = fromPt<std::vector<float>>(pt.get_child("localCRS")); Loading
EtsiServerGen/patches/applyPatches.sh +4 −1 Original line number Original line Diff line number Diff line Loading @@ -5,3 +5,6 @@ patch -u ../api/RelocalizationInformationApi.cpp -i fixRelocInfoJSONIssue.patch patch -u ../api/TrackablesApi.cpp -i fixCppTrackable.patch patch -u ../api/TrackablesApi.cpp -i fixCppTrackable.patch patch -u ../api/WorldAnchorsApi.cpp -i fixCppWorldAnchor.patch patch -u ../api/WorldAnchorsApi.cpp -i fixCppWorldAnchor.patch patch -u ../api/WorldLinksApi.cpp -i fixCppWorldLink.patch patch -u ../api/WorldLinksApi.cpp -i fixCppWorldLink.patch patch -u ../model/WorldLink.cpp -i fixCppWorldLinkModel.patch patch -u ../model/WorldAnchor.cpp -i fixCppWorldAnchorModel.patch patch -u ../model/Trackable.cpp -i fixCppTrackableModel.patch No newline at end of file
EtsiServerGen/patches/fixCppTrackable.patch +288 −72 Original line number Original line Diff line number Diff line --- TrackablesApi.cpp 2024-04-15 17:52:21.000357100 +0200 --- ../../../world-storage-cpp-server/EtsiServerGen/api/TrackablesApi.cpp 2024-04-15 17:47:05.542444638 +0200 +++ TrackablesApi_patched.cpp 2024-04-15 18:08:32.955228320 +0200 +++ ../api/TrackablesApi.cpp 2024-04-22 18:14:43.144871367 +0200 @@ -201,7 +201,7 @@ @@ -20,9 +20,12 @@ } #include <boost/property_tree/json_parser.hpp> #include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> - +#include <iostream> +#include <stdlib.h> #include "TrackablesApi.h" result = resultObject; + - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 200, result, responseHeaders); namespace org { return; namespace openapitools { } namespace server { if (status_code == 201) { @@ -80,6 +83,13 @@ @@ -211,7 +211,7 @@ boost::property_tree::json_parser::read_json(sstream, pt); } result = resultObject; auto model = MODEL_T(pt); - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 201, result, responseHeaders); + if constexpr(std::is_same_v<MODEL_T, Trackable>) { return; + auto unitStr = pt.get<std::string>("unit", ""); + UnitSystem unit; + unit.fromString(unitStr);// Convertir unitStr en UnitSystem + model.setUnit(unit); + } return model; } } if (status_code == 400) { @@ -219,7 +219,7 @@ result = "Bad request."; result = resultObject; @@ -159,86 +169,102 @@ - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); session->close(status, result, { {"Connection", "close"} }); + returnResponse(session, 400, result, responseHeaders); return; } } if (status_code == 409) { @@ -227,15 +227,14 @@ result = "Invalid UUID, id must be a Nil value."; result = resultObject; + +void extractBodyContentAsync( + const std::shared_ptr<restbed::Session>& session, + int content_length, + std::function<void(const std::string&)> callback) +{ + session->fetch(content_length, + [callback](const std::shared_ptr<restbed::Session> session, + const restbed::Bytes &body) { + std::string bodyContent = restbed::String::format( + "%.*s\n", (int)body.size(), body.data()); + callback(bodyContent); + }); +} void TrackablesResource::handler_POST_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); - // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); - auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); - // Getting the headers - std::string token = request->get_header("token", ""); - - int status_code = 500; - std::string resultObject = ""; - std::string result = ""; - - try { - std::tie(status_code, resultObject) = - handler_POST(trackable, token); - } - catch(const TrackablesApiException& e) { - std::tie(status_code, result) = handleTrackablesApiException(e); - } - catch(const std::exception& e) { - std::tie(status_code, result) = handleStdException(e); - } - catch(...) { - std::tie(status_code, result) = handleUnspecifiedException(); - } - - std::multimap< std::string, std::string > responseHeaders {}; - static const std::vector<std::string> contentTypes{ - "text/plain","application/json", - }; - static const std::string acceptTypes{ - "application/json, " - }; - - if (status_code == 200) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 201) { - responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); - if (!acceptTypes.empty()) { - responseHeaders.insert(std::make_pair("Accept", acceptTypes)); - } - - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 400) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Bad request."; - - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - return; - } - if (status_code == 409) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Invalid UUID, id must be a Nil value."; - - result = resultObject; - returnResponse(session, 409, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 409, result.empty() ? "{}" : result, responseHeaders); + returnResponse(session, 409, result, responseHeaders); - return; return; - } } - if (status_code == 0) { if (status_code == 0) { - responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); - result = "Unexpected error."; result = "Unexpected error."; - - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - return; - } - defaultSessionClose(session, status_code, result); + int content_length = request->get_header("Content-Length", 0); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + + + std::string token = request->get_header("token", ""); + + int status_code = 500; + std::string resultObject = ""; + std::string result = ""; + + auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); + + try { + std::tie(status_code, resultObject) = + handler_POST(trackable, token); + } + catch (const TrackablesApiException& e) { + std::tie(status_code, result) = handleTrackablesApiException(e); + } + catch (const std::exception& e) { + std::tie(status_code, result) = handleStdException(e); + } + catch (...) { + std::tie(status_code, result) = handleUnspecifiedException(); + } + + std::multimap< std::string, std::string > responseHeaders {}; + static const std::vector<std::string> contentTypes{ + "text/plain","application/json", + }; + static const std::string acceptTypes{ + "application/json, " + }; + + if (status_code == 200) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + return; + } + if (status_code == 201) { + responseHeaders.insert(std::make_pair("Content-Type", selectPreferredContentType(contentTypes))); + if (!acceptTypes.empty()) { + responseHeaders.insert(std::make_pair("Accept", acceptTypes)); + } + + auto result = resultObject; + returnResponse(session, 201, result, responseHeaders); + return; + } + if (status_code == 400) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Bad request."; + + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + return; + } + if (status_code == 409) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Invalid UUID, id must be a Nil value."; + + auto result = resultObject; + returnResponse(session, 409, result, responseHeaders); + return; + } + if (status_code == 0) { + responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); + result = "Unexpected error."; + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; + return; + } + defaultSessionClose(session, status_code, result); + }); } } defaultSessionClose(session, status_code, result); @@ -277,8 +276,12 @@ // x-extension @@ -277,8 +303,11 @@ if (!acceptTypes.empty()) { if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } - - - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + std::string response; + std::string rep; + for (const Trackable& item : resultObject) { + for (const Trackable& item : resultObject) { + response += item.toJsonString() + ",\n"; + rep += item.toJsonString() + ",\n"; + } + } + + returnResponse(session, 200, rep, responseHeaders); + returnResponse(session, 200, response, responseHeaders); return; return; } } if (status_code == 201) { if (status_code == 201) { @@ -286,17 +289,18 @@ @@ -286,17 +315,20 @@ if (!acceptTypes.empty()) { if (!acceptTypes.empty()) { responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } - - - result = resultObject; - result = resultObject; - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 201, result.empty() ? "{}" : result, responseHeaders); + std::string response; + std::string rep; + for (const Trackable& item : resultObject) { + for (const Trackable& item : resultObject) { + response += item.toJsonString() + ",\n"; + rep += item.toJsonString() + ",\n"; + } + } + returnResponse(session, 201, response, responseHeaders); + + returnResponse(session, 201, rep, responseHeaders); return; return; } } if (status_code == 0) { if (status_code == 0) { Loading @@ -80,33 +243,51 @@ - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -343,7 +347,7 @@ @@ -304,8 +336,11 @@ // x-extension void TrackablesResource::handler_PUT_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { + auto trackable = extractJsonModelBodyParam<Trackable>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -342,35 +377,36 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } result = resultObject; - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + returnResponse(session, 200, result, responseHeaders); return; return; } } if (status_code == 400) { if (status_code == 400) { @@ -351,7 +355,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Bad request."; result = "Bad request."; result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + returnResponse(session, 400, result, responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { @@ -359,15 +363,15 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, result, responseHeaders); return; return; } } Loading @@ -116,39 +297,74 @@ - result = resultObject.toJsonString(); - result = resultObject.toJsonString(); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); + result = resultObject; + + returnResponse(session, 0, result, responseHeaders); + returnResponse(session, 0, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -494,7 +498,7 @@ + }); } std::pair<int, std::string> TrackablesResource::handler_POST( @@ -390,9 +426,13 @@ return handler_PUT_func(trackable, token); } -std::string TrackablesResource::extractBodyContent(const std::shared_ptr<restbed::Session>& session) { + + +std::string TrackablesResource::extractBodyContent( + const std::shared_ptr<restbed::Session>& session) { const auto request = session->get_request(); int content_length = request->get_header("Content-Length", 0); + std::string bodyContent; session->fetch(content_length, [&bodyContent](const std::shared_ptr<restbed::Session> session, @@ -400,8 +440,10 @@ bodyContent = restbed::String::format( "%.*s\n", (int)body.size(), body.data()); }); - return bodyContent; + return bodyContent; } } + + result = resultObject; std::string TrackablesResource::extractFormParamsFromBody(const std::string& paramName, const std::string& body) { const auto uri = restbed::Uri("urlencoded?" + body, true); @@ -493,24 +535,24 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } - result = resultObject; - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 200, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 200, result, responseHeaders); + returnResponse(session, 200, result, responseHeaders); return; return; } } if (status_code == 400) { if (status_code == 400) { @@ -502,7 +506,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; result = "Invalid UUID supplied."; result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 400,result, responseHeaders); + returnResponse(session, 400,result, responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { @@ -510,7 +514,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, result, responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -556,23 +560,23 @@ @@ -556,23 +598,23 @@ } } result = resultObject.toJsonString(); result = resultObject.toJsonString(); Loading @@ -162,8 +378,8 @@ - result = resultObject; - result = resultObject; - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); + result = resultObject.toJsonString(); + auto result = resultObject; + returnResponse(session, 400, result, responseHeaders); + returnResponse(session, 400, "{}", responseHeaders); return; return; } } if (status_code == 404) { if (status_code == 404) { Loading @@ -172,8 +388,8 @@ - result = resultObject; - result = resultObject; - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); - returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); + result = resultObject.toJsonString(); + auto result = resultObject; + returnResponse(session, 404, result, responseHeaders); + returnResponse(session, 404, "{}", responseHeaders); return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result);
EtsiServerGen/patches/fixCppTrackableModel.patch 0 → 100644 +18 −0 Original line number Original line Diff line number Diff line --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/model/Trackable.cpp 2024-04-23 15:04:24.911615729 +0200 +++ ../model/Trackable.cpp 2024-04-22 18:23:44.610773480 +0200 @@ -41,6 +41,7 @@ } + std::string Trackable::toJsonString(bool prettyJson /* = false */) const { std::stringstream ss; @@ -51,6 +52,7 @@ return result; } + void Trackable::fromJsonString(std::string const& jsonString) { std::stringstream ss(jsonString);
EtsiServerGen/patches/fixCppWorldAnchor.patch +74 −8 Original line number Original line Diff line number Diff line --- WorldAnchorsApi.cpp 2024-04-18 15:54:51.026541100 +0200 --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/api/WorldAnchorsApi.cpp 2024-04-23 11:31:29.141217249 +0200 +++ WorldAnchorsApi_patched.cpp 2024-04-11 15:19:00.660580000 +0200 +++ ../api/WorldAnchorsApi.cpp 2024-04-22 10:38:47.298434241 +0200 @@ -234,7 +234,7 @@ @@ -20,7 +20,7 @@ #include <boost/property_tree/json_parser.hpp> #include <boost/lexical_cast.hpp> #include <boost/algorithm/string.hpp> - +#include <iostream> #include "WorldAnchorsApi.h" namespace org { @@ -159,11 +159,26 @@ session->close(status, result, { {"Connection", "close"} }); } +void extractBodyContentAsync( + const std::shared_ptr<restbed::Session>& session, + int content_length, + std::function<void(const std::string&)> callback) +{ + session->fetch(content_length, + [callback](const std::shared_ptr<restbed::Session> session, + const restbed::Bytes &body) { + std::string bodyContent = restbed::String::format( + "%.*s\n", (int)body.size(), body.data()); + callback(bodyContent); + }); +} void WorldAnchorsResource::handler_POST_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { auto worldAnchor = extractJsonModelBodyParam<WorldAnchor>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -234,11 +249,12 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; result = "Unexpected error."; Loading @@ -9,7 +46,12 @@ returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 0, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -278,7 +278,11 @@ defaultSessionClose(session, status_code, result); + }); } // x-extension @@ -278,7 +294,11 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } Loading @@ -22,7 +64,7 @@ return; return; } } if (status_code == 201) { if (status_code == 201) { @@ -287,16 +291,20 @@ @@ -287,16 +307,20 @@ responseHeaders.insert(std::make_pair("Accept", acceptTypes)); responseHeaders.insert(std::make_pair("Accept", acceptTypes)); } } Loading @@ -47,7 +89,19 @@ return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -366,8 +374,8 @@ @@ -304,8 +328,10 @@ // x-extension void WorldAnchorsResource::handler_PUT_internal(const std::shared_ptr<restbed::Session> session) { const auto request = session->get_request(); + int content_length = request->get_header("Content-Length", 0); + // body params or form params here from the body content string - std::string bodyContent = extractBodyContent(session); + extractBodyContentAsync(session, content_length, [this, session,request](const std::string& bodyContent) { auto worldAnchor = extractJsonModelBodyParam<WorldAnchor>(bodyContent); // Getting the headers std::string token = request->get_header("token", ""); @@ -366,11 +392,12 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Unexpected error."; result = "Unexpected error."; Loading @@ -58,7 +112,11 @@ return; return; } } defaultSessionClose(session, status_code, result); defaultSessionClose(session, status_code, result); @@ -563,7 +571,7 @@ + }); } std::pair<int, std::string> WorldAnchorsResource::handler_POST( @@ -563,7 +590,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Invalid UUID supplied."; result = "Invalid UUID supplied."; Loading @@ -67,7 +125,7 @@ returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 400, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -571,7 +579,7 @@ @@ -571,7 +598,7 @@ responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); responseHeaders.insert(std::make_pair("Content-Type", "text/plain")); result = "Not found, could not find UUID in database."; result = "Not found, could not find UUID in database."; Loading @@ -76,3 +134,11 @@ returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); returnResponse(session, 404, result.empty() ? "{}" : result, responseHeaders); return; return; } } @@ -590,6 +617,7 @@ return handler_GET_func(worldAnchorUUID, token); } + std::string WorldAnchorsWorldAnchorUUIDResource::extractBodyContent(const std::shared_ptr<restbed::Session>& session) { const auto request = session->get_request(); int content_length = request->get_header("Content-Length", 0);
EtsiServerGen/patches/fixCppWorldAnchorModel.patch 0 → 100644 +18 −0 Original line number Original line Diff line number Diff line --- ../../../cpp-server-patch/world-storage-cpp-server/EtsiServerGen/model/WorldAnchor.cpp 2024-04-23 11:31:29.041217253 +0200 +++ ../model/WorldAnchor.cpp 2024-04-23 09:52:17.137467999 +0200 @@ -66,6 +66,7 @@ pt.put("UUID", m_UUID); pt.put("name", m_Name); pt.put("creatorUUID", m_CreatorUUID); + pt.put("unit", m_Unit.getEnumValue()); // generate tree for LocalCRS tmp_node.clear(); if (!m_LocalCRS.empty()) { @@ -95,6 +96,7 @@ m_UUID = pt.get("UUID", ""); m_Name = pt.get("name", ""); m_CreatorUUID = pt.get("creatorUUID", ""); + m_Unit.setEnumValue(pt.get("unit","")); // push all items of LocalCRS into member if (pt.get_child_optional("localCRS")) { m_LocalCRS = fromPt<std::vector<float>>(pt.get_child("localCRS"));