--- /dev/null
+# The MIT License (MIT)
+#
+# Copyright (c) 2013-2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import bt2
+import babeltrace.common as common
+import babeltrace.reader_field_declaration as field_declaration
+import collections
+
+def _create_event_declaration(event_class):
+ event_declaration = EventDeclaration.__new__(EventDeclaration)
+ event_declaration._event_class = event_class
+ return event_declaration
+
+class EventDeclaration:
+ """
+ An event declaration contains the properties of a class of events,
+ that is, the common properties and fields layout of all the actual
+ recorded events associated with this declaration.
+
+ This class is not meant to be instantiated by the user. It is
+ returned by :attr:`TraceHandle.events`.
+ """
+ def __init__(self):
+ raise NotImplementedError("EventDeclaration cannot be instantiated")
+
+ def _get_scope_field_type(self, scope):
+ try:
+ ec = self._event_class
+ if scope is common.CTFScope.EVENT_FIELDS:
+ return ec.payload_field_type
+
+ if scope is common.CTFScope.EVENT_CONTEXT:
+ return ec.context_field_type
+
+ if scope is common.CTFScope.STREAM_EVENT_CONTEXT:
+ return ec.stream_class.event_context_field_type
+
+ if scope is common.CTFScope.STREAM_EVENT_HEADER:
+ return ec.stream_class.event_header_field_type
+
+ if scope is common.CTFScope.STREAM_PACKET_CONTEXT:
+ return ec.stream_class.packet_context_field_type
+
+ if scope is common.CTFScope.TRACE_PACKET_HEADER:
+ return ec.stream_class.trace.packet_header_field_type
+ except bt2.Error:
+ return
+
+ raise ValueError("Invalid scope provided")
+
+ @property
+ def name(self):
+ """
+ Event name, or ``None`` on error.
+ """
+
+ return self._event_class.name
+
+ @property
+ def id(self):
+ """
+ Event numeric ID, or -1 on error.
+ """
+
+ return self._event_class.id
+
+ @property
+ def fields(self):
+ """
+ Generates all the field declarations of this event, going
+ through each scope in the following order:
+
+ 1. Event fields (:attr:`babeltrace.common.CTFScope.EVENT_FIELDS`)
+ 2. Event context (:attr:`babeltrace.common.CTFScope.EVENT_CONTEXT`)
+ 3. Stream event context (:attr:`babeltrace.common.CTFScope.STREAM_EVENT_CONTEXT`)
+ 4. Event header (:attr:`babeltrace.common.CTFScope.STREAM_EVENT_HEADER`)
+ 5. Packet context (:attr:`babeltrace.common.CTFScope.STREAM_PACKET_CONTEXT`)
+ 6. Packet header (:attr:`babeltrace.common.CTFScope.TRACE_PACKET_HEADER`)
+
+ All the generated field declarations inherit
+ :class:`FieldDeclaration`, and are among:
+
+ * :class:`IntegerFieldDeclaration`
+ * :class:`FloatFieldDeclaration`
+ * :class:`EnumerationFieldDeclaration`
+ * :class:`StringFieldDeclaration`
+ * :class:`ArrayFieldDeclaration`
+ * :class:`SequenceFieldDeclaration`
+ * :class:`StructureFieldDeclaration`
+ * :class:`VariantFieldDeclaration`
+ """
+
+ for scope in _SCOPES:
+ for declaration in self.fields_scope(scope):
+ yield declaration
+
+ def fields_scope(self, scope):
+ """
+ Generates all the field declarations of the event's scope
+ *scope*.
+
+ *scope* must be one of :class:`babeltrace.common.CTFScope` constants.
+
+ All the generated field declarations inherit
+ :class:`FieldDeclaration`, and are among:
+
+ * :class:`IntegerFieldDeclaration`
+ * :class:`FloatFieldDeclaration`
+ * :class:`EnumerationFieldDeclaration`
+ * :class:`StringFieldDeclaration`
+ * :class:`ArrayFieldDeclaration`
+ * :class:`SequenceFieldDeclaration`
+ * :class:`StructureFieldDeclaration`
+ * :class:`VariantFieldDeclaration`
+ """
+
+ scope_field_type = self._get_scope_field_type(scope)
+ for name, field_type in scope_field_type.items():
+ yield field_declaration._create_field_declaration(field_type, name,
+ scope)
+
+# Priority of the scopes when searching for event fields
+_SCOPES = [
+ common.CTFScope.EVENT_FIELDS,
+ common.CTFScope.EVENT_CONTEXT,
+ common.CTFScope.STREAM_EVENT_CONTEXT,
+ common.CTFScope.STREAM_EVENT_HEADER,
+ common.CTFScope.STREAM_PACKET_CONTEXT,
+ common.CTFScope.TRACE_PACKET_HEADER
+]