3
0

Reader.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. from EventLogger.Utils import EventBoundary, EventHeader, EventNameHash, LogHeader, Prolog, PrologId
  9. def size_align_up(size, align):
  10. return (size + (align - 1)) & ~(align - 1)
  11. class Reader(object):
  12. ReadStatus_Success = 0
  13. ReadStatus_InsufficientFileSize = -1
  14. ReadStatus_InvalidFormat = -2
  15. ReadStatus_NoEvents = -3
  16. def __init__(self):
  17. self.log_header = LogHeader()
  18. self.current_event = EventHeader()
  19. self.current_thread_id = None
  20. self.buffer = None
  21. self.buffer_size = 0
  22. self.buffer_pos = 0
  23. def read_log_file(self, file_path):
  24. with open(file_path, mode='rb') as log_file:
  25. self.buffer = log_file.read()
  26. self.buffer_size = len(self.buffer)
  27. if self.buffer_size < LogHeader.size():
  28. return Reader.ReadStatus_InsufficientFileSize
  29. self.log_header.unpack(self.buffer)
  30. self.buffer_pos = LogHeader.size()
  31. if self.log_header.get_format() not in LogHeader.accepted_formats():
  32. return Reader.ReadStatus_InvalidFormat
  33. if self.buffer_pos + EventHeader.size() > self.buffer_size:
  34. return Reader.ReadStatus_NoEvents
  35. self.current_event.unpack(self._get_next(EventHeader.size()))
  36. self._update_thread_id()
  37. return Reader.ReadStatus_Success
  38. def get_log_header(self):
  39. return self.log_header
  40. def get_thread_id(self):
  41. return self.current_thread_id
  42. def get_event_name(self):
  43. return EventNameHash(self.current_event.event_id)
  44. def get_event_size(self):
  45. return self.current_event.size
  46. def get_event_flags(self):
  47. return self.current_event.flags
  48. def get_event_data(self):
  49. start = self.buffer_pos + EventHeader.size()
  50. return self._get_next(self.get_event_size(), override_start=start)
  51. def get_event_string(self):
  52. string_data = self.get_event_data()
  53. return string_data.decode('utf-8')
  54. def next(self):
  55. real_size = EventHeader.size() + self.get_event_size()
  56. self.buffer_pos += size_align_up(real_size, EventBoundary)
  57. if self.buffer_pos < self.buffer_size:
  58. self.current_event.unpack(self._get_next(EventHeader.size()))
  59. self._update_thread_id()
  60. return True
  61. return False
  62. def _get_next(self, size, override_start=None):
  63. start = override_start or self.buffer_pos
  64. end = start + size
  65. return self.buffer[start:end]
  66. def _update_thread_id(self):
  67. if self.get_event_name() == PrologId:
  68. prolog = Prolog()
  69. prolog.unpack(self._get_next(Prolog.size()))
  70. self.current_thread_id = prolog.thread_id