-# 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
-
-
-def _create_field_declaration(field_type, name, scope):
- try:
- if type(field_type) == bt2.IntegerFieldType:
- declaration = IntegerFieldDeclaration.__new__(
- IntegerFieldDeclaration)
- elif type(field_type) == bt2.EnumerationFieldType:
- declaration = EnumerationFieldDeclaration.__new__(
- EnumerationFieldDeclaration)
- elif type(field_type) == bt2.ArrayFieldType:
- declaration = ArrayFieldDeclaration.__new__(
- ArrayFieldDeclaration)
- elif type(field_type) == bt2.SequenceFieldType:
- declaration = SequenceFieldDeclaration.__new__(
- SequenceFieldDeclaration)
- elif type(field_type) == bt2.FloatingPointNumberFieldType:
- declaration = FloatFieldDeclaration.__new__(
- FloatFieldDeclaration)
- elif type(field_type) == bt2.StructureFieldType:
- declaration = StructureFieldDeclaration.__new__(
- StructureFieldDeclaration)
- elif type(field_type) == bt2.StringFieldType:
- declaration = StringFieldDeclaration.__new__(
- StringFieldDeclaration)
- elif type(field_type) == bt2.VariantFieldType:
- declaration = VariantFieldDeclaration.__new__(
- VariantFieldDeclaration)
- else:
- return
- except bt2.Error:
- return
-
- declaration._field_type = field_type
- declaration._name = name
- declaration._scope = scope
- return declaration
-
-
-class FieldDeclaration:
- """
- Base class for concrete field declarations.
-
- This class is not meant to be instantiated by the user.
- """
-
- def __init__(self):
- raise NotImplementedError("FieldDeclaration cannot be instantiated")
-
- def __repr__(self):
- return "({0}) {1} {2}".format(common.CTFScope.scope_name(self.scope),
- common.CTFTypeId.type_name(self.type),
- self.name)
-
- @property
- def name(self):
- """
- Field name, or ``None`` on error.
- """
-
- return self._name
-
- @property
- def type(self):
- """
- Field type (one of :class:`babeltrace.common.CTFTypeId`
- constants).
- """
-
- return _OBJ_TO_TYPE_ID[type(self)]
-
- @property
- def scope(self):
- """
- Field scope (one of:class:`babeltrace.common.CTFScope`
- constants).
- """
-
- return self._scope
-
-
-class IntegerFieldDeclaration(FieldDeclaration):
- """
- Integer field declaration.
- """
-
- def __init__(self):
- raise NotImplementedError("IntegerFieldDeclaration cannot be instantiated")
-
- @property
- def signedness(self):
- """
- 0 if this integer is unsigned, 1 if signed, or -1 on error.
- """
-
- try:
- if self._field_type.is_signed:
- return 1
- else:
- return 0
- except bt2.Error:
- return -1
-
- @property
- def base(self):
- """
- Integer base (:class:`int`), or a negative value on error.
- """
-
- try:
- return self._field_type.base
- except AssertionError:
- return -1
-
- @property
- def byte_order(self):
- """
- Integer byte order (one of
- :class:`babeltrace.common.ByteOrder` constants).
- """
-
- try:
- byte_order = self._field_type.byte_order
- except AssertionError:
- return common.ByteOrder.BYTE_ORDER_UNKNOWN
-
- try:
- return _BT2_BYTE_ORDER_TO_BYTE_ORDER[byte_order]
- except KeyError:
- return common.ByteOrder.BYTE_ORDER_UNKNOWN
-
- @property
- def size(self):
- """
- Integer size in bits, or a negative value on error.
- """
-
- try:
- return self._field_type.size
- except AssertionError:
- return -1
-
- @property
- def length(self):
- """
- Integer size in bits, or a negative value on error.
- """
-
- return self.size
-
- @property
- def encoding(self):
- """
- Integer encoding (one of
- :class:`babeltrace.common.CTFStringEncoding` constants).
- """
-
- try:
- encoding = self._field_type.encoding
- except bt2.Error:
- return common.CTFStringEncoding.UNKNOWN
-
- try:
- return _BT2_ENCODING_TO_ENCODING[encoding]
- except KeyError:
- return common.CTFStringEncoding.UNKNOWN
-
-
-class EnumerationFieldDeclaration(FieldDeclaration):
- """
- Enumeration field declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("EnumerationFieldDeclaration cannot be instantiated")
-
-
-class ArrayFieldDeclaration(FieldDeclaration):
- """
- Static array field declaration.
- """
-
- def __init__(self):
- raise NotImplementedError("ArrayFieldDeclaration cannot be instantiated")
-
- @property
- def length(self):
- """
- Fixed length of this static array (number of contained
- elements), or a negative value on error.
- """
-
- try:
- return self._field_type.length
- except AssertionError:
- return -1
-
- @property
- def element_declaration(self):
- """
- Field declaration of the underlying element.
- """
-
- try:
- return _create_field_declaration(
- self._field_type.element_field_type, name=None,
- scope=self._scope)
- except bt2.Error:
- return
-
-
-class SequenceFieldDeclaration(FieldDeclaration):
- """
- Sequence (dynamic array) field declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("SequenceFieldDeclaration cannot be instantiated")
-
- @property
- def element_declaration(self):
- """
- Field declaration of the underlying element.
- """
-
- try:
- return _create_field_declaration(
- self._field_type.element_field_type, name=None,
- scope=self._scope)
- except bt2.Error:
- return
-
-
-class FloatFieldDeclaration(FieldDeclaration):
- """
- Floating point number field declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("FloatFieldDeclaration cannot be instantiated")
-
-
-class StructureFieldDeclaration(FieldDeclaration):
- """
- Structure (ordered map of field names to field declarations) field
- declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("StructureFieldDeclaration cannot be instantiated")
-
-
-class StringFieldDeclaration(FieldDeclaration):
- """
- String (NULL-terminated array of bytes) field declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("StringFieldDeclaration cannot be instantiated")
-
-
-class VariantFieldDeclaration(FieldDeclaration):
- """
- Variant (dynamic selection between different types) field declaration.
-
- .. note::
-
- As of this version, this class is missing some properties.
- """
-
- def __init__(self):
- raise NotImplementedError("VariantFieldDeclaration cannot be instantiated")
-
-
-_OBJ_TO_TYPE_ID = {
- IntegerFieldDeclaration: common.CTFTypeId.INTEGER,
- FloatFieldDeclaration: common.CTFTypeId.FLOAT,
- EnumerationFieldDeclaration: common.CTFTypeId.ENUM,
- StringFieldDeclaration: common.CTFTypeId.STRING,
- StructureFieldDeclaration: common.CTFTypeId.STRUCT,
- ArrayFieldDeclaration: common.CTFTypeId.ARRAY,
- SequenceFieldDeclaration: common.CTFTypeId.SEQUENCE,
- VariantFieldDeclaration: common.CTFTypeId.VARIANT,
-}
-
-_BT2_BYTE_ORDER_TO_BYTE_ORDER = {
- bt2.ByteOrder.NATIVE: common.ByteOrder.BYTE_ORDER_NATIVE,
- bt2.ByteOrder.LITTLE_ENDIAN: common.ByteOrder.BYTE_ORDER_LITTLE_ENDIAN,
- bt2.ByteOrder.BIG_ENDIAN: common.ByteOrder.BYTE_ORDER_BIG_ENDIAN,
- bt2.ByteOrder.NETWORK: common.ByteOrder.BYTE_ORDER_NETWORK,
-}
-
-_BT2_ENCODING_TO_ENCODING = {
- bt2.Encoding.NONE: common.CTFStringEncoding.NONE,
- bt2.Encoding.ASCII: common.CTFStringEncoding.ASCII,
- bt2.Encoding.UTF8: common.CTFStringEncoding.UTF8,
-}