- 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) createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool withoutIedName)
{ {
int bufPos; int bufPos;
int arrayIndex = -1;
if (node->modelType != LogicalNodeModelType) { if (node->modelType != LogicalNodeModelType)
{
bufPos = createObjectReference(node->parent, objectReference, bufSize, withoutIedName); 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) if (bufPos == -1)
return -1; return -1;
if (bufPos < bufSize) if (arrayIndex < 0)
objectReference[bufPos++] = '.'; {
else if (bufPos < bufSize)
return -1; objectReference[bufPos++] = '.';
else
return -1;
}
} }
else { else
{
LogicalNode* lNode = (LogicalNode*) node; LogicalNode* lNode = (LogicalNode*) node;
LogicalDevice* lDevice = (LogicalDevice*) lNode->parent; LogicalDevice* lDevice = (LogicalDevice*) lNode->parent;
@ -559,12 +574,13 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
bufPos = 0; bufPos = 0;
if (withoutIedName) { if (withoutIedName)
{
objectReference[0] = 0; objectReference[0] = 0;
StringUtils_appendString(objectReference, bufSize, lDevice->name); StringUtils_appendString(objectReference, bufSize, lDevice->name);
} }
else { else
{
if (lDevice->ldName) { if (lDevice->ldName) {
StringUtils_copyStringMax(objectReference, bufSize, lDevice->ldName); StringUtils_copyStringMax(objectReference, bufSize, lDevice->ldName);
} }
@ -581,20 +597,49 @@ createObjectReference(ModelNode* node, char* objectReference, int bufSize, bool
return -1; return -1;
} }
/* append own name */ if (node->name)
int nameLength = strlen(node->name); {
/* append own name */
int nameLength = strlen(node->name);
if (bufPos + nameLength < bufSize)
{
int i;
for (i = 0; i < nameLength; i++) {
objectReference[bufPos++] = node->name[i];
}
if (bufPos + nameLength < bufSize) { return bufPos;
int i; }
for (i = 0; i < nameLength; i++) { else {
objectReference[bufPos++] = node->name[i]; return -1;
} }
return bufPos;
} }
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* char*
@ -608,15 +653,18 @@ ModelNode_getObjectReferenceEx(ModelNode* node, char* objectReference, bool with
{ {
bool allocated = false; bool allocated = false;
if (objectReference == NULL) { if (objectReference == NULL)
{
objectReference = (char*) GLOBAL_MALLOC(130); objectReference = (char*) GLOBAL_MALLOC(130);
allocated = true; allocated = true;
} }
if (objectReference) { if (objectReference)
{
int bufPos = createObjectReference(node, objectReference, 130, withoutIedName); int bufPos = createObjectReference(node, objectReference, 130, withoutIedName);
if (bufPos == -1) { if (bufPos == -1)
{
if (allocated) if (allocated)
GLOBAL_FREEMEM(objectReference); GLOBAL_FREEMEM(objectReference);
@ -729,16 +777,16 @@ ModelNode_getChild(ModelNode* self, const char* name)
ModelNode* matchingNode = NULL; ModelNode* matchingNode = NULL;
while (nextNode) { while (nextNode)
{
if (nextNode->name == NULL) { if (nextNode->name == NULL) {
break; /* is an array element */ break; /* is an array element */
} }
int nodeNameLen = strlen(nextNode->name); int nodeNameLen = strlen(nextNode->name);
if (nodeNameLen == nameElementLength) { if (nodeNameLen == nameElementLength)
{
if (memcmp(nextNode->name, name, nodeNameLen) == 0) { if (memcmp(nextNode->name, name, nodeNameLen) == 0) {
matchingNode = nextNode; matchingNode = nextNode;
break; break;

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

Loading…
Cancel
Save