+ if (cc_full_descr->descriptor->type == BT_COMPONENT_CLASS_TYPE_SOURCE ||
+ cc_full_descr->descriptor->type == BT_COMPONENT_CLASS_TYPE_FILTER) {
+ bt_message_iterator_class_next_method next_method;
+ bt_message_iterator_class_initialize_method init_method;
+ bt_message_iterator_class_finalize_method fini_method;
+ bt_message_iterator_class_seek_ns_from_origin_method seek_ns_from_origin_method;
+ bt_message_iterator_class_seek_beginning_method seek_beginning_method;
+ bt_message_iterator_class_can_seek_ns_from_origin_method can_seek_ns_from_origin_method;
+ bt_message_iterator_class_can_seek_beginning_method can_seek_beginning_method;
+
+ if (cc_full_descr->descriptor->type == BT_COMPONENT_CLASS_TYPE_SOURCE) {
+ next_method = cc_full_descr->descriptor->methods.source.msg_iter_next;
+ init_method = cc_full_descr->methods.source.msg_iter_initialize;
+ fini_method = cc_full_descr->methods.source.msg_iter_finalize;
+ seek_ns_from_origin_method = cc_full_descr->methods.source.msg_iter_seek_ns_from_origin;
+ can_seek_ns_from_origin_method = cc_full_descr->methods.source.msg_iter_can_seek_ns_from_origin;
+ seek_beginning_method = cc_full_descr->methods.source.msg_iter_seek_beginning;
+ can_seek_beginning_method = cc_full_descr->methods.source.msg_iter_can_seek_beginning;
+ } else {
+ next_method = cc_full_descr->descriptor->methods.filter.msg_iter_next;
+ init_method = cc_full_descr->methods.filter.msg_iter_initialize;
+ fini_method = cc_full_descr->methods.filter.msg_iter_finalize;
+ seek_ns_from_origin_method = cc_full_descr->methods.filter.msg_iter_seek_ns_from_origin;
+ can_seek_ns_from_origin_method = cc_full_descr->methods.filter.msg_iter_can_seek_ns_from_origin;
+ seek_beginning_method = cc_full_descr->methods.filter.msg_iter_seek_beginning;
+ can_seek_beginning_method = cc_full_descr->methods.filter.msg_iter_can_seek_beginning;
+ }
+
+ msg_iter_class = bt_message_iterator_class_create(next_method);
+ if (!msg_iter_class) {
+ BT_LIB_LOGE_APPEND_CAUSE(
+ "Cannot create message iterator class.");
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ if (init_method) {
+ ret = bt_message_iterator_class_set_initialize_method(
+ msg_iter_class, init_method);
+ if (ret) {
+ BT_LIB_LOGE_APPEND_CAUSE(
+ "Cannot set message iterator initialization method.");
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+ }
+
+ if (fini_method) {
+ ret = bt_message_iterator_class_set_finalize_method(
+ msg_iter_class, fini_method);
+ if (ret) {
+ BT_LIB_LOGE_APPEND_CAUSE(
+ "Cannot set message iterator finalization method.");
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+ }
+
+ if (seek_ns_from_origin_method) {
+ ret = bt_message_iterator_class_set_seek_ns_from_origin_methods(
+ msg_iter_class,
+ seek_ns_from_origin_method,
+ can_seek_ns_from_origin_method);
+ if (ret) {
+ BT_LIB_LOGE_APPEND_CAUSE(
+ "Cannot set message iterator \"seek nanoseconds from origin\" methods.");
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+ }
+
+ if (seek_beginning_method) {
+ ret = bt_message_iterator_class_set_seek_beginning_methods(
+ msg_iter_class,
+ seek_beginning_method,
+ can_seek_beginning_method);
+ if (ret) {
+ BT_LIB_LOGE_APPEND_CAUSE(
+ "Cannot set message iterator \"seek beginning\" methods.");
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+ }
+ }
+