AllJoyn/Samples/BACnetAdapter/bacnet-stack-0.8.2/src/proplist.c
int property_list_encode(
    BACNET_READ_PROPERTY_DATA * rpdata,
    const int *pListRequired,
    const int *pListOptional,
    const int *pListProprietary)
{
    int apdu_len = 0;   /* return value */
    uint8_t *apdu = NULL;
    int max_apdu_len = 0;
    unsigned count = 0;
    unsigned required_count = 0;
    unsigned optional_count = 0;
    unsigned proprietary_count = 0;
    int len = 0;
    unsigned i = 0; /* loop index */

    required_count = property_list_count(pListRequired);
    if (required_count >= 3) {
        /* less the 3 always required properties */
        count -= 3;
    } else {
        count = 0;
    }
    optional_count = property_list_count(pListOptional);
    proprietary_count = property_list_count(pListProprietary);
    /* total of all counts */
    count = required_count + optional_count + proprietary_count;
    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
        (rpdata->application_data_len == 0)) {
        return 0;
    }
    apdu = rpdata->application_data;
    max_apdu_len = rpdata->application_data_len;
    switch (rpdata->object_property) {
        case PROP_PROPERTY_LIST:
            if (rpdata->array_index == 0) {
                /* Array element zero is the number of elements in the array */
                apdu_len =
                    encode_application_unsigned(&apdu[0], count);
            } else if (rpdata->array_index == BACNET_ARRAY_ALL) {
                /* if no index was specified, then try to encode the entire list */
                /* into one packet. */
                if (required_count > 3) {
                    for (i = 0; i < required_count; i++) {
                        if ((pListRequired[i] == PROP_OBJECT_TYPE) ||
                            (pListRequired[i] == PROP_OBJECT_IDENTIFIER) ||
                            (pListRequired[i] == PROP_OBJECT_NAME)) {
                            continue;
                        } else {
                            len =
                                encode_application_enumerated(&apdu[apdu_len],
                                pListRequired[i]);
                        }
                        /* add it if we have room */
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
                if (optional_count) {
                    for (i = 0; i < optional_count; i++) {
                        len =
                            encode_application_enumerated(&apdu[apdu_len],
                            pListOptional[i]);
                        /* add it if we have room */
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
                if (proprietary_count) {
                    for (i = 0; i < proprietary_count; i++) {
                        len =
                            encode_application_enumerated(&apdu[apdu_len],
                            pListProprietary[i]);
                        /* add it if we have room */
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
            } else {
                if (rpdata->array_index <= count) {
                    count = 0;
                    if (required_count > 3) {
                        for (i = 0; i < required_count; i++) {
                            if ((pListRequired[i] == PROP_OBJECT_TYPE) ||
                                (pListRequired[i] == PROP_OBJECT_IDENTIFIER) ||
                                (pListRequired[i] == PROP_OBJECT_NAME)) {
                                continue;
                            } else {
                                count++;
                            }
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListRequired[i]);
                                break;
                            }
                        }
                    }
                    if ((apdu_len == 0) && (optional_count > 0)) {
                        for (i = 0; i < optional_count; i++) {
                            count++;
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListOptional[i]);
                                break;
                            }
                        }
                    }
                    if ((apdu_len == 0) && (proprietary_count > 0)) {
                        for (i = 0; i < proprietary_count; i++) {
                            count++;
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListProprietary[i]);
                                break;
                            }
                        }
                    }
                } else {
                    rpdata->error_class = ERROR_CLASS_PROPERTY;
                    rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX;
                    apdu_len = BACNET_STATUS_ERROR;
                }
            }
            break;
        default:
            rpdata->error_class = ERROR_CLASS_PROPERTY;
            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
            apdu_len = BACNET_STATUS_ERROR;
            break;
    }

    return apdu_len;
}
/**
 * ReadProperty handler for this property.  For the given ReadProperty
 * data, the application_data is loaded or the error flags are set.
 *
 * @param  rpdata - ReadProperty data, including requested data and
 * data for the reply, or error response.
 *
 * @return number of APDU bytes in the response, or
 * BACNET_STATUS_ERROR on error.
 */
ReadProperty handler for this property.  For the given ReadProperty
data, the application_data is loaded or the error flags are set.

@param  rpdata - ReadProperty data, including requested data and
data for the reply, or error response.

