|
|
@ -26,7 +26,7 @@
|
|
|
|
#include "stack_config.h"
|
|
|
|
#include "stack_config.h"
|
|
|
|
#include "mms_value_internal.h"
|
|
|
|
#include "mms_value_internal.h"
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
static void
|
|
|
|
mmsMsg_createFloatData(MmsValue* value, int* size, uint8_t** buf)
|
|
|
|
mmsMsg_createFloatData(MmsValue* value, int* size, uint8_t** buf)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (value->value.floatingPoint.formatWidth == 64) {
|
|
|
|
if (value->value.floatingPoint.formatWidth == 64) {
|
|
|
@ -318,271 +318,6 @@ mmsMsg_parseDataElement(Data_t* dataElement)
|
|
|
|
return value;
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Data_t*
|
|
|
|
|
|
|
|
mmsMsg_createDataElement(MmsValue* value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (value->type == MMS_STRUCTURE) {
|
|
|
|
|
|
|
|
Data_t* dataElement = (Data_t*) GLOBAL_CALLOC(1, sizeof(Data_t));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataElement->present = Data_PR_structure;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int elementCount = value->value.structure.size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataElement->choice.structure = (DataSequence_t*) GLOBAL_CALLOC(1, sizeof(DataSequence_t));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataElement->choice.structure->list.size = elementCount;
|
|
|
|
|
|
|
|
dataElement->choice.structure->list.count = elementCount;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataElement->choice.structure->list.array = (Data_t**) GLOBAL_CALLOC(elementCount, sizeof(Data_t*));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < elementCount; i++) {
|
|
|
|
|
|
|
|
dataElement->choice.structure->list.array[i] =
|
|
|
|
|
|
|
|
mmsMsg_createDataElement(value->value.structure.components[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return dataElement;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
return mmsMsg_createBasicDataElement(value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
mmsMsg_addResultToResultList(AccessResult_t* accessResult, MmsValue* value)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (value == NULL) {
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_failure;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(&accessResult->choice.failure, DataAccessError_objectnonexistent);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (DEBUG)
|
|
|
|
|
|
|
|
printf("ACCESS ERROR\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
switch (value->type) {
|
|
|
|
|
|
|
|
case MMS_ARRAY:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int size = value->value.structure.size;
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_array;
|
|
|
|
|
|
|
|
accessResult->choice.array.list.count = size;
|
|
|
|
|
|
|
|
accessResult->choice.array.list.size = size;
|
|
|
|
|
|
|
|
accessResult->choice.array.list.array = (Data_t**) GLOBAL_CALLOC(size, sizeof(Data_t*));
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
|
|
|
|
accessResult->choice.array.list.array[i] =
|
|
|
|
|
|
|
|
mmsMsg_createDataElement(value->value.structure.components[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_STRUCTURE:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int size = value->value.structure.size;
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_structure;
|
|
|
|
|
|
|
|
accessResult->choice.structure.list.count = size;
|
|
|
|
|
|
|
|
accessResult->choice.structure.list.size = size;
|
|
|
|
|
|
|
|
accessResult->choice.structure.list.array = (Data_t**) GLOBAL_CALLOC(size, sizeof(Data_t*));
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
|
|
|
|
accessResult->choice.structure.list.array[i] =
|
|
|
|
|
|
|
|
mmsMsg_createDataElement(value->value.structure.components[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_BIT_STRING:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_bitstring;
|
|
|
|
|
|
|
|
accessResult->choice.bitstring.buf = value->value.bitString.buf;
|
|
|
|
|
|
|
|
int size = (value->value.bitString.size / 8) + ((value->value.bitString.size % 8) > 0);
|
|
|
|
|
|
|
|
int unused = 8 - (value->value.bitString.size % 8);
|
|
|
|
|
|
|
|
accessResult->choice.bitstring.size = size; /* size in bytes */
|
|
|
|
|
|
|
|
accessResult->choice.bitstring.bits_unused = unused;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_BOOLEAN:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_boolean;
|
|
|
|
|
|
|
|
accessResult->choice.boolean = value->value.boolean;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_FLOAT:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_floatingpoint;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mmsMsg_createFloatData(value, &accessResult->choice.floatingpoint.size,
|
|
|
|
|
|
|
|
&accessResult->choice.floatingpoint.buf);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_UTC_TIME:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_utctime;
|
|
|
|
|
|
|
|
accessResult->choice.utctime.buf = (uint8_t*) GLOBAL_MALLOC(8);
|
|
|
|
|
|
|
|
memcpy(accessResult->choice.utctime.buf, value->value.utcTime, 8);
|
|
|
|
|
|
|
|
accessResult->choice.utctime.size = 8;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_INTEGER:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_integer;
|
|
|
|
|
|
|
|
asn_long2INTEGER(&accessResult->choice.integer, (long) MmsValue_toInt32(value));
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_UNSIGNED:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_unsigned;
|
|
|
|
|
|
|
|
asn_long2INTEGER(&accessResult->choice.Unsigned, (long) MmsValue_toInt32(value));
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MMS_VISIBLE_STRING:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_visiblestring;
|
|
|
|
|
|
|
|
if (value->value.visibleString.buf == NULL )
|
|
|
|
|
|
|
|
accessResult->choice.visiblestring.size = 0;
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
accessResult->choice.visiblestring.buf = (uint8_t*) value->value.visibleString.buf;
|
|
|
|
|
|
|
|
accessResult->choice.visiblestring.size = strlen(value->value.visibleString.buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_STRING:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_mMSString;
|
|
|
|
|
|
|
|
if (value->value.visibleString.buf == NULL ) {
|
|
|
|
|
|
|
|
accessResult->choice.mMSString.size = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else {
|
|
|
|
|
|
|
|
accessResult->choice.mMSString.buf = (uint8_t*) value->value.visibleString.buf;
|
|
|
|
|
|
|
|
accessResult->choice.mMSString.size = strlen(value->value.visibleString.buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_BINARY_TIME:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_binarytime;
|
|
|
|
|
|
|
|
accessResult->choice.binarytime.size = value->value.binaryTime.size;
|
|
|
|
|
|
|
|
accessResult->choice.binarytime.buf = value->value.binaryTime.buf;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MMS_OCTET_STRING:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_octetstring;
|
|
|
|
|
|
|
|
if (value->value.octetString.buf != NULL ) {
|
|
|
|
|
|
|
|
accessResult->choice.octetstring.buf = value->value.octetString.buf;
|
|
|
|
|
|
|
|
accessResult->choice.octetstring.size = value->value.octetString.size;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
accessResult->choice.octetstring.size = 0;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
accessResult->present = AccessResult_PR_failure;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
asn_long2INTEGER(&accessResult->choice.failure, DataAccessError_typeinconsistent);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AccessResult_t**
|
|
|
|
|
|
|
|
mmsMsg_createAccessResultsList(MmsPdu_t* mmsPdu, int resultsCount)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
ReadResponse_t* readResponse =
|
|
|
|
|
|
|
|
&(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.choice.read);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
readResponse->listOfAccessResult.list.size = resultsCount;
|
|
|
|
|
|
|
|
readResponse->listOfAccessResult.list.count = resultsCount;
|
|
|
|
|
|
|
|
readResponse->listOfAccessResult.list.array = (AccessResult_t**) GLOBAL_CALLOC(resultsCount, sizeof(AccessResult_t*));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < resultsCount; i++) {
|
|
|
|
|
|
|
|
readResponse->listOfAccessResult.list.array[i] = (AccessResult_t*) GLOBAL_CALLOC(1, sizeof(AccessResult_t));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AccessResult_t** accessResultList = readResponse->listOfAccessResult.list.array;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return accessResultList;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
|
|
|
deleteDataElement(Data_t* dataElement)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (dataElement == NULL ) {
|
|
|
|
|
|
|
|
printf("deleteDataElement NULL argument\n");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (dataElement->present == Data_PR_structure) {
|
|
|
|
|
|
|
|
int elementCount = dataElement->choice.structure->list.count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < elementCount; i++) {
|
|
|
|
|
|
|
|
deleteDataElement(dataElement->choice.structure->list.array[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.structure->list.array);
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.structure);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dataElement->present == Data_PR_array) {
|
|
|
|
|
|
|
|
int elementCount = dataElement->choice.array->list.count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < elementCount; i++) {
|
|
|
|
|
|
|
|
deleteDataElement(dataElement->choice.array->list.array[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.array->list.array);
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.array);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dataElement->present == Data_PR_floatingpoint) {
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.floatingpoint.buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (dataElement->present == Data_PR_utctime) {
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement->choice.utctime.buf);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(dataElement);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
|
|
|
mmsMsg_deleteAccessResultList(AccessResult_t** accessResult, int variableCount)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < variableCount; i++) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (accessResult[i]->present == AccessResult_PR_structure) {
|
|
|
|
|
|
|
|
int elementCount = accessResult[i]->choice.structure.list.count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < elementCount; j++) {
|
|
|
|
|
|
|
|
deleteDataElement(accessResult[i]->choice.structure.list.array[j]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.structure.list.array);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_array) {
|
|
|
|
|
|
|
|
int elementCount = accessResult[i]->choice.array.list.count;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int j;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (j = 0; j < elementCount; j++) {
|
|
|
|
|
|
|
|
deleteDataElement(accessResult[i]->choice.array.list.array[j]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.array.list.array);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_integer)
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.integer.buf);
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_unsigned)
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.Unsigned.buf);
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_floatingpoint)
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.floatingpoint.buf);
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_utctime)
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.utctime.buf);
|
|
|
|
|
|
|
|
else if (accessResult[i]->present == AccessResult_PR_failure)
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]->choice.failure.buf);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult[i]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOBAL_FREEMEM(accessResult);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char*
|
|
|
|
char*
|
|
|
|
mmsMsg_createStringFromAsnIdentifier(Identifier_t identifier)
|
|
|
|
mmsMsg_createStringFromAsnIdentifier(Identifier_t identifier)
|
|
|
|
{
|
|
|
|
{
|
|
|
|