- MMS server: implemented write access to array element commponent (LIB61850-338)

v1.6_develop_rgoose_sntp
Michael Zillgith 3 years ago
parent 0865b6fd99
commit 0a1ddb7ca9

@ -387,6 +387,13 @@ mmsServer_isIndexAccess(AlternateAccess_t* alternateAccess);
LIB61850_INTERNAL bool LIB61850_INTERNAL bool
mmsServer_isComponentAccess(AlternateAccess_t* alternateAccess); mmsServer_isComponentAccess(AlternateAccess_t* alternateAccess);
LIB61850_INTERNAL bool
mmsServer_isAccessToArrayComponent(AlternateAccess_t* alternateAccess);
LIB61850_INTERNAL MmsValue*
mmsServer_getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable,
MmsValue* structuredValue);
LIB61850_INTERNAL int LIB61850_INTERNAL int
mmsServer_getLowIndex(AlternateAccess_t* alternateAccess); mmsServer_getLowIndex(AlternateAccess_t* alternateAccess);

@ -135,24 +135,6 @@ deleteValueList(LinkedList values)
LinkedList_destroyStatic(values); LinkedList_destroyStatic(values);
} }
static bool
isAccessToArrayComponent(AlternateAccess_t* alternateAccess)
{
if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess != NULL)
{
if (alternateAccess->list.array[0]->choice.unnamed->
choice.selectAlternateAccess.alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.present ==
AlternateAccessSelection__selectAlternateAccess__accessSelection_PR_component)
{
return true;
}
else
return false;
}
else
return false;
}
static MmsValue* static MmsValue*
getComponent(MmsServerConnection connection, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, char* variableName) getComponent(MmsServerConnection connection, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, char* variableName)
{ {
@ -205,59 +187,6 @@ exit_function:
return retValue; return retValue;
} }
static MmsValue*
getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable,
MmsValue* structuredValue)
{
MmsValue* retValue = NULL;
if (isAccessToArrayComponent(alternateAccess))
{
Identifier_t component = alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess
->list.array[0]->choice.unnamed->choice.selectAccess.choice.component;
if (component.size > 129)
goto exit_function;
MmsVariableSpecification* structSpec;
if (namedVariable->type == MMS_ARRAY)
structSpec = namedVariable->typeSpec.array.elementTypeSpec;
else if (namedVariable->type == MMS_STRUCTURE)
structSpec = namedVariable;
else
goto exit_function;
int i;
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) {
if ((int) strlen(structSpec->typeSpec.structure.elements[i]->name)
== component.size) {
if (strncmp(structSpec->typeSpec.structure.elements[i]->name,
(char*) component.buf, component.size) == 0) {
MmsValue* value = MmsValue_getElement(structuredValue, i);
if (isAccessToArrayComponent(
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess)) {
retValue =
getComponentOfArrayElement(
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess,
structSpec->typeSpec.structure.elements[i],
value);
}
else
retValue = value;
goto exit_function;
}
}
}
}
exit_function:
return retValue;
}
static void static void
alternateArrayAccess(MmsServerConnection connection, alternateArrayAccess(MmsServerConnection connection,
AlternateAccess_t* alternateAccess, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsDomain* domain,
@ -278,12 +207,12 @@ alternateArrayAccess(MmsServerConnection connection,
MmsValue* value = NULL; MmsValue* value = NULL;
if (numberOfElements == 0) if (numberOfElements == 0)
if (isAccessToArrayComponent(alternateAccess)) { if (mmsServer_isAccessToArrayComponent(alternateAccess)) {
if (namedVariable->typeSpec.array.elementTypeSpec->type == MMS_STRUCTURE) { if (namedVariable->typeSpec.array.elementTypeSpec->type == MMS_STRUCTURE) {
MmsValue* structValue = MmsValue_getElement(arrayValue, index); MmsValue* structValue = MmsValue_getElement(arrayValue, index);
if (structValue != NULL) if (structValue != NULL)
value = getComponentOfArrayElement(alternateAccess, value = mmsServer_getComponentOfArrayElement(alternateAccess,
namedVariable, structValue); namedVariable, structValue);
} }
} }

@ -267,6 +267,77 @@ mmsServer_isComponentAccess(AlternateAccess_t* alternateAccess)
return false; return false;
} }
bool
mmsServer_isAccessToArrayComponent(AlternateAccess_t* alternateAccess)
{
if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess != NULL)
{
if (alternateAccess->list.array[0]->choice.unnamed->
choice.selectAlternateAccess.alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.accessSelection.present ==
AlternateAccessSelection__selectAlternateAccess__accessSelection_PR_component)
{
return true;
}
else
return false;
}
else
return false;
}
MmsValue*
mmsServer_getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable,
MmsValue* structuredValue)
{
MmsValue* retValue = NULL;
if (mmsServer_isAccessToArrayComponent(alternateAccess))
{
Identifier_t component = alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess
->list.array[0]->choice.unnamed->choice.selectAccess.choice.component;
if (component.size > 129)
goto exit_function;
MmsVariableSpecification* structSpec;
if (namedVariable->type == MMS_ARRAY)
structSpec = namedVariable->typeSpec.array.elementTypeSpec;
else if (namedVariable->type == MMS_STRUCTURE)
structSpec = namedVariable;
else
goto exit_function;
int i;
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) {
if ((int) strlen(structSpec->typeSpec.structure.elements[i]->name)
== component.size) {
if (strncmp(structSpec->typeSpec.structure.elements[i]->name,
(char*) component.buf, component.size) == 0) {
MmsValue* value = MmsValue_getElement(structuredValue, i);
if (mmsServer_isAccessToArrayComponent(
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess)) {
retValue =
mmsServer_getComponentOfArrayElement(
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess,
structSpec->typeSpec.structure.elements[i],
value);
}
else
retValue = value;
goto exit_function;
}
}
}
}
exit_function:
return retValue;
}
int int
mmsServer_getLowIndex(AlternateAccess_t* alternateAccess) mmsServer_getLowIndex(AlternateAccess_t* alternateAccess)
{ {

@ -479,7 +479,6 @@ handleWriteNamedVariableListRequest(
} }
void void
mmsServer_handleWriteRequest( mmsServer_handleWriteRequest(
MmsServerConnection connection, MmsServerConnection connection,
@ -501,7 +500,7 @@ mmsServer_handleWriteRequest(
goto exit_function; goto exit_function;
} }
MmsServer_lockModel(connection->server); MmsServer_lockModel(connection->server);
WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write);
@ -639,6 +638,19 @@ mmsServer_handleWriteRequest(
goto end_of_main_loop; goto end_of_main_loop;
} }
if (mmsServer_isAccessToArrayComponent(alternateAccess)) {
MmsVariableSpecification* namedVariable = MmsDomain_getNamedVariable(domain, nameIdStr);
if (namedVariable) {
elementValue = mmsServer_getComponentOfArrayElement(alternateAccess, namedVariable, elementValue);
}
if ((namedVariable == NULL) || (elementValue == NULL)) {
accessResults[i] = DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT;
goto end_of_main_loop;
}
}
if (MmsValue_update(elementValue, value) == false) { if (MmsValue_update(elementValue, value) == false) {
accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT;
goto end_of_main_loop; goto end_of_main_loop;

Loading…
Cancel
Save