static MmsValue* addNamedVariableValue(MmsTypeSpecification* namedVariable, MmsServerConnection* connection, MmsDomain* domain, char* itemId, LinkedList typedValues) { MmsValue* value = NULL; if (namedVariable->type == MMS_STRUCTURE) { value = mmsServer_getValue(connection->server, domain, itemId); if (value != NULL) { LinkedList_add(typedValues, value); } else { int componentCount = namedVariable->typeSpec.structure.elementCount; MmsValue* value = MmsValue_createEmptyStructure(componentCount); int i; for (i = 0; i < componentCount; i++) { char* newNameIdStr = createString(3, itemId, "$", namedVariable->typeSpec.structure.elements[i]->name); MmsValue* element = addNamedVariableValue(namedVariable->typeSpec.structure.elements[i], connection, domain, newNameIdStr, typedValues); MmsValue_setElement(value, i, element); free(newNameIdStr); } } } else { value = mmsServer_getValue(connection->server, domain, itemId); //TODO add checks??? if (value != NULL) LinkedList_add(typedValues, value); else { //TODO remove printf printf("Error getting element %s\n", itemId); } } return value; }
static void addNamedVariableToResultList(MmsTypeSpecification* namedVariable, MmsDomain* domain, char* nameIdStr, LinkedList /*<MmsValue>*/ values, MmsServerConnection* connection, AlternateAccess_t* alternateAccess) { if (namedVariable != NULL) { if (DEBUG) printf("MMS read: found named variable %s with search string %s\n", namedVariable->name, nameIdStr); if (namedVariable->type == MMS_STRUCTURE) { MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr); if (value != NULL) { appendValueToResultList(value, values); } else { //TODO signal DataAccessError to client addComplexValueToResultList(namedVariable, values, connection, domain, nameIdStr); } } else if (namedVariable->type == MMS_ARRAY) { if (alternateAccess != NULL) { alternateArrayAccess(connection, alternateAccess, domain, nameIdStr, values, namedVariable); } else { //getCompleteArray MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr); appendValueToResultList(value, values); } } else { MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr); if (value == NULL) { if (DEBUG) printf("MMS read: value of known variable is not found. Maybe illegal access to array element!\n"); appendErrorToResultList(values, 10 /* object-non-existant*/); } else appendValueToResultList(value, values); } } else appendErrorToResultList(values, 10 /* object-non-existant*/); }
static MmsValue* addNamedVariableValue(MmsVariableSpecification* namedVariable, MmsServerConnection connection, MmsDomain* domain, char* itemId) { MmsValue* value = NULL; if (namedVariable->type == MMS_STRUCTURE) { value = mmsServer_getValue(connection->server, domain, itemId, connection); if (value != NULL) goto exit_function; else { int componentCount = namedVariable->typeSpec.structure.elementCount; value = MmsValue_createEmptyStructure(componentCount); value->deleteValue = 1; int i; for (i = 0; i < componentCount; i++) { char newNameIdStr[65]; StringUtils_createStringInBuffer(newNameIdStr, 3, itemId, "$", namedVariable->typeSpec.structure.elements[i]->name); MmsValue* element = addNamedVariableValue(namedVariable->typeSpec.structure.elements[i], connection, domain, newNameIdStr); if (element == NULL) { MmsValue_delete(value); value = NULL; break; } MmsValue_setElement(value, i, element); } } } else { value = mmsServer_getValue(connection->server, domain, itemId, connection); } exit_function: return value; }
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*/); } }