|
|
@ -155,6 +155,57 @@ isAccessToArrayComponent(AlternateAccess_t* alternateAccess)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static MmsValue*
|
|
|
|
|
|
|
|
getComponent(MmsServerConnection connection, MmsDomain* domain, AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable, char* variableName)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
MmsValue* retValue = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mmsServer_isComponentAccess(alternateAccess)) {
|
|
|
|
|
|
|
|
Identifier_t component =
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAccess.choice.component;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (component.size > 129)
|
|
|
|
|
|
|
|
goto exit_function;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (namedVariable->type == MMS_STRUCTURE) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < namedVariable->typeSpec.structure.elementCount; i++) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ((int) strlen(namedVariable->typeSpec.structure.elements[i]->name)
|
|
|
|
|
|
|
|
== component.size) {
|
|
|
|
|
|
|
|
if (!strncmp(namedVariable->typeSpec.structure.elements[i]->name,
|
|
|
|
|
|
|
|
(char*) component.buf, component.size))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (strlen(variableName) + component.size < 199) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strcat(variableName, "$");
|
|
|
|
|
|
|
|
strncat(variableName, (const char*) component.buf, component.size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess
|
|
|
|
|
|
|
|
!= NULL) {
|
|
|
|
|
|
|
|
retValue =
|
|
|
|
|
|
|
|
getComponent(connection, domain,
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess,
|
|
|
|
|
|
|
|
namedVariable->typeSpec.structure.elements[i],
|
|
|
|
|
|
|
|
variableName);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
retValue = mmsServer_getValue(connection->server, domain, variableName, connection);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exit_function:
|
|
|
|
|
|
|
|
return retValue;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static MmsValue*
|
|
|
|
static MmsValue*
|
|
|
|
getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable,
|
|
|
|
getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecification* namedVariable,
|
|
|
|
MmsValue* structuredValue)
|
|
|
|
MmsValue* structuredValue)
|
|
|
@ -180,14 +231,20 @@ getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecif
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) {
|
|
|
|
for (i = 0; i < structSpec->typeSpec.structure.elementCount; i++) {
|
|
|
|
if (strncmp (structSpec->typeSpec.structure.elements[i]->name, (char*) component.buf,
|
|
|
|
|
|
|
|
component.size) == 0)
|
|
|
|
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);
|
|
|
|
MmsValue* value = MmsValue_getElement(structuredValue, i);
|
|
|
|
|
|
|
|
|
|
|
|
if (isAccessToArrayComponent(alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess)) {
|
|
|
|
if (isAccessToArrayComponent(
|
|
|
|
retValue = getComponentOfArrayElement(alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess,
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess)) {
|
|
|
|
structSpec->typeSpec.structure.elements[i], value);
|
|
|
|
retValue =
|
|
|
|
|
|
|
|
getComponentOfArrayElement(
|
|
|
|
|
|
|
|
alternateAccess->list.array[0]->choice.unnamed->choice.selectAlternateAccess.alternateAccess,
|
|
|
|
|
|
|
|
structSpec->typeSpec.structure.elements[i],
|
|
|
|
|
|
|
|
value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
retValue = value;
|
|
|
|
retValue = value;
|
|
|
@ -196,6 +253,7 @@ getComponentOfArrayElement(AlternateAccess_t* alternateAccess, MmsVariableSpecif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
exit_function:
|
|
|
|
exit_function:
|
|
|
|
return retValue;
|
|
|
|
return retValue;
|
|
|
@ -281,13 +339,30 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain*
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (namedVariable != NULL) {
|
|
|
|
if (namedVariable != NULL) {
|
|
|
|
|
|
|
|
|
|
|
|
if (DEBUG_MMS_SERVER) printf("MMS read: found named variable %s with search string %s\n",
|
|
|
|
if (DEBUG_MMS_SERVER)
|
|
|
|
|
|
|
|
printf("MMS read: found named variable %s with search string %s\n",
|
|
|
|
namedVariable->name, nameIdStr);
|
|
|
|
namedVariable->name, nameIdStr);
|
|
|
|
|
|
|
|
|
|
|
|
if (namedVariable->type == MMS_STRUCTURE) {
|
|
|
|
if (namedVariable->type == MMS_STRUCTURE) {
|
|
|
|
|
|
|
|
|
|
|
|
MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr, connection);
|
|
|
|
MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr, connection);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (alternateAccess != NULL) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char variableName[200];
|
|
|
|
|
|
|
|
variableName[0] = 0;
|
|
|
|
|
|
|
|
strcat(variableName, nameIdStr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
value = getComponent(connection, domain, alternateAccess, namedVariable, variableName);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (value != NULL) {
|
|
|
|
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
if (value != NULL) {
|
|
|
|
if (value != NULL) {
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -296,6 +371,7 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain*
|
|
|
|
values, connection, domain, nameIdStr);
|
|
|
|
values, connection, domain, nameIdStr);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
else if (namedVariable->type == MMS_ARRAY) {
|
|
|
|
else if (namedVariable->type == MMS_ARRAY) {
|
|
|
|
|
|
|
|
|
|
|
|
if (alternateAccess != NULL) {
|
|
|
|
if (alternateAccess != NULL) {
|
|
|
@ -307,6 +383,11 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain*
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (alternateAccess != NULL) {
|
|
|
|
|
|
|
|
appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT);
|
|
|
|
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr, connection);
|
|
|
|
MmsValue* value = mmsServer_getValue(connection->server, domain, nameIdStr, connection);
|
|
|
|
|
|
|
|
|
|
|
@ -319,7 +400,7 @@ addNamedVariableToResultList(MmsVariableSpecification* namedVariable, MmsDomain*
|
|
|
|
else
|
|
|
|
else
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
appendValueToResultList(value, values);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT);
|
|
|
|
appendErrorToResultList(values, DATA_ACCESS_ERROR_OBJECT_NONE_EXISTENT);
|
|
|
|