X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=lib%2Fcomponent%2Fcomponent-class.c;h=1f6e680aa7efb01d2115764f6c8befffa52e3320;hb=d3eb6e8fd59ebff26cb99a70d375e542d49575a3;hp=22551f88c54c60d55a3da428adab72b71937e30b;hpb=d3e4dcd8e7a601e0aa063455147f29fbe051582b;p=babeltrace.git diff --git a/lib/component/component-class.c b/lib/component/component-class.c index 22551f88..1f6e680a 100644 --- a/lib/component/component-class.c +++ b/lib/component/component-class.c @@ -29,6 +29,7 @@ #include #include #include +#include #include static @@ -98,12 +99,14 @@ end: } struct bt_component_class *bt_component_class_source_create(const char *name, - bt_component_class_source_init_iterator_method init_iterator_method) + bt_component_class_notification_iterator_get_method notification_iterator_get_method, + bt_component_class_notification_iterator_next_method notification_iterator_next_method) { struct bt_component_class_source *source_class = NULL; int ret; - if (!name || !init_iterator_method) { + if (!name || !notification_iterator_get_method || + !notification_iterator_next_method) { goto end; } @@ -124,19 +127,22 @@ struct bt_component_class *bt_component_class_source_create(const char *name, goto end; } - source_class->methods.init_iterator = init_iterator_method; + source_class->methods.iterator.get = notification_iterator_get_method; + source_class->methods.iterator.next = notification_iterator_next_method; end: return &source_class->parent; } struct bt_component_class *bt_component_class_filter_create(const char *name, - bt_component_class_filter_init_iterator_method init_iterator_method) + bt_component_class_notification_iterator_get_method notification_iterator_get_method, + bt_component_class_notification_iterator_next_method notification_iterator_next_method) { struct bt_component_class_filter *filter_class = NULL; int ret; - if (!name || !init_iterator_method) { + if (!name || !notification_iterator_get_method || + !notification_iterator_next_method) { goto end; } @@ -157,7 +163,8 @@ struct bt_component_class *bt_component_class_filter_create(const char *name, goto end; } - filter_class->methods.init_iterator = init_iterator_method; + filter_class->methods.iterator.get = notification_iterator_get_method; + filter_class->methods.iterator.next = notification_iterator_next_method; end: return &filter_class->parent; @@ -202,7 +209,7 @@ int bt_component_class_set_init_method( { int ret = 0; - if (!component_class || !init_method) { + if (!component_class || component_class->frozen || !init_method) { ret = -1; goto end; } @@ -219,7 +226,7 @@ int bt_component_class_set_destroy_method( { int ret = 0; - if (!component_class || !destroy_method) { + if (!component_class || component_class->frozen || !destroy_method) { ret = -1; goto end; } @@ -230,13 +237,149 @@ end: return ret; } -extern int bt_component_class_set_description( +int bt_component_class_source_set_notification_iterator_init_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_init_method notification_iterator_init_method) +{ + struct bt_component_class_source *source_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_init_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) { + ret = -1; + goto end; + } + + source_class = container_of(component_class, + struct bt_component_class_source, parent); + source_class->methods.iterator.init = notification_iterator_init_method; + +end: + return ret; +} + +int bt_component_class_source_set_notification_iterator_destroy_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_destroy_method notification_iterator_destroy_method) +{ + struct bt_component_class_source *source_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_destroy_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) { + ret = -1; + goto end; + } + + source_class = container_of(component_class, + struct bt_component_class_source, parent); + source_class->methods.iterator.destroy = + notification_iterator_destroy_method; + +end: + return ret; +} + +int bt_component_class_source_set_notification_iterator_seek_time_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method) +{ + struct bt_component_class_source *source_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_seek_time_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_SOURCE) { + ret = -1; + goto end; + } + + source_class = container_of(component_class, + struct bt_component_class_source, parent); + source_class->methods.iterator.seek_time = + notification_iterator_seek_time_method; + +end: + return ret; +} + +int bt_component_class_filter_set_notification_iterator_init_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_init_method notification_iterator_init_method) +{ + struct bt_component_class_filter *filter_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_init_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) { + ret = -1; + goto end; + } + + filter_class = container_of(component_class, + struct bt_component_class_filter, parent); + filter_class->methods.iterator.init = notification_iterator_init_method; + +end: + return ret; +} + +int bt_component_class_filter_set_notification_iterator_destroy_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_destroy_method notification_iterator_destroy_method) +{ + struct bt_component_class_filter *filter_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_destroy_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) { + ret = -1; + goto end; + } + + filter_class = container_of(component_class, + struct bt_component_class_filter, parent); + filter_class->methods.iterator.destroy = + notification_iterator_destroy_method; + +end: + return ret; +} + +int bt_component_class_filter_set_notification_iterator_seek_time_method( + struct bt_component_class *component_class, + bt_component_class_notification_iterator_seek_time_method notification_iterator_seek_time_method) +{ + struct bt_component_class_filter *filter_class; + int ret = 0; + + if (!component_class || component_class->frozen || + !notification_iterator_seek_time_method || + component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) { + ret = -1; + goto end; + } + + filter_class = container_of(component_class, + struct bt_component_class_filter, parent); + filter_class->methods.iterator.seek_time = + notification_iterator_seek_time_method; + +end: + return ret; +} + +int bt_component_class_set_description( struct bt_component_class *component_class, const char *description) { int ret = 0; - if (!component_class || !description) { + if (!component_class || component_class->frozen || !description) { ret = -1; goto end; } @@ -274,7 +417,7 @@ int bt_component_class_add_destroy_listener(struct bt_component_class *class, int ret = 0; struct bt_component_class_destroy_listener listener; - if (!class || !func) { + if (!class || class->frozen || !func) { ret = -1; goto end; } @@ -294,7 +437,8 @@ extern int bt_component_class_sink_set_add_iterator_method( struct bt_component_class_sink *sink_class; int ret = 0; - if (!component_class || !add_iterator_method || + if (!component_class || component_class->frozen || + !add_iterator_method || component_class->type != BT_COMPONENT_CLASS_TYPE_SINK) { ret = -1; goto end; @@ -315,7 +459,8 @@ extern int bt_component_class_filter_set_add_iterator_method( struct bt_component_class_filter *filter_class; int ret = 0; - if (!component_class || !add_iterator_method || + if (!component_class || component_class->frozen || + !add_iterator_method || component_class->type != BT_COMPONENT_CLASS_TYPE_FILTER) { ret = -1; @@ -329,3 +474,19 @@ extern int bt_component_class_filter_set_add_iterator_method( end: return ret; } + +int bt_component_class_freeze( + struct bt_component_class *component_class) +{ + int ret = 0; + + if (!component_class) { + ret = -1; + goto end; + } + + component_class->frozen = true; + +end: + return ret; +}