diff --git a/src/mms/inc_private/mms_server_internal.h b/src/mms/inc_private/mms_server_internal.h index 5e2f458d..569fe7e1 100644 --- a/src/mms/inc_private/mms_server_internal.h +++ b/src/mms/inc_private/mms_server_internal.h @@ -387,6 +387,13 @@ mmsServer_isIndexAccess(AlternateAccess_t* alternateAccess); LIB61850_INTERNAL bool 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 mmsServer_getLowIndex(AlternateAccess_t* alternateAccess); diff --git a/src/mms/iso_mms/server/mms_read_service.c b/src/mms/iso_mms/server/mms_read_service.c index 1a658de4..5fc3827d 100644 --- a/src/mms/iso_mms/server/mms_read_service.c +++ b/src/mms/iso_mms/server/mms_read_service.c @@ -135,24 +135,6 @@ deleteValueList(LinkedList 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* getComponent(MmsServerConnection connection, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, char* variableName) { @@ -205,59 +187,6 @@ exit_function: 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 alternateArrayAccess(MmsServerConnection connection, AlternateAccess_t* alternateAccess, MmsDomain* domain, @@ -278,12 +207,12 @@ alternateArrayAccess(MmsServerConnection connection, MmsValue* value = NULL; if (numberOfElements == 0) - if (isAccessToArrayComponent(alternateAccess)) { + if (mmsServer_isAccessToArrayComponent(alternateAccess)) { if (namedVariable->typeSpec.array.elementTypeSpec->type == MMS_STRUCTURE) { MmsValue* structValue = MmsValue_getElement(arrayValue, index); if (structValue != NULL) - value = getComponentOfArrayElement(alternateAccess, + value = mmsServer_getComponentOfArrayElement(alternateAccess, namedVariable, structValue); } } diff --git a/src/mms/iso_mms/server/mms_server_common.c b/src/mms/iso_mms/server/mms_server_common.c index 30d5118d..62f9e0d5 100644 --- a/src/mms/iso_mms/server/mms_server_common.c +++ b/src/mms/iso_mms/server/mms_server_common.c @@ -267,6 +267,77 @@ mmsServer_isComponentAccess(AlternateAccess_t* alternateAccess) 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 mmsServer_getLowIndex(AlternateAccess_t* alternateAccess) { diff --git a/src/mms/iso_mms/server/mms_write_service.c b/src/mms/iso_mms/server/mms_write_service.c index 31a171e4..1c02a97a 100644 --- a/src/mms/iso_mms/server/mms_write_service.c +++ b/src/mms/iso_mms/server/mms_write_service.c @@ -479,7 +479,6 @@ handleWriteNamedVariableListRequest( } - void mmsServer_handleWriteRequest( MmsServerConnection connection, @@ -501,7 +500,7 @@ mmsServer_handleWriteRequest( goto exit_function; } - MmsServer_lockModel(connection->server); + MmsServer_lockModel(connection->server); WriteRequest_t* writeRequest = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); @@ -639,6 +638,19 @@ mmsServer_handleWriteRequest( 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) { accessResults[i] = DATA_ACCESS_ERROR_TYPE_INCONSISTENT; goto end_of_main_loop;