Return component port counts by parameter
[babeltrace.git] / lib / component / filter.c
CommitLineData
34ac9eaf
JG
1/*
2 * filter.c
3 *
4 * Babeltrace Filter Component
5 *
6 * Copyright 2016 Jérémie Galarneau <jeremie.galarneau@efficios.com>
7 *
8 * Author: Jérémie Galarneau <jeremie.galarneau@efficios.com>
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29#include <babeltrace/compiler.h>
30#include <babeltrace/values.h>
d71dcf2c 31#include <babeltrace/component/component-filter-internal.h>
33b34c43 32#include <babeltrace/component/component-internal.h>
d3e4dcd8 33#include <babeltrace/component/component-class-internal.h>
33b34c43
PP
34#include <babeltrace/component/notification/notification.h>
35#include <babeltrace/component/notification/iterator-internal.h>
34ac9eaf 36
920b1d51 37BT_HIDDEN
366e034f
JG
38struct bt_notification_iterator *bt_component_filter_create_notification_iterator(
39 struct bt_component *component)
34a9ed19 40{
366e034f
JG
41 return bt_component_create_iterator(component, NULL);
42}
34a9ed19 43
920b1d51 44BT_HIDDEN
366e034f
JG
45struct bt_notification_iterator *bt_component_filter_create_notification_iterator_with_init_method_data(
46 struct bt_component *component, void *init_method_data)
47{
48 return bt_component_create_iterator(component, init_method_data);
49}
34a9ed19 50
366e034f
JG
51static
52void bt_component_filter_destroy(struct bt_component *component)
53{
54 struct bt_component_filter *filter = container_of(component,
55 struct bt_component_filter, parent);
34a9ed19 56
366e034f
JG
57 if (filter->input_ports) {
58 g_ptr_array_free(filter->input_ports, TRUE);
34a9ed19
JG
59 }
60
366e034f
JG
61 if (filter->output_ports) {
62 g_ptr_array_free(filter->output_ports, TRUE);
63 }
34a9ed19
JG
64}
65
366e034f
JG
66BT_HIDDEN
67struct bt_component *bt_component_filter_create(
68 struct bt_component_class *class, struct bt_value *params)
34a9ed19 69{
366e034f
JG
70 int ret;
71 struct bt_component_filter *filter = NULL;
72 enum bt_component_status status;
34a9ed19 73
366e034f
JG
74 filter = g_new0(struct bt_component_filter, 1);
75 if (!filter) {
34a9ed19
JG
76 goto end;
77 }
78
366e034f
JG
79 filter->parent.class = bt_get(class);
80 status = bt_component_init(&filter->parent, bt_component_filter_destroy);
81 if (status != BT_COMPONENT_STATUS_OK) {
82 goto error;
83 }
84
85 ret = bt_component_init_input_ports(&filter->parent,
86 &filter->input_ports);
87 if (ret) {
88 goto error;
89 }
90
91 ret = bt_component_init_output_ports(&filter->parent,
92 &filter->output_ports);
93 if (ret) {
94 goto error;
34a9ed19
JG
95 }
96
34a9ed19 97end:
366e034f
JG
98 return filter ? &filter->parent : NULL;
99error:
100 BT_PUT(filter);
101 goto end;
34a9ed19
JG
102}
103
366e034f
JG
104BT_HIDDEN
105enum bt_component_status bt_component_filter_validate(
106 struct bt_component *component)
34a9ed19 107{
34a9ed19
JG
108 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
109
366e034f 110 if (!component) {
34a9ed19
JG
111 ret = BT_COMPONENT_STATUS_INVALID;
112 goto end;
113 }
114
366e034f
JG
115 if (!component->class) {
116 ret = BT_COMPONENT_STATUS_INVALID;
34a9ed19
JG
117 goto end;
118 }
119
366e034f 120 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
34a9ed19
JG
121 ret = BT_COMPONENT_STATUS_INVALID;
122 goto end;
123 }
124
366e034f 125 /* Enforce iterator limits. */
34a9ed19
JG
126end:
127 return ret;
128}
129
346df6cf
JG
130enum bt_component_status bt_component_filter_get_input_port_count(
131 struct bt_component *component, uint64_t *count)
34a9ed19 132{
346df6cf 133 enum bt_component_status status = BT_COMPONENT_STATUS_OK;
34a9ed19 134 struct bt_component_filter *filter;
34a9ed19 135
346df6cf
JG
136 if (!component || !count) {
137 status = BT_COMPONENT_STATUS_INVALID;
34a9ed19
JG
138 goto end;
139 }
140
366e034f 141 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
346df6cf 142 status = BT_COMPONENT_STATUS_INVALID;
34a9ed19
JG
143 goto end;
144 }
145
146 filter = container_of(component, struct bt_component_filter, parent);
346df6cf 147 *count = (uint64_t) filter->input_ports->len;
366e034f 148end:
346df6cf 149 return status;
366e034f
JG
150}
151
152struct bt_port *bt_component_filter_get_input_port(
153 struct bt_component *component, const char *name)
154{
155 struct bt_component_filter *filter;
156 struct bt_port *ret_port = NULL;
157
158 if (!component || !name ||
159 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
34a9ed19
JG
160 goto end;
161 }
162
366e034f
JG
163 filter = container_of(component, struct bt_component_filter, parent);
164 ret_port = bt_component_get_port(filter->input_ports, name);
165end:
166 return ret_port;
167}
d3e4dcd8 168
366e034f
JG
169struct bt_port *bt_component_filter_get_input_port_at_index(
170 struct bt_component *component, int index)
171{
172 struct bt_port *port = NULL;
173 struct bt_component_filter *filter;
174
175 if (!component ||
176 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
177 goto end;
34a9ed19
JG
178 }
179
366e034f
JG
180 filter = container_of(component, struct bt_component_filter, parent);
181 port = bt_component_get_port_at_index(filter->input_ports, index);
34a9ed19 182end:
366e034f 183 return port;
34a9ed19
JG
184}
185
366e034f 186struct bt_port *bt_component_filter_get_default_input_port(
34a9ed19
JG
187 struct bt_component *component)
188{
366e034f
JG
189 return bt_component_filter_get_input_port(component,
190 DEFAULT_INPUT_PORT_NAME);
8b0ce102
PP
191}
192
366e034f
JG
193struct bt_port *bt_component_filter_add_input_port(
194 struct bt_component *component, const char *name)
8b0ce102 195{
366e034f
JG
196 struct bt_port *port;
197 struct bt_component_filter *filter;
198
199 if (!component ||
200 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
201 port = NULL;
202 goto end;
203 }
204
205 filter = container_of(component, struct bt_component_filter, parent);
206 port = bt_component_add_port(component, filter->input_ports,
207 BT_PORT_TYPE_INPUT, name);
208end:
209 return port;
34a9ed19 210}
526fc31a 211
366e034f
JG
212enum bt_component_status bt_component_filter_remove_input_port(
213 struct bt_component *component, const char *name)
526fc31a 214{
366e034f
JG
215 enum bt_component_status status;
216 struct bt_component_filter *filter;
526fc31a 217
366e034f
JG
218 if (!component ||
219 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
220 status = BT_COMPONENT_STATUS_INVALID;
221 goto end;
222 }
223
224 filter = container_of(component, struct bt_component_filter, parent);
225 status = bt_component_remove_port(component, filter->input_ports,
226 name);
227end:
228 return status;
526fc31a
JG
229}
230
346df6cf
JG
231enum bt_component_status bt_component_filter_get_output_port_count(
232 struct bt_component *component, uint64_t *count)
526fc31a 233{
346df6cf 234 enum bt_component_status status = BT_COMPONENT_STATUS_OK;
366e034f 235 struct bt_component_filter *filter;
526fc31a 236
346df6cf
JG
237 if (!component || !count) {
238 status = BT_COMPONENT_STATUS_INVALID;
526fc31a
JG
239 goto end;
240 }
241
366e034f 242 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
346df6cf 243 status = BT_COMPONENT_STATUS_INVALID;
366e034f 244 goto end;
526fc31a
JG
245 }
246
366e034f 247 filter = container_of(component, struct bt_component_filter, parent);
346df6cf 248 *count = (uint64_t) filter->output_ports->len;
526fc31a 249end:
346df6cf 250 return status;
526fc31a
JG
251}
252
366e034f
JG
253struct bt_port *bt_component_filter_get_output_port(
254 struct bt_component *component, const char *name)
526fc31a 255{
526fc31a 256 struct bt_component_filter *filter;
366e034f 257 struct bt_port *ret_port = NULL;
526fc31a 258
366e034f
JG
259 if (!component || !name ||
260 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
526fc31a
JG
261 goto end;
262 }
263
366e034f
JG
264 filter = container_of(component, struct bt_component_filter, parent);
265 ret_port = bt_component_get_port(filter->output_ports, name);
266end:
267 return ret_port;
268}
269
270struct bt_port *bt_component_filter_get_output_port_at_index(
271 struct bt_component *component, int index)
272{
273 struct bt_port *port = NULL;
274 struct bt_component_filter *filter;
275
276 if (!component ||
277 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
526fc31a
JG
278 goto end;
279 }
280
366e034f
JG
281 filter = container_of(component, struct bt_component_filter, parent);
282 port = bt_component_get_port_at_index(filter->output_ports, index);
283end:
284 return port;
285}
286
287struct bt_port *bt_component_filter_get_default_output_port(
288 struct bt_component *component)
289{
290 return bt_component_filter_get_output_port(component,
291 DEFAULT_OUTPUT_PORT_NAME);
292}
293
294struct bt_port *bt_component_filter_add_output_port(
295 struct bt_component *component, const char *name)
296{
297 struct bt_port *port;
298 struct bt_component_filter *filter;
299
300 if (!component ||
301 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
302 port = NULL;
526fc31a
JG
303 goto end;
304 }
305
306 filter = container_of(component, struct bt_component_filter, parent);
366e034f
JG
307 port = bt_component_add_port(component, filter->output_ports,
308 BT_PORT_TYPE_OUTPUT, name);
309end:
310 return port;
311}
312
313enum bt_component_status bt_component_filter_remove_output_port(
314 struct bt_component *component, const char *name)
315{
316 enum bt_component_status status;
317 struct bt_component_filter *filter;
318
319 if (!component ||
320 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
321 status = BT_COMPONENT_STATUS_INVALID;
526fc31a
JG
322 goto end;
323 }
366e034f
JG
324
325 filter = container_of(component, struct bt_component_filter, parent);
326 status = bt_component_remove_port(component, filter->output_ports,
327 name);
526fc31a 328end:
366e034f 329 return status;
526fc31a 330}
This page took 0.039124 seconds and 4 git commands to generate.