1 # SPDX-License-Identifier: MIT
3 # Copyright (c) 2016-2017 Philippe Proulx <pproulx@efficios.com>
7 from bt2
import field
as bt2_field
8 from bt2
import utils
as bt2_utils
9 from bt2
import object as bt2_object
10 from bt2
import packet
as bt2_packet
11 from bt2
import stream
as bt2_stream
12 from bt2
import native_bt
13 from bt2
import event_class
as bt2_event_class
16 class _EventConst(bt2_object
._UniqueObject
, collections
.abc
.Mapping
):
17 _borrow_class_ptr
= staticmethod(native_bt
.event_borrow_class_const
)
18 _borrow_packet_ptr
= staticmethod(native_bt
.event_borrow_packet_const
)
19 _borrow_stream_ptr
= staticmethod(native_bt
.event_borrow_stream_const
)
20 _borrow_common_context_field_ptr
= staticmethod(
21 native_bt
.event_borrow_common_context_field_const
23 _borrow_specific_context_field_ptr
= staticmethod(
24 native_bt
.event_borrow_specific_context_field_const
26 _borrow_payload_field_ptr
= staticmethod(native_bt
.event_borrow_payload_field_const
)
27 _create_field_from_ptr
= staticmethod(bt2_field
._create
_field
_from
_const
_ptr
)
29 _event_class_pycls
= property(lambda _
: bt2_event_class
._EventClassConst
)
30 _packet_pycls
= property(lambda _
: bt2_packet
._PacketConst
)
31 _stream_pycls
= property(lambda _
: bt2_stream
._StreamConst
)
35 event_class_ptr
= self
._borrow
_class
_ptr
(self
._ptr
)
36 assert event_class_ptr
is not None
37 return self
._event
_class
_pycls
._create
_from
_ptr
_and
_get
_ref
(event_class_ptr
)
49 packet_ptr
= self
._borrow
_packet
_ptr
(self
._ptr
)
51 if packet_ptr
is None:
54 return self
._packet
_pycls
._create
_from
_ptr
_and
_get
_ref
(packet_ptr
)
58 stream_ptr
= self
._borrow
_stream
_ptr
(self
._ptr
)
59 assert stream_ptr
is not None
60 return self
._stream
_pycls
._create
_from
_ptr
_and
_get
_ref
(stream_ptr
)
63 def common_context_field(self
):
64 field_ptr
= self
._borrow
_common
_context
_field
_ptr
(self
._ptr
)
69 return self
._create
_field
_from
_ptr
(
70 field_ptr
, self
._owner
_ptr
, self
._owner
_get
_ref
, self
._owner
_put
_ref
74 def specific_context_field(self
):
75 field_ptr
= self
._borrow
_specific
_context
_field
_ptr
(self
._ptr
)
80 return self
._create
_field
_from
_ptr
(
81 field_ptr
, self
._owner
_ptr
, self
._owner
_get
_ref
, self
._owner
_put
_ref
85 def payload_field(self
):
86 field_ptr
= self
._borrow
_payload
_field
_ptr
(self
._ptr
)
91 return self
._create
_field
_from
_ptr
(
92 field_ptr
, self
._owner
_ptr
, self
._owner
_get
_ref
, self
._owner
_put
_ref
95 def __getitem__(self
, key
):
96 bt2_utils
._check
_str
(key
)
97 payload_field
= self
.payload_field
99 if payload_field
is not None and key
in payload_field
:
100 return payload_field
[key
]
102 specific_context_field
= self
.specific_context_field
104 if specific_context_field
is not None and key
in specific_context_field
:
105 return specific_context_field
[key
]
107 common_context_field
= self
.common_context_field
109 if common_context_field
is not None and key
in common_context_field
:
110 return common_context_field
[key
]
113 packet_context_field
= self
.packet
.context_field
115 if packet_context_field
is not None and key
in packet_context_field
:
116 return packet_context_field
[key
]
121 # To only yield unique keys, keep a set of member names that are
122 # already yielded. Two root structure fields (for example,
123 # payload and common context) can contain immediate members
124 # which share the same name.
127 if self
.payload_field
is not None:
128 for field_name
in self
.payload_field
:
130 member_names
.add(field_name
)
132 if self
.specific_context_field
is not None:
133 for field_name
in self
.specific_context_field
:
134 if field_name
not in member_names
:
136 member_names
.add(field_name
)
138 if self
.common_context_field
is not None:
139 for field_name
in self
.common_context_field
:
140 if field_name
not in member_names
:
142 member_names
.add(field_name
)
144 if self
.packet
and self
.packet
.context_field
is not None:
145 for field_name
in self
.packet
.context_field
:
146 if field_name
not in member_names
:
148 member_names
.add(field_name
)
151 return sum(1 for _
in self
)
154 class _Event(_EventConst
):
155 _borrow_class_ptr
= staticmethod(native_bt
.event_borrow_class
)
156 _borrow_packet_ptr
= staticmethod(native_bt
.event_borrow_packet
)
157 _borrow_stream_ptr
= staticmethod(native_bt
.event_borrow_stream
)
158 _borrow_common_context_field_ptr
= staticmethod(
159 native_bt
.event_borrow_common_context_field
161 _borrow_specific_context_field_ptr
= staticmethod(
162 native_bt
.event_borrow_specific_context_field
164 _borrow_payload_field_ptr
= staticmethod(native_bt
.event_borrow_payload_field
)
165 _create_field_from_ptr
= staticmethod(bt2_field
._create
_field
_from
_ptr
)
167 _event_class_pycls
= property(lambda _
: bt2_event_class
._EventClass
)
168 _packet_pycls
= property(lambda _
: bt2_packet
._Packet
)
169 _stream_pycls
= property(lambda _
: bt2_stream
._Stream
)