bt2: Add bindings for trace classes
[babeltrace.git] / bindings / python / bt2 / bt2 / stream_class.py
CommitLineData
81447b5b
PP
1# The MIT License (MIT)
2#
811644b8 3# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
81447b5b
PP
4#
5# Permission is hereby granted, free of charge, to any person obtaining a copy
6# of this software and associated documentation files (the "Software"), to deal
7# in the Software without restriction, including without limitation the rights
8# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9# copies of the Software, and to permit persons to whom the Software is
10# furnished to do so, subject to the following conditions:
11#
12# The above copyright notice and this permission notice shall be included in
13# all copies or substantial portions of the Software.
14#
15# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21# THE SOFTWARE.
22
23from bt2 import native_bt, object, utils
b4f45851 24import bt2.field_class
81447b5b
PP
25import collections.abc
26import bt2.ctf_writer
27import bt2.stream
28import copy
29import bt2
30
31
32class _EventClassIterator(collections.abc.Iterator):
33 def __init__(self, stream_class):
34 self._stream_class = stream_class
35 self._at = 0
36
37 def __next__(self):
38 if self._at == len(self._stream_class):
39 raise StopIteration
40
50842bdc 41 ec_ptr = native_bt.stream_class_get_event_class_by_index(self._stream_class._ptr,
0b03f63e 42 self._at)
811644b8 43 assert(ec_ptr)
50842bdc 44 ev_id = native_bt.event_class_get_id(ec_ptr)
81447b5b 45 native_bt.put(ec_ptr)
811644b8 46 utils._handle_ret(ev_id, "cannot get event class object's ID")
81447b5b 47 self._at += 1
811644b8 48 return ev_id
81447b5b
PP
49
50
78288f58 51class StreamClass(object._SharedObject, collections.abc.Mapping):
fbbe9302
SM
52 _get_ref = staticmethod(native_bt.stream_class_get_ref)
53 _put_ref = staticmethod(native_bt.stream_class_put_ref)
54
b4f45851
SM
55 def __init__(self, name=None, id=None, packet_context_field_class=None,
56 event_header_field_class=None, event_context_field_class=None,
81447b5b 57 event_classes=None):
50842bdc 58 ptr = native_bt.stream_class_create_empty(None)
81447b5b
PP
59
60 if ptr is None:
61 raise bt2.CreationError('cannot create stream class object')
62
63 super().__init__(ptr)
64
65 if name is not None:
66 self.name = name
67
68 if id is not None:
69 self.id = id
70
b4f45851
SM
71 if packet_context_field_class is not None:
72 self.packet_context_field_class = packet_context_field_class
81447b5b 73
b4f45851
SM
74 if event_header_field_class is not None:
75 self.event_header_field_class = event_header_field_class
81447b5b 76
b4f45851
SM
77 if event_context_field_class is not None:
78 self.event_context_field_class = event_context_field_class
81447b5b
PP
79
80 if event_classes is not None:
81 for event_class in event_classes:
82 self.add_event_class(event_class)
83
84 def __getitem__(self, key):
811644b8 85 utils._check_int64(key)
50842bdc 86 ec_ptr = native_bt.stream_class_get_event_class_by_id(self._ptr,
0b03f63e 87 key)
81447b5b
PP
88
89 if ec_ptr is None:
90 raise KeyError(key)
91
92 return bt2.EventClass._create_from_ptr(ec_ptr)
93
94 def __len__(self):
50842bdc 95 count = native_bt.stream_class_get_event_class_count(self._ptr)
811644b8 96 assert(count >= 0)
81447b5b
PP
97 return count
98
99 def __iter__(self):
100 return _EventClassIterator(self)
101
81447b5b
PP
102 def add_event_class(self, event_class):
103 utils._check_type(event_class, bt2.EventClass)
50842bdc 104 ret = native_bt.stream_class_add_event_class(self._ptr, event_class._ptr)
81447b5b
PP
105 utils._handle_ret(ret, "cannot add event class object to stream class object's")
106
107 @property
108 def trace(self):
50842bdc 109 tc_ptr = native_bt.stream_class_get_trace(self._ptr)
81447b5b
PP
110
111 if tc_ptr is not None:
112 return bt2.Trace._create_from_ptr(tc_ptr)
113
114 @property
115 def name(self):
50842bdc 116 return native_bt.stream_class_get_name(self._ptr)
81447b5b
PP
117
118 @name.setter
119 def name(self, name):
120 utils._check_str(name)
50842bdc 121 ret = native_bt.stream_class_set_name(self._ptr, name)
81447b5b
PP
122 utils._handle_ret(ret, "cannot set stream class object's name")
123
124 @property
125 def id(self):
50842bdc 126 id = native_bt.stream_class_get_id(self._ptr)
81447b5b 127
811644b8
PP
128 if id < 0:
129 return
81447b5b
PP
130
131 return id
132
133 @id.setter
134 def id(self, id):
135 utils._check_int64(id)
50842bdc 136 ret = native_bt.stream_class_set_id(self._ptr, id)
81447b5b
PP
137 utils._handle_ret(ret, "cannot set stream class object's ID")
138
139 @property
140 def clock(self):
50842bdc 141 clock_ptr = native_bt.stream_class_get_clock(self._ptr)
81447b5b
PP
142
143 if clock_ptr is None:
144 return
145
146 return bt2.ctf_writer.CtfWriterClock._create_from_ptr(clock_ptr)
147
148 @clock.setter
149 def clock(self, clock):
150 utils._check_type(clock, bt2.ctf_writer.CtfWriterClock)
50842bdc 151 ret = native_bt.stream_class_set_clock(self._ptr, clock._ptr)
81447b5b
PP
152 utils._handle_ret(ret, "cannot set stream class object's CTF writer clock object")
153
154 @property
b4f45851
SM
155 def packet_context_field_class(self):
156 fc_ptr = native_bt.stream_class_get_packet_context_type(self._ptr)
81447b5b 157
b4f45851 158 if fc_ptr is None:
81447b5b
PP
159 return
160
b4f45851 161 return bt2.field_class._create_from_ptr(fc_ptr)
81447b5b 162
b4f45851
SM
163 @packet_context_field_class.setter
164 def packet_context_field_class(self, packet_context_field_class):
165 packet_context_field_class_ptr = None
81447b5b 166
b4f45851
SM
167 if packet_context_field_class is not None:
168 utils._check_type(packet_context_field_class, bt2.field_class._FieldClass)
169 packet_context_field_class_ptr = packet_context_field_class._ptr
81447b5b 170
50842bdc 171 ret = native_bt.stream_class_set_packet_context_type(self._ptr,
b4f45851
SM
172 packet_context_field_class_ptr)
173 utils._handle_ret(ret, "cannot set stream class object's packet context field class")
81447b5b
PP
174
175 @property
b4f45851
SM
176 def event_header_field_class(self):
177 fc_ptr = native_bt.stream_class_get_event_header_type(self._ptr)
81447b5b 178
b4f45851 179 if fc_ptr is None:
81447b5b
PP
180 return
181
b4f45851 182 return bt2.field_class._create_from_ptr(fc_ptr)
81447b5b 183
b4f45851
SM
184 @event_header_field_class.setter
185 def event_header_field_class(self, event_header_field_class):
186 event_header_field_class_ptr = None
81447b5b 187
b4f45851
SM
188 if event_header_field_class is not None:
189 utils._check_type(event_header_field_class, bt2.field_class._FieldClass)
190 event_header_field_class_ptr = event_header_field_class._ptr
81447b5b 191
50842bdc 192 ret = native_bt.stream_class_set_event_header_type(self._ptr,
b4f45851
SM
193 event_header_field_class_ptr)
194 utils._handle_ret(ret, "cannot set stream class object's event header field class")
81447b5b
PP
195
196 @property
b4f45851
SM
197 def event_context_field_class(self):
198 fc_ptr = native_bt.stream_class_get_event_context_type(self._ptr)
81447b5b 199
b4f45851 200 if fc_ptr is None:
81447b5b
PP
201 return
202
b4f45851 203 return bt2.field_class._create_from_ptr(fc_ptr)
81447b5b 204
b4f45851
SM
205 @event_context_field_class.setter
206 def event_context_field_class(self, event_context_field_class):
207 event_context_field_class_ptr = None
81447b5b 208
b4f45851
SM
209 if event_context_field_class is not None:
210 utils._check_type(event_context_field_class, bt2.field_class._FieldClass)
211 event_context_field_class_ptr = event_context_field_class._ptr
81447b5b 212
50842bdc 213 ret = native_bt.stream_class_set_event_context_type(self._ptr,
b4f45851
SM
214 event_context_field_class_ptr)
215 utils._handle_ret(ret, "cannot set stream class object's event context field class")
81447b5b 216
811644b8 217 def __call__(self, name=None, id=None):
81447b5b
PP
218 if name is not None:
219 utils._check_str(name)
220
811644b8 221 if id is None:
50842bdc 222 stream_ptr = native_bt.stream_create(self._ptr, name)
811644b8 223 else:
50842bdc 224 stream_ptr = native_bt.stream_create_with_id(self._ptr, name, id)
81447b5b
PP
225
226 if stream_ptr is None:
227 raise bt2.CreationError('cannot create stream object')
228
229 return bt2.stream._create_from_ptr(stream_ptr)
230
231 def __eq__(self, other):
232 if type(other) is not type(self):
233 return False
234
235 if self.addr == other.addr:
236 return True
237
238 self_event_classes = list(self.values())
239 other_event_classes = list(other.values())
240 self_props = (
241 self_event_classes,
242 self.name,
243 self.id,
b4f45851
SM
244 self.packet_context_field_class,
245 self.event_header_field_class,
246 self.event_context_field_class,
811644b8 247 self.clock,
81447b5b
PP
248 )
249 other_props = (
250 other_event_classes,
251 other.name,
252 other.id,
b4f45851
SM
253 other.packet_context_field_class,
254 other.event_header_field_class,
255 other.event_context_field_class,
811644b8 256 other.clock,
81447b5b 257 )
811644b8 258
81447b5b
PP
259 return self_props == other_props
260
b4f45851 261 def _copy(self, fc_copy_func, ev_copy_func):
81447b5b 262 cpy = StreamClass()
811644b8
PP
263
264 if self.id is not None:
265 cpy.id = self.id
266
267 if self.name is not None:
268 cpy.name = self.name
269
270 if self.clock is not None:
271 cpy.clock = self.clock
272
b4f45851
SM
273 cpy.packet_context_field_class = fc_copy_func(self.packet_context_field_class)
274 cpy.event_header_field_class = fc_copy_func(self.event_header_field_class)
275 cpy.event_context_field_class = fc_copy_func(self.event_context_field_class)
81447b5b
PP
276
277 for event_class in self.values():
278 cpy.add_event_class(ev_copy_func(event_class))
279
280 return cpy
281
282 def __copy__(self):
b4f45851 283 return self._copy(lambda fc: fc, copy.copy)
81447b5b
PP
284
285 def __deepcopy__(self, memo):
286 cpy = self._copy(copy.deepcopy, copy.deepcopy)
287 memo[id(self)] = cpy
288 return cpy
This page took 0.047634 seconds and 4 git commands to generate.