def parseConferenceCreateResponse( self, stream: BytesIO) -> GCCConferenceCreateResponsePDU: """ Parse ConferenceCreateResponse data into a GCCPDU :param stream: byte stream containing the PDU data """ nodeID = Uint16BE.unpack(stream.read(2)) + 1001 tag = per.readInteger(stream) result = per.readEnumeration(stream) userDataCount = per.readNumberOfSet(stream) if userDataCount != 1: raise ParsingError("Expected user data count to be 1, got %d" % userDataCount) userDataType = per.readChoice(stream) if userDataType != 0xc0: raise ParsingError( "Expected user data type to be 0xc0 (h221NonStandard), got %d" % userDataType) key = per.readOctetStream(stream, 4) if key != GCCParser.H221_SERVER_KEY: raise ParsingError("Expected user data key to be %s, got %s" % (GCCParser.H221_SERVER_KEY, key)) payload = per.readOctetStream(stream) return GCCConferenceCreateResponsePDU(nodeID, tag, result, payload)
def parseDataPDU(self, stream: BytesIO, PDUClass: type) -> Union[MCSSendDataRequestPDU, MCSSendDataIndicationPDU]: """ Common logic for parsing Send Data Request and Send Data Indication PDUs :param stream: stream containing the data :param PDUClass: the actual PDU class: MCSSendDataRequestPDU or MCSSendDataIndicationPDU """ initiator = Uint16BE.unpack(stream.read(2)) + MCSChannelID.USERCHANNEL_BASE channelID = Uint16BE.unpack(stream.read(2)) priority = per.readEnumeration(stream) payload = per.readOctetStream(stream) return PDUClass(initiator, channelID, priority, payload)
def parseDisconnectProviderUltimatum(self, stream: BytesIO) -> MCSDisconnectProviderUltimatumPDU: """ Parse a Disconnect Provider Ultimatum PDU :param stream: stream containing the data """ reason = per.readEnumeration(stream) if len(stream.read()) > 0: raise ParsingError("Unexpected payload") return MCSDisconnectProviderUltimatumPDU(reason)
def parseAttachUserConfirm(self, stream: BytesIO) -> MCSAttachUserConfirmPDU: """ Parse an Attach User Confirm PDU :param stream: stream containing the data """ result = per.readEnumeration(stream) data = stream.read() initiator = None if len(data) == 2: initiator = Uint16BE.unpack(data) + MCSChannelID.USERCHANNEL_BASE elif len(data) > 2: raise ParsingError("Unexpected payload") return MCSAttachUserConfirmPDU(result, initiator)
def parseChannelJoinConfirm(self, stream: BytesIO) -> MCSChannelJoinConfirmPDU: """ Parse a Channel Join Confirm PDU :param stream: stream containing the data """ result = per.readEnumeration(stream) data = stream.read() if len(data) < 4 or len(data) == 5: raise ParsingError("Invalid Channel Join Confirm PDU received") elif len(data) >= 6: channelID = Uint16BE.unpack(data[4 : 6]) payload = data[6 :] else: channelID = None payload = b"" initiator = Uint16BE.unpack(data[0 : 2]) + MCSChannelID.USERCHANNEL_BASE requested = Uint16BE.unpack(data[2 : 4]) return MCSChannelJoinConfirmPDU(result, initiator, requested, channelID, payload)