Utils.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #
  2. # Copyright (c) Contributors to the Open 3D Engine Project.
  3. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. #
  5. # SPDX-License-Identifier: Apache-2.0 OR MIT
  6. #
  7. #
  8. import struct
  9. import sys
  10. # Simple hash structure based on DJB2a
  11. class EventNameHash(object):
  12. def __init__(self, name):
  13. if isinstance(name, int):
  14. self.hash = name
  15. else:
  16. value = 5381
  17. for i in range(len(name)):
  18. value = ((value << 5) + value) ^ ord(name[i])
  19. self.hash = value & 0xFFFFFFFF
  20. def __hash__(self):
  21. return self.hash
  22. def __eq__(self, rhs):
  23. if isinstance(rhs, EventNameHash):
  24. return self.hash == rhs.hash
  25. else:
  26. return self.hash == rhs
  27. PrologId = EventNameHash("Prolog")
  28. EventBoundary = 8
  29. class LogStructBase(object):
  30. def _unpack(self, member_info, data):
  31. pos = 0
  32. for (member, data_format, data_size) in member_info:
  33. pos_end = pos + data_size
  34. unpacked_value = struct.unpack(data_format, data[pos:pos_end])
  35. setattr(self, member, unpacked_value[0])
  36. pos = pos_end
  37. class LogHeader(LogStructBase):
  38. @staticmethod
  39. def size():
  40. return 16
  41. @staticmethod
  42. def accepted_formats():
  43. return ['AZEL']
  44. def __init__(self):
  45. self.four_cc = None
  46. self.major_version = None
  47. self.minor_version = None
  48. self.user_version = None
  49. def unpack(self, data):
  50. member_info = [
  51. ('four_cc', '@4s', 4),
  52. ('major_version', '@I', 4),
  53. ('minor_version', '@I', 4),
  54. ('user_version', '@I', 4),
  55. ]
  56. self._unpack(member_info, data)
  57. def get_format(self):
  58. return self.four_cc.decode('utf-8')
  59. def get_version(self):
  60. return f'{self.major_version}.{self.minor_version} ({self.user_version})'
  61. class EventHeader(LogStructBase):
  62. @staticmethod
  63. def size():
  64. return 8
  65. def __init__(self):
  66. self.event_id = None
  67. self.size = None
  68. self.flags = None
  69. def unpack(self, data):
  70. member_info = [
  71. ('event_id', '@I', 4),
  72. ('size', '@H', 2),
  73. ('flags', '@H', 2),
  74. ]
  75. self._unpack(member_info, data)
  76. class Prolog(EventHeader):
  77. @staticmethod
  78. def size():
  79. return 16
  80. def __init__(self):
  81. super().__init__()
  82. self.thread_id = None
  83. def unpack(self, data):
  84. member_info = [
  85. ('event_id', '@I', 4),
  86. ('size', '@H', 2),
  87. ('flags', '@H', 2),
  88. ('thread_id', '@Q', 8)
  89. ]
  90. self._unpack(member_info, data)