class LivePlayerTab(RDPConnectionTab): """ Tab playing a live RDP connection as data is being received over the network. """ connectionClosed = pyqtSignal(object, name="Close") def __init__(self): RDPConnectionTab.__init__(self, QRemoteDesktop(1024, 768)) self.tcp = AsyncIOTCPLayer() self.tpkt = TPKTLayer() self.message = PlayerMessageLayer() self.eventHandler = PlayerMessageHandler(self.widget, self.text) Layer.chain(self.tcp, self.tpkt, self.message) self.message.addObserver(self.eventHandler) def getProtocol(self): return self.tcp def onDisconnection(self): self.connectionClosed.emit() def onClose(self): self.tcp.disconnect()
class LiveTab(BaseTab): """ Tab playing a live RDP connection as data is being received over the network. """ connectionClosed = Signal(object) def __init__(self, parent: QWidget = None): super().__init__(QRemoteDesktop(1024, 768), parent) self.tcp = AsyncIOTCPLayer() self.player = PlayerMessageLayer() self.eventHandler = PlayerMessageHandler(self.widget, self.text) LayerChainItem.chain(self.tcp, self.player) self.player.addObserver(self.eventHandler) def getProtocol(self): return self.tcp def onDisconnection(self): self.connectionClosed.emit() def onClose(self): self.tcp.disconnect(True)
class ReplayTab(BaseTab): """ Tab that displays a RDP Connection that is being replayed from a file. """ def __init__(self, fileName: str, parent: QWidget = None): """ :param fileName: name of the file to read. :param parent: parent widget. """ self.viewer = QRemoteDesktop(800, 600) super().__init__(self.viewer, parent) QApplication.instance().aboutToQuit.connect(self.onClose) self.fileName = fileName self.file = open(self.fileName, "rb") self.eventHandler = PlayerMessageHandler(self.widget, self.text) replay = Replay(self.file) self.thread = ReplayThread(replay) self.thread.eventReached.connect(self.readEvent) self.thread.timeUpdated.connect(self.onTimeUpdated) self.thread.clearNeeded.connect(self.clear) self.thread.start() self.controlBar = ReplayBar(replay.duration) self.controlBar.play.connect(self.thread.play) self.controlBar.pause.connect(self.thread.pause) self.controlBar.seek.connect(self.thread.seek) self.controlBar.speedChanged.connect(self.thread.setSpeed) self.layout().insertWidget(0, self.controlBar) self.player = PlayerMessageLayer() self.player.addObserver(self.eventHandler) def readEvent(self, position: int): """ Read an event from the file at the given position. :param position: the position of the event in the file. """ self.file.seek(position) data = self.file.read(8) self.player.recv(data) length = self.player.getDataLengthRequired() data = self.file.read(length) self.player.recv(data) def onTimeUpdated(self, currentTime: float): """ Called everytime the thread ticks. :param currentTime: the current time. """ self.controlBar.timeSlider.blockSignals(True) self.controlBar.timeSlider.setValue(int(currentTime * 1000)) self.controlBar.timeSlider.blockSignals(False) def clear(self): """ Clear the UI. """ self.viewer.clear() self.text.setText("") def onClose(self): self.thread.close() self.thread.wait()