- extended ModelNode_getObjectReferenceEx to support arrays (LIB61850-437)

pull/515/head
Michael Zillgith 1 year ago
parent 49c64ebfeb
commit a1e85e1452

@ -538,19 +538,34 @@ static int
createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool withoutIedName)
{
int bufPos;
int arrayIndex = -1;
if (node->modelType != LogicalNodeModelType) {
if (node->modelType != LogicalNodeModelType)
{
bufPos = createObjectReference(node->parent, objectReference, bufSize, withoutIedName);
if (node->modelType == DataAttributeModelType)
{
arrayIndex = ((DataAttribute*)(node))->arrayIndex;
}
else if (node->modelType == DataObjectModelType)
{
arrayIndex = ((DataObject*)(node))->arrayIndex;
}
if (bufPos == -1)
return -1;
if (arrayIndex < 0)
{
if (bufPos < bufSize)
objectReference[bufPos++] = '.';
else
return -1;
}
else {
}
else
{
LogicalNode* lNode = (LogicalNode*) node;
LogicalDevice* lDevice = (LogicalDevice*) lNode->parent;
@ -559,12 +574,13 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
bufPos = 0;
if (withoutIedName) {
if (withoutIedName)
{
objectReference[0] = 0;
StringUtils_appendString(objectReference, bufSize, lDevice->name);
}
else {
else
{
if (lDevice->ldName) {
StringUtils_copyStringMax(objectReference, bufSize, lDevice->ldName);
}
@ -581,10 +597,13 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
return -1;
}
if (node->name)
{
/* append own name */
int nameLength = strlen(node->name);
if (bufPos + nameLength < bufSize) {
if (bufPos + nameLength < bufSize)
{
int i;
for (i = 0; i < nameLength; i++) {
objectReference[bufPos++] = node->name[i];
@ -595,6 +614,32 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
else {
return -1;
}
}
if (arrayIndex > -1)
{
char arrayIndexStr[11];
snprintf(arrayIndexStr, 11, "%d", arrayIndex);
int arrayIndexStrLength = strlen(arrayIndexStr);
if (bufPos + arrayIndexStrLength + 2 < bufSize)
{
int i;
objectReference[bufPos++] = '(';
for (i = 0; i < arrayIndexStrLength; i++) {
objectReference[bufPos++] = arrayIndexStr[i];
}
objectReference[bufPos++] = ')';
}
else
return -1;
}
return bufPos;
}
char*
@ -608,15 +653,18 @@ ModelNode_getObjectReferenceEx(ModelNode* node, char* objectReference, bool with
{
bool allocated = false;
if (objectReference == NULL) {
if (objectReference == NULL)
{
objectReference = (char*) GLOBAL_MALLOC(130);
allocated = true;
}
if (objectReference) {
if (objectReference)
{
int bufPos = createObjectReference(node, objectReference, 130, withoutIedName);
if (bufPos == -1) {
if (bufPos == -1)
{
if (allocated)
GLOBAL_FREEMEM(objectReference);
@ -729,16 +777,16 @@ ModelNode_getChild(ModelNode* self, const char* name)
ModelNode* matchingNode = NULL;
while (nextNode) {
while (nextNode)
{
if (nextNode->name == NULL) {
break; /* is an array element */
}
int nodeNameLen = strlen(nextNode->name);
if (nodeNameLen == nameElementLength) {
if (nodeNameLen == nameElementLength)
{
if (memcmp(nextNode->name, name, nodeNameLen) == 0) {
matchingNode = nextNode;
break;

@ -309,12 +309,14 @@ mmsServer_getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVari
goto exit_function;
int i;
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) {
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++)
{
if ((int) strlen(structSpec->typeSpec.structure.elements[i]->name)
== component.size) {
== component.size)
{
if (strncmp(structSpec->typeSpec.structure.elements[i]->name,
(char*) component.buf, component.size) == 0) {
(char*) component.buf, component.size) == 0)
{
MmsValue* value = MmsValue_getElement(structuredValue, i);
if (mmsServer_isAccessToArrayComponent(

Loading…
Cancel
Save