Added CreateObject continue-on-error flag to be able to use for restoring a backup when object exists or object doesn't support dynamic creation.

This commit is contained in:
Steve Karg
2026-02-09 16:00:24 -06:00
parent 420c74635c
commit 0f325b1529
2 changed files with 17 additions and 7 deletions
+15 -7
View File
@@ -742,10 +742,12 @@ bool create_object_initializer_list_process(
} }
/* write the property - use the provided function */ /* write the property - use the provided function */
if (!write_property(&wp_data)) { if (!write_property(&wp_data)) {
/* report the error */ if (!data->continue_on_error) {
data->error_class = wp_data.error_class; /* report the error */
data->error_code = wp_data.error_code; data->error_class = wp_data.error_class;
return false; data->error_code = wp_data.error_code;
return false;
}
} }
data->first_failed_element_number++; data->first_failed_element_number++;
apdu_len += len; apdu_len += len;
@@ -782,20 +784,26 @@ bool create_object_process(
/* The device does not support the specified object type. */ /* The device does not support the specified object type. */
data->error_class = ERROR_CLASS_OBJECT; data->error_class = ERROR_CLASS_OBJECT;
data->error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE; data->error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE;
} else if (!create_object) { } else if ((!create_object) && (!data->continue_on_error)) {
/* The device supports the object type and may have /* The device supports the object type and may have
sufficient space, but does not support the creation of the sufficient space, but does not support the creation of the
object for some other reason.*/ object for some other reason.*/
data->error_class = ERROR_CLASS_OBJECT; data->error_class = ERROR_CLASS_OBJECT;
data->error_code = ERROR_CODE_DYNAMIC_CREATION_NOT_SUPPORTED; data->error_code = ERROR_CODE_DYNAMIC_CREATION_NOT_SUPPORTED;
} else if (object_exists) { } else if ((object_exists) && (!data->continue_on_error)) {
/* The object being created already exists */ /* The object being created already exists */
data->error_class = ERROR_CLASS_OBJECT; data->error_class = ERROR_CLASS_OBJECT;
data->error_code = ERROR_CODE_OBJECT_IDENTIFIER_ALREADY_EXISTS; data->error_code = ERROR_CODE_OBJECT_IDENTIFIER_ALREADY_EXISTS;
} else { } else {
if (data->application_data_len) { if (data->application_data_len) {
/* The optional 'List of Initial Values' parameter is included */ /* The optional 'List of Initial Values' parameter is included */
object_instance = create_object(data->object_instance); if (create_object) {
/* dynamic creation supported */
object_instance = create_object(data->object_instance);
} else {
/* dynamic creation not supported, but used for restore */
object_instance = data->object_instance;
}
if (object_instance == BACNET_MAX_INSTANCE) { if (object_instance == BACNET_MAX_INSTANCE) {
/* The device cannot allocate the space needed /* The device cannot allocate the space needed
for the new object.*/ for the new object.*/
+2
View File
@@ -50,6 +50,8 @@ typedef struct BACnet_Create_Object_Data {
Initial Values' parameter, the 'First Failed Element Number' shall Initial Values' parameter, the 'First Failed Element Number' shall
be equal to zero. */ be equal to zero. */
BACNET_UNSIGNED_INTEGER first_failed_element_number; BACNET_UNSIGNED_INTEGER first_failed_element_number;
/* bypass error and continue initializing values */
bool continue_on_error;
} BACNET_CREATE_OBJECT_DATA; } BACNET_CREATE_OBJECT_DATA;
/** /**