/** Handler for a ReadPropertyMultiple ACK. * @ingroup DSRPM * For each read property, print out the ACK'd data, * and free the request data items from linked property list. * * @param service_request [in] The contents of the service request. * @param service_len [in] The length of the service_request. * @param src [in] BACNET_ADDRESS of the source of the message * @param service_data [in] The BACNET_CONFIRMED_SERVICE_DATA information * decoded from the APDU header of this message. */ static void My_Read_Property_Multiple_Ack_Handler( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data) { int len = 0; BACNET_READ_ACCESS_DATA *rpm_data; BACNET_READ_ACCESS_DATA *old_rpm_data; BACNET_PROPERTY_REFERENCE *rpm_property; BACNET_PROPERTY_REFERENCE *old_rpm_property; BACNET_APPLICATION_DATA_VALUE *value; BACNET_APPLICATION_DATA_VALUE *old_value; if (address_match(&Target_Address, src) && (service_data->invoke_id == Request_Invoke_ID)) { rpm_data = calloc(1, sizeof(BACNET_READ_ACCESS_DATA)); if (rpm_data) { len = rpm_ack_decode_service_request(service_request, service_len, rpm_data); } if (len > 0) { while (rpm_data) { rpm_ack_extract_data(rpm_data); rpm_property = rpm_data->listOfProperties; while (rpm_property) { value = rpm_property->value; while (value) { old_value = value; value = value->next; free(old_value); } old_rpm_property = rpm_property; rpm_property = rpm_property->next; free(old_rpm_property); } old_rpm_data = rpm_data; rpm_data = rpm_data->next; free(old_rpm_data); } } else { LogError("RPM Ack Malformed! Freeing memory..."); while (rpm_data) { rpm_property = rpm_data->listOfProperties; while (rpm_property) { value = rpm_property->value; while (value) { old_value = value; value = value->next; free(old_value); } old_rpm_property = rpm_property; rpm_property = rpm_property->next; free(old_rpm_property); } old_rpm_data = rpm_data; rpm_data = rpm_data->next; free(old_rpm_data); } } } }
/** Handler for a ReadPropertyMultiple ACK. * @ingroup DSRPM * For each read property, print out the ACK'd data for debugging, * and free the request data items from linked property list. * * @param service_request [in] The contents of the service request. * @param service_len [in] The length of the service_request. * @param src [in] BACNET_ADDRESS of the source of the message * @param service_data [in] The BACNET_CONFIRMED_SERVICE_DATA information * decoded from the APDU header of this message. */ void handler_read_property_multiple_ack( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data) { int len = 0; BACNET_READ_ACCESS_DATA *rpm_data; BACNET_READ_ACCESS_DATA *old_rpm_data; BACNET_PROPERTY_REFERENCE *rpm_property; BACNET_PROPERTY_REFERENCE *old_rpm_property; BACNET_APPLICATION_DATA_VALUE *value; BACNET_APPLICATION_DATA_VALUE *old_value; (void) src; (void) service_data; /* we could use these... */ rpm_data = calloc(1, sizeof(BACNET_READ_ACCESS_DATA)); if (rpm_data) { len = rpm_ack_decode_service_request(service_request, service_len, rpm_data); } #if 1 fprintf(stderr, "Received Read-Property-Multiple Ack!\n"); #endif if (len > 0) { while (rpm_data) { rpm_ack_print_data(rpm_data); rpm_property = rpm_data->listOfProperties; while (rpm_property) { value = rpm_property->value; while (value) { old_value = value; value = value->next; free(old_value); } old_rpm_property = rpm_property; rpm_property = rpm_property->next; free(old_rpm_property); } old_rpm_data = rpm_data; rpm_data = rpm_data->next; free(old_rpm_data); } } else { #if 1 fprintf(stderr, "RPM Ack Malformed! Freeing memory...\n"); #endif while (rpm_data) { rpm_property = rpm_data->listOfProperties; while (rpm_property) { value = rpm_property->value; while (value) { old_value = value; value = value->next; free(old_value); } old_rpm_property = rpm_property; rpm_property = rpm_property->next; free(old_rpm_property); } old_rpm_data = rpm_data; rpm_data = rpm_data->next; free(old_rpm_data); } } }