55 lines
2.2 KiB
C
55 lines
2.2 KiB
C
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Copyright 2022 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
|
|
*/
|
|
|
|
#include "eventloop_common.h"
|
|
|
|
UA_StatusCode
|
|
UA_KeyValueRestriction_validate(const UA_Logger *logger, const char *logprefix,
|
|
const UA_KeyValueRestriction *restrictions, size_t restrictionsSize,
|
|
const UA_KeyValueMap *map) {
|
|
for(size_t i = 0; i < restrictionsSize; i++) {
|
|
const UA_KeyValueRestriction *r = &restrictions[i];
|
|
const UA_Variant *val = UA_KeyValueMap_get(map, r->name);
|
|
|
|
/* Value not present but required? */
|
|
if(!val) {
|
|
if(r->required) {
|
|
UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
|
|
"%s\t| Parameter %.*s required but not defined",
|
|
logprefix, (int)r->name.name.length, (char*)r->name.name.data);
|
|
return UA_STATUSCODE_BADINTERNALERROR;
|
|
}
|
|
continue;
|
|
}
|
|
|
|
/* Type matches */
|
|
if(val->type != r->type) {
|
|
UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
|
|
"%s\t| Parameter %.*s has the wrong type",
|
|
logprefix, (int)r->name.name.length, (char*)r->name.name.data);
|
|
return UA_STATUSCODE_BADINTERNALERROR;
|
|
}
|
|
|
|
/* Scalar / array is allowed */
|
|
UA_Boolean scalar = UA_Variant_isScalar(val);
|
|
if(scalar && !r->scalar) {
|
|
UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
|
|
"%s\t| Parameter %.*s must not be scalar",
|
|
logprefix, (int)r->name.name.length, (char*)r->name.name.data);
|
|
return UA_STATUSCODE_BADINTERNALERROR;
|
|
}
|
|
if(!scalar && !r->array) {
|
|
UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND,
|
|
"%s\t| Parameter %.*s must not be an array",
|
|
logprefix, (int)r->name.name.length, (char*)r->name.name.data);
|
|
return UA_STATUSCODE_BADCONNECTIONREJECTED;
|
|
}
|
|
}
|
|
|
|
return UA_STATUSCODE_GOOD;
|
|
}
|