Hide filter creation functions
[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 int bt_component_filter_get_input_port_count(struct bt_component *component)
131 {
132 int ret;
133 struct bt_component_filter *filter;
134
135 if (!component) {
136 ret = -1;
137 goto end;
138 }
139
140 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
141 ret = -1;
142 goto end;
143 }
144
145 filter = container_of(component, struct bt_component_filter, parent);
146 ret = filter->input_ports->len;
147 end:
148 return ret;
149 }
150
151 struct bt_port *bt_component_filter_get_input_port(
152 struct bt_component *component, const char *name)
153 {
154 struct bt_component_filter *filter;
155 struct bt_port *ret_port = NULL;
156
157 if (!component || !name ||
158 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
159 goto end;
160 }
161
162 filter = container_of(component, struct bt_component_filter, parent);
163 ret_port = bt_component_get_port(filter->input_ports, name);
164 end:
165 return ret_port;
166 }
167
168 struct bt_port *bt_component_filter_get_input_port_at_index(
169 struct bt_component *component, int index)
170 {
171 struct bt_port *port = NULL;
172 struct bt_component_filter *filter;
173
174 if (!component ||
175 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
176 goto end;
177 }
178
179 filter = container_of(component, struct bt_component_filter, parent);
180 port = bt_component_get_port_at_index(filter->input_ports, index);
181 end:
182 return port;
183 }
184
185 struct bt_port *bt_component_filter_get_default_input_port(
186 struct bt_component *component)
187 {
188 return bt_component_filter_get_input_port(component,
189 DEFAULT_INPUT_PORT_NAME);
190 }
191
192 struct bt_port *bt_component_filter_add_input_port(
193 struct bt_component *component, const char *name)
194 {
195 struct bt_port *port;
196 struct bt_component_filter *filter;
197
198 if (!component ||
199 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
200 port = NULL;
201 goto end;
202 }
203
204 filter = container_of(component, struct bt_component_filter, parent);
205 port = bt_component_add_port(component, filter->input_ports,
206 BT_PORT_TYPE_INPUT, name);
207 end:
208 return port;
209 }
210
211 enum bt_component_status bt_component_filter_remove_input_port(
212 struct bt_component *component, const char *name)
213 {
214 enum bt_component_status status;
215 struct bt_component_filter *filter;
216
217 if (!component ||
218 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
219 status = BT_COMPONENT_STATUS_INVALID;
220 goto end;
221 }
222
223 filter = container_of(component, struct bt_component_filter, parent);
224 status = bt_component_remove_port(component, filter->input_ports,
225 name);
226 end:
227 return status;
228 }
229
230 int bt_component_filter_get_output_port_count(struct bt_component *component)
231 {
232 int ret;
233 struct bt_component_filter *filter;
234
235 if (!component) {
236 ret = -1;
237 goto end;
238 }
239
240 if (component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
241 ret = -1;
242 goto end;
243 }
244
245 filter = container_of(component, struct bt_component_filter, parent);
246 ret = filter->output_ports->len;
247 end:
248 return ret;
249 }
250
251 struct bt_port *bt_component_filter_get_output_port(
252 struct bt_component *component, const char *name)
253 {
254 struct bt_component_filter *filter;
255 struct bt_port *ret_port = NULL;
256
257 if (!component || !name ||
258 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
259 goto end;
260 }
261
262 filter = container_of(component, struct bt_component_filter, parent);
263 ret_port = bt_component_get_port(filter->output_ports, name);
264 end:
265 return ret_port;
266 }
267
268 struct bt_port *bt_component_filter_get_output_port_at_index(
269 struct bt_component *component, int index)
270 {
271 struct bt_port *port = NULL;
272 struct bt_component_filter *filter;
273
274 if (!component ||
275 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
276 goto end;
277 }
278
279 filter = container_of(component, struct bt_component_filter, parent);
280 port = bt_component_get_port_at_index(filter->output_ports, index);
281 end:
282 return port;
283 }
284
285 struct bt_port *bt_component_filter_get_default_output_port(
286 struct bt_component *component)
287 {
288 return bt_component_filter_get_output_port(component,
289 DEFAULT_OUTPUT_PORT_NAME);
290 }
291
292 struct bt_port *bt_component_filter_add_output_port(
293 struct bt_component *component, const char *name)
294 {
295 struct bt_port *port;
296 struct bt_component_filter *filter;
297
298 if (!component ||
299 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
300 port = NULL;
301 goto end;
302 }
303
304 filter = container_of(component, struct bt_component_filter, parent);
305 port = bt_component_add_port(component, filter->output_ports,
306 BT_PORT_TYPE_OUTPUT, name);
307 end:
308 return port;
309 }
310
311 enum bt_component_status bt_component_filter_remove_output_port(
312 struct bt_component *component, const char *name)
313 {
314 enum bt_component_status status;
315 struct bt_component_filter *filter;
316
317 if (!component ||
318 component->class->type != BT_COMPONENT_CLASS_TYPE_FILTER) {
319 status = BT_COMPONENT_STATUS_INVALID;
320 goto end;
321 }
322
323 filter = container_of(component, struct bt_component_filter, parent);
324 status = bt_component_remove_port(component, filter->output_ports,
325 name);
326 end:
327 return status;
328 }
This page took 0.035203 seconds and 4 git commands to generate.