This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.2 KiB
77 lines
2.2 KiB
// Copyright 2004-present Facebook. All Rights Reserved. |
|
|
|
#include "MethodCall.h" |
|
|
|
#include <folly/json.h> |
|
#include <stdexcept> |
|
|
|
namespace facebook { |
|
namespace react { |
|
|
|
#define REQUEST_MODULE_IDS 0 |
|
#define REQUEST_METHOD_IDS 1 |
|
#define REQUEST_PARAMSS 2 |
|
#define REQUEST_CALLID 3 |
|
|
|
static const char *errorPrefix = "Malformed calls from JS: "; |
|
|
|
std::vector<MethodCall> parseMethodCalls(folly::dynamic&& jsonData) throw(std::invalid_argument) { |
|
if (jsonData.isNull()) { |
|
return {}; |
|
} |
|
|
|
if (!jsonData.isArray()) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "input isn't array but ", jsonData.typeName())); |
|
} |
|
|
|
if (jsonData.size() < REQUEST_PARAMSS + 1) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "size == ", jsonData.size())); |
|
} |
|
|
|
auto& moduleIds = jsonData[REQUEST_MODULE_IDS]; |
|
auto& methodIds = jsonData[REQUEST_METHOD_IDS]; |
|
auto& params = jsonData[REQUEST_PARAMSS]; |
|
int callId = -1; |
|
|
|
if (!moduleIds.isArray() || !methodIds.isArray() || !params.isArray()) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "not all fields are arrays.\n\n", folly::toJson(jsonData))); |
|
} |
|
|
|
if (moduleIds.size() != methodIds.size() || moduleIds.size() != params.size()) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "field sizes are different.\n\n", folly::toJson(jsonData))); |
|
} |
|
|
|
if (jsonData.size() > REQUEST_CALLID) { |
|
if (!jsonData[REQUEST_CALLID].isNumber()) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "invalid callId", jsonData[REQUEST_CALLID].typeName())); |
|
} |
|
callId = jsonData[REQUEST_CALLID].asInt(); |
|
} |
|
|
|
std::vector<MethodCall> methodCalls; |
|
for (size_t i = 0; i < moduleIds.size(); i++) { |
|
if (!params[i].isArray()) { |
|
throw std::invalid_argument( |
|
folly::to<std::string>(errorPrefix, "method arguments isn't array but ", params[i].typeName())); |
|
} |
|
|
|
methodCalls.emplace_back( |
|
moduleIds[i].asInt(), |
|
methodIds[i].asInt(), |
|
std::move(params[i]), |
|
callId); |
|
|
|
// only incremement callid if contains valid callid as callid is optional |
|
callId += (callId != -1) ? 1 : 0; |
|
} |
|
|
|
return methodCalls; |
|
} |
|
|
|
}} |
|
|
|
|