from .packet import Packet class DFrame: PACKET_COMMAND_DATA = 0x01 PACKET_COMMAND_RELIABLE = 0x02 PACKET_COMMAND_SEQUENTIAL = 0x04 PACKET_COMMAND_POLL = 0x08 PACKET_COMMAND_NEW_MSG = 0x10 PACKET_COMMAND_END_MSG = 0x20 PACKET_COMMAND_USER_1 = 0x40 PACKET_COMMAND_USER_2 = 0x80 PACKET_CONTROL_RETRY = 0x01 PACKET_CONTROL_KEEPALIVE_OR_CORRELATE = 0x02 PACKET_CONTROL_COALESCE = 0x04 PACKET_CONTROL_END_STREAM = 0x08 PACKET_CONTROL_SACK1 = 0x10 PACKET_CONTROL_SACK2 = 0x20 PACKET_CONTROL_SEND1 = 0x40 PACKET_CONTROL_SEND2 = 0x80 def __init__(self, packet=None): self.Command = DFrame.PACKET_COMMAND_DATA self.Control = 0x00 self.Seq = 0 self.NRcv = 0 self.SACKMask1 = b'' self.SACKMask2 = b'' self.SendMask1 = b'' self.SendMask2 = b'' self.Signature = b'' self.SessID = b'' self.Payload = b'' if packet: self.parse(packet) def parse(self, packet): packet.seek(0) self.Command = packet.getByte() self.Control = packet.getByte() self.Seq = packet.getByte() self.NRcv = packet.getByte() if self.Control & DFrame.PACKET_CONTROL_SACK1: self.SACKMask1 = packet.getLong() if self.Control & DFrame.PACKET_CONTROL_SACK2: self.SACKMask2 = packet.getLong() if self.Control & DFrame.PACKET_CONTROL_SEND1: self.SendMask1 = packet.getLong() if self.Control & DFrame.PACKET_CONTROL_SEND2: self.SendMask2 = packet.getLong() # TODO: handle signature if self.Control & DFrame.PACKET_CONTROL_KEEPALIVE_OR_CORRELATE: self.SessID = packet.getLong() self.Payload = packet.read() def to_packet(self): packet = Packet() packet.putByte(self.Command) packet.putByte(self.Control) packet.putByte(self.Seq) packet.putByte(self.NRcv) if self.Control & DFrame.PACKET_CONTROL_SACK1: packet.putLong(self.SACKMask1) if self.Control & DFrame.PACKET_CONTROL_SACK2: packet.putLong(self.SACKMask2) if self.Control & DFrame.PACKET_CONTROL_SEND1: packet.putLong(self.SendMask1) if self.Control & DFrame.PACKET_CONTROL_SEND2: packet.putLong(self.SendMask2) if self.Signature: packet.putLongLong(self.Signature) if self.Control & DFrame.PACKET_CONTROL_KEEPALIVE_OR_CORRELATE: packet.putLong(self.SessID) packet.putBytes(self.Payload) return packet