@ -3380,8 +3380,8 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
if ( listType = = MMS_GETNAMELIST_DATASETS )
{
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
char str [ 65 ] ;
char * ldName = MmsDomain_getName ( domain ) ;
@ -3414,7 +3414,8 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
}
else if ( listType = = MMS_GETNAMELIST_JOURNALS )
{
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
char str [ 65 ] ;
char * ldName = MmsDomain_getName ( domain ) ;
@ -3457,7 +3458,8 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
{
FunctionalConstraint fc = IEC61850_FC_NONE ;
if ( separator ) {
if ( separator )
{
fc = FunctionalConstraint_fromString ( separator + 1 ) ;
if ( fc = = IEC61850_FC_BR | | fc = = IEC61850_FC_US | |
@ -3473,17 +3475,20 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
LogicalNode * ln = LogicalDevice_getLogicalNode ( ld , str ) ;
if ( ln ) {
if ( ln )
{
char * doStart = strchr ( separator + 1 , ' $ ' ) ;
if ( doStart ! = NULL ) {
if ( doStart ! = NULL )
{
char * doEnd = strchr ( doStart + 1 , ' $ ' ) ;
if ( doEnd = = NULL ) {
if ( doEnd = = NULL )
{
StringUtils_copyStringToBuffer ( doStart + 1 , str ) ;
}
else {
else
{
doEnd - - ;
StringUtils_createStringFromBufferInBufferMax ( str , ( uint8_t * ) ( doStart + 1 ) , doEnd - doStart , sizeof ( str ) ) ;
@ -3521,7 +3526,8 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
break ;
}
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer , connection ) ;
allowAccess = self - > listObjectsAccessHandler ( self - > listObjectsAccessHandlerParameter , clientConnection , acsiClass , ld , ln , str , subObjectName , fc ) ;
@ -3543,14 +3549,16 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
{
char * doStart = strchr ( separator + 1 , ' $ ' ) ;
if ( doStart ! = NULL ) {
if ( doStart ! = NULL )
{
char * doEnd = strchr ( doStart + 1 , ' $ ' ) ;
if ( doEnd = = NULL ) {
if ( doEnd = = NULL )
{
StringUtils_copyStringToBuffer ( doStart + 1 , str ) ;
}
else {
else
{
doEnd - - ;
StringUtils_createStringFromBufferInBufferMax ( str , ( uint8_t * ) ( doStart + 1 ) , doEnd - doStart , sizeof ( str ) ) ;
@ -3558,8 +3566,10 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
subObjectName = StringUtils_copyStringToBufferAndReplace ( doEnd + 2 , subObjectBuf , ' $ ' , ' . ' ) ;
}
if ( fc = = IEC61850_FC_SP ) {
if ( ! strcmp ( str , " SGCB " ) ) {
if ( fc = = IEC61850_FC_SP )
{
if ( ! strcmp ( str , " SGCB " ) )
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer ,
connection ) ;
@ -3572,41 +3582,47 @@ mmsListObjectsAccessHandler(void* parameter, MmsGetNameListType listType, MmsDom
ModelNode * dobj = ModelNode_getChild ( ( ModelNode * ) ln , str ) ;
if ( dobj ! = NULL ) {
if ( dobj - > modelType = = DataObjectModelType ) {
if ( dobj ! = NULL )
{
if ( dobj - > modelType = = DataObjectModelType )
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer ,
connection ) ;
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
allowAccess = self - > listObjectsAccessHandler ( self - > listObjectsAccessHandlerParameter , clientConnection , ACSI_CLASS_DATA_OBJECT , ld , ln , dobj - > name , subObjectName , fc ) ;
}
}
}
}
else {
else
{
/* no data object but with FC specified */
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer ,
connection ) ;
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
allowAccess = self - > listObjectsAccessHandler ( self - > listObjectsAccessHandlerParameter , clientConnection , ACSI_CLASS_DATA_OBJECT , ld , ln , NULL , NULL , fc ) ;
}
}
}
}
}
else {
else
{
LogicalNode * ln = LogicalDevice_getLogicalNode ( ld , variableId ) ;
if ( ln ) {
if ( ln )
{
/* only LN, no FC specified */
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer , connection ) ;
if ( self - > listObjectsAccessHandler ) {
if ( self - > listObjectsAccessHandler )
{
allowAccess = self - > listObjectsAccessHandler ( self - > listObjectsAccessHandlerParameter , clientConnection , ACSI_CLASS_DATA_OBJECT , ld , ln , NULL , NULL , fc ) ;
}
}
@ -3778,21 +3794,24 @@ checkDataSetAccess(MmsMapping* self, MmsServerConnection connection, MmsVariable
{
bool accessGranted = true ;
if ( self - > dataSetAccessHandler ) {
if ( self - > dataSetAccessHandler )
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer , connection ) ;
char dataSetRef [ 130 ] ;
dataSetRef [ 0 ] = 0 ;
if ( listType = = MMS_ASSOCIATION_SPECIFIC ) {
if ( listType = = MMS_ASSOCIATION_SPECIFIC )
{
dataSetRef [ 0 ] = ' @ ' ;
StringUtils_copyStringToBuffer ( dataSetRef + 1 , listName ) ;
}
else if ( listType = = MMS_VMD_SPECIFIC ) {
else if ( listType = = MMS_VMD_SPECIFIC )
{
StringUtils_copyStringToBuffer ( dataSetRef , listName ) ;
}
else if ( listType = = MMS_DOMAIN_SPECIFIC ) {
else if ( listType = = MMS_DOMAIN_SPECIFIC )
{
StringUtils_appendString ( dataSetRef , 129 , domain - > domainName ) ;
StringUtils_appendString ( dataSetRef , 129 , " / " ) ;
StringUtils_appendString ( dataSetRef , 129 , listName ) ;
@ -3841,11 +3860,12 @@ variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType
printf ( " specific (name=%s) \n " , listName ) ;
# endif /* (DEBUG_IED_SERVER == 1) */
if ( accessType = = MMS_VARLIST_CREATE ) {
if ( checkDataSetAccess ( self , connection , listType , domain , listName , DATASET_CREATE ) ) {
if ( listType = = MMS_DOMAIN_SPECIFIC ) {
if ( accessType = = MMS_VARLIST_CREATE )
{
if ( checkDataSetAccess ( self , connection , listType , domain , listName , DATASET_CREATE ) )
{
if ( listType = = MMS_DOMAIN_SPECIFIC )
{
/* check if LN exists - otherwise reject request (to fulfill test case sDsN1c) */
allow = MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT ;
@ -3854,13 +3874,14 @@ variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType
LogicalDevice * ld = IedModel_getDevice ( model , domain - > domainName ) ;
if ( ld ! = NULL ) {
if ( ld ! = NULL )
{
char lnName [ 129 ] ;
char * separator = strchr ( listName , ' $ ' ) ;
if ( separator ! = NULL ) {
if ( separator ! = NULL )
{
int lnNameLen = separator - listName ;
memcpy ( lnName , listName , lnNameLen ) ;
@ -3869,7 +3890,6 @@ variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType
if ( LogicalDevice_getLogicalNode ( ld , lnName ) ! = NULL )
allow = MMS_ERROR_NONE ;
}
}
}
}
@ -3877,46 +3897,58 @@ variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType
allow = MMS_ERROR_ACCESS_OBJECT_ACCESS_DENIED ;
}
}
else if ( accessType = = MMS_VARLIST_DELETE ) {
if ( checkDataSetAccess ( self , connection , listType , domain , listName , DATASET_DELETE ) ) {
else if ( accessType = = MMS_VARLIST_DELETE )
{
if ( checkDataSetAccess ( self , connection , listType , domain , listName , DATASET_DELETE ) )
{
/* Check if data set is referenced in a report */
LinkedList rcElement = self - > reportControls ;
while ( ( rcElement = LinkedList_getNext ( rcElement ) ) ! = NULL ) {
while ( ( rcElement = LinkedList_getNext ( rcElement ) ) ! = NULL )
{
ReportControl * rc = ( ReportControl * ) rcElement - > data ;
if ( rc - > isDynamicDataSet ) {
if ( rc - > dataSet ! = NULL ) {
if ( listType = = MMS_DOMAIN_SPECIFIC ) {
if ( rc - > dataSet - > logicalDeviceName ! = NULL ) {
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 ) {
if ( strcmp ( rc - > dataSet - > logicalDeviceName , MmsDomain_getName ( domain ) + strlen ( self - > model - > name ) ) = = 0 ) {
if ( rc - > isDynamicDataSet )
{
if ( rc - > dataSet ! = NULL )
{
if ( listType = = MMS_DOMAIN_SPECIFIC )
{
if ( rc - > dataSet - > logicalDeviceName ! = NULL )
{
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 )
{
if ( strcmp ( rc - > dataSet - > logicalDeviceName , MmsDomain_getName ( domain ) + strlen ( self - > model - > name ) ) = = 0 )
{
allow = MMS_ERROR_SERVICE_OBJECT_CONSTRAINT_CONFLICT ;
break ;
}
}
}
}
else if ( listType = = MMS_VMD_SPECIFIC ) {
if ( rc - > dataSet - > logicalDeviceName = = NULL ) {
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 ) {
else if ( listType = = MMS_VMD_SPECIFIC )
{
if ( rc - > dataSet - > logicalDeviceName = = NULL )
{
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 )
{
allow = MMS_ERROR_SERVICE_OBJECT_CONSTRAINT_CONFLICT ;
break ;
}
}
}
else if ( listType = = MMS_ASSOCIATION_SPECIFIC ) {
if ( rc - > dataSet - > logicalDeviceName = = NULL ) {
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 ) {
else if ( listType = = MMS_ASSOCIATION_SPECIFIC )
{
if ( rc - > dataSet - > logicalDeviceName = = NULL )
{
if ( strcmp ( rc - > dataSet - > name , listName ) = = 0 )
{
allow = MMS_ERROR_SERVICE_OBJECT_CONSTRAINT_CONFLICT ;
break ;
}
}
}
}
}
}
@ -3925,31 +3957,39 @@ variableListAccessHandler (void* parameter, MmsVariableListAccessType accessType
/* check if data set is referenced in a log control block*/
LinkedList logElement = self - > logControls ;
while ( ( logElement = LinkedList_getNext ( logElement ) ) ! = NULL ) {
while ( ( logElement = LinkedList_getNext ( logElement ) ) ! = NULL )
{
LogControl * lc = ( LogControl * ) logElement - > data ;
if ( lc - > isDynamicDataSet ) {
if ( lc - > dataSet ! = NULL ) {
if ( listType = = MMS_DOMAIN_SPECIFIC ) {
if ( lc - > dataSet - > logicalDeviceName ! = NULL ) {
if ( strcmp ( lc - > dataSet - > name , listName ) = = 0 ) {
if ( strcmp ( lc - > dataSet - > logicalDeviceName , MmsDomain_getName ( domain ) + strlen ( self - > model - > name ) ) = = 0 ) {
if ( lc - > isDynamicDataSet )
{
if ( lc - > dataSet ! = NULL )
{
if ( listType = = MMS_DOMAIN_SPECIFIC )
{
if ( lc - > dataSet - > logicalDeviceName ! = NULL )
{
if ( strcmp ( lc - > dataSet - > name , listName ) = = 0 )
{
if ( strcmp ( lc - > dataSet - > logicalDeviceName , MmsDomain_getName ( domain ) + strlen ( self - > model - > name ) ) = = 0 )
{
allow = MMS_ERROR_SERVICE_OBJECT_CONSTRAINT_CONFLICT ;
break ;
}
}
}
}
else if ( listType = = MMS_VMD_SPECIFIC ) {
if ( lc - > dataSet - > logicalDeviceName = = NULL ) {
if ( strcmp ( lc - > dataSet - > name , listName ) = = 0 ) {
else if ( listType = = MMS_VMD_SPECIFIC )
{
if ( lc - > dataSet - > logicalDeviceName = = NULL )
{
if ( strcmp ( lc - > dataSet - > name , listName ) = = 0 )
{
allow = MMS_ERROR_SERVICE_OBJECT_CONSTRAINT_CONFLICT ;
break ;
}
}
}
}
}
}
@ -3990,7 +4030,8 @@ mmsReadJournalHandler(void* parameter, MmsDomain* domain, const char* logName, M
MmsMapping * self = ( MmsMapping * ) parameter ;
if ( self - > controlBlockAccessHandler ) {
if ( self - > controlBlockAccessHandler )
{
ClientConnection clientConnection = private_IedServer_getClientConnectionByHandle ( self - > iedServer , connection ) ;
LogicalDevice * ld = IedModel_getDevice ( self - > model , domain - > domainName ) ;
@ -4005,7 +4046,8 @@ mmsReadJournalHandler(void* parameter, MmsDomain* domain, const char* logName, M
char * separator = strchr ( str , ' $ ' ) ;
if ( separator ) {
if ( separator )
{
name = separator + 1 ;
* separator = 0 ;
@ -4049,15 +4091,18 @@ isMemberValueRecursive(MmsValue* container, MmsValue* value)
if ( container = = value )
isMemberValue = true ;
else {
else
{
if ( ( MmsValue_getType ( container ) = = MMS_STRUCTURE ) | |
( MmsValue_getType ( container ) = = MMS_ARRAY ) )
{
int compCount = MmsValue_getArraySize ( container ) ;
int i ;
for ( i = 0 ; i < compCount ; i + + ) {
if ( isMemberValueRecursive ( MmsValue_getElement ( container , i ) , value ) ) {
for ( i = 0 ; i < compCount ; i + + )
{
if ( isMemberValueRecursive ( MmsValue_getElement ( container , i ) , value ) )
{
isMemberValue = true ;
break ;
}
@ -4077,12 +4122,15 @@ DataSet_isMemberValue(DataSet* dataSet, MmsValue* value, int* index)
DataSetEntry * dataSetEntry = dataSet - > fcdas ;
while ( dataSetEntry ! = NULL ) {
while ( dataSetEntry ! = NULL )
{
MmsValue * dataSetValue = dataSetEntry - > value ;
if ( dataSetValue ! = NULL ) { /* prevent invalid data set members */
if ( isMemberValueRecursive ( dataSetValue , value ) ) {
if ( dataSetValue ! = NULL )
{
/* prevent invalid data set members */
if ( isMemberValueRecursive ( dataSetValue , value ) )
{
if ( index ! = NULL )
* index = i ;
@ -4108,12 +4156,15 @@ DataSet_isMemberValueWithRef(DataSet* dataSet, MmsValue* value, char* dataRef, c
DataSetEntry * dataSetEntry = dataSet - > fcdas ;
while ( dataSetEntry ! = NULL ) {
while ( dataSetEntry ! = NULL )
{
MmsValue * dataSetValue = dataSetEntry - > value ;
if ( dataSetValue ! = NULL ) { /* prevent invalid data set members */
if ( isMemberValueRecursive ( dataSetValue , value ) ) {
if ( dataSetValue ! = NULL )
{
/* prevent invalid data set members */
if ( isMemberValueRecursive ( dataSetValue , value ) )
{
if ( dataRef ! = NULL )
sprintf ( dataRef , " %s%s/%s " , iedName , dataSetEntry - > logicalDeviceName , dataSetEntry - > variableName ) ;
@ -4137,11 +4188,12 @@ MmsMapping_triggerLogging(MmsMapping* self, MmsValue* value, LogInclusionFlag fl
{
LinkedList element = self - > logControls ;
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL ) {
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL )
{
LogControl * lc = ( LogControl * ) element - > data ;
if ( ( lc - > enabled ) & & ( lc - > dataSet ! = NULL ) ) {
if ( ( lc - > enabled ) & & ( lc - > dataSet ! = NULL ) )
{
uint8_t reasonCode ;
switch ( flag ) {
@ -4179,15 +4231,16 @@ MmsMapping_triggerLogging(MmsMapping* self, MmsValue* value, LogInclusionFlag fl
int dsEntryIdx = 0 ;
if ( DataSet_isMemberValueWithRef ( lc - > dataSet , value , dataRef , self - > model - > name , & dsEntryIdx ) ) {
if ( lc - > logInstance ! = NULL ) {
if ( lc - > dataSet ) {
if ( DataSet_isMemberValueWithRef ( lc - > dataSet , value , dataRef , self - > model - > name , & dsEntryIdx ) )
{
if ( lc - > logInstance ! = NULL )
{
if ( lc - > dataSet )
{
DataSetEntry * dsEntry = lc - > dataSet - > fcdas ;
while ( dsEntry & & ( dsEntryIdx > 0 ) ) {
while ( dsEntry & & ( dsEntryIdx > 0 ) )
{
dsEntry = dsEntry - > sibling ;
if ( dsEntry = = NULL )
@ -4196,21 +4249,20 @@ MmsMapping_triggerLogging(MmsMapping* self, MmsValue* value, LogInclusionFlag fl
dsEntryIdx - - ;
}
if ( dsEntry ) {
if ( dsEntry )
{
MmsValue * dsValue = dsEntry - > value ;
LogInstance_logSingleData ( lc - > logInstance , dataRef , dsValue , reasonCode ) ;
}
}
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: No log instance available! \n " ) ;
}
}
}
}
}
@ -4278,20 +4330,24 @@ MmsMapping_triggerGooseObservers(MmsMapping* self, MmsValue* value)
{
LinkedList element = self - > gseControls ;
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL ) {
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL )
{
MmsGooseControlBlock gcb = ( MmsGooseControlBlock ) element - > data ;
if ( MmsGooseControlBlock_isEnabled ( gcb ) ) {
if ( MmsGooseControlBlock_isEnabled ( gcb ) )
{
DataSet * dataSet = MmsGooseControlBlock_getDataSet ( gcb ) ;
if ( DataSet_isMemberValue ( dataSet , value , NULL ) ) {
if ( DataSet_isMemberValue ( dataSet , value , NULL ) )
{
MmsGooseControlBlock_setStateChangePending ( gcb ) ;
# if (CONFIG_MMS_THREADLESS_STACK != 1)
Semaphore_wait ( self - > isModelLockedMutex ) ;
# endif
if ( self - > isModelLocked = = false ) {
if ( self - > isModelLocked = = false )
{
MmsGooseControlBlock_publishNewState ( gcb ) ;
}
@ -4308,10 +4364,12 @@ MmsMapping_enableGoosePublishing(MmsMapping* self)
{
LinkedList element = LinkedList_getNext ( self - > gseControls ) ;
while ( element ) {
while ( element )
{
MmsGooseControlBlock gcb = ( MmsGooseControlBlock ) LinkedList_getData ( element ) ;
if ( MmsGooseControlBlock_enable ( gcb , self ) = = false ) {
if ( MmsGooseControlBlock_enable ( gcb , self ) = = false )
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: failed to enable GoCB %s \n " , MmsGooseControlBlock_getName ( gcb ) ) ;
}
@ -4325,14 +4383,18 @@ MmsMapping_useGooseVlanTag(MmsMapping* self, LogicalNode* ln, const char* gcbNam
{
LinkedList element = self - > gseControls ;
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL ) {
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL )
{
MmsGooseControlBlock gcb = ( MmsGooseControlBlock ) element - > data ;
if ( ln = = NULL ) {
if ( ln = = NULL )
{
MmsGooseControlBlock_useGooseVlanTag ( gcb , useVlanTag ) ;
}
else {
if ( ( MmsGooseControlBlock_getLogicalNode ( gcb ) = = ln ) & & ! strcmp ( MmsGooseControlBlock_getName ( gcb ) , gcbName ) ) {
else
{
if ( ( MmsGooseControlBlock_getLogicalNode ( gcb ) = = ln ) & & ! strcmp ( MmsGooseControlBlock_getName ( gcb ) , gcbName ) )
{
MmsGooseControlBlock_useGooseVlanTag ( gcb , useVlanTag ) ;
}
}
@ -4344,14 +4406,18 @@ MmsMapping_setGooseInterfaceId(MmsMapping* self, LogicalNode* ln, const char* g
{
LinkedList element = self - > gseControls ;
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL ) {
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL )
{
MmsGooseControlBlock gcb = ( MmsGooseControlBlock ) element - > data ;
if ( ln = = NULL ) {
if ( ln = = NULL )
{
MmsGooseControlBlock_setGooseInterfaceId ( gcb , interfaceId ) ;
}
else {
if ( ( MmsGooseControlBlock_getLogicalNode ( gcb ) = = ln ) & & ! strcmp ( MmsGooseControlBlock_getName ( gcb ) , gcbName ) ) {
else
{
if ( ( MmsGooseControlBlock_getLogicalNode ( gcb ) = = ln ) & & ! strcmp ( MmsGooseControlBlock_getName ( gcb ) , gcbName ) )
{
MmsGooseControlBlock_setGooseInterfaceId ( gcb , interfaceId ) ;
}
}
@ -4363,7 +4429,8 @@ MmsMapping_disableGoosePublishing(MmsMapping* self)
{
LinkedList element = self - > gseControls ;
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL ) {
while ( ( element = LinkedList_getNext ( element ) ) ! = NULL )
{
MmsGooseControlBlock gcb = ( MmsGooseControlBlock ) element - > data ;
MmsGooseControlBlock_disable ( gcb , self ) ;
@ -4393,10 +4460,12 @@ GOOSE_processGooseEvents(MmsMapping* self, uint64_t currentTimeInMs)
{
LinkedList element = LinkedList_getNext ( self - > gseControls ) ;
while ( element ! = NULL ) {
while ( element ! = NULL )
{
MmsGooseControlBlock mmsGCB = ( MmsGooseControlBlock ) element - > data ;
if ( MmsGooseControlBlock_isEnabled ( mmsGCB ) ) {
if ( MmsGooseControlBlock_isEnabled ( mmsGCB ) )
{
MmsGooseControlBlock_checkAndPublish ( mmsGCB , currentTimeInMs , self ) ;
}
@ -4449,8 +4518,8 @@ eventWorkerThread(MmsMapping* self)
{
bool running = true ;
while ( running ) {
while ( running )
{
processPeriodicTasks ( self ) ;
Thread_sleep ( 1 ) ; /* hand-over control to other threads */
@ -4477,11 +4546,12 @@ MmsMapping_startEventWorkerThread(MmsMapping* self)
void
MmsMapping_stopEventWorkerThread ( MmsMapping * self )
{
if ( self - > reportThreadRunning ) {
if ( self - > reportThreadRunning )
{
self - > reportThreadRunning = false ;
if ( self - > reportWorkerThread ) {
if ( self - > reportWorkerThread )
{
Thread_destroy ( self - > reportWorkerThread ) ;
self - > reportWorkerThread = NULL ;
}
@ -4494,15 +4564,18 @@ MmsMapping_createDataSetByNamedVariableList(MmsMapping* self, MmsNamedVariableLi
{
DataSet * dataSet = ( DataSet * ) GLOBAL_CALLOC ( 1 , sizeof ( DataSet ) ) ;
if ( dataSet ) {
if ( variableList - > domain ! = NULL ) {
if ( dataSet )
{
if ( variableList - > domain ! = NULL )
{
LogicalDevice * ld = IedModel_getDevice ( self - > model , MmsDomain_getName ( variableList - > domain ) ) ;
if ( ld ) {
if ( ld )
{
dataSet - > logicalDeviceName = ld - > name ;
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: LD lookup error! " ) ;
}
@ -4517,17 +4590,18 @@ MmsMapping_createDataSetByNamedVariableList(MmsMapping* self, MmsNamedVariableLi
DataSetEntry * lastDataSetEntry = NULL ;
while ( element ! = NULL ) {
while ( element ! = NULL )
{
MmsAccessSpecifier * listEntry = ( MmsAccessSpecifier * ) element - > data ;
LogicalDevice * entryLd = IedModel_getDevice ( self - > model , MmsDomain_getName ( listEntry - > domain ) ) ;
if ( entryLd ) {
if ( entryLd )
{
DataSetEntry * dataSetEntry = ( DataSetEntry * ) GLOBAL_MALLOC ( sizeof ( DataSetEntry ) ) ;
if ( dataSetEntry ) {
if ( dataSetEntry )
{
/* use variable name part of domain name as logicalDeviceName */
dataSetEntry - > logicalDeviceName = entryLd - > name ;
dataSetEntry - > variableName = listEntry - > variableName ;
@ -4545,42 +4619,51 @@ MmsMapping_createDataSetByNamedVariableList(MmsMapping* self, MmsNamedVariableLi
MmsValue * dataSetEntryValue = MmsServer_getValueFromCacheEx ( self - > mmsServer , listEntry - > domain , listEntry - > variableName , & dataSetEntryVarSpec ) ;
if ( dataSetEntryValue ) {
if ( dataSetEntry - > index ! = - 1 ) {
if ( dataSetEntryVarSpec - > type = = MMS_ARRAY ) {
if ( dataSetEntryValue )
{
if ( dataSetEntry - > index ! = - 1 )
{
if ( dataSetEntryVarSpec - > type = = MMS_ARRAY )
{
MmsValue * elementValue = MmsValue_getElement ( dataSetEntryValue , dataSetEntry - > index ) ;
if ( elementValue ) {
if ( dataSetEntry - > componentName ) {
if ( elementValue )
{
if ( dataSetEntry - > componentName )
{
MmsVariableSpecification * elementType = dataSetEntryVarSpec - > typeSpec . array . elementTypeSpec ;
MmsValue * subElementValue = MmsVariableSpecification_getChildValue ( elementType , elementValue , dataSetEntry - > componentName ) ;
if ( subElementValue ) {
if ( subElementValue )
{
dataSetEntry - > value = subElementValue ;
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: ERROR - component %s of array element not found \n " , dataSetEntry - > componentName ) ;
}
}
else {
else
{
dataSetEntry - > value = elementValue ;
}
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: ERROR - array element %i not found \n " , dataSetEntry - > index ) ;
}
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: ERROR - variable %s/%s is not an array \n " , dataSetEntry - > logicalDeviceName , dataSetEntry - > variableName ) ;
}
}
else {
else
{
dataSetEntry - > value = dataSetEntryValue ;
}
}
@ -4588,7 +4671,8 @@ MmsMapping_createDataSetByNamedVariableList(MmsMapping* self, MmsNamedVariableLi
lastDataSetEntry = dataSetEntry ;
}
}
else {
else
{
if ( DEBUG_IED_SERVER )
printf ( " IED_SERVER: LD lookup error! \n " ) ;
}
@ -4644,7 +4728,8 @@ MmsMapping_freeDynamicallyCreatedDataSet(DataSet* dataSet)
{
DataSetEntry * dataSetEntry = dataSet - > fcdas ;
while ( dataSetEntry ! = NULL ) {
while ( dataSetEntry )
{
DataSetEntry * nextEntry = dataSetEntry - > sibling ;
GLOBAL_FREEMEM ( dataSetEntry ) ;