int arf_ack_decode_apdu( uint8_t * apdu, unsigned apdu_len, uint8_t * invoke_id, BACNET_ATOMIC_READ_FILE_DATA * data) { int len = 0; unsigned offset = 0; if (!apdu) return -1; /* optional checking - most likely was already done prior to this call */ if (apdu[0] != PDU_TYPE_COMPLEX_ACK) return -1; *invoke_id = apdu[1]; /* invoke id - filled in by net layer */ if (apdu[2] != SERVICE_CONFIRMED_ATOMIC_READ_FILE) return -1; offset = 3; if (apdu_len > offset) { len = arf_ack_decode_service_request(&apdu[offset], apdu_len - offset, data); } return len; }
void handler_atomic_read_file_ack( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data) { int len = 0; BACNET_ATOMIC_READ_FILE_DATA data; uint32_t instance = 0; (void) src; /* get the file instance from the tsm data before freeing it */ instance = bacfile_instance_from_tsm(service_data->invoke_id); len = arf_ack_decode_service_request(service_request, service_len, &data); #if PRINT_ENABLED fprintf(stderr, "Received Read-File Ack!\n"); #endif if ((len > 0) && (instance <= BACNET_MAX_INSTANCE)) { /* write the data received to the file specified */ if (data.access == FILE_STREAM_ACCESS) { bacfile_read_ack_stream_data(instance, &data); } else if (data.access == FILE_RECORD_ACCESS) { /* FIXME: add handling for Record Access */ } } }
static void AtomicReadFileAckHandler( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data) { int len = 0; BACNET_ATOMIC_READ_FILE_DATA data; FILE *pFile = NULL; /* stream pointer */ size_t octets_written = 0; (void) src; /* FIXME: validate the source address matches */ len = arf_ack_decode_service_request(service_request, service_len, &data); if (len > 0) { /* validate the parameters before storing data */ if ((data.access == FILE_STREAM_ACCESS) && (service_data->invoke_id == Current_Invoke_ID)) { if (data.type.stream.fileStartPosition == 0) pFile = fopen(Local_File_Name, "wb"); else pFile = fopen(Local_File_Name, "rb+"); if (pFile) { /* is there anything to do with this? data.stream.requestedOctetCount */ (void) fseek(pFile, data.type.stream.fileStartPosition, SEEK_SET); octets_written = fwrite(octetstring_value(&data.fileData), 1, /* unit to write in bytes - in our case, an octet is one byte */ octetstring_length(&data.fileData), pFile); if (octets_written != octetstring_length(&data.fileData)) { fprintf(stderr, "Unable to write data to file \"%s\".\n", Local_File_Name); } else if (octets_written == 0) { fprintf(stderr, "Received 0 byte octet string!.\n"); } else { printf("\r%d bytes", (data.type.stream.fileStartPosition + octets_written)); } fflush(pFile); fclose(pFile); } if (data.endOfFile) { End_Of_File_Detected = true; printf("\r\n"); } } } }
static void AtomicReadFileAckHandler( uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data) { int len = 0; BACNET_ATOMIC_READ_FILE_DATA data; if (address_match(&Target_Address, src) && (service_data->invoke_id == Request_Invoke_ID)) { len = arf_ack_decode_service_request(service_request, service_len, &data); if (len > 0) { /* validate the parameters before storing data */ if ((data.access == FILE_STREAM_ACCESS) && (service_data->invoke_id == Request_Invoke_ID)) { char msg[32]; uint8_t *pFileData; int i; sprintf(msg, "EOF=%d,start=%d,", data.endOfFile, data.type.stream.fileStartPosition); __LogAnswer(msg, 0); pFileData = octetstring_value(&data.fileData); for (i = 0; i < octetstring_length(&data.fileData); i++) { sprintf(msg, "%02x ", *pFileData); __LogAnswer(msg, 1); pFileData++; } } else { LogError("Bad stream access reported"); } } } }