コード例 #1
0
/* We are going to use the BuiltinPublicationListener_on_data_available
 * to detect the topics that are being published on the domain
 *
 * Once we have detected a new topic, we will print out the Topic Name,
 * Participant ID, DataWriter id, and Data Type.
 */
void BuiltinPublicationListener_on_data_available(
    void* listener_data,
    DDS_DataReader* reader)
{
    DDS_PublicationBuiltinTopicDataDataReader *builtin_reader = NULL;
    struct DDS_PublicationBuiltinTopicDataSeq data_seq = DDS_SEQUENCE_INITIALIZER;
    struct DDS_PublicationBuiltinTopicData *data = NULL;
    struct DDS_SampleInfoSeq info_seq = DDS_SEQUENCE_INITIALIZER;
    DDS_ReturnCode_t retcode;
    DDS_ExceptionCode_t exception_code;
    int i, len;

    builtin_reader = DDS_PublicationBuiltinTopicDataDataReader_narrow(reader);

    retcode = DDS_PublicationBuiltinTopicDataDataReader_take(
        builtin_reader,
        &data_seq, &info_seq, DDS_LENGTH_UNLIMITED,
        DDS_ANY_SAMPLE_STATE, DDS_NEW_VIEW_STATE,
        DDS_ANY_INSTANCE_STATE);

    if (retcode == DDS_RETCODE_NO_DATA)
        return;

    if (retcode != DDS_RETCODE_OK) {
        printf("***Error: failed to access data from the built-in reader\n");
        return;
    }

    len = DDS_PublicationBuiltinTopicDataSeq_get_length(&data_seq);
    for (i = 0; i < len; ++i) {
        if (DDS_SampleInfoSeq_get_reference(&info_seq, i)->valid_data) {
            data = DDS_PublicationBuiltinTopicDataSeq_get_reference(&data_seq, i);
            printf("-----\nFound topic \"%s\"\nparticipant: %08x%08x%08x\ndatawriter: %08x%08x%08x\ntype:\n",
                   data->topic_name,
                   data->participant_key.value[0],
                   data->participant_key.value[1],
                   data->participant_key.value[2],
                   data->key.value[0],
                   data->key.value[1],
                   data->key.value[2]);

            if (data->type_code == NULL) {
                printf("No type code received, perhaps increase type_code_max_serialized_length?\n");
                continue;
            }

            /* Using the type_code propagated we print the data type
             * with print_IDL(). */
            DDS_TypeCode_print_IDL(data->type_code, 2, &exception_code);
            if (exception_code != DDS_NO_EXCEPTION_CODE) {
                printf("Error***: print_IDL returns exception code %d",
                        exception_code);
            }

        }
    }
    DDS_PublicationBuiltinTopicDataDataReader_return_loan(
        builtin_reader, &data_seq, &info_seq);
}
int main() {
    struct DDS_TypeCode *inner_tc = NULL;
    struct DDS_TypeCode *outer_tc = NULL;
    struct DDS_TypeCodeFactory *factory = NULL;

    DDS_ExceptionCode_t err;
    DDS_ReturnCode_t retcode;
    int ret = -1;

    DDS_DynamicData *outer_data = NULL;
    DDS_DynamicData *inner_data = NULL;
    DDS_DynamicData *bounded_data = NULL;

    /* Getting a reference to the type code factory */
    factory = DDS_TypeCodeFactory_get_instance();
    if (factory == NULL) {
        fprintf(stderr, "! Unable to get type code factory singleton\n");
        goto fail;
    }

    /* Creating the typeCode of the inner_struct */
    inner_tc = inner_struct_get_typecode(factory);
    if (inner_tc == NULL) {
        fprintf(stderr, "! Unable to create typeCode\n");
        goto fail;
    }

    /* Creating the typeCode of the outer_struct that contains an inner_struct */
    outer_tc = outer_struct_get_typecode(factory);
    if (inner_tc == NULL) {
        fprintf(stderr, "! Unable to create typeCode\n");
        goto fail;
    }

    printf(" Connext Dynamic Data Nested Struct Example \n"
            "--------------------------------------------\n");

    printf(" Data Types\n"
            "------------------\n");
    DDS_TypeCode_print_IDL(inner_tc, 0, &err);
    DDS_TypeCode_print_IDL(outer_tc, 0, &err);

    /* Now, we create a dynamicData instance for each type */
    outer_data = DDS_DynamicData_new(outer_tc,
            &DDS_DYNAMIC_DATA_PROPERTY_DEFAULT);
    if (outer_data == NULL) {
        fprintf(stderr, "! Unable to create outer dynamicData\n");
        goto fail;
    }

    inner_data = DDS_DynamicData_new(inner_tc,
            &DDS_DYNAMIC_DATA_PROPERTY_DEFAULT);
    if (outer_data == NULL) {
        fprintf(stderr, "! Unable to create inner dynamicData\n");
        goto fail;
    }
    /* Setting the inner data */
    retcode = DDS_DynamicData_set_double(inner_data, "x",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 3.14159);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value 'x' in the inner struct \n");
        goto fail;
    }

    retcode = DDS_DynamicData_set_double(inner_data, "y",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 2.71828);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value 'y' in the inner struct\n");
        goto fail;
    }

    printf("\n\n get/set_complex_member API\n"
            "----------------------------\n");
    /* Using set_complex_member, we copy inner_data values in inner_struct of
     * outer_data */
    printf("Setting initial values of outer_data with "
            "set_complex_member()\n");
    retcode = DDS_DynamicData_set_complex_member(outer_data, "inner",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, inner_data);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set complex struct value "
                "(member inner in the outer struct)\n");
        goto fail;
    }

    DDS_DynamicData_print(outer_data, stdout, 1);

    retcode = DDS_DynamicData_clear_all_members(inner_data);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to clear all member in the inner data\n");
        goto fail;
    }

    printf("\n + get_complex_member() called\n");
    retcode = DDS_DynamicData_get_complex_member(outer_data, inner_data,
            "inner", DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to get complex struct value "
                "(member inner in the outer struct)\n");
        goto fail;
    }

    printf("\n + inner_data value\n");
    DDS_DynamicData_print(inner_data, stdout, 1);

    /* get_complex_member made a copy of the inner_struct. If we modify
     * inner_data values, outer_data inner_struct WILL NOT be modified. */
    printf("\n + setting new values to inner_data\n");
    retcode = DDS_DynamicData_set_double(inner_data, "x",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 1.00000);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value 'x' in the inner struct \n");
        goto fail;
    }

    retcode = DDS_DynamicData_set_double(inner_data, "y",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 0.00001);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value 'y' in the inner struct \n");
        goto fail;
    }

    DDS_DynamicData_print(inner_data, stdout, 1);

    /* Current value of outer_data
     * outer_data:
     * inner:
     *     x: 3.141590
     *     y: 2.718280
     *
     * inner_data:
     *     x: 1.000000
     *     y: 0.000010
     */

    printf("\n + current outer_data value \n");
    DDS_DynamicData_print(outer_data, stdout, 1);

    /* Bind/Unbind member API */
    printf("\n\n bind/unbind API\n"
            "------------------\n");
    printf("Creating a new dynamic data called bounded_data\n");
    bounded_data = DDS_DynamicData_new(NULL,
            &DDS_DYNAMIC_DATA_PROPERTY_DEFAULT);
    if (bounded_data == NULL) {
        fprintf(stderr, "! Unable to create new dynamic data\n");
        goto fail;
    }

    printf("\n + binding bounded_data to outer_data's inner_struct\n");

    /* Using bind_complex_member, we do not copy inner_struct, but bind it.
     * So, if we modify bounded_data, the inner member inside outer_data WILL
     * also be modified */
    retcode = DDS_DynamicData_bind_complex_member(outer_data, bounded_data,
            "inner", DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to bind the structs\n");
        goto fail;
    }

    DDS_DynamicData_print(bounded_data, stdout, 1);

    printf("\n + setting new values to bounded_data\n");
    retcode = DDS_DynamicData_set_double(bounded_data, "x",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 1.00000);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value to 'x' with the bounded data\n");
        goto fail;
    }

    retcode = DDS_DynamicData_set_double(bounded_data, "y",
            DDS_DYNAMIC_DATA_MEMBER_ID_UNSPECIFIED, 0.00001);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to set value to 'x' with the bounded data\n");
        goto fail;
    }

    /* Current value of outer data
     * outer:
     * inner:
     *     x: 1.000000
     *     y: 0.000010
     */

    DDS_DynamicData_print(bounded_data, stdout, 1);
    retcode = DDS_DynamicData_unbind_complex_member(outer_data, bounded_data);
    if (retcode != DDS_RETCODE_OK) {
        fprintf(stderr, "! Unable to unbind the data\n");
        goto fail;
    }

    printf("\n + current outer_data value \n");
    DDS_DynamicData_print(outer_data, stdout, 1);

    ret = 1;

    fail:
    if (inner_tc != NULL) {
        DDS_TypeCodeFactory_delete_tc(factory, inner_tc, NULL);
    }

    if (outer_tc != NULL) {
        DDS_TypeCodeFactory_delete_tc(factory, outer_tc, NULL);
    }

    if (inner_data != NULL) {
        DDS_DynamicData_delete(inner_data);
    }

    if (outer_data != NULL) {
        DDS_DynamicData_delete(outer_data);
    }

    if (bounded_data != NULL) {
        DDS_DynamicData_delete(bounded_data);
    }

    return ret;
}