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;
}