ctrlX Data Layer API for Python  1.6.0
The ctrlX Data Layer API allows access to the ctrlX Data Layer with Python
provider_node.py
1 """
2 Class Provider Node
3 """
4 import ctypes
5 import typing
6 
7 import datalayer
8 from datalayer.clib import C_DLR_RESULT
9 from datalayer.clib_provider_node import (C_DLR_PROVIDER_NODE_CALLBACK,
10  C_DLR_PROVIDER_NODE_CALLBACKDATA,
11  C_DLR_PROVIDER_NODE_CALLBACKS,
12  C_DLR_PROVIDER_NODE_FUNCTION,
13  C_DLR_PROVIDER_NODE_FUNCTION_DATA,
14  C_DLR_VARIANT, address_c_char_p,
15  userData_c_void_p)
16 from datalayer.variant import Result, Variant, VariantRef
17 
18 NodeCallback = typing.Callable[[Result, typing.Optional[Variant]], None]
19 NodeFunction = typing.Callable[[userData_c_void_p, str, NodeCallback], None]
20 NodeFunctionData = typing.Callable[[
21  userData_c_void_p, str, Variant, NodeCallback], None]
22 
23 
24 class _CallbackPtr:
25  """
26  _CallbackPtr helper
27  """
28 
29  __slots__ = ['_ptr']
30 
31  def __init__(self):
32  """
33  init _CallbackPtr
34  """
35  self._ptr: typing.Optional[ctypes._CFuncPtr] = None
36 
37  def set_ptr(self, ptr):
38  """
39  setter _CallbackPtr
40  """
41  self._ptr = ptr
42 
43  def get_ptr(self):
44  """
45  getter _CallbackPtr
46  """
47  return self._ptr
48 
49 
51  """
52  Provider Node callbacks interface
53  """
54  __slots__ = ['on_create', 'on_remove', 'on_browse',
55  'on_read', 'on_write', 'on_metadata']
56 
57  def __init__(self,
58  on_create: NodeFunctionData,
59  on_remove: NodeFunction,
60  on_browse: NodeFunction,
61  on_read: NodeFunctionData,
62  on_write: NodeFunctionData,
63  on_metadata: NodeFunction):
64  """
65  init ProviderNodeCallbacks
66  """
67  self.on_create = on_create
68  self.on_remove = on_remove
69  self.on_browse = on_browse
70  self.on_read = on_read
71  self.on_write = on_write
72  self.on_metadata = on_metadata
73 
74 
75 class ProviderNode:
76  """
77  Provider node interface for providing data to the system
78 
79  Hint: see python context manager for instance handling
80  """
81  __slots__ = ['__ptrs', '__c_cbs', '__closed', '__provider_node']
82 
83  def __init__(self, cbs: ProviderNodeCallbacks, userdata: userData_c_void_p = None):
84  """
85  init ProviderNode
86  """
87  self.__ptrs: typing.List[_CallbackPtr] = []
88  self.__c_cbs = C_DLR_PROVIDER_NODE_CALLBACKS(
89  userdata,
90  self.__create_function_data(cbs.on_create),
91  self.__create_function(cbs.on_remove),
92  self.__create_function(cbs.on_browse),
93  self.__create_function_data(cbs.on_read),
94  self.__create_function_data(cbs.on_write),
95  self.__create_function(cbs.on_metadata),
96  )
97  self.__closed = False
98  self.__provider_node = datalayer.clib.libcomm_datalayer.DLR_providerNodeCreate(
99  self.__c_cbs)
100 
101  def __enter__(self):
102  """
103  use the python context manager
104  """
105  return self
106 
107  def __exit__(self, exc_type, exc_val, exc_tb):
108  """
109  use the python context manager
110  """
111  self.close()
112 
113  def __del__(self):
114  """
115  __del__
116  """
117  self.close()
118 
119  def close(self):
120  """
121  closes the node instance
122  """
123  if self.__closed:
124  return
125  self.__closed = True
126  datalayer.clib.libcomm_datalayer.DLR_providerNodeDelete(
127  self.__provider_node)
128  self.__ptrs.clear()
129  self.__c_cbs = None
130 
131  def get_handle(self):
132  """
133  handle value of ProviderNode
134  """
135  return self.__provider_node
136 
137  def __create_callback(self,
138  c_cb: C_DLR_PROVIDER_NODE_CALLBACK,
139  c_cbdata: C_DLR_PROVIDER_NODE_CALLBACKDATA) -> NodeCallback:
140  """
141  create callback
142  """
143  def cb(result: Result, data: typing.Optional[Variant]):
144  """ cb """
145  if data is None:
146  c_cb(c_cbdata, result.value, None)
147  else:
148  c_cb(c_cbdata, result.value, data.get_handle())
149  return cb
150 
151  def __create_function(self, func: NodeFunction):
152  """
153  create callback managment
154  """
155  cb_ptr = _CallbackPtr()
156  self.__ptrs.append(cb_ptr)
157 
158  def _func(c_userdata: userData_c_void_p,
159  c_address: address_c_char_p,
160  c_cb: C_DLR_PROVIDER_NODE_CALLBACK,
161  c_cbdata: C_DLR_PROVIDER_NODE_CALLBACKDATA) -> C_DLR_RESULT:
162  """
163  datalayer calls this function
164  """
165  address = c_address.decode('utf-8')
166  cb = self.__create_callback(c_cb, c_cbdata)
167  func(c_userdata, address, cb)
168  return Result.OK.value
169  cb_ptr.set_ptr(C_DLR_PROVIDER_NODE_FUNCTION(_func))
170  return cb_ptr.get_ptr()
171 
172  def __create_function_data(self, func: NodeFunctionData):
173  """
174  create callback managment
175  """
176  cb_ptr = _CallbackPtr()
177  self.__ptrs.append(cb_ptr)
178 
179  def _func(c_userdata: userData_c_void_p,
180  c_address: address_c_char_p,
181  c_data: C_DLR_VARIANT,
182  c_cb: C_DLR_PROVIDER_NODE_CALLBACK,
183  c_cbdata: C_DLR_PROVIDER_NODE_CALLBACKDATA) -> C_DLR_RESULT:
184  """
185  datalayer calls this function
186  """
187  address = c_address.decode('utf-8')
188  data = VariantRef(c_data)
189  cb = self.__create_callback(c_cb, c_cbdata)
190  func(c_userdata, address, data, cb)
191  return Result.OK.value
192  cb_ptr.set_ptr(C_DLR_PROVIDER_NODE_FUNCTION_DATA(_func))
193  return cb_ptr.get_ptr()
194 
195  def _test_function(self, func: NodeFunction):
196  """
197  internal use
198  """
199  return self.__create_function(func)
200 
201  def _test_function_data(self, func: NodeFunctionData):
202  """
203  internal use
204  """
205  return self.__create_function_data(func)
datalayer.provider_node.ProviderNodeCallbacks.on_create
on_create
Definition: provider_node.py:63
datalayer.provider_node.ProviderNodeCallbacks.on_browse
on_browse
Definition: provider_node.py:65
datalayer.provider_node.ProviderNode.__enter__
def __enter__(self)
use the python context manager
Definition: provider_node.py:106
datalayer.provider_node.ProviderNode.get_handle
def get_handle(self)
handle value of ProviderNode
Definition: provider_node.py:136
datalayer.variant
Definition: variant.py:1
datalayer.provider_node.ProviderNodeCallbacks.on_remove
on_remove
Definition: provider_node.py:64
datalayer.provider_node.ProviderNode.__create_function
def __create_function(self, NodeFunction func)
create callback managment
Definition: provider_node.py:160
datalayer.provider_node.ProviderNode.__c_cbs
__c_cbs
Definition: provider_node.py:90
datalayer.provider_node.ProviderNodeCallbacks.on_write
on_write
Definition: provider_node.py:67
datalayer.provider_node.ProviderNodeCallbacks.__init__
def __init__(self, NodeFunctionData on_create, NodeFunction on_remove, NodeFunction on_browse, NodeFunctionData on_read, NodeFunctionData on_write, NodeFunction on_metadata)
init ProviderNodeCallbacks
Definition: provider_node.py:62
datalayer.clib
Definition: clib.py:1
datalayer.provider_node.ProviderNode.__exit__
def __exit__(self, exc_type, exc_val, exc_tb)
use the python context manager
Definition: provider_node.py:112
datalayer.provider_node.ProviderNode.__del__
def __del__(self)
del
Definition: provider_node.py:118
datalayer.provider_node._CallbackPtr.__init__
def __init__(self)
init _CallbackPtr
Definition: provider_node.py:36
datalayer.provider_node.ProviderNode.__create_callback
NodeCallback __create_callback(self, C_DLR_PROVIDER_NODE_CALLBACK c_cb, C_DLR_PROVIDER_NODE_CALLBACKDATA c_cbdata)
create callback
Definition: provider_node.py:144
datalayer.provider_node._CallbackPtr._ptr
_ptr
Definition: provider_node.py:43
datalayer.provider_node.ProviderNode.close
def close(self)
closes the node instance
Definition: provider_node.py:124
datalayer.provider_node.ProviderNode
Provider node interface for providing data to the system.
Definition: provider_node.py:82
datalayer.provider_node.ProviderNodeCallbacks
Provider Node callbacks interface.
Definition: provider_node.py:55
datalayer.provider_node._CallbackPtr.get_ptr
def get_ptr(self)
getter _CallbackPtr
Definition: provider_node.py:48
datalayer.provider_node.ProviderNode.__create_function_data
def __create_function_data(self, NodeFunctionData func)
create callback managment
Definition: provider_node.py:185
datalayer.provider_node.ProviderNodeCallbacks.on_read
on_read
Definition: provider_node.py:66
datalayer.provider_node.ProviderNode.__provider_node
__provider_node
Definition: provider_node.py:100
datalayer.provider_node._CallbackPtr.set_ptr
def set_ptr(self, ptr)
setter _CallbackPtr
Definition: provider_node.py:42
datalayer.provider_node.ProviderNode.__init__
def __init__(self, ProviderNodeCallbacks cbs, userData_c_void_p userdata=None)
init ProviderNode
Definition: provider_node.py:88
datalayer.variant.VariantRef
Definition: variant.py:732
datalayer.provider_node._CallbackPtr
_CallbackPtr helper
Definition: provider_node.py:29
datalayer.provider_node.ProviderNodeCallbacks.on_metadata
on_metadata
Definition: provider_node.py:68
datalayer.provider_node.ProviderNode.__closed
__closed
Definition: provider_node.py:99