#include <babeltrace/component/component-source-internal.h>
#include <babeltrace/component/component-filter-internal.h>
#include <babeltrace/component/component-sink-internal.h>
+#include <babeltrace/component/component-graph-internal.h>
#include <babeltrace/component/notification/iterator-internal.h>
#include <babeltrace/babeltrace-internal.h>
#include <babeltrace/compiler.h>
goto end;
}
+ component->initializing = true;
component->destroy = destroy;
end:
return ret;
goto end;
}
- component->initializing = true;
-
if (component_class->methods.init) {
ret = component_class->methods.init(component, params,
init_method_data);
goto end;
}
- ret = component->name->str;
+ ret = component->name->len == 0 ? NULL : component->name->str;
end:
return ret;
}
end:
return ret;
}
+
+BT_HIDDEN
+void bt_component_set_graph(struct bt_component *component,
+ struct bt_graph *graph)
+{
+ struct bt_object *parent = bt_object_get_parent(&component->base);
+
+ assert(!parent || parent == &graph->base);
+ if (!parent) {
+ bt_object_set_parent(component, &graph->base);
+ }
+ bt_put(parent);
+}
+
+struct bt_graph *bt_component_get_graph(
+ struct bt_component *component)
+{
+ return (struct bt_graph *) bt_object_get_parent(&component->base);
+}
+
+BT_HIDDEN
+int bt_component_init_input_ports(struct bt_component *component,
+ GPtrArray **input_ports)
+{
+ int ret = 0;
+ struct bt_port *default_port;
+
+ *input_ports = g_ptr_array_new_with_free_func(bt_object_release);
+ if (!*input_ports) {
+ ret = -1;
+ goto end;
+ }
+
+ default_port = bt_component_add_port(component, *input_ports,
+ BT_PORT_TYPE_INPUT, DEFAULT_INPUT_PORT_NAME);
+ if (!default_port) {
+ ret = -1;
+ goto end;
+ }
+ bt_put(default_port);
+end:
+ return ret;
+}
+
+BT_HIDDEN
+int bt_component_init_output_ports(struct bt_component *component,
+ GPtrArray **output_ports)
+{
+ int ret = 0;
+ struct bt_port *default_port;
+
+ *output_ports = g_ptr_array_new_with_free_func(bt_object_release);
+ if (!*output_ports) {
+ ret = -1;
+ goto end;
+ }
+
+ default_port = bt_component_add_port(component, *output_ports,
+ BT_PORT_TYPE_OUTPUT, DEFAULT_OUTPUT_PORT_NAME);
+ if (!default_port) {
+ ret = -1;
+ goto end;
+ }
+ bt_put(default_port);
+end:
+ return ret;
+}
+
+BT_HIDDEN
+struct bt_port *bt_component_get_port(GPtrArray *ports, const char *name)
+{
+ size_t i;
+ struct bt_port *ret_port = NULL;
+
+ for (i = 0; i < ports->len; i++) {
+ struct bt_port *port = g_ptr_array_index(ports, i);
+ const char *port_name = bt_port_get_name(port);
+
+ if (!port_name) {
+ continue;
+ }
+
+ if (!strcmp(name, port_name)) {
+ ret_port = bt_get(port);
+ break;
+ }
+ }
+
+ return ret_port;
+}
+
+BT_HIDDEN
+struct bt_port *bt_component_get_port_at_index(GPtrArray *ports, int index)
+{
+ struct bt_port *port = NULL;
+
+ if (index < 0 || index >= ports->len) {
+ goto end;
+ }
+
+ port = bt_get(g_ptr_array_index(ports, index));
+end:
+ return port;
+}
+
+BT_HIDDEN
+struct bt_port *bt_component_add_port(
+ struct bt_component *component,GPtrArray *ports,
+ enum bt_port_type port_type, const char *name)
+{
+ size_t i;
+ struct bt_port *new_port = NULL;
+
+ if (!component->initializing || !name || *name == '\0') {
+ goto end;
+ }
+
+ /* Look for a port having the same name. */
+ for (i = 0; i < ports->len; i++) {
+ const char *port_name;
+ struct bt_port *port = g_ptr_array_index(
+ ports, i);
+
+ port_name = bt_port_get_name(port);
+ if (!port_name) {
+ continue;
+ }
+
+ if (!strcmp(name, port_name)) {
+ /* Port name clash, abort. */
+ goto end;
+ }
+ }
+
+ new_port = bt_port_create(component, port_type, name);
+ if (!new_port) {
+ goto end;
+ }
+
+ /*
+ * No name clash, add the port.
+ * The component is now the port's parent; it should _not_
+ * hold a reference to the port since the port's lifetime
+ * is now protected by the component's own lifetime.
+ */
+ g_ptr_array_add(ports, new_port);
+end:
+ return new_port;
+}
+
+BT_HIDDEN
+enum bt_component_status bt_component_remove_port(
+ struct bt_component *component, GPtrArray *ports,
+ const char *name)
+{
+ size_t i;
+ enum bt_component_status status = BT_COMPONENT_STATUS_OK;
+
+ if (!component->initializing || !name) {
+ status = BT_COMPONENT_STATUS_INVALID;
+ goto end;
+ }
+
+ for (i = 0; i < ports->len; i++) {
+ const char *port_name;
+ struct bt_port *port = g_ptr_array_index(ports, i);
+
+ port_name = bt_port_get_name(port);
+ if (!port_name) {
+ continue;
+ }
+
+ if (!strcmp(name, port_name)) {
+ g_ptr_array_remove_index(ports, i);
+ goto end;
+ }
+ }
+ status = BT_COMPONENT_STATUS_NOT_FOUND;
+end:
+ return status;
+}
+
+BT_HIDDEN
+enum bt_component_status bt_component_new_connection(
+ struct bt_component *component, struct bt_port *own_port,
+ struct bt_connection *connection)
+{
+ enum bt_component_status status = BT_COMPONENT_STATUS_OK;
+
+ if (component->class->methods.new_connection_method) {
+ status = component->class->methods.new_connection_method(
+ own_port, connection);
+ }
+
+ return status;
+}