blob: 805dda61e6a84227622cfe503b1e4b3a328f396f [file] [log] [blame]
/*
* BaSyxNativeProvider.cpp
*
* Created on: 07.08.2018
* Author: schnicke
*/
#include <BaSyx/vab/provider/native/frame/BaSyxNativeFrameProcessor.h>
#include <BaSyx/vab/provider/native/frame/BaSyxNativeFrameHelper.h>
#include <BaSyx/util/tools/CoderTools.h>
#include <BaSyx/util/tools/StringTools.h>
#include <BaSyx/shared/types.h>
namespace basyx {
namespace vab {
namespace provider {
namespace native {
namespace frame {
BaSyxNativeFrameProcessor::BaSyxNativeFrameProcessor(vab::core::IModelProvider* providerBackend)
: jsonProvider{ providerBackend}
{
}
BaSyxNativeFrameProcessor::~BaSyxNativeFrameProcessor()
{
}
void BaSyxNativeFrameProcessor::processInputFrame(char const* rxFrame, std::size_t rxSize, char* txFrame, std::size_t* txSize)
{
std::size_t offset;
auto command = vab::provider::native::frame::BaSyxNativeFrameHelper::getCommand(rxFrame, &offset);
rxFrame += offset;
switch (command) {
case BaSyxCommand::Get:
processGet(rxFrame, txFrame, txSize);
break;
case BaSyxCommand::Set:
processSet(rxFrame, txFrame, txSize);
break;
case BaSyxCommand::Create:
processCreate(rxFrame, txFrame, txSize);
break;
case BaSyxCommand::Delete:
processDelete(rxFrame, rxSize - offset, txFrame, txSize);
break;
case BaSyxCommand::Invoke:
processInvoke(rxFrame, txFrame, txSize);
break;
}
}
void BaSyxNativeFrameProcessor::processGet(char const* rxFrame, char* txFrame, std::size_t* txSize)
{
// Try to get the requested value
// TODO: Error Handling?
std::string path = BaSyxNativeFrameHelper::getString(rxFrame, 0);
// Advance txFrame by 5 because of the following setup of txFrame:
// 1 byte result field
// 4 byte string size
// N byte return value
std::string getResult = jsonProvider.processBaSysGet(path);
*txSize += getResult.size();
memcpy(txFrame + 5, getResult.c_str(), getResult.size());
// Set return string size
CoderTools::setInt32(txFrame + 1, 0, *txSize);
*txSize += BASYX_STRINGSIZE_SIZE;
// Set result field to 0 to indicate success
txFrame[0] = 0;
*txSize += 1;
}
void BaSyxNativeFrameProcessor::processSet(char const* rxFrame, char* txFrame, std::size_t* txSize)
{
std::string path = BaSyxNativeFrameHelper::getString(rxFrame, 0);
// TODO: Error Handling?
std::string serializedValue = BaSyxNativeFrameHelper::getString(rxFrame, 1);
std::string getResult = jsonProvider.processBaSysSet(path, serializedValue);
memcpy(txFrame + 5, getResult.c_str(), getResult.size());
// Set return string size
CoderTools::setInt32(txFrame + 1, 0, *txSize);
*txSize += BASYX_STRINGSIZE_SIZE;
// Set result field to 0 to indicate success
txFrame[0] = 0;
*txSize += 1;
}
void BaSyxNativeFrameProcessor::processCreate(char const* rxFrame, char* txFrame, std::size_t* txSize)
{
std::string path = BaSyxNativeFrameHelper::getString(rxFrame, 0);
// TODO: Error Handling?
std::string serializedValue = BaSyxNativeFrameHelper::getString(rxFrame, 1);
std::string getResult = jsonProvider.processBaSysCreate(path, serializedValue);
memcpy(txFrame + 5, getResult.c_str(), getResult.size());
// Set return string size
CoderTools::setInt32(txFrame + 1, 0, *txSize);
*txSize += BASYX_STRINGSIZE_SIZE;
// Set result field to 0 to indicate success
txFrame[0] = 0;
*txSize += 1;
}
void BaSyxNativeFrameProcessor::processDelete(char const* rxFrame, std::size_t rxSize, char* txFrame, std::size_t* txSize)
{
std::string path = BaSyxNativeFrameHelper::getString(rxFrame, 0);
std::string result;
// Check if there is a serialized json after the path to distinguish between map/collection delete and simple delete
if (path.size() + BASYX_STRINGSIZE_SIZE < rxSize) {
std::string serializedValue = BaSyxNativeFrameHelper::getString(rxFrame,
1);
result = jsonProvider.processBaSysDelete(path, serializedValue);
} else {
result = jsonProvider.processBaSysDelete(path);
}
memcpy(txFrame + 5, result.c_str(), result.size());
// Set return string size
CoderTools::setInt32(txFrame + 1, 0, *txSize);
*txSize += BASYX_STRINGSIZE_SIZE;
// Set result field to 0 to indicate success
txFrame[0] = 0;
*txSize += 1;
}
void BaSyxNativeFrameProcessor::processInvoke(char const* rxFrame, char* txFrame, std::size_t* txSize)
{
std::string path = BaSyxNativeFrameHelper::getString(rxFrame, 0);
// TODO: Error Handling?
std::string serializedValue = BaSyxNativeFrameHelper::getString(rxFrame, 1);
// Advance txFrame by 5 because of the following setup of txFrame:
// 1 byte result field
// 4 byte string size
// N byte return value
auto result = jsonProvider.processBaSysInvoke(path, serializedValue, txFrame + 5,
txSize);
*txSize = result.size();
memcpy(txFrame + 5, result.c_str(), result.size());
// Set return value size
CoderTools::setInt32(txFrame + 1, 0, *txSize);
*txSize += BASYX_STRINGSIZE_SIZE;
// Set result field to 0 to indicate success
txFrame[0] = 0;
*txSize += 1;
}
}
}
}
}
}