fix: use definitions from previous protocols
It's not really elegant but it works. If a definition is missing, it's likely because it's unchanged since last revision
This commit is contained in:
parent
6448e7bad4
commit
d6e5e7a6f6
2 changed files with 10 additions and 2 deletions
|
@ -233,7 +233,10 @@ class Dispatcher:
|
||||||
if not self._proto:
|
if not self._proto:
|
||||||
raise InvalidState("Cannot access registries from invalid protocol")
|
raise InvalidState("Cannot access registries from invalid protocol")
|
||||||
|
|
||||||
proto_reg = reg[self._proto]
|
proto = self._proto
|
||||||
|
while proto not in reg:
|
||||||
|
proto -= 1
|
||||||
|
proto_reg = reg[proto]
|
||||||
|
|
||||||
return proto_reg[packet_id]
|
return proto_reg[packet_id]
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,8 @@ class Packet:
|
||||||
def __init__(self, proto:int, **kwargs):
|
def __init__(self, proto:int, **kwargs):
|
||||||
self._proto = proto
|
self._proto = proto
|
||||||
self._processed = Event()
|
self._processed = Event()
|
||||||
|
while proto not in self._definitions:
|
||||||
|
proto -= 1
|
||||||
self.definition = self._definitions[proto]
|
self.definition = self._definitions[proto]
|
||||||
self.id = self._ids[proto]
|
self.id = self._ids[proto]
|
||||||
for name, t in self.definition:
|
for name, t in self.definition:
|
||||||
|
@ -36,7 +38,10 @@ class Packet:
|
||||||
@classmethod
|
@classmethod
|
||||||
def deserialize(cls, proto:int, buffer:io.BytesIO):
|
def deserialize(cls, proto:int, buffer:io.BytesIO):
|
||||||
ctx = Context(_proto=proto)
|
ctx = Context(_proto=proto)
|
||||||
for k, t in cls._definitions[proto]:
|
fallback_proto = proto
|
||||||
|
while fallback_proto not in cls._definitions:
|
||||||
|
fallback_proto -= 1
|
||||||
|
for k, t in cls._definitions[fallback_proto]:
|
||||||
setattr(ctx, k, t.read(buffer, ctx=ctx))
|
setattr(ctx, k, t.read(buffer, ctx=ctx))
|
||||||
return cls(proto, **ctx.serialize())
|
return cls(proto, **ctx.serialize())
|
||||||
# return cls(proto, **{ name : t.read(buffer) for (name, t) in cls._definitions[proto] })
|
# return cls(proto, **{ name : t.read(buffer) for (name, t) in cls._definitions[proto] })
|
||||||
|
|
Loading…
Reference in a new issue