1 # The MIT License (MIT)
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
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:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
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
23 from bt2
import native_bt
, object, utils
24 import bt2
.field_class
25 import collections
.abc
32 class _EventClassIterator(collections
.abc
.Iterator
):
33 def __init__(self
, stream_class
):
34 self
._stream
_class
= stream_class
38 if self
._at
== len(self
._stream
_class
):
41 ec_ptr
= native_bt
.stream_class_get_event_class_by_index(self
._stream
_class
._ptr
,
44 ev_id
= native_bt
.event_class_get_id(ec_ptr
)
46 utils
._handle
_ret
(ev_id
, "cannot get event class object's ID")
51 class StreamClass(object._SharedObject
, collections
.abc
.Mapping
):
52 _get_ref
= staticmethod(native_bt
.stream_class_get_ref
)
53 _put_ref
= staticmethod(native_bt
.stream_class_put_ref
)
55 def __init__(self
, name
=None, id=None, packet_context_field_class
=None,
56 event_header_field_class
=None, event_context_field_class
=None,
58 ptr
= native_bt
.stream_class_create_empty(None)
61 raise bt2
.CreationError('cannot create stream class object')
71 if packet_context_field_class
is not None:
72 self
.packet_context_field_class
= packet_context_field_class
74 if event_header_field_class
is not None:
75 self
.event_header_field_class
= event_header_field_class
77 if event_context_field_class
is not None:
78 self
.event_context_field_class
= event_context_field_class
80 if event_classes
is not None:
81 for event_class
in event_classes
:
82 self
.add_event_class(event_class
)
84 def __getitem__(self
, key
):
85 utils
._check
_int
64(key
)
86 ec_ptr
= native_bt
.stream_class_get_event_class_by_id(self
._ptr
,
92 return bt2
.EventClass
._create
_from
_ptr
(ec_ptr
)
95 count
= native_bt
.stream_class_get_event_class_count(self
._ptr
)
100 return _EventClassIterator(self
)
102 def add_event_class(self
, event_class
):
103 utils
._check
_type
(event_class
, bt2
.EventClass
)
104 ret
= native_bt
.stream_class_add_event_class(self
._ptr
, event_class
._ptr
)
105 utils
._handle
_ret
(ret
, "cannot add event class object to stream class object's")
109 tc_ptr
= native_bt
.stream_class_get_trace(self
._ptr
)
111 if tc_ptr
is not None:
112 return bt2
.Trace
._create
_from
_ptr
(tc_ptr
)
116 return native_bt
.stream_class_get_name(self
._ptr
)
119 def name(self
, name
):
120 utils
._check
_str
(name
)
121 ret
= native_bt
.stream_class_set_name(self
._ptr
, name
)
122 utils
._handle
_ret
(ret
, "cannot set stream class object's name")
125 def assigns_automatic_stream_id(self
):
126 return native_bt
.stream_class_assigns_automatic_stream_id(self
._ptr
)
128 def _assigns_automatic_stream_id(self
, auto_id
):
129 utils
._check
_bool
(auto_id
)
130 return native_bt
.stream_class_set_assigns_automatic_stream_id(self
._ptr
, auto_id
)
132 _assigns_automatic_stream_id
= property(fset
=_assigns_automatic_stream_id
)
136 id = native_bt
.stream_class_get_id(self
._ptr
)
145 utils
._check
_int
64(id)
146 ret
= native_bt
.stream_class_set_id(self
._ptr
, id)
147 utils
._handle
_ret
(ret
, "cannot set stream class object's ID")
151 clock_ptr
= native_bt
.stream_class_get_clock(self
._ptr
)
153 if clock_ptr
is None:
156 return bt2
.ctf_writer
.CtfWriterClock
._create
_from
_ptr
(clock_ptr
)
159 def clock(self
, clock
):
160 utils
._check
_type
(clock
, bt2
.ctf_writer
.CtfWriterClock
)
161 ret
= native_bt
.stream_class_set_clock(self
._ptr
, clock
._ptr
)
162 utils
._handle
_ret
(ret
, "cannot set stream class object's CTF writer clock object")
165 def packet_context_field_class(self
):
166 fc_ptr
= native_bt
.stream_class_get_packet_context_type(self
._ptr
)
171 return bt2
.field_class
._create
_from
_ptr
(fc_ptr
)
173 @packet_context_field_class.setter
174 def packet_context_field_class(self
, packet_context_field_class
):
175 packet_context_field_class_ptr
= None
177 if packet_context_field_class
is not None:
178 utils
._check
_type
(packet_context_field_class
, bt2
.field_class
._FieldClass
)
179 packet_context_field_class_ptr
= packet_context_field_class
._ptr
181 ret
= native_bt
.stream_class_set_packet_context_type(self
._ptr
,
182 packet_context_field_class_ptr
)
183 utils
._handle
_ret
(ret
, "cannot set stream class object's packet context field class")
186 def event_header_field_class(self
):
187 fc_ptr
= native_bt
.stream_class_get_event_header_type(self
._ptr
)
192 return bt2
.field_class
._create
_from
_ptr
(fc_ptr
)
194 @event_header_field_class.setter
195 def event_header_field_class(self
, event_header_field_class
):
196 event_header_field_class_ptr
= None
198 if event_header_field_class
is not None:
199 utils
._check
_type
(event_header_field_class
, bt2
.field_class
._FieldClass
)
200 event_header_field_class_ptr
= event_header_field_class
._ptr
202 ret
= native_bt
.stream_class_set_event_header_type(self
._ptr
,
203 event_header_field_class_ptr
)
204 utils
._handle
_ret
(ret
, "cannot set stream class object's event header field class")
207 def event_context_field_class(self
):
208 fc_ptr
= native_bt
.stream_class_get_event_context_type(self
._ptr
)
213 return bt2
.field_class
._create
_from
_ptr
(fc_ptr
)
215 @event_context_field_class.setter
216 def event_context_field_class(self
, event_context_field_class
):
217 event_context_field_class_ptr
= None
219 if event_context_field_class
is not None:
220 utils
._check
_type
(event_context_field_class
, bt2
.field_class
._FieldClass
)
221 event_context_field_class_ptr
= event_context_field_class
._ptr
223 ret
= native_bt
.stream_class_set_event_context_type(self
._ptr
,
224 event_context_field_class_ptr
)
225 utils
._handle
_ret
(ret
, "cannot set stream class object's event context field class")
227 def __call__(self
, name
=None, id=None):
229 utils
._check
_str
(name
)
232 stream_ptr
= native_bt
.stream_create(self
._ptr
, name
)
234 stream_ptr
= native_bt
.stream_create_with_id(self
._ptr
, name
, id)
236 if stream_ptr
is None:
237 raise bt2
.CreationError('cannot create stream object')
239 return bt2
.stream
._create
_from
_ptr
(stream_ptr
)
241 def __eq__(self
, other
):
242 if type(other
) is not type(self
):
245 if self
.addr
== other
.addr
:
248 self_event_classes
= list(self
.values())
249 other_event_classes
= list(other
.values())
254 self
.packet_context_field_class
,
255 self
.event_header_field_class
,
256 self
.event_context_field_class
,
263 other
.packet_context_field_class
,
264 other
.event_header_field_class
,
265 other
.event_context_field_class
,
269 return self_props
== other_props
271 def _copy(self
, fc_copy_func
, ev_copy_func
):
274 if self
.id is not None:
277 if self
.name
is not None:
280 if self
.clock
is not None:
281 cpy
.clock
= self
.clock
283 cpy
.packet_context_field_class
= fc_copy_func(self
.packet_context_field_class
)
284 cpy
.event_header_field_class
= fc_copy_func(self
.event_header_field_class
)
285 cpy
.event_context_field_class
= fc_copy_func(self
.event_context_field_class
)
287 for event_class
in self
.values():
288 cpy
.add_event_class(ev_copy_func(event_class
))
293 return self
._copy
(lambda fc
: fc
, copy
.copy
)
295 def __deepcopy__(self
, memo
):
296 cpy
= self
._copy
(copy
.deepcopy
, copy
.deepcopy
)