@return number of APDU bytes in the response, or
BACNET_STATUS_ERROR on error.
ReadProperty handler for this property . For the given ReadProperty data the application_data is loaded or the error flags are set . @param rpdata - ReadProperty data including requested data and data for the reply or error response . @return number of APDU bytes in the response or BACNET_STATUS_ERROR on error .
int property_list_encode(
    BACNET_READ_PROPERTY_DATA * rpdata,
    const int *pListRequired,
    const int *pListOptional,
    const int *pListProprietary)
{
    int apdu_len = 0;   
    uint8_t *apdu = NULL;
    int max_apdu_len = 0;
    unsigned count = 0;
    unsigned required_count = 0;
    unsigned optional_count = 0;
    unsigned proprietary_count = 0;
    int len = 0;
    unsigned i = 0; 
    required_count = property_list_count(pListRequired);
    if (required_count >= 3) {
        count -= 3;
    } else {
        count = 0;
    }
    optional_count = property_list_count(pListOptional);
    proprietary_count = property_list_count(pListProprietary);
    count = required_count + optional_count + proprietary_count;
    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
        (rpdata->application_data_len == 0)) {
        return 0;
    }
    apdu = rpdata->application_data;
    max_apdu_len = rpdata->application_data_len;
    switch (rpdata->object_property) {
        case PROP_PROPERTY_LIST:
            if (rpdata->array_index == 0) {
                apdu_len =
                    encode_application_unsigned(&apdu[0], count);
            } else if (rpdata->array_index == BACNET_ARRAY_ALL) {
                if (required_count > 3) {
                    for (i = 0; i < required_count; i++) {
                        if ((pListRequired[i] == PROP_OBJECT_TYPE) ||
                            (pListRequired[i] == PROP_OBJECT_IDENTIFIER) ||
                            (pListRequired[i] == PROP_OBJECT_NAME)) {
                            continue;
                        } else {
                            len =
                                encode_application_enumerated(&apdu[apdu_len],
                                pListRequired[i]);
                        }
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
                if (optional_count) {
                    for (i = 0; i < optional_count; i++) {
                        len =
                            encode_application_enumerated(&apdu[apdu_len],
                            pListOptional[i]);
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
                if (proprietary_count) {
                    for (i = 0; i < proprietary_count; i++) {
                        len =
                            encode_application_enumerated(&apdu[apdu_len],
                            pListProprietary[i]);
                        if ((apdu_len + len) < max_apdu_len) {
                            apdu_len += len;
                        } else {
                            rpdata->error_class = ERROR_CLASS_SERVICES;
                            rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;
                            apdu_len = BACNET_STATUS_ERROR;
                            break;
                        }
                    }
                }
            } else {
                if (rpdata->array_index <= count) {
                    count = 0;
                    if (required_count > 3) {
                        for (i = 0; i < required_count; i++) {
                            if ((pListRequired[i] == PROP_OBJECT_TYPE) ||
                                (pListRequired[i] == PROP_OBJECT_IDENTIFIER) ||
                                (pListRequired[i] == PROP_OBJECT_NAME)) {
                                continue;
                            } else {
                                count++;
                            }
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListRequired[i]);
                                break;
                            }
                        }
                    }
                    if ((apdu_len == 0) && (optional_count > 0)) {
                        for (i = 0; i < optional_count; i++) {
                            count++;
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListOptional[i]);
                                break;
                            }
                        }
                    }
                    if ((apdu_len == 0) && (proprietary_count > 0)) {
                        for (i = 0; i < proprietary_count; i++) {
                            count++;
                            if (count == rpdata->array_index) {
                                apdu_len = encode_application_enumerated(
                                    &apdu[apdu_len],
                                    pListProprietary[i]);
                                break;
                            }
                        }
                    }
                } else {
                    rpdata->error_class = ERROR_CLASS_PROPERTY;
                    rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX;
                    apdu_len = BACNET_STATUS_ERROR;
                }
            }
            break;
        default:
            rpdata->error_class = ERROR_CLASS_PROPERTY;
            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
            apdu_len = BACNET_STATUS_ERROR;
            break;
    }
    return apdu_len;
}
int property_list_encode ( BACNET_READ_PROPERTY_DATA * rpdata , const int * pListRequired , const int * pListOptional , const int * pListProprietary ) { int apdu_len = 0 ; uint8_t * apdu = NULL ; int max_apdu_len = 0 ; unsigned count = 0 ; unsigned required_count = 0 ; unsigned optional_count = 0 ; unsigned proprietary_count = 0 ; int len = 0 ; unsigned i = 0 ; required_count = property_list_count ( pListRequired ) ; if ( required_count >= 3 ) { count -= 3 ; } else { count = 0 ; } optional_count = property_list_count ( pListOptional ) ; proprietary_count = property_list_count ( pListProprietary ) ; count = required_count + optional_count + proprietary_count ; if ( ( rpdata == NULL ) || ( rpdata -> application_data == NULL ) || ( rpdata -> application_data_len == 0 ) ) { return 0 ; } apdu = rpdata -> application_data ; max_apdu_len = rpdata -> application_data_len ; switch ( rpdata -> object_property ) { case PROP_PROPERTY_LIST : if ( rpdata -> array_index == 0 ) { apdu_len = encode_application_unsigned ( & apdu [ 0 ] , count ) ; } else if ( rpdata -> array_index == BACNET_ARRAY_ALL ) { if ( required_count > 3 ) { for ( i = 0 ; i < required_count ; i ++ ) { if ( ( pListRequired [ i ] == PROP_OBJECT_TYPE ) || ( pListRequired [ i ] == PROP_OBJECT_IDENTIFIER ) || ( pListRequired [ i ] == PROP_OBJECT_NAME ) ) { continue ; } else { len = encode_application_enumerated ( & apdu [ apdu_len ] , pListRequired [ i ] ) ; } if ( ( apdu_len + len ) < max_apdu_len ) { apdu_len += len ; } else { rpdata -> error_class = ERROR_CLASS_SERVICES ; rpdata -> error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT ; apdu_len = BACNET_STATUS_ERROR ; break ; } } } if ( optional_count ) { for ( i = 0 ; i < optional_count ; i ++ ) { len = encode_application_enumerated ( & apdu [ apdu_len ] , pListOptional [ i ] ) ; if ( ( apdu_len + len ) < max_apdu_len ) { apdu_len += len ; } else { rpdata -> error_class = ERROR_CLASS_SERVICES ; rpdata -> error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT ; apdu_len = BACNET_STATUS_ERROR ; break ; } } } if ( proprietary_count ) { for ( i = 0 ; i < proprietary_count ; i ++ ) { len = encode_application_enumerated ( & apdu [ apdu_len ] , pListProprietary [ i ] ) ; if ( ( apdu_len + len ) < max_apdu_len ) { apdu_len += len ; } else { rpdata -> error_class = ERROR_CLASS_SERVICES ; rpdata -> error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT ; apdu_len = BACNET_STATUS_ERROR ; break ; } } } } else { if ( rpdata -> array_index <= count ) { count = 0 ; if ( required_count > 3 ) { for ( i = 0 ; i < required_count ; i ++ ) { if ( ( pListRequired [ i ] == PROP_OBJECT_TYPE ) || ( pListRequired [ i ] == PROP_OBJECT_IDENTIFIER ) || ( pListRequired [ i ] == PROP_OBJECT_NAME ) ) { continue ; } else { count ++ ; } if ( count == rpdata -> array_index ) { apdu_len = encode_application_enumerated ( & apdu [ apdu_len ] , pListRequired [ i ] ) ; break ; } } } if ( ( apdu_len == 0 ) && ( optional_count > 0 ) ) { for ( i = 0 ; i < optional_count ; i ++ ) { count ++ ; if ( count == rpdata -> array_index ) { apdu_len = encode_application_enumerated ( & apdu [ apdu_len ] , pListOptional [ i ] ) ; break ; } } } if ( ( apdu_len == 0 ) && ( proprietary_count > 0 ) ) { for ( i = 0 ; i < proprietary_count ; i ++ ) { count ++ ; if ( count == rpdata -> array_index ) { apdu_len = encode_application_enumerated ( & apdu [ apdu_len ] , pListProprietary [ i ] ) ; break ; } } } } else { rpdata -> error_class = ERROR_CLASS_PROPERTY ; rpdata -> error_code = ERROR_CODE_INVALID_ARRAY_INDEX ; apdu_len = BACNET_STATUS_ERROR ; } } break ; default : rpdata -> error_class = ERROR_CLASS_PROPERTY ; rpdata -> error_code = ERROR_CODE_UNKNOWN_PROPERTY ; apdu_len = BACNET_STATUS_ERROR ; break ; } return apdu_len ; }
ReadProperty handler for this property.
ReadProperty handler for this property .
/* return value */ /* loop index */ /* less the 3 always required properties */ /* total of all counts */ /* Array element zero is the number of elements in the array */ /* if no index was specified, then try to encode the entire list */ /* into one packet. */ /* add it if we have room */ /* add it if we have room */ /* add it if we have room */