8abd5a6d38c2b1be421fdd0547ec9faf83266315
[babeltrace.git] / lib / component / filter.c
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>
31 #include <babeltrace/component/component-filter-internal.h>
32 #include <babeltrace/component/component-internal.h>
33 #include <babeltrace/component/component-class-internal.h>
34 #include <babeltrace/component/notification/notification.h>
35 #include <babeltrace/component/notification/iterator-internal.h>
36
37 BT_HIDDEN
38 struct bt_notification_iterator *bt_component_filter_create_notification_iterator(
39 struct bt_component *component)
40 {
41 return bt_component_create_iterator(component, NULL);
42 }
43
44 BT_HIDDEN
45 struct 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 }
50
51 static
52 void bt_component_filter_destroy(struct bt_component *component)
53 {
54 struct bt_component_filter *filter = container_of(component,
55 struct bt_component_filter, parent);
56
57 if (filter->input_ports) {
58 g_ptr_array_free(filter->input_ports, TRUE);
59 }
60
61 if (filter->output_ports) {
62 g_ptr_array_free(filter->output_ports, TRUE);
63 }
64 }
65
66 BT_HIDDEN
67 struct bt_component *bt_component_filter_create(
68 struct bt_component_class *class, struct bt_value *params)
69 {
70 int ret;
71 struct bt_component_filter *filter = NULL;
72 enum bt_component_status status;
73
74 filter = g_new0(struct bt_component_filter, 1);
75 if (!filter) {
76 goto end;
77 }
78
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;
95 }
96
97 end:
98 return filter ? &filter->parent : NULL;
99 error:
100 BT_PUT(filter);
101 goto end;
102 }
103
104 BT_HIDDEN
105 enum bt_component_status bt_component_filter_validate(
106 struct bt_component *component)
107 {
108 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
109
110 if (!component) {
111 ret = BT_COMPONENT_STATUS_INVALID;
112 goto end;
113 }
114
115 if (!component->class) {
116 ret = BT_COMPONENT_STATUS_INVALID;
117 goto end;
118 }
119
120 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
121 ret = BT_COMPONENT_STATUS_INVALID;
122 goto end;
123 }
124
125 /* Enforce iterator limits. */
126 end:
127 return ret;
128 }
129
130 enum bt_component_status bt_component_filter_get_input_port_count(
131 struct bt_component *component, uint64_t *count)
132 {
133 enum bt_component_status status = BT_COMPONENT_STATUS_OK;
134 struct bt_component_filter *filter;
135
136 if (!component || !count) {
137 status = BT_COMPONENT_STATUS_INVALID;
138 goto end;
139 }
140
141 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
142 status = BT_COMPONENT_STATUS_INVALID;
143 goto end;
144 }
145
146 filter = container_of(component, struct bt_component_filter, parent);
147 *count = (uint64_t) filter->input_ports->len;
148 end:
149 return status;
150 }
151
152 struct 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) {
160 goto end;
161 }
162
163 filter = container_of(component, struct bt_component_filter, parent);
164 ret_port = bt_component_get_port(filter->input_ports, name);
165 end:
166 return ret_port;
167 }
168
169 struct 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;
178 }
179
180 filter = container_of(component, struct bt_component_filter, parent);
181 port = bt_component_get_port_at_index(filter->input_ports, index);
182 end:
183 return port;
184 }
185
186 struct bt_port *bt_component_filter_get_default_input_port(
187 struct bt_component *component)
188 {
189 return bt_component_filter_get_input_port(component,
190 DEFAULT_INPUT_PORT_NAME);
191 }
192
193 struct bt_port *bt_component_filter_add_input_port(
194 struct bt_component *component, const char *name)
195 {
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);
208 end:
209 return port;
210 }
211
212 enum bt_component_status bt_component_filter_remove_input_port(
213 struct bt_component *component, const char *name)
214 {
215 enum bt_component_status status;
216 struct bt_component_filter *filter;
217
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);
227 end:
228 return status;
229 }
230
231 enum bt_component_status bt_component_filter_get_output_port_count(
232 struct bt_component *component, uint64_t *count)
233 {
234 enum bt_component_status status = BT_COMPONENT_STATUS_OK;
235 struct bt_component_filter *filter;
236
237 if (!component || !count) {
238 status = BT_COMPONENT_STATUS_INVALID;
239 goto end;
240 }
241
242 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
243 status = BT_COMPONENT_STATUS_INVALID;
244 goto end;
245 }
246
247 filter = container_of(component, struct bt_component_filter, parent);
248 *count = (uint64_t) filter->output_ports->len;
249 end:
250 return status;
251 }
252
253 struct bt_port *bt_component_filter_get_output_port(
254 struct bt_component *component, const char *name)
255 {
256 struct bt_component_filter *filter;
257 struct bt_port *ret_port = NULL;
258
259 if (!component || !name ||
260 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
261 goto end;
262 }
263
264 filter = container_of(component, struct bt_component_filter, parent);
265 ret_port = bt_component_get_port(filter->output_ports, name);
266 end:
267 return ret_port;
268 }
269
270 struct 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) {
278 goto end;
279 }
280
281 filter = container_of(component, struct bt_component_filter, parent);
282 port = bt_component_get_port_at_index(filter->output_ports, index);
283 end:
284 return port;
285 }
286
287 struct 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
294 struct 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;
303 goto end;
304 }
305
306 filter = container_of(component, struct bt_component_filter, parent);
307 port = bt_component_add_port(component, filter->output_ports,
308 BT_PORT_TYPE_OUTPUT, name);
309 end:
310 return port;
311 }
312
313 enum 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;
322 goto end;
323 }
324
325 filter = container_of(component, struct bt_component_filter, parent);
326 status = bt_component_remove_port(component, filter->output_ports,
327 name);
328 end:
329 return status;
330 }
This page took 0.037164 seconds and 3 git commands to generate.