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); }
int mmsClient_createWriteRequest(uint32_t invokeId, char* domainId, char* itemId, MmsValue* value, ByteBuffer* writeBuffer) { //TODO reuse code to send information report! MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = ConfirmedServiceRequest_PR_write; WriteRequest_t* request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); /* Create list of variable specifications */ request->variableAccessSpecification.present = VariableAccessSpecification_PR_listOfVariable; request->variableAccessSpecification.choice.listOfVariable.list.count = 1; request->variableAccessSpecification.choice.listOfVariable.list.size = 1; request->variableAccessSpecification.choice.listOfVariable.list.array = (ListOfVariableSeq_t**) calloc(1, sizeof(ListOfVariableSeq_t*)); request->variableAccessSpecification.choice.listOfVariable.list.array[0] = (ListOfVariableSeq_t*) createNewDomainVariableSpecification(domainId, itemId); /* Create list of typed data values */ request->listOfData.list.count = 1; request->listOfData.list.size = 1; request->listOfData.list.array = (Data_t**) calloc(1, sizeof(struct Data*)); request->listOfData.list.array[0] = mmsMsg_createBasicDataElement(value); asn_enc_rval_t rval; rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu); /* Free ASN structure */ request->variableAccessSpecification.choice.listOfVariable.list.count = 0; free(request->variableAccessSpecification.choice.listOfVariable.list.array[0]); free(request->variableAccessSpecification.choice.listOfVariable.list.array); request->variableAccessSpecification.choice.listOfVariable.list.array = 0; request->listOfData.list.count = 0; deleteDataElement(request->listOfData.list.array[0]); free(request->listOfData.list.array); request->listOfData.list.array = 0; asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); return rval.encoded; }
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); }
int mmsClient_createWriteMultipleItemsRequest(uint32_t invokeId, char* domainId, LinkedList itemIds, LinkedList values, ByteBuffer* writeBuffer) { MmsPdu_t* mmsPdu = mmsClient_createConfirmedRequestPdu(invokeId); mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.present = ConfirmedServiceRequest_PR_write; WriteRequest_t* request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.write); int numberOfItems = LinkedList_size(itemIds); /* Create list of variable specifications */ request->variableAccessSpecification.present = VariableAccessSpecification_PR_listOfVariable; request->variableAccessSpecification.choice.listOfVariable.list.count = numberOfItems; request->variableAccessSpecification.choice.listOfVariable.list.size = numberOfItems; request->variableAccessSpecification.choice.listOfVariable.list.array = (ListOfVariableSeq_t**) calloc(numberOfItems, sizeof(ListOfVariableSeq_t*)); /* Create list of data values */ request->listOfData.list.count = numberOfItems; request->listOfData.list.size = numberOfItems; request->listOfData.list.array = (Data_t**) calloc(numberOfItems, sizeof(struct Data*)); int i; LinkedList item = LinkedList_getNext(itemIds); LinkedList valueElement = LinkedList_getNext(values); for (i = 0; i < numberOfItems; i++) { if (item == NULL) return -1; if (valueElement == NULL) return -1; char* itemId = (char*) item->data; MmsValue* value = (MmsValue*) valueElement->data; request->variableAccessSpecification.choice.listOfVariable.list.array[i] = (ListOfVariableSeq_t*) createNewDomainVariableSpecification(domainId, itemId); request->listOfData.list.array[i] = mmsMsg_createBasicDataElement(value); item = LinkedList_getNext(item); } asn_enc_rval_t rval; rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, (asn_app_consume_bytes_f*) mmsClient_write_out, (void*) writeBuffer); if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu); /* Free ASN structure */ request->variableAccessSpecification.choice.listOfVariable.list.count = 0; for (i = 0; i < numberOfItems; i++) { free(request->variableAccessSpecification.choice.listOfVariable.list.array[i]); deleteDataElement(request->listOfData.list.array[i]); } free(request->variableAccessSpecification.choice.listOfVariable.list.array); request->variableAccessSpecification.choice.listOfVariable.list.array = 0; request->listOfData.list.count = 0; free(request->listOfData.list.array); request->listOfData.list.array = 0; asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); return rval.encoded; }