static void createNamedVariableListResponse(MmsServerConnection* connection, MmsNamedVariableList namedList, int invokeId, ByteBuffer* response, ReadRequest_t* read, VarAccessSpec* accessSpec) { LinkedList /*<MmsValue>*/ values = LinkedList_create(); LinkedList variables = MmsNamedVariableList_getVariableList(namedList); int variableCount = LinkedList_size(variables); MmsServer_lockModel(connection->server); int i; LinkedList variable = LinkedList_getNext(variables); for (i = 0; i < variableCount; i++) { MmsNamedVariableListEntry variableListEntry = (MmsNamedVariableListEntry) variable->data; MmsDomain* variableDomain = MmsNamedVariableListEntry_getDomain(variableListEntry); char* variableName = MmsNamedVariableListEntry_getVariableName(variableListEntry); MmsTypeSpecification* namedVariable = MmsDomain_getNamedVariable(variableDomain, variableName); addNamedVariableToResultList(namedVariable, variableDomain, variableName, values, connection, NULL); variable = LinkedList_getNext(variable); } if (isSpecWithResult(read)) /* add specification to result */ encodeReadResponse(connection, invokeId, response, values, accessSpec); else encodeReadResponse(connection, invokeId, response, values, NULL); MmsServer_unlockModel(connection->server); deleteValueList(values); }
static void handleReadListOfVariablesRequest( MmsServerConnection* connection, ReadRequest_t* read, uint32_t invokeId, ByteBuffer* response) { int variableCount = read->variableAccessSpecification.choice.listOfVariable.list.count; LinkedList /*<MmsValue>*/ values = LinkedList_create(); if (isSpecWithResult(read)) { /* add specification to result */ //TODO add va spec to result } MmsServer_lockModel(connection->server); int i; for (i = 0; i < variableCount; i++) { VariableSpecification_t varSpec = read->variableAccessSpecification.choice.listOfVariable.list.array[i]->variableSpecification; AlternateAccess_t* alternateAccess = read->variableAccessSpecification.choice.listOfVariable.list.array[i]->alternateAccess; if (varSpec.present == VariableSpecification_PR_name) { if (varSpec.choice.name.present == ObjectName_PR_domainspecific) { char* domainIdStr = mmsMsg_createStringFromAsnIdentifier( varSpec.choice.name.choice.domainspecific.domainId); char* nameIdStr = mmsMsg_createStringFromAsnIdentifier( varSpec.choice.name.choice.domainspecific.itemId); MmsDomain* domain = MmsDevice_getDomain(MmsServer_getDevice(connection->server), domainIdStr); if (domain == NULL) { if (DEBUG) printf("MMS read: domain %s not found!\n", domainIdStr); appendErrorToResultList(values, 10 /* object-non-existant*/); break; } MmsTypeSpecification* namedVariable = MmsDomain_getNamedVariable(domain, nameIdStr); addNamedVariableToResultList(namedVariable, domain, nameIdStr, values, connection, alternateAccess); free(domainIdStr); free(nameIdStr); } else { appendErrorToResultList(values, 10 /* object-non-existant*/); if (DEBUG) printf("MMS read: object name type not supported!\n"); } } else { //TODO should we send a ConfirmedErrorPdu here? if (DEBUG) printf("MMS read: varspec type not supported!\n"); } } encodeReadResponse(connection, invokeId, response, values, NULL); MmsServer_unlockModel(connection->server); exit: deleteValueList(values); }
static void handleReadListOfVariablesRequest( MmsServerConnection connection, ReadRequest_t* read, uint32_t invokeId, ByteBuffer* response) { int variableCount = read->variableAccessSpecification.choice.listOfVariable.list.count; LinkedList /*<MmsValue>*/ values = LinkedList_create(); if (isSpecWithResult(read)) { /* add specification to result */ // ignore - not required for IEC 61850 } int i; for (i = 0; i < variableCount; i++) { VariableSpecification_t varSpec = read->variableAccessSpecification.choice.listOfVariable.list.array[i]->variableSpecification; AlternateAccess_t* alternateAccess = read->variableAccessSpecification.choice.listOfVariable.list.array[i]->alternateAccess; if (varSpec.present == VariableSpecification_PR_name) { if (varSpec.choice.name.present == ObjectName_PR_domainspecific) { char domainIdStr[65]; char nameIdStr[65]; mmsMsg_copyAsn1IdentifierToStringBuffer(varSpec.choice.name.choice.domainspecific.domainId, domainIdStr, 65); mmsMsg_copyAsn1IdentifierToStringBuffer(varSpec.choice.name.choice.domainspecific.itemId, nameIdStr, 65); MmsDomain* domain = MmsDevice_getDomain(MmsServer_getDevice(connection->server), domainIdStr); if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ domainId: (%s) nameId: (%s)\n", domainIdStr, nameIdStr); if (domain == NULL) { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ domain %s not found!\n", domainIdStr); appendErrorToResultList(values, 10 /* object-non-existent*/); } else { MmsVariableSpecification* namedVariable = MmsDomain_getNamedVariable(domain, nameIdStr); if (namedVariable == NULL) appendErrorToResultList(values, 10 /* object-non-existent*/); else addNamedVariableToResultList(namedVariable, domain, nameIdStr, values, connection, alternateAccess); } } #if (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) else if (varSpec.choice.name.present == ObjectName_PR_vmdspecific) { char nameIdStr[65]; mmsMsg_copyAsn1IdentifierToStringBuffer(varSpec.choice.name.choice.vmdspecific, nameIdStr, 65); if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ vmd-specific nameId:%s\n", nameIdStr); MmsVariableSpecification* namedVariable = MmsDevice_getNamedVariable(MmsServer_getDevice(connection->server), nameIdStr); if (namedVariable == NULL) appendErrorToResultList(values, 10 /* object-non-existent*/); else addNamedVariableToResultList(namedVariable, (MmsDomain*) MmsServer_getDevice(connection->server), nameIdStr, values, connection, alternateAccess); } #endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */ else { appendErrorToResultList(values, 10 /* object-non-existent*/); if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ object name type not supported!\n"); } } else { if (DEBUG_MMS_SERVER) printf("MMS_SERVER: READ varspec type not supported!\n"); mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_REQUEST_INVALID_ARGUMENT, response); goto exit; } } encodeReadResponse(connection, invokeId, response, values, NULL); exit: deleteValueList(values); }