- enum bt_notification_iterator_status ret_iterator;
- enum bt_component_class_type type;
- struct bt_notification_iterator *iterator = NULL;
- struct bt_component_class *class = component->class;
-
- if (!component) {
- goto error;
- }
-
- type = bt_component_get_class_type(component);
- if (type != BT_COMPONENT_CLASS_TYPE_SOURCE &&
- type != BT_COMPONENT_CLASS_TYPE_FILTER) {
- /* Unsupported operation. */
- goto error;
- }
-
- iterator = bt_notification_iterator_create(component);
- if (!iterator) {
- goto error;
- }
-
- switch (type) {
- case BT_COMPONENT_CLASS_TYPE_SOURCE:
- {
- struct bt_component_class_source *source_class;
- enum bt_notification_iterator_status status;
-
- source_class = container_of(class, struct bt_component_class_source, parent);
-
- if (source_class->methods.iterator.init) {
- status = source_class->methods.iterator.init(component,
- iterator, init_method_data);
- if (status < 0) {
- goto error;
- }
- }
- break;
- }
- case BT_COMPONENT_CLASS_TYPE_FILTER:
- {
- struct bt_component_class_filter *filter_class;
- enum bt_notification_iterator_status status;
-
- filter_class = container_of(class, struct bt_component_class_filter, parent);
-
- if (filter_class->methods.iterator.init) {
- status = filter_class->methods.iterator.init(component,
- iterator, init_method_data);
- if (status < 0) {
- goto error;
- }
- }
- break;
- }
- default:
- /* Unreachable. */
- assert(0);
- }
-
- ret_iterator = bt_notification_iterator_validate(iterator);
- if (ret_iterator != BT_NOTIFICATION_ITERATOR_STATUS_OK) {
- goto error;
- }
-
- return iterator;
-error:
- BT_PUT(iterator);
- return iterator;