Skip to content

Commit 3876d2c

Browse files
authored
Merge pull request #44 from tfgm-bud/revert-pr42
Alternative method to allow dynamic header size
2 parents 9d2b24d + 35324ee commit 3876d2c

File tree

3 files changed

+15
-17
lines changed

3 files changed

+15
-17
lines changed

mdp/secdef.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ def __init__(self):
77
self.info = {}
88

99
def load(self, secdef_filename):
10-
tag_regexp = re.compile('(?:^|\x01)(48|55)=(.*?)(?=\x01)')
11-
depth_regexp = re.compile('1022=GBX\x01264=(\d+)')
10+
tag_regexp = re.compile(r'(?:^|\x01)(48|55)=(.*?)(?=\x01)')
11+
depth_regexp = re.compile(r'1022=GBX\x01264=(\d+)')
1212
with gzip.open(secdef_filename, 'rb') as f:
1313
for line in f:
1414
line = line.decode('UTF-8')

sbedecoder/message.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -368,9 +368,10 @@ def __init__(self, schema):
368368
super(MDPMessageFactory, self).__init__(schema)
369369

370370
def build(self, msg_buffer, offset):
371-
# Peek at the template id to figure out what class to build
372-
# this looks past the starting 2 byte message_size header that is CME specific
373-
# and the 2 byte BlockHeader that starts all SBE Messages
371+
# Peek at the template id to figure out what class to build.
372+
# This looks past the starting 2 byte MsgSize header that is CME specific
373+
# and the 2 byte BlockLength that starts all SBE Messages:
374+
# https://www.cmegroup.com/confluence/display/EPICSANDBOX/MDP+3.0+-+Message+Header
374375
template_id = unpack_from('<H', msg_buffer, offset+4)[0]
375376
message_type = self.schema.get_message_type(template_id)
376377
message = message_type()

sbedecoder/schema.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def _parse_message_elements(elements, definition):
106106
definition['fields'] = fields
107107
definition['groups'] = groups
108108

109-
def _build_message_field(self, field_definition, offset, header_size=10, endian='<', add_header_size=True):
109+
def _build_message_field(self, message_type, field_definition, offset, endian='<', add_header_size=True):
110110
field_original_name = field_definition['name']
111111
field_name = convert_to_underscore(field_original_name)
112112
field_id = field_definition['id']
@@ -124,7 +124,7 @@ def _build_message_field(self, field_definition, offset, header_size=10, endian=
124124
if field_definition.get('offset', None) is not None:
125125
field_offset = int(field_definition.get('offset', None))
126126
if add_header_size:
127-
field_offset += header_size
127+
field_offset += message_type.header_size
128128

129129
primitive_type_fmt, primitive_type_size = self.primitive_type_map[field_type['primitive_type']]
130130

@@ -173,7 +173,7 @@ def _build_message_field(self, field_definition, offset, header_size=10, endian=
173173
if field_definition.get('offset', None) is not None:
174174
field_offset = int(field_definition.get('offset', None))
175175
if add_header_size:
176-
field_offset += header_size
176+
field_offset += message_type.header_size
177177

178178
unpack_fmt = endian
179179
field_length = field_type.get('length', None)
@@ -206,7 +206,7 @@ def _build_message_field(self, field_definition, offset, header_size=10, endian=
206206
if field_definition.get('offset', None) is not None:
207207
field_offset = int(field_definition.get('offset', None))
208208
if add_header_size:
209-
field_offset += header_size
209+
field_offset += message_type.header_size
210210

211211
unpack_fmt = endian
212212
field_length = field_type.get('length', None)
@@ -231,7 +231,7 @@ def _build_message_field(self, field_definition, offset, header_size=10, endian=
231231
if field_definition.get('offset', None) is not None:
232232
field_offset = int(field_definition.get('offset', None))
233233
if add_header_size:
234-
field_offset += header_size
234+
field_offset += message_type.header_size
235235

236236
float_composite = False
237237
field_length = 0
@@ -345,12 +345,10 @@ def _construct_header(self, message):
345345
setattr(message_type, 'header_size', field_offset)
346346
return field_offset
347347

348-
def _add_fields(self, field_offset, entity, entity_type, endian, add_header_size=True, header_size=10):
348+
def _add_fields(self, message_type, field_offset, entity, entity_type, endian, add_header_size=True):
349349
# Now run through the remaining types and update the fields
350350
for field_type in entity.get('fields', []):
351-
field_type['offset'] = None
352-
field = self._build_message_field(field_type, field_offset, header_size=header_size, endian=endian,
353-
add_header_size=add_header_size)
351+
field = self._build_message_field(message_type, field_type, field_offset, endian=endian, add_header_size=add_header_size)
354352
field_offset += field.field_length
355353
entity_type.fields.append(field)
356354
# make it an attribute too
@@ -402,7 +400,7 @@ def _add_groups(self, entity, entity_type, endian):
402400
dimension_size=block_field_offset,
403401
since_version=group_since_version)
404402

405-
self._add_fields(group_field_offset, group_type, repeating_group, endian, add_header_size=False)
403+
self._add_fields(entity, group_field_offset, group_type, repeating_group, endian, add_header_size=False)
406404

407405
repeating_groups.append(repeating_group)
408406
setattr(entity_type, repeating_group.name, repeating_group)
@@ -415,8 +413,7 @@ def _add_groups(self, entity, entity_type, endian):
415413
def _construct_body(self, message, field_offset, endian):
416414
message_id = int(message['id'])
417415
message_type = self.get_message_type(message_id)
418-
self._add_fields(field_offset, message, message_type, endian, add_header_size=True,
419-
header_size=message_type.header_size)
416+
self._add_fields(message_type, field_offset, message, message_type, endian, add_header_size=True)
420417
self._add_groups(message, message_type, endian)
421418

422419
def parse(self, xml_file, message_tag="message", types_tag="types", endian='<'):

0 commit comments

Comments
 (0)