A.1.2 Discover DeviceIdentity personality using attribute org.opcfoundation.product_instance_uri

The example below enumerates all personalities and checks for the attribute org.opcfoundation.product_instance_uri

bool b_loop = true;
char identifier_type_buffer[200];
char identifier_value_buffer[200];
myio_obufstream_t ostream_identifier_type = { 0 };
myio_obufstream_t ostream_identifier_value = { 0 };
gta_enum_handle_t h_enum = GTA_HANDLE_ENUM_FIRST;

gta_context_handle_t h_ctx = GTA_HANDLE_INVALID;
bool exit_loops = false;
char selected_personality[100];

/* enumerate all identifiers */
while (b_loop && !exit_loops) {
    myio_open_obufstream(&ostream_identifier_type,
                         identifier_type_buffer,
                         sizeof(identifier_type_buffer),
                         &errinfo);
    myio_open_obufstream(&ostream_identifier_value,
                         identifier_value_buffer,
                         sizeof(identifier_value_buffer),
                         &errinfo);
    b_ret = gta_identifier_enumerate(
                h_inst,
                &h_enum,
                (gtaio_ostream_t *)&ostream_identifier_type,
                (gtaio_ostream_t *)&ostream_identifier_value,
                &errinfo);
    myio_close_obufstream(&ostream_identifier_type, &errinfo);
    myio_close_obufstream(&ostream_identifier_value, &errinfo);

    if (true == b_ret) {
        bool b_inner_loop = true;
        char personality_name_buffer[200];
        myio_obufstream_t ostream_personality_name = { 0 };
        gta_enum_handle_t h_enum_inner_loop = GTA_HANDLE_ENUM_FIRST;

        /* enumerate all personalities belonging to identifier */
        while (b_inner_loop && !exit_loops) {
            myio_open_obufstream(&ostream_personality_name,
                                 personality_name_buffer, 
                                 sizeof(personality_name_buffer),
                                 &errinfo);
            b_ret = gta_personality_enumerate(
                        h_inst,
                        identifier_value_buffer,
                        &h_enum_inner_loop,
                        GTA_PERSONALITY_ENUM_ALL,
                        (gtaio_ostream_t *)&ostream_personality_name,
                        &errinfo);
            myio_close_obufstream(&ostream_personality_name, &errinfo);

            if (true == b_ret) {
                bool b_innermost_loop = true;
                char attribute_type_buffer[200];
                char attribute_value_buffer[200];
                myio_obufstream_t ostream_attribute_type = { 0 };
                myio_obufstream_t ostream_attribute_value = { 0 };
                gta_enum_handle_t h_enum_innermost_loop
                    = GTA_HANDLE_ENUM_FIRST;
 
 
 
                /* enumerate all attributes belonging to personality */
                while (b_innermost_loop && !exit_loops) {
                    myio_open_obufstream(
                        &ostream_attribute_type,
                        attribute_type_buffer,
                        sizeof(attribute_type_buffer),
                        &errinfo);
                    myio_open_obufstream(
                        &ostream_attribute_value,
                        attribute_value_buffer,
                        sizeof(attribute_value_buffer),
                        &errinfo);
                    b_ret = gta_personality_attributes_enumerate(
                         h_inst,
                         personality_name_buffer,
                         &h_enum_innermost_loop,
                         (gtaio_ostream_t *)&ostream_attribute_type,
                         (gtaio_ostream_t *)&ostream_attribute_value,
                         &errinfo);
                    myio_close_obufstream(&ostream_attribute_type,
                                          &errinfo);
                    myio_close_obufstream(&ostream_attribute_value,
                                          &errinfo);
                    if (true == b_ret) {
                        if (0 == strcmp(
                            "org.opcfoundation.product_instance_uri",
                            attribute_type_buffer)) {
                            exit_loops = true;
                            strcpy(selected_personality,
                                   personality_name_buffer);
                        }
                    }
                    else {
                        b_innermost_loop = false;
                    }
                } 
             }
             else {
                 errinfo = 0;
                 b_inner_loop = false;
             }
         }
    }
    else {
        errinfo = 0;
        b_loop = false;
    }
}

/*
 * do something with selected personality
 */