- for t in j['types']:
- try:
- type_ = self.struct_type_class(t, self.types,
- self.field_class)
- if type_.name in self.types:
- raise ParseError("Duplicate type `%s'" % type_.name)
- except ParseError as e:
- self.exceptions.append(e)
- continue
- self.types[type_.name] = type_
- self.types_by_json[path].append(type_)
- self.logger.debug("Parsed type: %s" % type_)
- for m in j['messages']:
- try:
- msg = self.message_class(self.logger, m, self.types,
- self.struct_type_class,
- self.simple_type_class,
- self.field_class)
- if msg.name in self.messages:
- raise ParseError("Duplicate message `%s'" % msg.name)
- except ParseError as e:
- self.exceptions.append(e)
- continue
- self.messages[msg.name] = msg
- self.messages_by_json[path][msg.name] = msg
+ for k in j['services']:
+ if k in self.services:
+ raise ParseError("Duplicate service `%s'" % k)
+ self.services[k] = j['services'][k]
+ self.replies.add(self.services[k]["reply"])
+ if "events" in self.services[k]:
+ for x in self.services[k]["events"]:
+ self.events.add(x)
+ for e in j['enums']:
+ name = e[0]
+ value_pairs = e[1:-1]
+ enumtype = self.types[e[-1]["enumtype"]]
+ enum = self.enum_class(name, value_pairs, enumtype)
+ self.enums[enum.name] = enum
+ self.logger.debug("Parsed enum: %s" % enum)
+ self.enums_by_json[path].append(enum)
+ exceptions = []
+ progress = 0
+ last_progress = 0
+ while True:
+ for u in j['unions']:
+ name = u[0]
+ if name in self.unions:
+ progress = progress + 1
+ continue
+ try:
+ type_pairs = [[self.lookup_type_like_id(t), n]
+ for t, n in u[1:-1]]
+ crc = u[-1]["crc"]
+ union = self.union_class(name, type_pairs, crc)
+ progress = progress + 1
+ except ParseError as e:
+ exceptions.append(e)
+ continue
+ self.unions[union.name] = union
+ self.logger.debug("Parsed union: %s" % union)
+ self.unions_by_json[path].append(union)
+ for name, body in j['aliases'].iteritems():
+ if name in self.aliases:
+ progress = progress + 1
+ continue
+ if 'length' in body:
+ array_len = body['length']
+ else:
+ array_len = None
+ t = self.types[body['type']]
+ alias = self.alias_class(name, t, array_len)
+ self.aliases[name] = alias
+ self.logger.debug("Parsed alias: %s" % alias)
+ self.aliases_by_json[path].append(alias)
+ for t in j['types']:
+ if t[0] in self.types:
+ progress = progress + 1
+ continue
+ try:
+ type_ = self.struct_type_class(t, self,
+ self.field_class,
+ self.logger)
+ if type_.name in self.types:
+ raise ParseError(
+ "Duplicate type `%s'" % type_.name)
+ progress = progress + 1
+ except ParseError as e:
+ exceptions.append(e)
+ continue
+ self.types[type_.name] = type_
+ self.types_by_json[path].append(type_)
+ self.logger.debug("Parsed type: %s" % type_)
+ if not exceptions:
+ # finished parsing
+ break
+ if progress <= last_progress:
+ # cannot make forward progress
+ self.exceptions.extend(exceptions)
+ break
+ exceptions = []
+ last_progress = progress
+ progress = 0
+ prev_length = len(self.messages)
+ processed = []
+ while True:
+ exceptions = []
+ for m in j['messages']:
+ if m in processed:
+ continue
+ try:
+ msg = self.message_class(self.logger, m, self)
+ if msg.name in self.messages:
+ raise ParseError(
+ "Duplicate message `%s'" % msg.name)
+ except ParseError as e:
+ exceptions.append(e)
+ continue
+ self.messages[msg.name] = msg
+ self.messages_by_json[path][msg.name] = msg
+ processed.append(m)
+ if prev_length == len(self.messages):
+ # cannot make forward progress ...
+ self.exceptions.extend(exceptions)
+ break
+ prev_length = len(self.messages)
+
+ def lookup_type_like_id(self, name):
+ mundane_name = remove_magic(name)
+ if name in self.types:
+ return self.types[name]
+ elif name in self.enums:
+ return self.enums[name]
+ elif name in self.unions:
+ return self.unions[name]
+ elif name in self.aliases:
+ return self.aliases[name]
+ elif mundane_name in self.types:
+ return self.types[mundane_name]
+ elif mundane_name in self.enums:
+ return self.enums[mundane_name]
+ elif mundane_name in self.unions:
+ return self.unions[mundane_name]
+ elif mundane_name in self.aliases:
+ return self.aliases[mundane_name]
+ raise ParseError(
+ "Could not find type, enum or union by magic name `%s' nor by "
+ "mundane name `%s'" % (name, mundane_name))
+
+ def is_reply(self, message):
+ return message in self.replies
+
+ def is_event(self, message):
+ return message in self.events