from bt2 import native_bt, object, utils
import bt2.notification_iterator
import collections.abc
+import bt2.values
import sys
import bt2
def help(self):
return native_bt.component_class_get_help(self._ptr)
+ def query(self, obj, params=None):
+ return _query(self._ptr, obj, params)
+
def __call__(self, params=None, name=None):
params = bt2.create_value(params)
comp_ptr = native_bt.component_create_with_init_method_data(self._ptr,
return '\n'.join(trimmed)
+def _query(comp_cls_ptr, obj, params):
+ utils._check_str(obj)
+
+ if params is None:
+ params_ptr = native_bt.value_null
+ else:
+ params = bt2.create_value(params)
+ params_ptr = params._ptr
+
+ results_ptr = native_bt.component_class_query(comp_cls_ptr, obj,
+ params_ptr)
+
+ if results_ptr is None:
+ raise bt2.Error('cannot query info with object "{}"'.format(obj))
+
+ if results_ptr == native_bt.value_null:
+ return
+
+ return bt2.values._create_from_ptr(results_ptr)
+
+
# Metaclass for component classes defined by Python code.
#
# The Python user can create a standard Python class which inherits one
def addr(cls):
return int(cls._cc_ptr)
+ def query(cls, action, params=None):
+ return _query(cls._cc_ptr, action, params)
+
+ def _query_from_bt(cls, action, params):
+ # this can raise, in which case the native call to
+ # bt_component_class_query() returns NULL
+ results = cls._query(action, params)
+ results = bt2.create_value(results)
+
+ if results is None:
+ results_addr = int(native_bt.value_null)
+ else:
+ # steal the underlying native value object for the caller
+ results_addr = int(results._ptr)
+ results._ptr = None
+
+ return results_addr
+
+ @staticmethod
+ def _query(action, params):
+ # BT catches this and returns NULL to the user
+ raise NotImplementedError
+
def __del__(cls):
if hasattr(cls, '_cc_ptr'):
native_bt.put(cls._cc_ptr)