ctrlX Data Layer API for Python  1.6.0
The ctrlX Data Layer API allows access to the ctrlX Data Layer with Python
subscription.py
1 """
2 Class Subscription
3 """
4 import datetime
5 import enum
6 import typing
7 
8 import flatbuffers
9 
10 import comm.datalayer.NotifyInfo
11 import comm.datalayer.SubscriptionProperties
12 import datalayer
13 from datalayer.clib_variant import C_DLR_VARIANT
14 from datalayer.variant import Result, Variant, VariantRef, VariantType
15 
16 
17 class NotifyType(enum.Enum):
18  """
19  NotifyType
20 
21  """
22  DATA = 0
23  BROWSE = 1
24  METADATA = 2
25 
26 
27 class NotifyItem:
28  """
29  NotifyItem
30  """
31 
32  __slots__ = ['__data', '__info']
33 
34  def __init__(self, data: C_DLR_VARIANT, info: C_DLR_VARIANT):
35  """
36  @param[in] data of the notify item
37  @param[in] containing notify_info.fbs
38  """
39  self.__data = VariantRef(data)
40  i = VariantRef(info)
41  if i.get_type() != VariantType.FLATBUFFERS:
42  return
43  b = i.get_flatbuffers()
44  self.__info = comm.datalayer.NotifyInfo.NotifyInfo.GetRootAsNotifyInfo(
45  b, 0)
46 
47  def get_data(self) -> Variant:
48  """
49  data of the notify item
50 
51  @returns <Variant>
52  """
53  return self.__data
54 
55  def get_address(self) -> str:
56  """
57  Node address
58 
59  @returns <str>
60  """
61  return self.__info.Node().decode("utf-8")
62 
63  def get_type(self) -> NotifyType:
64  """
65  Notify type
66 
67  @returns <NotifyType>
68  """
69  return NotifyType(self.__info.NotifyType())
70 
71  def get_timestamp(self) -> int:
72  """
73  uint64; // Filetime: Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).
74 
75  @returns <int>
76  """
77  return self.__info.Timestamp()
78 
79 
80 # http://support.microsoft.com/kb/167296
81 # How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME
82 EPOCH_AS_FILETIME = 116444736000000000 # January 1, 1970 as MS file time
83 HUNDREDS_OF_NANOSECONDS = 10000000
84 
85 
86 def to_datetime(filetime: int) -> datetime.datetime:
87  """Converts a Microsoft filetime number to a Python datetime. The new
88  datetime object is time zone-naive but is equivalent to tzinfo=utc.
89  >>> filetime_to_dt(116444736000000000)
90  datetime.datetime(1970, 1, 1, 0, 0)
91  >>> filetime_to_dt(128930364000000000)
92  datetime.datetime(2009, 7, 25, 23, 0)
93  """
94  return datetime.datetime.utcfromtimestamp(
95  (filetime - EPOCH_AS_FILETIME) / HUNDREDS_OF_NANOSECONDS)
96 
97 
98 ResponseNotifyCallback = typing.Callable[[
99  Result, typing.List[NotifyItem], datalayer.clib.userData_c_void_p], None]
100 """
101  ResponseNotifyCallback
102  This callback delivers a vector with the updated nodes of a subscription.
103  It is usually called in the interval given by the publishInterval which has been set by the creation of the subscription.
104  The callback may not contain all nodes of the subscription.I.e.when a node did not change.
105  The callback may contain a node multiple times.I.e.when the node did change multiple times since the last callback.
106  The sorting order of the items in the vector is undefined.
107  @param[in] status Notify status
108  @param[in] items Notify data
109  @param[in] userdata Same userdata as in create subscription given
110  Result != OK the list of NotifyItem is None
111 """
112 
113 
114 class Subscription:
115  """
116  Subscription
117  """
118 
119  def id(self) -> str:
120  """
121  Subscription ID
122  """
123  pass
124 
125  def on_close(self):
126  """
127  notification of the close
128  """
129  pass
130 
131 
132 def create_properties(ident: str, publish_interval: int = 1000,
133  keepalive_interval: int = 60000, error_interval: int = 10000) -> Variant:
134  """
135  create_properties
136  @returns <Variant> Variant that describe ruleset of subscription
137  """
138  builder = flatbuffers.Builder(1024)
139  # Hint: CreateString must be done beforehand
140  idl = builder.CreateString(ident)
141  comm.datalayer.SubscriptionProperties.SubscriptionPropertiesStart(
142  builder)
143  comm.datalayer.SubscriptionProperties.SubscriptionPropertiesAddId(
144  builder, idl)
145  comm.datalayer.SubscriptionProperties.SubscriptionPropertiesAddPublishInterval(
146  builder, publish_interval)
147  comm.datalayer.SubscriptionProperties.SubscriptionPropertiesAddKeepaliveInterval(
148  builder, keepalive_interval)
149  comm.datalayer.SubscriptionProperties.SubscriptionPropertiesAddErrorInterval(
150  builder, error_interval)
151  prop = comm.datalayer.SubscriptionProperties.SubscriptionPropertiesEnd(
152  builder)
153  builder.Finish(prop)
154  v = Variant()
155  v.set_flatbuffers(builder.Output())
156  return v
157 
158 
159 def get_id(prop: Variant) -> str:
160  """ get_id """
161  if prop.get_type() != VariantType.FLATBUFFERS:
162  return ""
163  b = prop.get_flatbuffers()
164  p = comm.datalayer.SubscriptionProperties.SubscriptionProperties.GetRootAsSubscriptionProperties(
165  b, 0)
166  return p.Id().decode("utf-8")
datalayer.subscription.NotifyItem.__init__
def __init__(self, C_DLR_VARIANT data, C_DLR_VARIANT info)
Definition: subscription.py:38
datalayer.subscription.Subscription
Subscription.
Definition: subscription.py:119
datalayer.subscription.NotifyItem.get_data
Variant get_data(self)
data of the notify item
Definition: subscription.py:52
datalayer.subscription.NotifyItem.get_address
str get_address(self)
Node address.
Definition: subscription.py:60
datalayer.subscription.Subscription.on_close
def on_close(self)
notification of the close
Definition: subscription.py:130
datalayer.variant
Definition: variant.py:1
datalayer.subscription.NotifyItem.__data
__data
Definition: subscription.py:39
datalayer.subscription.NotifyItem.get_timestamp
int get_timestamp(self)
uint64; // Filetime: Contains a 64-bit value representing the number of 100-nanosecond intervals sinc...
Definition: subscription.py:76
datalayer.subscription.NotifyItem.get_type
NotifyType get_type(self)
Notify type.
Definition: subscription.py:68
datalayer.subscription.Subscription.id
str id(self)
Subscription ID.
Definition: subscription.py:124
datalayer.subscription.NotifyType
NotifyType.
Definition: subscription.py:21
datalayer.subscription.NotifyItem
NotifyItem.
Definition: subscription.py:30
datalayer.subscription.NotifyItem.__info
__info
Definition: subscription.py:44
datalayer.variant.VariantRef
Definition: variant.py:732