static void updateControlParameters(ControlObject* controlObject, MmsValue* ctlVal, MmsValue* ctlNum, MmsValue* origin) { if (controlObject->ctlVal != NULL) MmsValue_delete(controlObject->ctlVal); if (controlObject->ctlNum != NULL) MmsValue_delete(controlObject->ctlNum); if (controlObject->origin != NULL) MmsValue_delete(controlObject->origin); controlObject->ctlVal = MmsValue_clone(ctlVal); controlObject->ctlNum = MmsValue_clone(ctlNum); controlObject->origin = MmsValue_clone(origin); }
static void updateOrClone(MmsValue** valuePtr, MmsValue* values, int index) { if (*valuePtr != NULL) MmsValue_update(*valuePtr, MmsValue_getElement(values, index)); else *valuePtr = MmsValue_clone(MmsValue_getElement(values, index)); }
void ClientReportControlBlock_setEntryId(ClientReportControlBlock self, MmsValue* entryId) { if (self->entryId != NULL) { MmsValue_update(self->entryId, entryId); } else { if (MmsValue_getType(entryId) != MMS_OCTET_STRING) { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: ClientReportControlBlock_setEntryId invalid argument type\n"); } else self->entryId = MmsValue_clone(entryId); } }
void ClientReportControlBlock_setOptFlds(ClientReportControlBlock self, MmsValue* optFlds) { if (self->optFlds != NULL) { MmsValue_update(self->optFlds, optFlds); } else { if (MmsValue_getType(optFlds) != MMS_BIT_STRING) { if (DEBUG_IED_CLIENT) printf("IED_CLIENT: ClientReportControlBlock_setOptFlds invalid argument type\n"); } else self->optFlds = MmsValue_clone(optFlds); } }
static void alternateArrayAccess(MmsServerConnection* connection, AlternateAccess_t* alternateAccess, MmsDomain* domain, char* itemId, LinkedList values, MmsTypeSpecification* namedVariable) { if (mmsServer_isIndexAccess(alternateAccess)) { int lowIndex = mmsServer_getLowIndex(alternateAccess); int numberOfElements = mmsServer_getNumberOfElements(alternateAccess); if (DEBUG) printf("Alternate access index: %i elements %i\n", lowIndex, numberOfElements); int index = lowIndex; MmsValue* value = NULL; MmsValue* arrayValue = mmsServer_getValue(connection->server, domain, itemId); if (arrayValue != NULL) { if (numberOfElements == 0) if (isAccessToArrayComponent(alternateAccess)) { if (namedVariable->typeSpec.array.elementTypeSpec->type == MMS_STRUCTURE) { MmsValue* structValue = MmsValue_getElement(arrayValue, index); if (structValue != NULL) value = getComponentOfArrayElement(alternateAccess, namedVariable, structValue); } } else value = MmsValue_getElement(arrayValue, index); else { value = MmsValue_createEmtpyArray(numberOfElements); MmsValue_setDeletable(value); int resultIndex = 0; while (index < lowIndex + numberOfElements) { MmsValue* elementValue = NULL; elementValue = MmsValue_getElement(arrayValue, index); if (!MmsValue_isDeletable(elementValue)) elementValue = MmsValue_clone(elementValue); MmsValue_setElement(value, resultIndex, elementValue); index++; resultIndex++; } } appendValueToResultList(value, values); if (MmsValue_isDeletable(arrayValue)) MmsValue_delete(arrayValue); } else /* access error */ appendErrorToResultList(values, 10 /* object-non-existant*/); } else { // invalid access if (DEBUG) printf("Invalid alternate access\n"); appendErrorToResultList(values, 10 /* object-non-existant*/); } }