void mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection* connection, DeleteNamedVariableListRequest_t* request, int invokeId, ByteBuffer* response) { //TODO implement for association specific named variable lists MmsDevice* device; long scopeOfDelete; request->scopeOfDelete; asn_INTEGER2long(request->scopeOfDelete, &scopeOfDelete); device = MmsServer_getDevice(connection->server); if (scopeOfDelete == DeleteNamedVariableListRequest__scopeOfDelete_specific) { int numberMatched = 0; int numberDeleted = 0; int numberItems = request->listOfVariableListName->list.count; int i; for (i = 0; i < numberItems; i++) { if (request->listOfVariableListName->list.array[i]->present == ObjectName_PR_domainspecific) { char* domainId = mmsMsg_createStringFromAsnIdentifier( request->listOfVariableListName->list.array[i]->choice.domainspecific.domainId); MmsDomain* domain = MmsDevice_getDomain(device, domainId); char* itemId = mmsMsg_createStringFromAsnIdentifier( request->listOfVariableListName->list.array[i]->choice.domainspecific.itemId); MmsNamedVariableList variableList = MmsDomain_getNamedVariableList(domain, itemId); if (variableList != NULL) { numberMatched++; if (MmsNamedVariableList_isDeletable(variableList)) { MmsDomain_deleteNamedVariableList(domain, itemId); numberDeleted++; } } free(domainId); free(itemId); } else if (request->listOfVariableListName->list.array[i]->present == ObjectName_PR_aaspecific) { char* itemId = mmsMsg_createStringFromAsnIdentifier( request->listOfVariableListName->list.array[i]->choice.aaspecific); MmsNamedVariableList variableList = MmsServerConnection_getNamedVariableList(connection, itemId); if (variableList != NULL) { numberMatched++; numberDeleted++; MmsServerConnection_deleteNamedVariableList(connection, itemId); } free(itemId); } //TODO else send error??? } createDeleteNamedVariableListResponse(invokeId, response, numberMatched, numberDeleted); } else { mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_TYPE_OBJECT_ACCESS_UNSUPPORTED); } }
static void createGetNamedVariableListAttributesResponse(int invokeId, ByteBuffer* response, MmsNamedVariableList variableList) { MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId); mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present = ConfirmedServiceResponse_PR_getNamedVariableListAttributes; GetNamedVariableListAttributesResponse_t* varListResponse = &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse. choice.getNamedVariableListAttributes); varListResponse->mmsDeletable = MmsNamedVariableList_isDeletable(variableList); LinkedList variables = MmsNamedVariableList_getVariableList(variableList); int variableCount = LinkedList_size(variables); varListResponse->listOfVariable.list.count = variableCount; varListResponse->listOfVariable.list.size = variableCount; varListResponse->listOfVariable.list.array = (struct GetNamedVariableListAttributesResponse__listOfVariable__Member**) GLOBAL_CALLOC(variableCount, sizeof(void*)); LinkedList variable = LinkedList_getNext(variables); int i; for (i = 0; i < variableCount; i++) { MmsNamedVariableListEntry variableEntry = (MmsNamedVariableListEntry) variable->data; varListResponse->listOfVariable.list.array[i] = (struct GetNamedVariableListAttributesResponse__listOfVariable__Member*) GLOBAL_CALLOC(1, sizeof(struct GetNamedVariableListAttributesResponse__listOfVariable__Member)); varListResponse->listOfVariable.list.array[i]->variableSpecification.present = VariableSpecification_PR_name; varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.present = ObjectName_PR_domainspecific; char* variableDomainName = MmsDomain_getName(variableEntry->domain); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.buf = (uint8_t*) copyString(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.size = strlen(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.buf = (uint8_t*) copyString(variableEntry->variableName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.size = strlen(variableEntry->variableName); variable = LinkedList_getNext(variable); } der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); }
static void createGetNamedVariableListAttributesResponse(int invokeId, ByteBuffer* response, MmsNamedVariableList variableList, char* domainName) { char* variableDomainName; asn_enc_rval_t rval; int i; int variableCount; LinkedList variable; LinkedList variables; GetNamedVariableListAttributesResponse_t* varListResponse; MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId); BOOLEAN_t moreFollows = 0; mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present = ConfirmedServiceResponse_PR_getNamedVariableListAttributes; varListResponse = &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse. choice.getNamedVariableListAttributes); varListResponse->mmsDeletable = MmsNamedVariableList_isDeletable(variableList); variables = MmsNamedVariableList_getVariableList(variableList); variableCount = LinkedList_size(variables); varListResponse->listOfVariable.list.count = variableCount; varListResponse->listOfVariable.list.size = variableCount; varListResponse->listOfVariable.list.array = calloc(variableCount, sizeof(void*)); variable = LinkedList_getNext(variables); for (i = 0; i < variableCount; i++) { MmsNamedVariableListEntry variableEntry = (MmsNamedVariableListEntry) variable->data; varListResponse->listOfVariable.list.array[i] = calloc(1, sizeof(struct GetNamedVariableListAttributesResponse__listOfVariable__Member)); varListResponse->listOfVariable.list.array[i]->variableSpecification.present = VariableSpecification_PR_name; varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.present = ObjectName_PR_domainspecific; variableDomainName = MmsDomain_getName(variableEntry->domain); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.buf = copyString(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.domainId.size = strlen(variableDomainName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.buf = copyString(variableEntry->variableName); varListResponse->listOfVariable.list.array[i]->variableSpecification.choice.name.choice. domainspecific.itemId.size = strlen(variableEntry->variableName); variable = LinkedList_getNext(variable); } rval = der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response); if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu); asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); }
void mmsServer_handleDeleteNamedVariableListRequest(MmsServerConnection connection, uint8_t* buffer, int bufPos, int maxBufPos, uint32_t invokeId, ByteBuffer* response) { DeleteNamedVariableListRequest_t* request = 0; MmsPdu_t* mmsPdu = 0; asn_dec_rval_t rval = ber_decode(NULL, &asn_DEF_MmsPdu, (void**) &mmsPdu, buffer, maxBufPos); if (rval.code != RC_OK) { mmsServer_writeMmsRejectPdu(&invokeId, MMS_ERROR_REJECT_INVALID_PDU, response); goto exit_function; } request = &(mmsPdu->choice.confirmedRequestPdu.confirmedServiceRequest.choice.deleteNamedVariableList); long scopeOfDelete; asn_INTEGER2long(request->scopeOfDelete, &scopeOfDelete); MmsDevice* device = MmsServer_getDevice(connection->server); if (scopeOfDelete == DeleteNamedVariableListRequest__scopeOfDelete_specific) { int numberMatched = 0; int numberDeleted = 0; int numberItems = request->listOfVariableListName->list.count; int i; for (i = 0; i < numberItems; i++) { if (request->listOfVariableListName->list.array[i]->present == ObjectName_PR_domainspecific) { char domainName[65]; char listName[65]; mmsMsg_copyAsn1IdentifierToStringBuffer(request->listOfVariableListName->list.array[i]->choice.domainspecific.domainId, domainName, 65); mmsMsg_copyAsn1IdentifierToStringBuffer(request->listOfVariableListName->list.array[i]->choice.domainspecific.itemId, listName, 65); MmsDomain* domain = MmsDevice_getDomain(device, domainName); if (domain != NULL) { MmsNamedVariableList variableList = MmsDomain_getNamedVariableList(domain, listName); if (variableList != NULL) { numberMatched++; if (MmsNamedVariableList_isDeletable(variableList)) { if (mmsServer_callVariableListChangedHandler(false, MMS_DOMAIN_SPECIFIC, domain, listName, connection) == MMS_ERROR_NONE) { MmsDomain_deleteNamedVariableList(domain, listName); numberDeleted++; } } } } } else if (request->listOfVariableListName->list.array[i]->present == ObjectName_PR_aaspecific) { char listName[65]; mmsMsg_copyAsn1IdentifierToStringBuffer(request->listOfVariableListName->list.array[i]->choice.aaspecific, listName, 65); MmsNamedVariableList variableList = MmsServerConnection_getNamedVariableList(connection, listName); if (variableList != NULL) { numberMatched++; if (mmsServer_callVariableListChangedHandler(false, MMS_ASSOCIATION_SPECIFIC, NULL, listName, connection) == MMS_ERROR_NONE) { numberDeleted++; MmsServerConnection_deleteNamedVariableList(connection, listName); } } } } createDeleteNamedVariableListResponse(invokeId, response, numberMatched, numberDeleted); } else { mmsServer_createConfirmedErrorPdu(invokeId, response, MMS_ERROR_ACCESS_OBJECT_ACCESS_UNSUPPORTED); } asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0); exit_function: return; }