From 66329a05a0b060942ad10c1e2aaea252a87633c1 Mon Sep 17 00:00:00 2001 From: Steve Karg Date: Mon, 10 Feb 2025 09:44:53 -0600 Subject: [PATCH] Bugfix/property array element zero size (#908) * Changed BACnetARRAY index validation into ReadProperty, ReadPropertyMultiple, WriteProperty, and WritePropertyMultiple handlers. * Changed the basic and example objects after refactoring BACnetARRAY index validation into ReadProperty, ReadPropertyMultiple, WriteProperty, and WritePropertyMultiple handlers. * Added BACnet application decoder that understands that an array element of zero is an unsigned integer tagged value. Fixes RP and RPM apps when reading the array element zero of arrays. --- apps/blinkt/device.c | 37 ++-------- apps/piface/device.c | 37 ++-------- ports/at91sam7s/ai.c | 6 -- ports/at91sam7s/av.c | 17 ----- ports/at91sam7s/bi.c | 6 -- ports/at91sam7s/bv.c | 14 ---- ports/at91sam7s/device.c | 14 ---- ports/at91sam7s/netport.c | 12 ---- ports/bdk-atxx4-mstp/ai.c | 6 -- ports/bdk-atxx4-mstp/av.c | 17 ----- ports/bdk-atxx4-mstp/bi.c | 6 -- ports/bdk-atxx4-mstp/bo.c | 14 ---- ports/bdk-atxx4-mstp/device.c | 14 ---- ports/bdk-atxx4-mstp/netport.c | 12 ---- ports/stm32f10x/bo.c | 14 ---- ports/stm32f10x/device.c | 63 ++++------------- ports/stm32f10x/netport.c | 12 ---- ports/stm32f4xx/device.c | 69 ++++--------------- ports/stm32f4xx/netport.c | 14 ---- ports/xplained/ai.c | 13 ---- ports/xplained/device.c | 14 ---- ports/xplained/netport.c | 12 ---- src/bacnet/bacapp.c | 34 ++++++++- src/bacnet/bacapp.h | 8 +++ src/bacnet/basic/client/bac-rw.c | 4 +- src/bacnet/basic/object/acc.c | 52 +++++++------- src/bacnet/basic/object/access_credential.c | 44 +++--------- src/bacnet/basic/object/access_door.c | 14 ---- src/bacnet/basic/object/access_point.c | 50 ++++---------- src/bacnet/basic/object/access_rights.c | 20 +----- src/bacnet/basic/object/access_user.c | 35 +++------- src/bacnet/basic/object/access_zone.c | 35 +++------- src/bacnet/basic/object/ai.c | 15 ---- src/bacnet/basic/object/ao.c | 16 ----- src/bacnet/basic/object/av.c | 16 ----- src/bacnet/basic/object/bacfile.c | 6 -- src/bacnet/basic/object/bi.c | 13 +--- src/bacnet/basic/object/bitstring_value.c | 18 ----- src/bacnet/basic/object/blo.c | 14 ---- src/bacnet/basic/object/bo.c | 14 ---- src/bacnet/basic/object/bv.c | 16 +---- src/bacnet/basic/object/calendar.c | 29 -------- src/bacnet/basic/object/channel.c | 19 ----- src/bacnet/basic/object/color_object.c | 16 ----- src/bacnet/basic/object/color_temperature.c | 16 ----- src/bacnet/basic/object/command.c | 14 ---- .../basic/object/credential_data_input.c | 15 ---- src/bacnet/basic/object/csv.c | 7 -- src/bacnet/basic/object/device.c | 37 ++-------- src/bacnet/basic/object/gateway/gw_device.c | 7 -- src/bacnet/basic/object/iv.c | 16 ----- src/bacnet/basic/object/lc.c | 18 ----- src/bacnet/basic/object/lo.c | 14 ---- src/bacnet/basic/object/lsp.c | 12 ---- src/bacnet/basic/object/lsz.c | 12 ---- src/bacnet/basic/object/ms-input.c | 14 ---- src/bacnet/basic/object/mso.c | 15 +--- src/bacnet/basic/object/msv.c | 16 ----- src/bacnet/basic/object/nc.c | 15 ---- src/bacnet/basic/object/netport.c | 49 ------------- src/bacnet/basic/object/osv.c | 16 ----- src/bacnet/basic/object/piv.c | 16 ----- src/bacnet/basic/object/schedule.c | 16 ----- src/bacnet/basic/object/structured_view.c | 10 --- src/bacnet/basic/object/time_value.c | 35 ---------- src/bacnet/basic/object/trendlog.c | 19 ----- src/bacnet/basic/service/h_rp.c | 6 +- src/bacnet/basic/service/h_rp_a.c | 5 +- src/bacnet/basic/service/h_rpm.c | 2 + src/bacnet/basic/service/h_rpm_a.c | 5 +- src/bacnet/basic/service/h_wp.c | 7 +- src/bacnet/basic/service/h_wpm.c | 3 + src/bacnet/proplist.c | 32 +++------ src/bacnet/rp.c | 23 +++++++ src/bacnet/rp.h | 3 + src/bacnet/wp.c | 24 +++++++ src/bacnet/wp.h | 2 + test/bacnet/basic/object/acc/CMakeLists.txt | 1 + .../object/access_credential/CMakeLists.txt | 1 + .../basic/object/access_door/CMakeLists.txt | 1 + .../basic/object/access_point/CMakeLists.txt | 2 + .../basic/object/access_user/CMakeLists.txt | 1 + .../basic/object/access_zone/CMakeLists.txt | 1 + .../basic/object/bacfile/CMakeLists.txt | 1 + .../basic/object/bitstring_value/src/main.c | 10 --- test/bacnet/basic/object/blo/CMakeLists.txt | 1 + .../basic/object/color_object/CMakeLists.txt | 1 + .../object/color_temperature/CMakeLists.txt | 1 + test/bacnet/basic/object/lo/CMakeLists.txt | 1 + test/bacnet/basic/object/lsp/CMakeLists.txt | 1 + test/bacnet/basic/object/nc/CMakeLists.txt | 1 + test/bacnet/basic/object/netport/src/main.c | 58 ++++++++-------- test/bacnet/basic/object/osv/CMakeLists.txt | 1 + test/bacnet/basic/object/piv/CMakeLists.txt | 1 + test/bacnet/basic/object/test/property_test.c | 34 ++++----- test/bacnet/rp/CMakeLists.txt | 1 + test/bacnet/wp/CMakeLists.txt | 1 + test/bacnet/wpm/CMakeLists.txt | 1 + 98 files changed, 299 insertions(+), 1234 deletions(-) diff --git a/apps/blinkt/device.c b/apps/blinkt/device.c index c6e40036..d6529398 100644 --- a/apps/blinkt/device.c +++ b/apps/blinkt/device.c @@ -1298,13 +1298,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1334,20 +1327,11 @@ static int Read_Property_Common( if (property_list_common(rpdata->object_property)) { apdu_len = property_list_common_encode(rpdata, Object_Instance_Number); } else if (rpdata->object_property == PROP_OBJECT_NAME) { - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - characterstring_init_ansi(&char_string, ""); - if (pObject->Object_Name) { - (void)pObject->Object_Name( - rpdata->object_instance, &char_string); - } - apdu_len = - encode_application_character_string(&apdu[0], &char_string); + characterstring_init_ansi(&char_string, ""); + if (pObject->Object_Name) { + (void)pObject->Object_Name(rpdata->object_instance, &char_string); } + apdu_len = encode_application_character_string(&apdu[0], &char_string); #if (BACNET_PROTOCOL_REVISION >= 14) } else if (rpdata->object_property == PROP_PROPERTY_LIST) { Device_Objects_Property_List( @@ -1419,13 +1403,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: @@ -1685,12 +1662,6 @@ static bool Device_Write_Property_Object_Name( if (!wp_data) { return false; } - if (wp_data->array_index != BACNET_ARRAY_ALL) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } apdu = wp_data->application_data; apdu_size = wp_data->application_data_len; len = bacnet_character_string_application_decode(apdu, apdu_size, &value); diff --git a/apps/piface/device.c b/apps/piface/device.c index 53985d35..a429bc6a 100644 --- a/apps/piface/device.c +++ b/apps/piface/device.c @@ -1250,13 +1250,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1286,20 +1279,11 @@ static int Read_Property_Common( if (property_list_common(rpdata->object_property)) { apdu_len = property_list_common_encode(rpdata, Object_Instance_Number); } else if (rpdata->object_property == PROP_OBJECT_NAME) { - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - characterstring_init_ansi(&char_string, ""); - if (pObject->Object_Name) { - (void)pObject->Object_Name( - rpdata->object_instance, &char_string); - } - apdu_len = - encode_application_character_string(&apdu[0], &char_string); + characterstring_init_ansi(&char_string, ""); + if (pObject->Object_Name) { + (void)pObject->Object_Name(rpdata->object_instance, &char_string); } + apdu_len = encode_application_character_string(&apdu[0], &char_string); #if (BACNET_PROTOCOL_REVISION >= 14) } else if (rpdata->object_property == PROP_PROPERTY_LIST) { Device_Objects_Property_List( @@ -1371,13 +1355,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: @@ -1637,12 +1614,6 @@ static bool Device_Write_Property_Object_Name( if (!wp_data) { return false; } - if (wp_data->array_index != BACNET_ARRAY_ALL) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } apdu = wp_data->application_data; apdu_size = wp_data->application_data_len; len = bacnet_character_string_application_decode(apdu, apdu_size, &value); diff --git a/ports/at91sam7s/ai.c b/ports/at91sam7s/ai.c index dd5a1693..9c706b55 100644 --- a/ports/at91sam7s/ai.c +++ b/ports/at91sam7s/ai.c @@ -162,12 +162,6 @@ int Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/ports/at91sam7s/av.c b/ports/at91sam7s/av.c index ebf99e86..b708f173 100644 --- a/ports/at91sam7s/av.c +++ b/ports/at91sam7s/av.c @@ -267,16 +267,6 @@ int Analog_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && -#if 0 - (rpdata->object_property != PROP_PRIORITY_ARRAY) && -#endif - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -306,13 +296,6 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: if (value.tag == BACNET_APPLICATION_TAG_REAL) { diff --git a/ports/at91sam7s/bi.c b/ports/at91sam7s/bi.c index dc9834a4..d0a9e7f2 100644 --- a/ports/at91sam7s/bi.c +++ b/ports/at91sam7s/bi.c @@ -182,12 +182,6 @@ int Binary_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/ports/at91sam7s/bv.c b/ports/at91sam7s/bv.c index bd83d322..46ec5717 100644 --- a/ports/at91sam7s/bv.c +++ b/ports/at91sam7s/bv.c @@ -124,7 +124,6 @@ int Binary_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) BACNET_CHARACTER_STRING char_string; BACNET_BINARY_PV present_value = BINARY_INACTIVE; BACNET_POLARITY polarity = POLARITY_NORMAL; - uint8_t *apdu = NULL; if ((rpdata == NULL) || (rpdata->application_data == NULL) || @@ -180,12 +179,6 @@ int Binary_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -215,13 +208,6 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) { diff --git a/ports/at91sam7s/device.c b/ports/at91sam7s/device.c index 22c6ae74..c12e4f72 100644 --- a/ports/at91sam7s/device.c +++ b/ports/at91sam7s/device.c @@ -782,13 +782,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -811,13 +804,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) { diff --git a/ports/at91sam7s/netport.c b/ports/at91sam7s/netport.c index d94f2f23..de8a21e1 100644 --- a/ports/at91sam7s/netport.c +++ b/ports/at91sam7s/netport.c @@ -668,18 +668,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_LINK_SPEEDS) && - (wp_data->object_property != PROP_IP_DNS_SERVER) && - (wp_data->object_property != PROP_IPV6_DNS_SERVER) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS_CONFIG) && - (wp_data->object_property != PROP_TAGS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/ports/bdk-atxx4-mstp/ai.c b/ports/bdk-atxx4-mstp/ai.c index 428271c4..ff4778a3 100644 --- a/ports/bdk-atxx4-mstp/ai.c +++ b/ports/bdk-atxx4-mstp/ai.c @@ -162,12 +162,6 @@ int Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/ports/bdk-atxx4-mstp/av.c b/ports/bdk-atxx4-mstp/av.c index 1dba7f09..bc7a7c29 100644 --- a/ports/bdk-atxx4-mstp/av.c +++ b/ports/bdk-atxx4-mstp/av.c @@ -277,16 +277,6 @@ int Analog_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && -#if 0 - (rpdata->object_property != PROP_PRIORITY_ARRAY) && -#endif - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -312,13 +302,6 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid(wp_data, &value, diff --git a/ports/bdk-atxx4-mstp/bi.c b/ports/bdk-atxx4-mstp/bi.c index 728b7611..d98bbca4 100644 --- a/ports/bdk-atxx4-mstp/bi.c +++ b/ports/bdk-atxx4-mstp/bi.c @@ -193,12 +193,6 @@ int Binary_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/ports/bdk-atxx4-mstp/bo.c b/ports/bdk-atxx4-mstp/bo.c index dac56c3e..d64afb8e 100644 --- a/ports/bdk-atxx4-mstp/bo.c +++ b/ports/bdk-atxx4-mstp/bo.c @@ -336,13 +336,6 @@ int Binary_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -366,13 +359,6 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid(wp_data, &value, diff --git a/ports/bdk-atxx4-mstp/device.c b/ports/bdk-atxx4-mstp/device.c index 8b155b91..e691a263 100644 --- a/ports/bdk-atxx4-mstp/device.c +++ b/ports/bdk-atxx4-mstp/device.c @@ -779,13 +779,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -807,13 +800,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) { diff --git a/ports/bdk-atxx4-mstp/netport.c b/ports/bdk-atxx4-mstp/netport.c index 73c2eaa9..23418919 100644 --- a/ports/bdk-atxx4-mstp/netport.c +++ b/ports/bdk-atxx4-mstp/netport.c @@ -669,18 +669,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_LINK_SPEEDS) && - (wp_data->object_property != PROP_IP_DNS_SERVER) && - (wp_data->object_property != PROP_IPV6_DNS_SERVER) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS_CONFIG) && - (wp_data->object_property != PROP_TAGS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/ports/stm32f10x/bo.c b/ports/stm32f10x/bo.c index ad39adac..4385ce65 100644 --- a/ports/stm32f10x/bo.c +++ b/ports/stm32f10x/bo.c @@ -314,13 +314,6 @@ int Binary_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -344,13 +337,6 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid(wp_data, &value, diff --git a/ports/stm32f10x/device.c b/ports/stm32f10x/device.c index 35ac61db..8992659b 100644 --- a/ports/stm32f10x/device.c +++ b/ports/stm32f10x/device.c @@ -120,47 +120,26 @@ static int Read_Property_Common( apdu = rpdata->application_data; switch (rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - /* Device Object exception: requested instance - may not match our instance if a wildcard */ - if (rpdata->object_type == OBJECT_DEVICE) { - rpdata->object_instance = Object_Instance_Number; - } - apdu_len = encode_application_object_id( - &apdu[0], rpdata->object_type, rpdata->object_instance); + /* Device Object exception: requested instance + may not match our instance if a wildcard */ + if (rpdata->object_type == OBJECT_DEVICE) { + rpdata->object_instance = Object_Instance_Number; } + apdu_len = encode_application_object_id( + &apdu[0], rpdata->object_type, rpdata->object_instance); break; case PROP_OBJECT_NAME: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - characterstring_init_ansi(&char_string, ""); - if (pObject->Object_Name) { - (void)pObject->Object_Name( - rpdata->object_instance, &char_string); - } - apdu_len = - encode_application_character_string(&apdu[0], &char_string); + characterstring_init_ansi(&char_string, ""); + if (pObject->Object_Name) { + (void)pObject->Object_Name( + rpdata->object_instance, &char_string); } + apdu_len = + encode_application_character_string(&apdu[0], &char_string); break; case PROP_OBJECT_TYPE: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - apdu_len = encode_application_enumerated( - &apdu[0], rpdata->object_type); - } + apdu_len = encode_application_enumerated( + &apdu[0], rpdata->object_type); break; #if (BACNET_PROTOCOL_REVISION >= 14) case PROP_PROPERTY_LIST: @@ -796,13 +775,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -825,13 +797,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) { diff --git a/ports/stm32f10x/netport.c b/ports/stm32f10x/netport.c index d94f2f23..de8a21e1 100644 --- a/ports/stm32f10x/netport.c +++ b/ports/stm32f10x/netport.c @@ -668,18 +668,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_LINK_SPEEDS) && - (wp_data->object_property != PROP_IP_DNS_SERVER) && - (wp_data->object_property != PROP_IPV6_DNS_SERVER) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS_CONFIG) && - (wp_data->object_property != PROP_TAGS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/ports/stm32f4xx/device.c b/ports/stm32f4xx/device.c index c5d0c901..8ce7a2a6 100644 --- a/ports/stm32f4xx/device.c +++ b/ports/stm32f4xx/device.c @@ -857,13 +857,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -893,47 +886,26 @@ static int Read_Property_Common( apdu = rpdata->application_data; switch (rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - /* Device Object exception: requested instance - may not match our instance if a wildcard */ - if (rpdata->object_type == OBJECT_DEVICE) { - rpdata->object_instance = Object_Instance_Number; - } - apdu_len = encode_application_object_id( - &apdu[0], rpdata->object_type, rpdata->object_instance); + /* Device Object exception: requested instance + may not match our instance if a wildcard */ + if (rpdata->object_type == OBJECT_DEVICE) { + rpdata->object_instance = Object_Instance_Number; } + apdu_len = encode_application_object_id( + &apdu[0], rpdata->object_type, rpdata->object_instance); break; case PROP_OBJECT_NAME: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - characterstring_init_ansi(&char_string, ""); - if (pObject->Object_Name) { - (void)pObject->Object_Name( - rpdata->object_instance, &char_string); - } - apdu_len = - encode_application_character_string(&apdu[0], &char_string); + characterstring_init_ansi(&char_string, ""); + if (pObject->Object_Name) { + (void)pObject->Object_Name( + rpdata->object_instance, &char_string); } + apdu_len = + encode_application_character_string(&apdu[0], &char_string); break; case PROP_OBJECT_TYPE: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - apdu_len = encode_application_enumerated( - &apdu[0], rpdata->object_type); - } + apdu_len = encode_application_enumerated( + &apdu[0], rpdata->object_type); break; #if (BACNET_PROTOCOL_REVISION >= 14) case PROP_PROPERTY_LIST: @@ -1007,13 +979,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) { @@ -1179,12 +1144,6 @@ static bool Device_Write_Property_Object_Name( if (!wp_data) { return false; } - if (wp_data->array_index != BACNET_ARRAY_ALL) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } apdu = wp_data->application_data; apdu_size = wp_data->application_data_len; len = bacnet_character_string_application_decode(apdu, apdu_size, &value); diff --git a/ports/stm32f4xx/netport.c b/ports/stm32f4xx/netport.c index e28c28d7..fac24780 100644 --- a/ports/stm32f4xx/netport.c +++ b/ports/stm32f4xx/netport.c @@ -66,12 +66,6 @@ static const int Network_Port_Properties_Optional[] = { PROP_MAC_ADDRESS, static const int Network_Port_Properties_Proprietary[] = { -1 }; -/* standard properties that are arrays for this object, - but not necessary supported in this object */ -static const int Network_Port_Properties_Array[] = { PROP_LINK_SPEEDS, - PROP_IP_DNS_SERVER, PROP_IPV6_DNS_SERVER, PROP_EVENT_MESSAGE_TEXTS, - PROP_EVENT_MESSAGE_TEXTS_CONFIG, PROP_TAGS, -1 }; - /** * Returns the list of required, optional, and proprietary properties. * Used by ReadPropertyMultiple service. @@ -699,14 +693,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if (!property_list_member( - Network_Port_Properties_Array, wp_data->object_property) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/ports/xplained/ai.c b/ports/xplained/ai.c index f7bb0fc5..c5eddf59 100644 --- a/ports/xplained/ai.c +++ b/ports/xplained/ai.c @@ -231,12 +231,6 @@ int Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -258,13 +252,6 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid(wp_data, &value, diff --git a/ports/xplained/device.c b/ports/xplained/device.c index 81c56f40..30e461c7 100644 --- a/ports/xplained/device.c +++ b/ports/xplained/device.c @@ -752,13 +752,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -780,13 +773,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: if (value.tag == BACNET_APPLICATION_TAG_OBJECT_ID) { diff --git a/ports/xplained/netport.c b/ports/xplained/netport.c index 48b142e2..4904263f 100644 --- a/ports/xplained/netport.c +++ b/ports/xplained/netport.c @@ -662,18 +662,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_LINK_SPEEDS) && - (wp_data->object_property != PROP_IP_DNS_SERVER) && - (wp_data->object_property != PROP_IPV6_DNS_SERVER) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS_CONFIG) && - (wp_data->object_property != PROP_TAGS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/src/bacnet/bacapp.c b/src/bacnet/bacapp.c index c2cb8d0b..78f1df85 100644 --- a/src/bacnet/bacapp.c +++ b/src/bacnet/bacapp.c @@ -1697,6 +1697,7 @@ int bacapp_decode_application_tag_value( /** * @brief Decodes a well-known, possibly complex property value + * or array property. * Used to reverse operations in bacapp_encode_application_data. * @note This function is called repeatedly to decode array or lists one * element at a time. @@ -1707,12 +1708,13 @@ int bacapp_decode_application_tag_value( * @return number of bytes decoded, or BACNET_STATUS_ERROR if errors occur * @note number of bytes can be 0 for empty lists, etc. */ -int bacapp_decode_known_property( +int bacapp_decode_known_array_property( const uint8_t *apdu, int apdu_size, BACNET_APPLICATION_DATA_VALUE *value, BACNET_OBJECT_TYPE object_type, - BACNET_PROPERTY_ID property) + BACNET_PROPERTY_ID property, + uint32_t array_index) { int apdu_len = 0; int tag; @@ -1722,6 +1724,11 @@ int bacapp_decode_known_property( value->tag = BACNET_APPLICATION_TAG_EMPTYLIST; } apdu_len = 0; + } else if (array_index == 0) { + /* Array index 0 is the size of the array and always unsigned int */ + value->tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; + apdu_len = bacnet_unsigned_application_decode( + apdu, apdu_size, &value->type.Unsigned_Int); } else if (property == PROP_PRIORITY_ARRAY) { /* BACnetPriorityValue */ /* special case to reduce complexity - mostly encoded as application @@ -1744,6 +1751,29 @@ int bacapp_decode_known_property( return apdu_len; } +/** + * @brief Decodes a well-known, possibly complex property value + * Used to reverse operations in bacapp_encode_application_data. + * @note This function is called repeatedly to decode array or lists one + * element at a time. + * @param apdu - buffer of data to be decoded + * @param max_apdu_len - number of bytes in the buffer + * @param value - stores the decoded property value + * @param property - context property identifier + * @return number of bytes decoded, or BACNET_STATUS_ERROR if errors occur + * @note number of bytes can be 0 for empty lists, etc. + */ +int bacapp_decode_known_property( + const uint8_t *apdu, + int apdu_size, + BACNET_APPLICATION_DATA_VALUE *value, + BACNET_OBJECT_TYPE object_type, + BACNET_PROPERTY_ID property) +{ + return bacapp_decode_known_array_property( + apdu, apdu_size, value, object_type, property, BACNET_ARRAY_ALL); +} + #if defined(BACAPP_COMPLEX_TYPES) /** * @brief Determine the BACnet Context Data number of APDU bytes consumed diff --git a/src/bacnet/bacapp.h b/src/bacnet/bacapp.h index 2b4994cd..76bfc80e 100644 --- a/src/bacnet/bacapp.h +++ b/src/bacnet/bacapp.h @@ -325,6 +325,14 @@ int bacapp_decode_known_property( BACNET_APPLICATION_DATA_VALUE *value, BACNET_OBJECT_TYPE object_type, BACNET_PROPERTY_ID property); +BACNET_STACK_EXPORT +int bacapp_decode_known_array_property( + const uint8_t *apdu, + int apdu_size, + BACNET_APPLICATION_DATA_VALUE *value, + BACNET_OBJECT_TYPE object_type, + BACNET_PROPERTY_ID property, + uint32_t array_index); BACNET_STACK_EXPORT int bacapp_known_property_tag( diff --git a/src/bacnet/basic/client/bac-rw.c b/src/bacnet/basic/client/bac-rw.c index 8f4e50fc..e7d0692f 100644 --- a/src/bacnet/basic/client/bac-rw.c +++ b/src/bacnet/basic/client/bac-rw.c @@ -234,9 +234,9 @@ static void bacnet_read_property_ack_process( apdu_len = rp_data->application_data_len; while (apdu_len) { bacapp_value_list_init(value, 1); - len = bacapp_decode_known_property( + len = bacapp_decode_known_array_property( apdu, (unsigned)apdu_len, value, rp_data->object_type, - rp_data->object_property); + rp_data->object_property, rp_data->array_index); if (len > 0) { if ((len < apdu_len) && (rp_data->array_index == BACNET_ARRAY_ALL)) { diff --git a/src/bacnet/basic/object/acc.c b/src/bacnet/basic/object/acc.c index 354fb080..4e1fb3f9 100644 --- a/src/bacnet/basic/object/acc.c +++ b/src/bacnet/basic/object/acc.c @@ -12,6 +12,7 @@ #include "bacnet/bacdef.h" /* BACnet Stack API */ #include "bacnet/bacdcode.h" +#include "bacnet/proplist.h" #include "bacnet/basic/object/acc.h" #ifndef MAX_ACCUMULATORS @@ -355,12 +356,7 @@ int Accumulator_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } + return apdu_len; } @@ -388,30 +384,34 @@ bool Accumulator_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if (wp_data->array_index != BACNET_ARRAY_ALL) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch ((int)wp_data->object_property) { - case PROP_OBJECT_IDENTIFIER: - case PROP_OBJECT_NAME: - case PROP_DESCRIPTION: - case PROP_OBJECT_TYPE: case PROP_PRESENT_VALUE: - case PROP_SCALE: - case PROP_MAX_PRES_VALUE: - case PROP_STATUS_FLAGS: - case PROP_EVENT_STATE: - case PROP_OUT_OF_SERVICE: - case PROP_UNITS: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) { + if (value.type.Unsigned_Int <= + Accumulator_Max_Pres_Value(wp_data->object_instance)) { + Accumulator_Present_Value_Set( + wp_data->object_instance, value.type.Unsigned_Int); + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; + return false; + } + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE; + return false; + } break; default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (property_lists_member( + Properties_Required, Properties_Optional, + Properties_Proprietary, wp_data->object_property)) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } break; } diff --git a/src/bacnet/basic/object/access_credential.c b/src/bacnet/basic/object/access_credential.c index 587d28c3..d45cfb90 100644 --- a/src/bacnet/basic/object/access_credential.c +++ b/src/bacnet/basic/object/access_credential.c @@ -15,6 +15,7 @@ #include "bacnet/bacdcode.h" #include "bacnet/bacapp.h" #include "bacnet/wp.h" +#include "bacnet/proplist.h" #include "bacnet/basic/object/access_credential.h" #include "bacnet/basic/services.h" @@ -303,15 +304,6 @@ int Access_Credential_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && - (rpdata->object_property != PROP_AUTHENTICATION_FACTORS) && - (rpdata->object_property != PROP_ASSIGNED_ACCESS_RIGHTS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -334,14 +326,6 @@ bool Access_Credential_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_AUTHENTICATION_FACTORS) && - (wp_data->object_property != PROP_ASSIGNED_ACCESS_RIGHTS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Access_Credential_Instance_To_Index(wp_data->object_instance); switch (wp_data->object_property) { @@ -353,24 +337,16 @@ bool Access_Credential_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) value.type.Unsigned_Int; } break; - case PROP_OBJECT_IDENTIFIER: - case PROP_OBJECT_NAME: - case PROP_OBJECT_TYPE: - case PROP_STATUS_FLAGS: - case PROP_RELIABILITY: - case PROP_CREDENTIAL_STATUS: - case PROP_REASON_FOR_DISABLE: - case PROP_AUTHENTICATION_FACTORS: - case PROP_ACTIVATION_TIME: - case PROP_EXPIRATION_TIME: - case PROP_CREDENTIAL_DISABLE: - case PROP_ASSIGNED_ACCESS_RIGHTS: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; - break; default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (property_lists_member( + Properties_Required, Properties_Optional, + Properties_Proprietary, wp_data->object_property)) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } break; } diff --git a/src/bacnet/basic/object/access_door.c b/src/bacnet/basic/object/access_door.c index 28ce2035..bcda479c 100644 --- a/src/bacnet/basic/object/access_door.c +++ b/src/bacnet/basic/object/access_door.c @@ -416,13 +416,6 @@ int Access_Door_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -445,13 +438,6 @@ bool Access_Door_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Access_Door_Instance_To_Index(wp_data->object_instance); switch (wp_data->object_property) { case PROP_PRESENT_VALUE: diff --git a/src/bacnet/basic/object/access_point.c b/src/bacnet/basic/object/access_point.c index 09fc4f30..42de9a3a 100644 --- a/src/bacnet/basic/object/access_point.c +++ b/src/bacnet/basic/object/access_point.c @@ -297,13 +297,6 @@ int Access_Point_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_ACCESS_DOORS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -325,38 +318,25 @@ bool Access_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_ACCESS_DOORS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } - switch (wp_data->object_property) { - case PROP_OBJECT_IDENTIFIER: - case PROP_OBJECT_NAME: - case PROP_OBJECT_TYPE: - case PROP_STATUS_FLAGS: - case PROP_EVENT_STATE: - case PROP_RELIABILITY: case PROP_OUT_OF_SERVICE: - case PROP_AUTHENTICATION_STATUS: - case PROP_ACTIVE_AUTHENTICATION_POLICY: - case PROP_NUMBER_OF_AUTHENTICATION_POLICIES: - case PROP_AUTHORIZATION_MODE: - case PROP_ACCESS_EVENT: - case PROP_ACCESS_EVENT_TAG: - case PROP_ACCESS_EVENT_TIME: - case PROP_ACCESS_EVENT_CREDENTIAL: - case PROP_ACCESS_DOORS: - case PROP_PRIORITY_FOR_WRITING: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + status = write_property_type_valid( + wp_data, &value, BACNET_APPLICATION_TAG_BOOLEAN); + if (status) { + Access_Point_Out_Of_Service_Set( + wp_data->object_instance, value.type.Boolean); + } break; default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (property_lists_member( + Properties_Required, Properties_Optional, + Properties_Proprietary, wp_data->object_property)) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } break; } diff --git a/src/bacnet/basic/object/access_rights.c b/src/bacnet/basic/object/access_rights.c index cb307c76..df7440cb 100644 --- a/src/bacnet/basic/object/access_rights.c +++ b/src/bacnet/basic/object/access_rights.c @@ -14,6 +14,7 @@ #include "bacnet/bacdcode.h" #include "bacnet/bacapp.h" #include "bacnet/property.h" +#include "bacnet/proplist.h" #include "bacnet/wp.h" #include "bacnet/basic/services.h" /* me! */ @@ -203,7 +204,6 @@ int Access_Rights_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) unsigned object_index = 0; BACNET_UNSIGNED_INTEGER count; uint8_t *apdu = NULL; - bool is_array = false; if ((rpdata == NULL) || (rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -278,15 +278,6 @@ int Access_Rights_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - rpdata->object_type, rpdata->object_property); - if ((apdu_len >= 0) && (!is_array) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -295,19 +286,10 @@ int Access_Rights_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) bool Access_Rights_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) { bool status = false; /* return value */ - bool is_array = false; int len = 0; BACNET_APPLICATION_DATA_VALUE value = { 0 }; unsigned object_index = 0; - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - wp_data->object_type, wp_data->object_property); - if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* decode the some of the request */ len = bacapp_decode_application_data( wp_data->application_data, wp_data->application_data_len, &value); diff --git a/src/bacnet/basic/object/access_user.c b/src/bacnet/basic/object/access_user.c index 09c6b489..704e1f41 100644 --- a/src/bacnet/basic/object/access_user.c +++ b/src/bacnet/basic/object/access_user.c @@ -13,6 +13,7 @@ /* BACnet Stack API */ #include "bacnet/bacdcode.h" #include "bacnet/bacapp.h" +#include "bacnet/proplist.h" #include "bacnet/wp.h" #include "access_user.h" #include "bacnet/basic/services.h" @@ -197,12 +198,6 @@ int Access_User_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -225,12 +220,6 @@ bool Access_User_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Access_User_Instance_To_Index(wp_data->object_instance); switch (wp_data->object_property) { case PROP_GLOBAL_IDENTIFIER: @@ -241,20 +230,16 @@ bool Access_User_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) value.type.Unsigned_Int; } break; - - case PROP_OBJECT_IDENTIFIER: - case PROP_OBJECT_NAME: - case PROP_OBJECT_TYPE: - case PROP_STATUS_FLAGS: - case PROP_RELIABILITY: - case PROP_USER_TYPE: - case PROP_CREDENTIALS: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; - break; default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (property_lists_member( + Properties_Required, Properties_Optional, + Properties_Proprietary, wp_data->object_property)) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } break; } diff --git a/src/bacnet/basic/object/access_zone.c b/src/bacnet/basic/object/access_zone.c index a66fb072..c86e8a58 100644 --- a/src/bacnet/basic/object/access_zone.c +++ b/src/bacnet/basic/object/access_zone.c @@ -249,12 +249,6 @@ int Access_Zone_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -277,12 +271,6 @@ bool Access_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Access_Zone_Instance_To_Index(wp_data->object_instance); switch (wp_data->object_property) { case PROP_GLOBAL_IDENTIFIER: @@ -306,21 +294,16 @@ bool Access_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; } break; - case PROP_OBJECT_IDENTIFIER: - case PROP_OBJECT_NAME: - case PROP_OBJECT_TYPE: - case PROP_OCCUPANCY_STATE: - case PROP_STATUS_FLAGS: - case PROP_EVENT_STATE: - case PROP_OUT_OF_SERVICE: - case PROP_ENTRY_POINTS: - case PROP_EXIT_POINTS: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; - break; default: - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + if (property_lists_member( + Properties_Required, Properties_Optional, + Properties_Proprietary, wp_data->object_property)) { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED; + } else { + wp_data->error_class = ERROR_CLASS_PROPERTY; + wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + } break; } diff --git a/src/bacnet/basic/object/ai.c b/src/bacnet/basic/object/ai.c index 5aa3472e..01238979 100644 --- a/src/bacnet/basic/object/ai.c +++ b/src/bacnet/basic/object/ai.c @@ -849,14 +849,6 @@ int Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -892,13 +884,6 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } pObject = Analog_Input_Object(wp_data->object_instance); if (!pObject) { return false; diff --git a/src/bacnet/basic/object/ao.c b/src/bacnet/basic/object/ao.c index 6fb0a6bb..7635ca41 100644 --- a/src/bacnet/basic/object/ao.c +++ b/src/bacnet/basic/object/ao.c @@ -1085,14 +1085,6 @@ int Analog_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1120,14 +1112,6 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/av.c b/src/bacnet/basic/object/av.c index 344e9dce..74567d83 100644 --- a/src/bacnet/basic/object/av.c +++ b/src/bacnet/basic/object/av.c @@ -871,14 +871,6 @@ int Analog_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -914,14 +906,6 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } CurrentAV = Analog_Value_Object(wp_data->object_instance); if (!CurrentAV) { wp_data->error_class = ERROR_CLASS_OBJECT; diff --git a/src/bacnet/basic/object/bacfile.c b/src/bacnet/basic/object/bacfile.c index ade5b38a..a9e0c46b 100644 --- a/src/bacnet/basic/object/bacfile.c +++ b/src/bacnet/basic/object/bacfile.c @@ -683,12 +683,6 @@ bool bacfile_write_property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT; return false; } - /* only array properties can have array options */ - if (wp_data->array_index != BACNET_ARRAY_ALL) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* decode the some of the request */ len = bacapp_decode_application_data( wp_data->application_data, wp_data->application_data_len, &value); diff --git a/src/bacnet/basic/object/bi.c b/src/bacnet/basic/object/bi.c index 65d58a27..2ecafa70 100644 --- a/src/bacnet/basic/object/bi.c +++ b/src/bacnet/basic/object/bi.c @@ -21,6 +21,7 @@ #include "bacnet/rp.h" #include "bacnet/wp.h" #include "bacnet/cov.h" +#include "bacnet/proplist.h" /* basic objects and services */ #include "bacnet/basic/object/device.h" #include "bacnet/basic/services.h" @@ -1030,12 +1031,6 @@ int Binary_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1072,12 +1067,6 @@ bool Binary_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) #endif return BACNET_STATUS_ERROR; } - /* only array properties can have array options */ - if (wp_data->array_index != BACNET_ARRAY_ALL) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/bitstring_value.c b/src/bacnet/basic/object/bitstring_value.c index 02246190..e3fdb9e3 100644 --- a/src/bacnet/basic/object/bitstring_value.c +++ b/src/bacnet/basic/object/bitstring_value.c @@ -552,7 +552,6 @@ int BitString_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) BACNET_BIT_STRING bit_string; BACNET_CHARACTER_STRING char_string; bool state = false; - bool is_array = false; uint8_t *apdu = NULL; if ((rpdata == NULL) || (rpdata->application_data == NULL) || @@ -611,15 +610,6 @@ int BitString_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - rpdata->object_type, rpdata->object_property); - if ((apdu_len >= 0) && (!is_array) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -654,14 +644,6 @@ bool BitString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/blo.c b/src/bacnet/basic/object/blo.c index 08a3c045..c390c822 100644 --- a/src/bacnet/basic/object/blo.c +++ b/src/bacnet/basic/object/blo.c @@ -1369,13 +1369,6 @@ int Binary_Lighting_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1405,13 +1398,6 @@ bool Binary_Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/bo.c b/src/bacnet/basic/object/bo.c index 8cc24b9b..0c5bdc0c 100644 --- a/src/bacnet/basic/object/bo.c +++ b/src/bacnet/basic/object/bo.c @@ -1089,13 +1089,6 @@ int Binary_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1125,13 +1118,6 @@ bool Binary_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/bv.c b/src/bacnet/basic/object/bv.c index 1f88338e..792528f8 100644 --- a/src/bacnet/basic/object/bv.c +++ b/src/bacnet/basic/object/bv.c @@ -21,6 +21,7 @@ #include "bacnet/wp.h" #include "bacnet/rp.h" #include "bacnet/cov.h" +#include "bacnet/proplist.h" /* basic objects and services */ #include "bacnet/basic/services.h" #include "bacnet/basic/object/device.h" @@ -1037,13 +1038,6 @@ int Binary_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* Only array properties can have array options. */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1070,7 +1064,6 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) if (wp_data->application_data_len == 0) { return false; } - /* Decode the some of the request. */ len = bacapp_decode_application_data( wp_data->application_data, wp_data->application_data_len, &value); @@ -1087,13 +1080,6 @@ bool Binary_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) #endif return BACNET_STATUS_ERROR; } - /* Only array properties can have array options. */ - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/calendar.c b/src/bacnet/basic/object/calendar.c index 2e798a8c..9d30a906 100644 --- a/src/bacnet/basic/object/calendar.c +++ b/src/bacnet/basic/object/calendar.c @@ -57,11 +57,6 @@ static const int Calendar_Properties_Optional[] = { PROP_DESCRIPTION, -1 }; static const int Calendar_Properties_Proprietary[] = { -1 }; -/* standard properties that are arrays for this object, - but not necessary supported in this object */ -static const int BACnetARRAY_Properties[] = { PROP_PRIORITY_ARRAY, PROP_TAGS, - -1 }; - /** * Returns the list of required, optional, and proprietary properties. * Used by ReadPropertyMultiple service. @@ -481,16 +476,6 @@ bool Calendar_Description_Set(uint32_t object_instance, const char *new_name) return status; } -/** - * @brief Determine if the object property is a BACnetARRAY property - * @param object_property - object-property to be checked - * @return true if the property is a BACnetARRAY property - */ -static bool BACnetARRAY_Property(int object_property) -{ - return property_list_member(BACnetARRAY_Properties, object_property); -} - /** * ReadProperty handler for this object. For the given ReadProperty * data, the application_data is loaded or the error flags are set. @@ -549,13 +534,6 @@ int Calendar_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (!BACnetARRAY_Property(rpdata->object_property)) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -589,13 +567,6 @@ bool Calendar_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((!BACnetARRAY_Property(wp_data->object_property)) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_DATE_LIST: pv_old = Calendar_Present_Value(wp_data->object_instance); diff --git a/src/bacnet/basic/object/channel.c b/src/bacnet/basic/object/channel.c index d21bbc12..0449412b 100644 --- a/src/bacnet/basic/object/channel.c +++ b/src/bacnet/basic/object/channel.c @@ -966,7 +966,6 @@ int Channel_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) bool state = false; int apdu_size = 0; uint8_t *apdu = NULL; - bool is_array; if ((rpdata == NULL) || (rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -1053,15 +1052,6 @@ int Channel_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - rpdata->object_type, rpdata->object_property); - if ((apdu_len >= 0) && (!is_array) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1239,16 +1229,7 @@ bool Channel_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) bool status = false; /* return value */ int len = 0; BACNET_APPLICATION_DATA_VALUE value = { 0 }; - bool is_array; - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - wp_data->object_type, wp_data->object_property); - if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* decode the first value of the request */ len = bacapp_decode_known_property( wp_data->application_data, wp_data->application_data_len, &value, diff --git a/src/bacnet/basic/object/color_object.c b/src/bacnet/basic/object/color_object.c index 6a8f7bba..e7c2d5d6 100644 --- a/src/bacnet/basic/object/color_object.c +++ b/src/bacnet/basic/object/color_object.c @@ -971,14 +971,6 @@ int Color_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1013,14 +1005,6 @@ bool Color_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/color_temperature.c b/src/bacnet/basic/object/color_temperature.c index 088da93d..a1b357b9 100644 --- a/src/bacnet/basic/object/color_temperature.c +++ b/src/bacnet/basic/object/color_temperature.c @@ -1404,14 +1404,6 @@ int Color_Temperature_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1445,14 +1437,6 @@ bool Color_Temperature_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/command.c b/src/bacnet/basic/object/command.c index ed0e5477..1779ce0e 100644 --- a/src/bacnet/basic/object/command.c +++ b/src/bacnet/basic/object/command.c @@ -442,13 +442,6 @@ int Command_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_ACTION) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -478,13 +471,6 @@ bool Command_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_ACTION) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Command_Instance_To_Index(wp_data->object_instance); if (object_index >= MAX_COMMANDS) { return false; diff --git a/src/bacnet/basic/object/credential_data_input.c b/src/bacnet/basic/object/credential_data_input.c index 1766ffe4..8a613587 100644 --- a/src/bacnet/basic/object/credential_data_input.c +++ b/src/bacnet/basic/object/credential_data_input.c @@ -259,14 +259,6 @@ int Credential_Data_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && - (rpdata->object_property != PROP_SUPPORTED_FORMATS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -289,13 +281,6 @@ bool Credential_Data_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_SUPPORTED_FORMATS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = Credential_Data_Input_Instance_To_Index(wp_data->object_instance); switch (wp_data->object_property) { diff --git a/src/bacnet/basic/object/csv.c b/src/bacnet/basic/object/csv.c index e2c55722..bce11e1c 100644 --- a/src/bacnet/basic/object/csv.c +++ b/src/bacnet/basic/object/csv.c @@ -626,13 +626,6 @@ int CharacterString_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/src/bacnet/basic/object/device.c b/src/bacnet/basic/object/device.c index c029350b..76b21c65 100644 --- a/src/bacnet/basic/object/device.c +++ b/src/bacnet/basic/object/device.c @@ -1576,13 +1576,6 @@ int Device_Read_Property_Local(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1612,20 +1605,11 @@ static int Read_Property_Common( if (property_list_common(rpdata->object_property)) { apdu_len = property_list_common_encode(rpdata, Object_Instance_Number); } else if (rpdata->object_property == PROP_OBJECT_NAME) { - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - characterstring_init_ansi(&char_string, ""); - if (pObject->Object_Name) { - (void)pObject->Object_Name( - rpdata->object_instance, &char_string); - } - apdu_len = - encode_application_character_string(&apdu[0], &char_string); + characterstring_init_ansi(&char_string, ""); + if (pObject->Object_Name) { + (void)pObject->Object_Name(rpdata->object_instance, &char_string); } + apdu_len = encode_application_character_string(&apdu[0], &char_string); #if (BACNET_PROTOCOL_REVISION >= 14) } else if (rpdata->object_property == PROP_PROPERTY_LIST) { Device_Objects_Property_List( @@ -1698,13 +1682,6 @@ bool Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: @@ -1942,12 +1919,6 @@ static bool Device_Write_Property_Object_Name( if (!wp_data) { return false; } - if (wp_data->array_index != BACNET_ARRAY_ALL) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } apdu = wp_data->application_data; apdu_size = wp_data->application_data_len; len = bacnet_character_string_application_decode(apdu, apdu_size, &value); diff --git a/src/bacnet/basic/object/gateway/gw_device.c b/src/bacnet/basic/object/gateway/gw_device.c index 7d4db4e7..fd7a8fae 100644 --- a/src/bacnet/basic/object/gateway/gw_device.c +++ b/src/bacnet/basic/object/gateway/gw_device.c @@ -462,13 +462,6 @@ bool Routed_Device_Write_Property_Local(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_OBJECT_LIST) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_OBJECT_IDENTIFIER: diff --git a/src/bacnet/basic/object/iv.c b/src/bacnet/basic/object/iv.c index 3057f0bd..47ed6a57 100644 --- a/src/bacnet/basic/object/iv.c +++ b/src/bacnet/basic/object/iv.c @@ -520,14 +520,6 @@ int Integer_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -557,14 +549,6 @@ bool Integer_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/lc.c b/src/bacnet/basic/object/lc.c index 90a9ca7b..33dc19a3 100644 --- a/src/bacnet/basic/object/lc.c +++ b/src/bacnet/basic/object/lc.c @@ -1074,15 +1074,6 @@ int Load_Control_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && - (rpdata->object_property != PROP_SHED_LEVEL_DESCRIPTIONS) && - (rpdata->object_property != PROP_SHED_LEVELS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1466,15 +1457,6 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if ((wp_data->object_property != PROP_SHED_LEVELS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - debug_printf( - "Load_Control_Write_Property() failure detected point C\n"); - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_REQUESTED_SHED_LEVEL: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/lo.c b/src/bacnet/basic/object/lo.c index 713a6ea7..efa618e3 100644 --- a/src/bacnet/basic/object/lo.c +++ b/src/bacnet/basic/object/lo.c @@ -2162,13 +2162,6 @@ int Lighting_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -2200,13 +2193,6 @@ bool Lighting_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/lsp.c b/src/bacnet/basic/object/lsp.c index c0f8a48a..4d71a140 100644 --- a/src/bacnet/basic/object/lsp.c +++ b/src/bacnet/basic/object/lsp.c @@ -557,12 +557,6 @@ int Life_Safety_Point_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -584,12 +578,6 @@ bool Life_Safety_Point_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if (wp_data->array_index != BACNET_ARRAY_ALL) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_MODE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/lsz.c b/src/bacnet/basic/object/lsz.c index 7567269c..e0ca4eb5 100644 --- a/src/bacnet/basic/object/lsz.c +++ b/src/bacnet/basic/object/lsz.c @@ -734,12 +734,6 @@ int Life_Safety_Zone_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -761,12 +755,6 @@ bool Life_Safety_Zone_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - /* only array properties can have array options */ - if (wp_data->array_index != BACNET_ARRAY_ALL) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_MODE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/ms-input.c b/src/bacnet/basic/object/ms-input.c index 018d6572..2fc2de2f 100644 --- a/src/bacnet/basic/object/ms-input.c +++ b/src/bacnet/basic/object/ms-input.c @@ -790,13 +790,6 @@ int Multistate_Input_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -824,13 +817,6 @@ bool Multistate_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_STATE_TEXT) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/mso.c b/src/bacnet/basic/object/mso.c index a01c06b6..e06b0ee6 100644 --- a/src/bacnet/basic/object/mso.c +++ b/src/bacnet/basic/object/mso.c @@ -25,6 +25,7 @@ #include "bacnet/reject.h" #include "bacnet/rp.h" #include "bacnet/wp.h" +#include "bacnet/proplist.h" #include "bacnet/basic/services.h" #include "bacnet/basic/sys/keylist.h" /* me! */ @@ -1035,13 +1036,6 @@ int Multistate_Output_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -1069,13 +1063,6 @@ bool Multistate_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_STATE_TEXT) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/msv.c b/src/bacnet/basic/object/msv.c index 4c2f789b..e1518bd1 100644 --- a/src/bacnet/basic/object/msv.c +++ b/src/bacnet/basic/object/msv.c @@ -792,14 +792,6 @@ int Multistate_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) && - (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -827,14 +819,6 @@ bool Multistate_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_STATE_TEXT) && - (wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/nc.c b/src/bacnet/basic/object/nc.c index 7fe1284d..aa74c599 100644 --- a/src/bacnet/basic/object/nc.c +++ b/src/bacnet/basic/object/nc.c @@ -279,14 +279,6 @@ int Notification_Class_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } - return apdu_len; } @@ -314,13 +306,6 @@ bool Notification_Class_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRIORITY: status = write_property_type_valid( diff --git a/src/bacnet/basic/object/netport.c b/src/bacnet/basic/object/netport.c index ae018807..735f23d7 100644 --- a/src/bacnet/basic/object/netport.c +++ b/src/bacnet/basic/object/netport.c @@ -3239,35 +3239,6 @@ bool Network_Port_MSTP_Max_Info_Frames_Set( return status; } -/** - * Determine if the object property is a BACnetARRAY datatype - * @param object_property [in] BACnet object property - * @return true if the object property is a BACnetARRAY datatype - */ -static bool -Network_Port_BACnetArray_Property(BACNET_PROPERTY_ID object_property) -{ - bool status = false; - - switch (object_property) { - case PROP_EVENT_TIME_STAMPS: - case PROP_EVENT_MESSAGE_TEXTS: - case PROP_EVENT_MESSAGE_TEXTS_CONFIG: - case PROP_PROPERTY_LIST: - case PROP_TAGS: - case PROP_LINK_SPEEDS: - case PROP_IP_DNS_SERVER: - case PROP_IPV6_DNS_SERVER: - case PROP_ISSUER_CERTIFICATE_FILES: - status = true; - break; - default: - break; - } - - return status; -} - /** * ReadProperty handler for this object. For the given ReadProperty * data, the application_data is loaded or the error flags are set. @@ -3807,14 +3778,6 @@ int Network_Port_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) (void)apdu_size; break; } - /* only array properties can have optional array indices */ - if ((apdu_len >= 0) && - (!Network_Port_BACnetArray_Property(rpdata->object_property)) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -3854,18 +3817,6 @@ bool Network_Port_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_LINK_SPEEDS) && - (wp_data->object_property != PROP_IP_DNS_SERVER) && - (wp_data->object_property != PROP_IPV6_DNS_SERVER) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS) && - (wp_data->object_property != PROP_EVENT_MESSAGE_TEXTS_CONFIG) && - (wp_data->object_property != PROP_TAGS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* FIXME: len < application_data_len: more data? */ switch (wp_data->object_property) { case PROP_MAX_MASTER: diff --git a/src/bacnet/basic/object/osv.c b/src/bacnet/basic/object/osv.c index 7f6c77c2..5b095147 100644 --- a/src/bacnet/basic/object/osv.c +++ b/src/bacnet/basic/object/osv.c @@ -239,14 +239,6 @@ int OctetString_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -270,14 +262,6 @@ bool OctetString_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = OctetString_Value_Instance_To_Index(wp_data->object_instance); if (object_index < MAX_OCTETSTRING_VALUES) { diff --git a/src/bacnet/basic/object/piv.c b/src/bacnet/basic/object/piv.c index 8badcf4c..5c347f4e 100644 --- a/src/bacnet/basic/object/piv.c +++ b/src/bacnet/basic/object/piv.c @@ -250,14 +250,6 @@ int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) && - (rpdata->object_property != PROP_EVENT_TIME_STAMPS) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -281,14 +273,6 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((wp_data->object_property != PROP_PRIORITY_ARRAY) && - (wp_data->object_property != PROP_EVENT_TIME_STAMPS) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } object_index = PositiveInteger_Value_Instance_To_Index(wp_data->object_instance); if (object_index < MAX_POSITIVEINTEGER_VALUES) { diff --git a/src/bacnet/basic/object/schedule.c b/src/bacnet/basic/object/schedule.c index f43c3254..603c6d75 100644 --- a/src/bacnet/basic/object/schedule.c +++ b/src/bacnet/basic/object/schedule.c @@ -408,13 +408,6 @@ int Schedule_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) break; } - if ((apdu_len >= 0) && (rpdata->object_property != PROP_WEEKLY_SCHEDULE) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } - return apdu_len; } @@ -424,16 +417,7 @@ bool Schedule_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) bool status = false; /* return value */ int len; BACNET_APPLICATION_DATA_VALUE value = { 0 }; - bool is_array; - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - wp_data->object_type, wp_data->object_property); - if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* decode the some of the request */ len = bacapp_decode_application_data( wp_data->application_data, wp_data->application_data_len, &value); diff --git a/src/bacnet/basic/object/structured_view.c b/src/bacnet/basic/object/structured_view.c index 4e748550..b33bfa78 100644 --- a/src/bacnet/basic/object/structured_view.c +++ b/src/bacnet/basic/object/structured_view.c @@ -660,7 +660,6 @@ int Structured_View_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) uint32_t count = 0; uint8_t *apdu = NULL; uint16_t apdu_max = 0; - bool is_array = false; if ((rpdata == NULL) || (rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -774,15 +773,6 @@ int Structured_View_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - rpdata->object_type, rpdata->object_property); - if ((apdu_len >= 0) && (!is_array) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } diff --git a/src/bacnet/basic/object/time_value.c b/src/bacnet/basic/object/time_value.c index 9365996e..fafd4d6a 100644 --- a/src/bacnet/basic/object/time_value.c +++ b/src/bacnet/basic/object/time_value.c @@ -60,17 +60,6 @@ static const int Time_Value_Properties_Optional[] = { PROP_DESCRIPTION, static const int Time_Value_Properties_Proprietary[] = { -1 }; -/* standard properties that are arrays for this object, - but not necessary supported in this object */ -static const int BACnetARRAY_Properties[] = { PROP_PRIORITY_ARRAY, - PROP_EVENT_TIME_STAMPS, - PROP_EVENT_MESSAGE_TEXTS, - PROP_EVENT_MESSAGE_TEXTS_CONFIG, - PROP_VALUE_SOURCE_ARRAY, - PROP_COMMAND_TIME_ARRAY, - PROP_TAGS, - -1 }; - /** * Returns the list of required, optional, and proprietary properties. * Used by ReadPropertyMultiple service. @@ -428,16 +417,6 @@ bool Time_Value_Description_Set(uint32_t object_instance, const char *new_name) return status; } -/** - * @brief Determine if the object property is a BACnetARRAY property - * @param object_property - object-property to be checked - * @return true if the property is a BACnetARRAY property - */ -static bool BACnetARRAY_Property(int object_property) -{ - return property_list_member(BACnetARRAY_Properties, object_property); -} - bool Time_Value_Change_Of_Value(uint32_t object_instance) { bool status = false; @@ -591,13 +570,6 @@ int Time_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - if ((apdu_len >= 0) && (!BACnetARRAY_Property(rpdata->object_property)) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -627,13 +599,6 @@ bool Time_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE; return false; } - if ((!BACnetARRAY_Property(wp_data->object_property)) && - (wp_data->array_index != BACNET_ARRAY_ALL)) { - /* only array properties can have array options */ - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } switch (wp_data->object_property) { case PROP_PRESENT_VALUE: if (Time_Value_Out_Of_Service(wp_data->object_instance)) { diff --git a/src/bacnet/basic/object/trendlog.c b/src/bacnet/basic/object/trendlog.c index 9383a719..2ec0f0bb 100644 --- a/src/bacnet/basic/object/trendlog.c +++ b/src/bacnet/basic/object/trendlog.c @@ -262,7 +262,6 @@ int Trend_Log_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) BACNET_CHARACTER_STRING char_string; TL_LOG_INFO *CurrentLog; uint8_t *apdu = NULL; - bool is_array; if ((rpdata == NULL) || (rpdata->application_data == NULL) || (rpdata->application_data_len == 0)) { @@ -405,15 +404,6 @@ int Trend_Log_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata) apdu_len = BACNET_STATUS_ERROR; break; } - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - rpdata->object_type, rpdata->object_property); - if ((apdu_len >= 0) && (!is_array) && - (rpdata->array_index != BACNET_ARRAY_ALL)) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } return apdu_len; } @@ -429,16 +419,7 @@ bool Trend_Log_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data) BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE TempSource; bool bEffectiveEnable; int log_index; - bool is_array; - /* only array properties can have array options */ - is_array = property_list_bacnet_array_member( - wp_data->object_type, wp_data->object_property); - if (!is_array && (wp_data->array_index != BACNET_ARRAY_ALL)) { - wp_data->error_class = ERROR_CLASS_PROPERTY; - wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - return false; - } /* Pin down which log to look at */ log_index = Trend_Log_Instance_To_Index(wp_data->object_instance); CurrentLog = &LogInfo[log_index]; diff --git a/src/bacnet/basic/service/h_rp.c b/src/bacnet/basic/service/h_rp.c index e42f126b..f4f17f73 100644 --- a/src/bacnet/basic/service/h_rp.c +++ b/src/bacnet/basic/service/h_rp.c @@ -124,7 +124,11 @@ void handler_read_property( &Handler_Transmit_Buffer[npdu_len + apdu_len]; rpdata.application_data_len = sizeof(Handler_Transmit_Buffer) - (npdu_len + apdu_len); - len = Device_Read_Property(&rpdata); + if (!read_property_bacnet_array_valid(&rpdata)) { + len = BACNET_STATUS_ERROR; + } else { + len = Device_Read_Property(&rpdata); + } if (len >= 0) { apdu_len += len; len = rp_ack_encode_apdu_object_property_end( diff --git a/src/bacnet/basic/service/h_rp_a.c b/src/bacnet/basic/service/h_rp_a.c index e733bc30..61b63943 100644 --- a/src/bacnet/basic/service/h_rp_a.c +++ b/src/bacnet/basic/service/h_rp_a.c @@ -50,10 +50,9 @@ void rp_ack_print_data(BACNET_READ_PROPERTY_DATA *data) /* FIXME: what if application_data_len is bigger than 255? */ /* value? need to loop until all of the len is gone... */ for (;;) { - len = bacapp_decode_known_property( + len = bacapp_decode_known_array_property( application_data, (unsigned)application_data_len, &value, - data->object_type, data->object_property); - + data->object_type, data->object_property, data->array_index); if (len < 0) { PRINTF_ERR( "RP Ack: unable to decode! %s:%s\n", diff --git a/src/bacnet/basic/service/h_rpm.c b/src/bacnet/basic/service/h_rpm.c index 31b91786..59d9d162 100644 --- a/src/bacnet/basic/service/h_rpm.c +++ b/src/bacnet/basic/service/h_rpm.c @@ -147,6 +147,8 @@ static int RPM_Encode_Property( (rpmdata->object_property == PROP_OPTIONAL)) { /* special properties only get ERROR encoding */ len = BACNET_STATUS_ERROR; + } else if (!read_property_bacnet_array_valid(&rpdata)) { + len = BACNET_STATUS_ERROR; } else { len = Device_Read_Property(&rpdata); } diff --git a/src/bacnet/basic/service/h_rpm_a.c b/src/bacnet/basic/service/h_rpm_a.c index b7ada77a..73ee3fd7 100644 --- a/src/bacnet/basic/service/h_rpm_a.c +++ b/src/bacnet/basic/service/h_rpm_a.c @@ -115,10 +115,11 @@ int rpm_ack_decode_service_request( } else { /* one or more (array or list) elements to decode */ while (value && (apdu_len > 0)) { - len = bacapp_decode_known_property( + len = bacapp_decode_known_array_property( apdu, (unsigned)apdu_len, value, rpm_object->object_type, - rpm_property->propertyIdentifier); + rpm_property->propertyIdentifier, + rpm_property->propertyArrayIndex); /* If len == 0 then it's an empty structure, which is * OK. */ if (len < 0) { diff --git a/src/bacnet/basic/service/h_wp.c b/src/bacnet/basic/service/h_wp.c index 5c32a754..1a9ff64f 100644 --- a/src/bacnet/basic/service/h_wp.c +++ b/src/bacnet/basic/service/h_wp.c @@ -55,6 +55,7 @@ void handler_write_property( BACNET_WRITE_PROPERTY_DATA wp_data; int len = 0; bool bcontinue = true; + bool success; int pdu_len = 0; BACNET_NPDU_DATA npdu_data; int bytes_sent = 0; @@ -103,7 +104,11 @@ void handler_write_property( bcontinue = false; } if (bcontinue) { - if (Device_Write_Property(&wp_data)) { + success = write_property_bacnet_array_valid(&wp_data); + if (!success) { + success = Device_Write_Property(&wp_data); + } + if (success) { len = encode_simple_ack( &Handler_Transmit_Buffer[pdu_len], service_data->invoke_id, SERVICE_CONFIRMED_WRITE_PROPERTY); diff --git a/src/bacnet/basic/service/h_wpm.c b/src/bacnet/basic/service/h_wpm.c index b2e00798..6c2dc3c7 100644 --- a/src/bacnet/basic/service/h_wpm.c +++ b/src/bacnet/basic/service/h_wpm.c @@ -72,6 +72,9 @@ static int write_property_multiple_decode( (unsigned long)wp_data->object_property, (unsigned long)wp_data->priority, (long)wp_data->array_index); + if (!write_property_bacnet_array_valid(wp_data)) { + return BACNET_STATUS_ERROR; + } if (device_write_property) { if (device_write_property(wp_data) == false) { /* Workaround BTL Specified Test 9.23.2.X5 */ diff --git a/src/bacnet/proplist.c b/src/bacnet/proplist.c index ed6524ab..705af554 100644 --- a/src/bacnet/proplist.c +++ b/src/bacnet/proplist.c @@ -281,31 +281,17 @@ int property_list_common_encode( apdu = rpdata->application_data; switch (rpdata->object_property) { case PROP_OBJECT_IDENTIFIER: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - /* Device Object exception: requested instance - may not match our instance if a wildcard */ - if (rpdata->object_type == OBJECT_DEVICE) { - rpdata->object_instance = device_instance_number; - } - apdu_len = encode_application_object_id( - &apdu[0], rpdata->object_type, rpdata->object_instance); + /* Device Object exception: requested instance + may not match our instance if a wildcard */ + if (rpdata->object_type == OBJECT_DEVICE) { + rpdata->object_instance = device_instance_number; } + apdu_len = encode_application_object_id( + &apdu[0], rpdata->object_type, rpdata->object_instance); break; case PROP_OBJECT_TYPE: - /* only array properties can have array options */ - if (rpdata->array_index != BACNET_ARRAY_ALL) { - rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; - apdu_len = BACNET_STATUS_ERROR; - } else { - apdu_len = encode_application_enumerated( - &apdu[0], rpdata->object_type); - } + apdu_len = + encode_application_enumerated(&apdu[0], rpdata->object_type); break; default: break; @@ -393,6 +379,8 @@ static const int Properties_BACnetARRAY[] = { PROP_TAGS, PROP_ISSUER_CERTIFICATE_FILES, PROP_SC_HUB_FUNCTION_ACCEPT_URIS, + PROP_NEGATIVE_ACCESS_RULES, + PROP_POSITIVE_ACCESS_RULES, -1 }; diff --git a/src/bacnet/rp.c b/src/bacnet/rp.c index e1ff347f..e5293a64 100644 --- a/src/bacnet/rp.c +++ b/src/bacnet/rp.c @@ -11,6 +11,7 @@ #include "bacnet/bacdef.h" /* BACnet Stack API */ #include "bacnet/bacdcode.h" +#include "bacnet/proplist.h" #include "bacnet/rp.h" #if BACNET_SVC_RP_A @@ -360,6 +361,28 @@ int rp_ack_encode_apdu_object_property_end(uint8_t *apdu) return apdu_len; } +/** + * @brief Validate the array indices for the given property + * @param data - ReadProperty data, including requested data and + * data for the reply, or error response. + * @return true if the property is an array and the array indices are used. + */ +bool read_property_bacnet_array_valid(BACNET_READ_PROPERTY_DATA *data) +{ + bool is_array; + + /* only array properties can have array options */ + is_array = property_list_bacnet_array_member( + data->object_type, data->object_property); + if ((!is_array) && (data->array_index != BACNET_ARRAY_ALL)) { + data->error_class = ERROR_CLASS_PROPERTY; + data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; + return false; + } + + return true; +} + /** Encode the acknowledge. * * @param apdu Pointer to the buffer for encoding, or NULL for length diff --git a/src/bacnet/rp.h b/src/bacnet/rp.h index 9bdeb7e6..c6e03e04 100644 --- a/src/bacnet/rp.h +++ b/src/bacnet/rp.h @@ -75,6 +75,9 @@ BACNET_STACK_EXPORT int rp_decode_service_request( const uint8_t *apdu, unsigned apdu_len, BACNET_READ_PROPERTY_DATA *rpdata); +BACNET_STACK_EXPORT +bool read_property_bacnet_array_valid(BACNET_READ_PROPERTY_DATA *data); + /* method to encode the ack without extra buffer */ BACNET_STACK_EXPORT int rp_ack_encode_apdu_init( diff --git a/src/bacnet/wp.c b/src/bacnet/wp.c index b8756d90..f2ad2c5d 100644 --- a/src/bacnet/wp.c +++ b/src/bacnet/wp.c @@ -11,6 +11,7 @@ #include "bacnet/bacdef.h" /* BACnet Stack API */ #include "bacnet/bacdcode.h" +#include "bacnet/proplist.h" #include "bacnet/wp.h" /** @file wp.c Encode/Decode BACnet Write Property APDUs */ @@ -426,6 +427,29 @@ bool write_property_empty_string_valid( return (valid); } +/** + * @brief simple validation of BACnetARRAY for Write Property + * @param data - #BACNET_WRITE_PROPERTY_DATA data, including + * requested data and space for the reply, or error response. + * @return true if the property is an array and the request uses array + * indices. + */ +bool write_property_bacnet_array_valid(BACNET_WRITE_PROPERTY_DATA *data) +{ + bool is_array; + + /* only array properties can have array options */ + is_array = property_list_bacnet_array_member( + data->object_type, data->object_property); + if (!is_array && (data->array_index != BACNET_ARRAY_ALL)) { + data->error_class = ERROR_CLASS_PROPERTY; + data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY; + return false; + } + + return true; +} + /** * @brief Helper to decode a WriteProperty unsigned integer and set a property * @param wp_data - #BACNET_WRITE_PROPERTY_DATA data including any diff --git a/src/bacnet/wp.h b/src/bacnet/wp.h index 1dfbc80d..71df69d5 100644 --- a/src/bacnet/wp.h +++ b/src/bacnet/wp.h @@ -94,6 +94,8 @@ bool write_property_empty_string_valid( BACNET_WRITE_PROPERTY_DATA *wp_data, const BACNET_APPLICATION_DATA_VALUE *value, size_t len_max); +BACNET_STACK_EXPORT +bool write_property_bacnet_array_valid(BACNET_WRITE_PROPERTY_DATA *wp_data); BACNET_STACK_EXPORT bool write_property_unsigned_decode( diff --git a/test/bacnet/basic/object/acc/CMakeLists.txt b/test/bacnet/basic/object/acc/CMakeLists.txt index 1fb46a89..4ca28496 100644 --- a/test/bacnet/basic/object/acc/CMakeLists.txt +++ b/test/bacnet/basic/object/acc/CMakeLists.txt @@ -50,6 +50,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/basic/sys/days.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/access_credential/CMakeLists.txt b/test/bacnet/basic/object/access_credential/CMakeLists.txt index 0bfadb74..3b76b44e 100644 --- a/test/bacnet/basic/object/access_credential/CMakeLists.txt +++ b/test/bacnet/basic/object/access_credential/CMakeLists.txt @@ -54,6 +54,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/access_door/CMakeLists.txt b/test/bacnet/basic/object/access_door/CMakeLists.txt index ec00d581..b63d0866 100644 --- a/test/bacnet/basic/object/access_door/CMakeLists.txt +++ b/test/bacnet/basic/object/access_door/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/access_point/CMakeLists.txt b/test/bacnet/basic/object/access_point/CMakeLists.txt index 97aa0d8b..7934f81e 100644 --- a/test/bacnet/basic/object/access_point/CMakeLists.txt +++ b/test/bacnet/basic/object/access_point/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/weeklyschedule.c ${SRC_DIR}/bacnet/bactimevalue.c @@ -59,6 +60,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/special_event.c ${SRC_DIR}/bacnet/channel_value.c ${SRC_DIR}/bacnet/secure_connect.c + ${SRC_DIR}/bacnet/wp.c # Test and test library files ./src/main.c ${ZTST_DIR}/ztest_mock.c diff --git a/test/bacnet/basic/object/access_user/CMakeLists.txt b/test/bacnet/basic/object/access_user/CMakeLists.txt index 8826bfeb..f2982c5c 100644 --- a/test/bacnet/basic/object/access_user/CMakeLists.txt +++ b/test/bacnet/basic/object/access_user/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/access_zone/CMakeLists.txt b/test/bacnet/basic/object/access_zone/CMakeLists.txt index bd42a5aa..3a570e20 100644 --- a/test/bacnet/basic/object/access_zone/CMakeLists.txt +++ b/test/bacnet/basic/object/access_zone/CMakeLists.txt @@ -55,6 +55,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/bacfile/CMakeLists.txt b/test/bacnet/basic/object/bacfile/CMakeLists.txt index 085b23cc..4b0a12d5 100644 --- a/test/bacnet/basic/object/bacfile/CMakeLists.txt +++ b/test/bacnet/basic/object/bacfile/CMakeLists.txt @@ -57,6 +57,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/memcopy.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c diff --git a/test/bacnet/basic/object/bitstring_value/src/main.c b/test/bacnet/basic/object/bitstring_value/src/main.c index 9c47b595..3e94b4f5 100644 --- a/test/bacnet/basic/object/bitstring_value/src/main.c +++ b/test/bacnet/basic/object/bitstring_value/src/main.c @@ -93,16 +93,6 @@ static void test_BitString_Value_Object(void) zassert_false(status, NULL); zassert_equal(wpdata.error_class, ERROR_CLASS_PROPERTY, NULL); zassert_equal(wpdata.error_code, ERROR_CODE_WRITE_ACCESS_DENIED, NULL); - /* WP to property using priority array */ - wpdata.object_property = PROP_PRESENT_VALUE; - value.tag = BACNET_APPLICATION_TAG_BIT_STRING; - wpdata.array_index = 0; - wpdata.application_data_len = - bacapp_encode_application_data(wpdata.application_data, &value); - status = BitString_Value_Write_Property(&wpdata); - zassert_false(status, NULL); - zassert_equal(wpdata.error_class, ERROR_CLASS_PROPERTY, NULL); - zassert_equal(wpdata.error_code, ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY, NULL); /* no application data */ wpdata.application_data_len = 0; status = BitString_Value_Write_Property(&wpdata); diff --git a/test/bacnet/basic/object/blo/CMakeLists.txt b/test/bacnet/basic/object/blo/CMakeLists.txt index 70eb6aea..0e506efb 100644 --- a/test/bacnet/basic/object/blo/CMakeLists.txt +++ b/test/bacnet/basic/object/blo/CMakeLists.txt @@ -56,6 +56,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/color_object/CMakeLists.txt b/test/bacnet/basic/object/color_object/CMakeLists.txt index c6c048bd..7859b4bb 100644 --- a/test/bacnet/basic/object/color_object/CMakeLists.txt +++ b/test/bacnet/basic/object/color_object/CMakeLists.txt @@ -56,6 +56,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/memcopy.c ${SRC_DIR}/bacnet/wp.c diff --git a/test/bacnet/basic/object/color_temperature/CMakeLists.txt b/test/bacnet/basic/object/color_temperature/CMakeLists.txt index 634fd982..06e6dc40 100644 --- a/test/bacnet/basic/object/color_temperature/CMakeLists.txt +++ b/test/bacnet/basic/object/color_temperature/CMakeLists.txt @@ -56,6 +56,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/memcopy.c ${SRC_DIR}/bacnet/wp.c diff --git a/test/bacnet/basic/object/lo/CMakeLists.txt b/test/bacnet/basic/object/lo/CMakeLists.txt index 36344ebb..bf5c7cfe 100644 --- a/test/bacnet/basic/object/lo/CMakeLists.txt +++ b/test/bacnet/basic/object/lo/CMakeLists.txt @@ -57,6 +57,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/lsp/CMakeLists.txt b/test/bacnet/basic/object/lsp/CMakeLists.txt index 3afe4eed..804882ac 100644 --- a/test/bacnet/basic/object/lsp/CMakeLists.txt +++ b/test/bacnet/basic/object/lsp/CMakeLists.txt @@ -52,6 +52,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/nc/CMakeLists.txt b/test/bacnet/basic/object/nc/CMakeLists.txt index 121c5fd6..b971cf0e 100644 --- a/test/bacnet/basic/object/nc/CMakeLists.txt +++ b/test/bacnet/basic/object/nc/CMakeLists.txt @@ -57,6 +57,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/list_element.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/netport/src/main.c b/test/bacnet/basic/object/netport/src/main.c index 33443649..9c6f85a7 100644 --- a/test/bacnet/basic/object/netport/src/main.c +++ b/test/bacnet/basic/object/netport/src/main.c @@ -568,17 +568,15 @@ static void test_network_port_sc_status_encode_decode(void) object_value.object_property = rpdata.object_property = PROP_SC_FAILED_CONNECTION_REQUESTS; - // count (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 0; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); - - // context (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 1; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); - - // all context + if (property_list_bacnet_array_member( + rpdata.object_type, rpdata.object_property)) { + object_value.array_index = rpdata.array_index = 0; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); + object_value.array_index = rpdata.array_index = 1; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); + } object_value.array_index = rpdata.array_index = BACNET_ARRAY_ALL; len = Network_Port_Read_Property(&rpdata); zassert_true(len > 0, NULL); @@ -618,15 +616,17 @@ static void test_network_port_sc_status_encode_decode(void) object_value.object_property = rpdata.object_property = PROP_SC_HUB_FUNCTION_CONNECTION_STATUS; - // count (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 0; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); + if (property_list_bacnet_array_member( + rpdata.object_type, rpdata.object_property)) { + object_value.array_index = rpdata.array_index = 0; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); - // context (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 1; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); + // context (error: property is not BacArray) + object_value.array_index = rpdata.array_index = 1; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); + } len = bacapp_snprintf_value(NULL, 0, &object_value); zassert_true((len > 0) && (len < sizeof(str) - 1), NULL); @@ -707,17 +707,15 @@ static void test_network_port_sc_status_encode_decode(void) object_value.object_property = rpdata.object_property = PROP_SC_DIRECT_CONNECT_CONNECTION_STATUS; - // count (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 0; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); - - // context (error: property is not BacArray) - object_value.array_index = rpdata.array_index = 1; - len = Network_Port_Read_Property(&rpdata); - zassert_true(len == -1, NULL); - - // all context + if (property_list_bacnet_array_member( + rpdata.object_type, rpdata.object_property)) { + object_value.array_index = rpdata.array_index = 0; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); + object_value.array_index = rpdata.array_index = 1; + len = Network_Port_Read_Property(&rpdata); + zassert_not_equal(len, -1, NULL); + } object_value.array_index = rpdata.array_index = BACNET_ARRAY_ALL; len = Network_Port_Read_Property(&rpdata); zassert_true(len > 0, NULL); diff --git a/test/bacnet/basic/object/osv/CMakeLists.txt b/test/bacnet/basic/object/osv/CMakeLists.txt index 1ae7b80c..97485b41 100644 --- a/test/bacnet/basic/object/osv/CMakeLists.txt +++ b/test/bacnet/basic/object/osv/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/piv/CMakeLists.txt b/test/bacnet/basic/object/piv/CMakeLists.txt index 9dad4962..5aed0bec 100644 --- a/test/bacnet/basic/object/piv/CMakeLists.txt +++ b/test/bacnet/basic/object/piv/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/wp.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/basic/object/test/property_test.c b/test/bacnet/basic/object/test/property_test.c index 9e39f750..2947d4c2 100644 --- a/test/bacnet/basic/object/test/property_test.c +++ b/test/bacnet/basic/object/test/property_test.c @@ -48,16 +48,16 @@ bool bacnet_object_property_write_test( wp_data->object_type, wp_data->object_property); is_list = property_list_bacnet_list_member( wp_data->object_type, wp_data->object_property); - if (!is_array && !is_list) { + if (is_array) { wp_data->array_index = 0; status = write_property(wp_data); - zassert_equal(status, false, NULL); - zassert_equal(wp_data->error_class, ERROR_CLASS_PROPERTY, NULL); - zassert_equal( - wp_data->error_code, ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY, - "property=%s error_code=%s", - bactext_property_name(wp_data->object_property), - bactext_error_code_name(wp_data->error_code)); + if (!status) { + zassert_not_equal( + wp_data->error_code, ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY, + "property=%s array_index=0: error code=%s.\n", + bactext_property_name(wp_data->object_property), + bactext_error_code_name(wp_data->error_code)); + } } } @@ -174,21 +174,13 @@ int bacnet_object_property_read_test( rpdata->object_type, rpdata->object_property); is_list = property_list_bacnet_list_member( rpdata->object_type, rpdata->object_property); - if (!is_array && !is_list) { + if (is_array) { + /* test an array index that must be implemented */ rpdata->array_index = 0; read_len = read_property(rpdata); - zassert_equal( - read_len, BACNET_STATUS_ERROR, "property '%s': is not an array!\n", - bactext_property_name(rpdata->object_property)); - zassert_equal(read_len, BACNET_STATUS_ERROR, NULL); - zassert_equal( - rpdata->error_class, ERROR_CLASS_PROPERTY, - "property '%s': error class is %s\n", - bactext_property_name(rpdata->object_property), - bactext_error_class_name(rpdata->error_class)); - zassert_equal( - rpdata->error_code, ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY, - "property '%s': error code is %s\n", + zassert_not_equal( + read_len, BACNET_STATUS_ERROR, + "property '%s' array_index=0: error code is %s.\n", bactext_property_name(rpdata->object_property), bactext_error_code_name(rpdata->error_code)); } diff --git a/test/bacnet/rp/CMakeLists.txt b/test/bacnet/rp/CMakeLists.txt index ae2d1a33..3320ea82 100644 --- a/test/bacnet/rp/CMakeLists.txt +++ b/test/bacnet/rp/CMakeLists.txt @@ -38,6 +38,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/bacint.c ${SRC_DIR}/bacnet/bacreal.c ${SRC_DIR}/bacnet/bacstr.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/basic/sys/bigend.c # Test and test library files ./src/main.c diff --git a/test/bacnet/wp/CMakeLists.txt b/test/bacnet/wp/CMakeLists.txt index 41c7483b..cc98cc80 100644 --- a/test/bacnet/wp/CMakeLists.txt +++ b/test/bacnet/wp/CMakeLists.txt @@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/basic/sys/days.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/weeklyschedule.c diff --git a/test/bacnet/wpm/CMakeLists.txt b/test/bacnet/wpm/CMakeLists.txt index f3728736..7ff19224 100644 --- a/test/bacnet/wpm/CMakeLists.txt +++ b/test/bacnet/wpm/CMakeLists.txt @@ -52,6 +52,7 @@ add_executable(${PROJECT_NAME} ${SRC_DIR}/bacnet/basic/sys/days.c ${SRC_DIR}/bacnet/hostnport.c ${SRC_DIR}/bacnet/lighting.c + ${SRC_DIR}/bacnet/proplist.c ${SRC_DIR}/bacnet/timestamp.c ${SRC_DIR}/bacnet/indtext.c ${SRC_DIR}/bacnet/weeklyschedule.c