1 # SPDX-License-Identifier: MIT
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
5 from bt2
import native_bt
, object, utils
7 from bt2
import component
as bt2_component
11 def find_plugins_in_path(path
, recurse
=True, fail_on_load_error
=False):
12 utils
._check
_str
(path
)
13 utils
._check
_bool
(recurse
)
14 utils
._check
_bool
(fail_on_load_error
)
17 if os
.path
.isfile(path
):
18 status
, plugin_set_ptr
= native_bt
.bt2_plugin_find_all_from_file(
19 path
, fail_on_load_error
21 elif os
.path
.isdir(path
):
22 status
, plugin_set_ptr
= native_bt
.bt2_plugin_find_all_from_dir(
23 path
, int(recurse
), int(fail_on_load_error
)
26 raise ValueError("invalid path: '{}'".format(path
))
28 if status
== native_bt
.__BT
_FUNC
_STATUS
_NOT
_FOUND
:
31 utils
._handle
_func
_status
(status
, 'failed to find plugins')
32 assert plugin_set_ptr
is not None
33 return _PluginSet
._create
_from
_ptr
(plugin_set_ptr
)
37 find_in_std_env_var
=True,
38 find_in_user_dir
=True,
41 fail_on_load_error
=False,
43 utils
._check
_bool
(find_in_std_env_var
)
44 utils
._check
_bool
(find_in_user_dir
)
45 utils
._check
_bool
(find_in_sys_dir
)
46 utils
._check
_bool
(find_in_static
)
47 utils
._check
_bool
(fail_on_load_error
)
50 status
, plugin_set_ptr
= native_bt
.bt2_plugin_find_all(
51 int(find_in_std_env_var
),
52 int(find_in_user_dir
),
55 int(fail_on_load_error
),
58 if status
== native_bt
.__BT
_FUNC
_STATUS
_NOT
_FOUND
:
61 utils
._handle
_func
_status
(status
, 'failed to find plugins')
62 assert plugin_set_ptr
is not None
63 return _PluginSet
._create
_from
_ptr
(plugin_set_ptr
)
68 find_in_std_env_var
=True,
69 find_in_user_dir
=True,
72 fail_on_load_error
=False,
74 utils
._check
_str
(name
)
75 utils
._check
_bool
(fail_on_load_error
)
76 status
, ptr
= native_bt
.bt2_plugin_find(
78 int(find_in_std_env_var
),
79 int(find_in_user_dir
),
82 int(fail_on_load_error
),
85 if status
== native_bt
.__BT
_FUNC
_STATUS
_NOT
_FOUND
:
88 utils
._handle
_func
_status
(status
, 'failed to find plugin')
89 assert ptr
is not None
90 return _Plugin
._create
_from
_ptr
(ptr
)
93 class _PluginSet(object._SharedObject
, collections
.abc
.Sequence
):
94 _put_ref
= staticmethod(native_bt
.plugin_set_put_ref
)
95 _get_ref
= staticmethod(native_bt
.plugin_set_get_ref
)
98 count
= native_bt
.plugin_set_get_plugin_count(self
._ptr
)
102 def __getitem__(self
, index
):
103 utils
._check
_uint
64(index
)
105 if index
>= len(self
):
108 plugin_ptr
= native_bt
.plugin_set_borrow_plugin_by_index_const(self
._ptr
, index
)
109 assert plugin_ptr
is not None
110 return _Plugin
._create
_from
_ptr
_and
_get
_ref
(plugin_ptr
)
113 class _PluginVersion
:
114 def __init__(self
, major
, minor
, patch
, extra
):
139 if self
._extra
is not None:
142 return '{}.{}.{}{}'.format(self
._major
, self
._minor
, self
._patch
, extra
)
145 class _PluginComponentClassesIterator(collections
.abc
.Iterator
):
146 def __init__(self
, plugin_comp_cls
):
147 self
._plugin
_comp
_cls
= plugin_comp_cls
151 plugin_ptr
= self
._plugin
_comp
_cls
._plugin
._ptr
152 total
= self
._plugin
_comp
_cls
._component
_class
_count
(plugin_ptr
)
154 if self
._at
== total
:
157 comp_cls_ptr
= self
._plugin
_comp
_cls
._borrow
_component
_class
_by
_index
(
160 assert comp_cls_ptr
is not None
163 comp_cls_type
= self
._plugin
_comp
_cls
._comp
_cls
_type
164 comp_cls_pycls
= bt2_component
._COMP
_CLS
_TYPE
_TO
_GENERIC
_COMP
_CLS
_PYCLS
[
167 comp_cls_ptr
= comp_cls_pycls
._bt
_as
_component
_class
_ptr
(comp_cls_ptr
)
168 name
= native_bt
.component_class_get_name(comp_cls_ptr
)
169 assert name
is not None
173 class _PluginComponentClasses(collections
.abc
.Mapping
):
174 def __init__(self
, plugin
):
175 self
._plugin
= plugin
177 def __getitem__(self
, key
):
178 utils
._check
_str
(key
)
179 cc_ptr
= self
._borrow
_component
_class
_by
_name
(self
._plugin
._ptr
, key
)
184 return bt2_component
._create
_component
_class
_from
_const
_ptr
_and
_get
_ref
(
185 cc_ptr
, self
._comp
_cls
_type
189 return self
._component
_class
_count
(self
._plugin
._ptr
)
192 return _PluginComponentClassesIterator(self
)
195 class _PluginSourceComponentClasses(_PluginComponentClasses
):
196 _component_class_count
= staticmethod(
197 native_bt
.plugin_get_source_component_class_count
199 _borrow_component_class_by_name
= staticmethod(
200 native_bt
.plugin_borrow_source_component_class_by_name_const
202 _borrow_component_class_by_index
= staticmethod(
203 native_bt
.plugin_borrow_source_component_class_by_index_const
205 _comp_cls_type
= native_bt
.COMPONENT_CLASS_TYPE_SOURCE
208 class _PluginFilterComponentClasses(_PluginComponentClasses
):
209 _component_class_count
= staticmethod(
210 native_bt
.plugin_get_filter_component_class_count
212 _borrow_component_class_by_name
= staticmethod(
213 native_bt
.plugin_borrow_filter_component_class_by_name_const
215 _borrow_component_class_by_index
= staticmethod(
216 native_bt
.plugin_borrow_filter_component_class_by_index_const
218 _comp_cls_type
= native_bt
.COMPONENT_CLASS_TYPE_FILTER
221 class _PluginSinkComponentClasses(_PluginComponentClasses
):
222 _component_class_count
= staticmethod(
223 native_bt
.plugin_get_sink_component_class_count
225 _borrow_component_class_by_name
= staticmethod(
226 native_bt
.plugin_borrow_sink_component_class_by_name_const
228 _borrow_component_class_by_index
= staticmethod(
229 native_bt
.plugin_borrow_sink_component_class_by_index_const
231 _comp_cls_type
= native_bt
.COMPONENT_CLASS_TYPE_SINK
234 class _Plugin(object._SharedObject
):
235 _put_ref
= staticmethod(native_bt
.plugin_put_ref
)
236 _get_ref
= staticmethod(native_bt
.plugin_get_ref
)
240 name
= native_bt
.plugin_get_name(self
._ptr
)
241 assert name
is not None
246 return native_bt
.plugin_get_author(self
._ptr
)
250 return native_bt
.plugin_get_license(self
._ptr
)
253 def description(self
):
254 return native_bt
.plugin_get_description(self
._ptr
)
258 return native_bt
.plugin_get_path(self
._ptr
)
262 status
, major
, minor
, patch
, extra
= native_bt
.bt2_plugin_get_version(self
._ptr
)
264 if status
== native_bt
.PROPERTY_AVAILABILITY_NOT_AVAILABLE
:
267 return _PluginVersion(major
, minor
, patch
, extra
)
270 def source_component_classes(self
):
271 return _PluginSourceComponentClasses(self
)
274 def filter_component_classes(self
):
275 return _PluginFilterComponentClasses(self
)
278 def sink_component_classes(self
):
279 return _PluginSinkComponentClasses(self
)