static int
createVariableAccessAttributesResponse(
		MmsServerConnection* connection,
		char* domainId,
		char* nameId,
		int invokeId,
		ByteBuffer* response)
{
	MmsDevice* device = MmsServer_getDevice(connection->server);

	MmsDomain* domain = MmsDevice_getDomain(device, domainId);

	if (domain == NULL) {
		if (DEBUG) printf("mms_server: domain %s not known\n", domainId);
		return -1;
	}

	MmsTypeSpecification* namedVariable = MmsDomain_getNamedVariable(domain, nameId);

	if (namedVariable == NULL) {
		if (DEBUG) printf("mms_server: named variable %s not known\n", nameId);
		return -1;
	}

	MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

	mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
			ConfirmedServiceResponse_PR_getVariableAccessAttributes;

	GetVariableAccessAttributesResponse_t* getVarAccessAttr;

	getVarAccessAttr = &(mmsPdu->choice.confirmedResponsePdu.
			confirmedServiceResponse.choice.getVariableAccessAttributes);

	getVarAccessAttr->mmsDeletable = 0;

	createTypeSpecification(namedVariable, &getVarAccessAttr->typeSpecification);

	asn_enc_rval_t rval;

	rval = der_encode(&asn_DEF_MmsPdu, mmsPdu,
			mmsServer_write_out, (void*) response);

	if (DEBUG) xer_fprint(stdout, &asn_DEF_MmsPdu, mmsPdu);

	deleteVariableAccessAttributesResponse(getVarAccessAttr);

	asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);

	return 0;
}
static void
createDefineNamedVariableListResponse(int invokeId, ByteBuffer* response)
{
    asn_enc_rval_t rval;
    MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

    mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
        ConfirmedServiceResponse_PR_defineNamedVariableList;

    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);
}
Example #3
0
static int
createMmsWriteResponse(MmsServerConnection* connection,
		int invokeId, ByteBuffer* response, MmsValueIndication indication)
{
	MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

	mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
			ConfirmedServiceResponse_PR_write;

	WriteResponse_t* writeResponse =
			&(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.choice.write);

	writeResponse->list.count = 1;
	writeResponse->list.size = 1;
	writeResponse->list.array = calloc(1, sizeof(struct WriteResponse__Member*));
	writeResponse->list.array[0] = calloc(1, sizeof(struct WriteResponse__Member));


	if (indication == MMS_VALUE_OK)
		writeResponse->list.array[0]->present = WriteResponse__Member_PR_success;
	else {
		writeResponse->list.array[0]->present = WriteResponse__Member_PR_failure;

		if (indication == MMS_VALUE_VALUE_INVALID)
			asn_long2INTEGER(&writeResponse->list.array[0]->choice.failure,
					DataAccessError_objectvalueinvalid);
		else if (indication == MMS_VALUE_ACCESS_DENIED)
			asn_long2INTEGER(&writeResponse->list.array[0]->choice.failure,
					DataAccessError_objectaccessdenied);
	}

	asn_enc_rval_t rval;

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

 	return 0;
}
static void
createDeleteNamedVariableListResponse(uint32_t invokeId, ByteBuffer* response,
                                      long numberMatched, long numberDeleted)
{
    asn_enc_rval_t rval;
    DeleteNamedVariableListResponse_t* _delete;
    MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

    mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
        ConfirmedServiceResponse_PR_deleteNamedVariableList;

    _delete =
        &(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.choice.deleteNamedVariableList);

    asn_long2INTEGER(&(_delete->numberDeleted), numberDeleted);
    asn_long2INTEGER(&(_delete->numberMatched), numberMatched);

    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);
}
Example #5
0
int
mmsServer_createMmsWriteResponse(MmsServerConnection* connection,
		int invokeId, ByteBuffer* response, int numberOfItems, MmsDataAccessError* accessResults)
{
	MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

	mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
			ConfirmedServiceResponse_PR_write;

	WriteResponse_t* writeResponse =
			&(mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.choice.write);

	writeResponse->list.count = numberOfItems;
	writeResponse->list.size = numberOfItems;
	writeResponse->list.array = (struct WriteResponse__Member**) calloc(numberOfItems,
	        sizeof(struct WriteResponse__Member*));

	int i;

	for (i = 0; i < numberOfItems; i++) {
	    writeResponse->list.array[i] =  (struct WriteResponse__Member*) calloc(1, sizeof(struct WriteResponse__Member));

	    if (accessResults[i] == DATA_ACCESS_ERROR_SUCCESS)
	        writeResponse->list.array[i]->present = WriteResponse__Member_PR_success;
	    else {
	        writeResponse->list.array[i]->present = WriteResponse__Member_PR_failure;
	        asn_long2INTEGER(&writeResponse->list.array[i]->choice.failure, (long) accessResults[i]);
	    }
	}

	der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response);

	asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);

 	return 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);
}
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
createVariableAccessAttributesResponse(
		MmsServerConnection connection,
		char* domainId,
		char* nameId,
		int invokeId,
		ByteBuffer* response)
{
	MmsDevice* device = MmsServer_getDevice(connection->server);

	MmsVariableSpecification* namedVariable = NULL;

	if (domainId != NULL) {
	    MmsDomain* domain = MmsDevice_getDomain(device, domainId);

	    if (domain == NULL) {
	        if (DEBUG_MMS_SERVER) printf("MMS_SERVER: domain %s not known\n", domainId);

	        mmsServer_createConfirmedErrorPdu(invokeId, response,
	                              MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);
	        goto exit_function;
	    }

	    namedVariable = MmsDomain_getNamedVariable(domain, nameId);
	}
#if (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1)
	else
	    namedVariable = MmsDevice_getNamedVariable(device, nameId);
#endif /* (CONFIG_MMS_SUPPORT_VMD_SCOPE_NAMED_VARIABLES == 1) */


	if (namedVariable == NULL) {
		if (DEBUG_MMS_SERVER) printf("MMS_SERVER: named variable %s not known\n", nameId);

		mmsServer_createConfirmedErrorPdu(invokeId, response,
		                          MMS_ERROR_ACCESS_OBJECT_NON_EXISTENT);

		goto exit_function;
	}

	MmsPdu_t* mmsPdu = mmsServer_createConfirmedResponse(invokeId);

	mmsPdu->choice.confirmedResponsePdu.confirmedServiceResponse.present =
			ConfirmedServiceResponse_PR_getVariableAccessAttributes;

	GetVariableAccessAttributesResponse_t* getVarAccessAttr;

	getVarAccessAttr = &(mmsPdu->choice.confirmedResponsePdu.
			confirmedServiceResponse.choice.getVariableAccessAttributes);

	getVarAccessAttr->mmsDeletable = 0;

	createTypeSpecification(namedVariable, &getVarAccessAttr->typeSpecification);

	asn_enc_rval_t rval =
	        der_encode(&asn_DEF_MmsPdu, mmsPdu, mmsServer_write_out, (void*) response);

	if (rval.encoded == -1) {
	    response->size = 0;

        if (DEBUG_MMS_SERVER)
            printf("MMS getVariableAccessAttributes: message to large! send error PDU!\n");

        mmsServer_createConfirmedErrorPdu(invokeId, response,
                      MMS_ERROR_SERVICE_OTHER);

        goto exit_function;
	}

	deleteVariableAccessAttributesResponse(getVarAccessAttr);

	asn_DEF_MmsPdu.free_struct(&asn_DEF_MmsPdu, mmsPdu, 0);

exit_function:
	return;
}