giantsd/dpnet/DFrame.py

81 lines
2.6 KiB
Python

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