From 089caf7e4b4e81303423a5a425dd3832d1cb01c6 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Tue, 29 Oct 2024 13:30:03 -0500 Subject: [PATCH] Fixed BACnet basic file object to have dynamic name, mime-type, path. (#835) --- src/bacnet/basic/object/bacfile.c | 35 +++++++++++++++---------------- src/bacnet/basic/object/bacfile.h | 2 +- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/bacnet/basic/object/bacfile.c b/src/bacnet/basic/object/bacfile.c index 76856975..ade5b38a 100644 --- a/src/bacnet/basic/object/bacfile.c +++ b/src/bacnet/basic/object/bacfile.c @@ -33,10 +33,10 @@ #define FILE_RECORD_SIZE MAX_OCTET_STRING_BYTES #endif struct object_data { - const char *Object_Name; + char *Object_Name; char *Pathname; - BACNET_DATE_TIME Modification_Date; char *File_Type; + BACNET_DATE_TIME Modification_Date; bool File_Access_Stream : 1; bool Read_Only : 1; bool Archive : 1; @@ -131,9 +131,7 @@ void bacfile_pathname_set(uint32_t object_instance, const char *pathname) pObject = Keylist_Data(Object_List, object_instance); if (pObject) { - if (pObject->Pathname) { - free(pObject->Pathname); - } + free(pObject->Pathname); pObject->Pathname = bacfile_strdup(pathname); } } @@ -154,9 +152,11 @@ uint32_t bacfile_pathname_instance(const char *pathname) count = Keylist_Count(Object_List); while (count) { pObject = Keylist_Data_Index(Object_List, index); - if (strcmp(pathname, pObject->Pathname) == 0) { - Keylist_Index_Key(Object_List, index, &key); - break; + if (pObject->Pathname) { + if (strcmp(pathname, pObject->Pathname) == 0) { + Keylist_Index_Key(Object_List, index, &key); + break; + } } count--; index++; @@ -205,7 +205,7 @@ bool bacfile_object_name( * * @return true if object-name was set */ -bool bacfile_object_name_set(uint32_t object_instance, char *new_name) +bool bacfile_object_name_set(uint32_t object_instance, const char *new_name) { bool status = false; /* return value */ struct object_data *pObject; @@ -213,7 +213,8 @@ bool bacfile_object_name_set(uint32_t object_instance, char *new_name) pObject = Keylist_Data(Object_List, object_instance); if (pObject) { status = true; - pObject->Object_Name = new_name; + free(pObject->Object_Name); + pObject->Object_Name = bacfile_strdup(new_name); } return status; @@ -438,14 +439,8 @@ void bacfile_file_type_set(uint32_t object_instance, const char *mime_type) pObject = Keylist_Data(Object_List, object_instance); if (pObject) { - if (pObject->File_Type) { - if (strcmp(pObject->File_Type, mime_type) != 0) { - free(pObject->File_Type); - pObject->File_Type = bacfile_strdup(mime_type); - } - } else { - pObject->File_Type = bacfile_strdup(mime_type); - } + free(pObject->File_Type); + pObject->File_Type = bacfile_strdup(mime_type); } } @@ -1019,6 +1014,7 @@ uint32_t bacfile_create(uint32_t object_instance) if (pObject) { pObject->Object_Name = NULL; pObject->Pathname = NULL; + pObject->File_Type = NULL; /* April Fool's Day */ datetime_set_values( &pObject->Modification_Date, 2006, 4, 1, 7, 0, 3, 1); @@ -1069,6 +1065,9 @@ void bacfile_cleanup(void) do { pObject = Keylist_Data_Pop(Object_List); if (pObject) { + free(pObject->Pathname); + free(pObject->File_Type); + free(pObject->Object_Name); free(pObject); } } while (pObject); diff --git a/src/bacnet/basic/object/bacfile.h b/src/bacnet/basic/object/bacfile.h index 89934467..fbdd6e5e 100644 --- a/src/bacnet/basic/object/bacfile.h +++ b/src/bacnet/basic/object/bacfile.h @@ -32,7 +32,7 @@ BACNET_STACK_EXPORT bool bacfile_object_name( uint32_t object_instance, BACNET_CHARACTER_STRING *object_name); BACNET_STACK_EXPORT -bool bacfile_object_name_set(uint32_t object_instance, char *new_name); +bool bacfile_object_name_set(uint32_t object_instance, const char *new_name); BACNET_STACK_EXPORT const char *bacfile_name_ansi(uint32_t object_instance);