-
- if (cc_full_descr->init_method) {
- ret = bt_component_class_set_init_method(comp_class,
- cc_full_descr->init_method);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->destroy_method) {
- ret = bt_component_class_set_destroy_method(comp_class,
- cc_full_descr->destroy_method);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- switch (cc_full_descr->descriptor->type) {
- case BT_COMPONENT_CLASS_TYPE_SOURCE:
- if (cc_full_descr->iterator_methods.init) {
- ret = bt_component_class_source_set_notification_iterator_init_method(
- comp_class,
- cc_full_descr->iterator_methods.init);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->iterator_methods.destroy) {
- ret = bt_component_class_source_set_notification_iterator_destroy_method(
- comp_class,
- cc_full_descr->iterator_methods.destroy);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->iterator_methods.seek_time) {
- ret = bt_component_class_source_set_notification_iterator_seek_time_method(
- comp_class,
- cc_full_descr->iterator_methods.seek_time);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
- break;
- case BT_COMPONENT_CLASS_TYPE_FILTER:
- if (cc_full_descr->filter_add_iterator_method) {
- ret = bt_component_class_filter_set_add_iterator_method(
- comp_class,
- cc_full_descr->filter_add_iterator_method);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->iterator_methods.init) {
- ret = bt_component_class_filter_set_notification_iterator_init_method(
- comp_class,
- cc_full_descr->iterator_methods.init);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->iterator_methods.destroy) {
- ret = bt_component_class_filter_set_notification_iterator_destroy_method(
- comp_class,
- cc_full_descr->iterator_methods.destroy);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
-
- if (cc_full_descr->iterator_methods.seek_time) {
- ret = bt_component_class_filter_set_notification_iterator_seek_time_method(
- comp_class,
- cc_full_descr->iterator_methods.seek_time);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
- break;
- case BT_COMPONENT_CLASS_TYPE_SINK:
- if (cc_full_descr->sink_add_iterator_method) {
- ret = bt_component_class_sink_set_add_iterator_method(
- comp_class,
- cc_full_descr->sink_add_iterator_method);
- if (ret) {
- status = BT_PLUGIN_STATUS_ERROR;
- BT_PUT(comp_class);
- goto end;
- }
- }
- break;
- default:
- assert(false);
- break;
- }
-
- /* Add component class to the plugin object */
- status = bt_plugin_add_component_class(plugin,
- comp_class);
- BT_PUT(comp_class);
- if (status < 0) {
- printf_verbose("Cannot add component class %s (type %d) to plugin `%s`: status = %d\n",
- cc_full_descr->descriptor->name,
- cc_full_descr->descriptor->type,
- plugin->name, status);
- goto end;
- }
- }
-
- /*
- * All the plugin's component classes should be added at this
- * point. We freeze the plugin so that it's not possible to add
- * component classes to this plugin object after this stage
- * (plugin object becomes immutable).
- */
- plugin->frozen = true;
-
-end:
- g_array_free(comp_class_full_descriptors, TRUE);
- return status;
-}
-
-static
-struct bt_plugin **bt_plugin_create_all_from_sections(
- struct bt_plugin_shared_lib_handle *shared_lib_handle,
- struct __bt_plugin_descriptor const * const *descriptors_begin,
- struct __bt_plugin_descriptor const * const *descriptors_end,
- struct __bt_plugin_descriptor_attribute const * const *attrs_begin,
- struct __bt_plugin_descriptor_attribute const * const *attrs_end,
- struct __bt_plugin_component_class_descriptor const * const *cc_descriptors_begin,
- struct __bt_plugin_component_class_descriptor const * const *cc_descriptors_end,
- struct __bt_plugin_component_class_descriptor_attribute const * const *cc_descr_attrs_begin,
- struct __bt_plugin_component_class_descriptor_attribute const * const *cc_descr_attrs_end)
-{
- size_t descriptor_count;
- size_t attrs_count;
- size_t cc_descriptors_count;
- size_t cc_descr_attrs_count;
- size_t i;
- struct bt_plugin **plugins = NULL;
-
- descriptor_count = descriptors_end - descriptors_begin;
- attrs_count = attrs_end - attrs_begin;
- cc_descriptors_count = cc_descriptors_end - cc_descriptors_begin;
- cc_descr_attrs_count = cc_descr_attrs_end - cc_descr_attrs_begin;
- printf_verbose("Section: Plugin descriptors: [%p - %p], (%zu elements)\n",
- descriptors_begin, descriptors_end, descriptor_count);
- printf_verbose("Section: Plugin descriptor attributes: [%p - %p], (%zu elements)\n",
- attrs_begin, attrs_end, attrs_count);
- printf_verbose("Section: Plugin component class descriptors: [%p - %p], (%zu elements)\n",
- cc_descriptors_begin, cc_descriptors_end, cc_descriptors_count);
- printf_verbose("Section: Plugin component class descriptor attributes: [%p - %p], (%zu elements)\n",
- cc_descr_attrs_begin, cc_descr_attrs_end, cc_descr_attrs_count);
- plugins = calloc(descriptor_count + 1, sizeof(*plugins));
- if (!plugins) {
- goto error;