diff --git a/rdpy/display/qt.py b/rdpy/display/qt.py new file mode 100644 index 0000000..c6d883e --- /dev/null +++ b/rdpy/display/qt.py @@ -0,0 +1,120 @@ +''' +@author: sylvain +''' +from PyQt4 import QtGui +from rdpy.protocol.rfb.rfb import RfbObserver + +class QAdaptor(object): + ''' + adaptor model with link beetween protocol + and qt widget + ''' + def __init__(self): + ''' + constructor + must set qRemoteDesktop attribute + ''' + #qwidget use for render + self._qRemoteDesktop = None + + def sendMouseEvent(self, e): + ''' + interface to send mouse event + to protocol stack + @param e: qEvent + ''' + pass + + def sendKeyEvent(self, e): + ''' + interface to send key event + to protocol stack + @param e: qEvent + ''' + pass + + +class RfbAdaptor(RfbObserver, QAdaptor): + ''' + QAdaptor for specific RFB protocol stack + is to an RFB observer + ''' + def __init__(self, rfb): + ''' + ctor + @param rfb: RFB protocol stack + ''' + self._rfb = rfb + #set RFB observer to + self._rfb.addObserver(self) + + def notifyFramebufferUpdate(self, width, height, x, y, pixelFormat, encoding, data): + ''' + implement RfbAdaptor interface + @param width: width of new image + @param height: height of new image + @param x: xpositionof new image + @param y: y position of new image + @param pixelFormat: pixefFormat structure in rfb.message.PixelFormat + @param encoding: encoding typpe rfb.message.Encoding + @param data: image data in accordance with pixelformat and encoding + ''' + imageFormat = None + if pixelFormat.BitsPerPixel.value == 32 and pixelFormat.RedShift.value == 16: + imageFormat = QtGui.QImage.Format_RGB32 + else: + print "Receive image in bad format" + return + + image = QtGui.QImage(data, width, height, imageFormat) + self._qRemoteDesktop.notifyImage(x, y, image) + + def sendMouseEvent(self, e): + ''' + convert qt mouse event to rfb mouse event + send mouse event to rfb protocol stack + @param e: qEvent + ''' + self._rfb.sendPointerEvent(0, e.pos().x(), e.pos().y()) + + def sendKeyEvent(self, e): + ''' + convert qt key press event to rfb press event + send key event to protocol stack + @param e: qevent + ''' + self._rfb.sendKeyEvent(True, e.nativeVirtualKey()) + + +class QRemoteDesktop(QtGui.QWidget): + ''' + Class that represent the main + widget + ''' + def __init__(self, adaptor): + super(QRemoteDesktop, self).__init__() + self._adaptor = adaptor + self._adaptor._qRemoteDesktop = self + self._refresh = [] + self.setMouseTracking(True) + + def notifyImage(self, x, y, qimage): + self._refresh.append({"x" : x, "y" : y, "image" : qimage}) + self.update() + + def paintEvent(self, e): + if self._refresh == []: + return + qp = QtGui.QPainter() + qp.begin(self) + for image in self._refresh: + qp.drawImage(image["x"], image["y"], image["image"]) + qp.end() + + self._lastReceive = [] + + def mouseMoveEvent(self, event): + self._adaptor.sendMouseEvent(event) + + def keyPressEvent(self, event): + self._adaptor.sendKeyEvent(event) \ No newline at end of file diff --git a/rdpy/display/qt/__init__.py b/rdpy/display/qt/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/rdpy/display/qt/adaptor.py b/rdpy/display/qt/adaptor.py deleted file mode 100644 index 0f31028..0000000 --- a/rdpy/display/qt/adaptor.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -Created on 4 sept. 2013 -@author: sylvain -''' -from PyQt4 import QtGui -from rdpy.protocol.rfb.observer import RfbObserver - -class QAdaptor(object): - ''' - Adaptor for all qt - ''' - def __init__(self): - self._observers = [] - - def addObserver(self, observer): - self._observers.append(observer) - - def notifyImage(self, x, y, qimage): - for observer in self._observers: - observer.notifyImage(x, y, qimage) - - def sendMouseEvent(self, e): - pass - def sendKeyEvent(self, e): - pass - - -class RfbAdaptor(RfbObserver, QAdaptor): - ''' - classdocs - ''' - - def __init__(self, rfb): - QAdaptor.__init__(self) - self._rfb = rfb - self._rfb.addObserver(self) - - def notifyFramebufferUpdate(self, width, height, x, y, pixelFormat, encoding, data): - ''' - implement RfbAdaptor interface - ''' - imageFormat = None - if pixelFormat.BitsPerPixel.value == 32 and pixelFormat.RedShift.value == 16: - imageFormat = QtGui.QImage.Format_RGB32 - else: - print "Receive image in bad format" - return - - image = QtGui.QImage(data, width, height, imageFormat) - self.notifyImage(x, y, image) - - def sendMouseEvent(self, e): - ''' - convert qt mouse event to rfb mouse event - ''' - self._rfb.sendPointerEvent(0, e.pos().x(), e.pos().y()) - - def sendKeyEvent(self, e): - ''' - convert qt key press event to rfb press event - ''' - self._rfb.sendKeyEvent(True, e.nativeVirtualKey()) \ No newline at end of file diff --git a/rdpy/display/qt/observer.py b/rdpy/display/qt/observer.py deleted file mode 100644 index 0428bf2..0000000 --- a/rdpy/display/qt/observer.py +++ /dev/null @@ -1,12 +0,0 @@ -''' -Created on 4 sept. 2013 - -@author: sylvain -''' - -class QObserver(object): - ''' - classdocs - ''' - def notifyImage(self, x, y, qimage): - pass \ No newline at end of file diff --git a/rdpy/display/qt/widget.py b/rdpy/display/qt/widget.py deleted file mode 100644 index f8f6cf7..0000000 --- a/rdpy/display/qt/widget.py +++ /dev/null @@ -1,38 +0,0 @@ -''' -Created on 4 sept. 2013 - -@author: sylvain -''' - -from PyQt4 import QtGui -from observer import QObserver - -class QRemoteDesktop(QtGui.QWidget, QObserver): - - def __init__(self, adaptor): - super(QRemoteDesktop, self).__init__() - self._adaptor = adaptor - self._adaptor.addObserver(self) - self._refresh = [] - self.setMouseTracking(True) - - def notifyImage(self, x, y, qimage): - self._refresh.append({"x" : x, "y" : y, "image" : qimage}) - self.update() - - def paintEvent(self, e): - if self._refresh == []: - return - qp = QtGui.QPainter() - qp.begin(self) - for image in self._refresh: - qp.drawImage(image["x"], image["y"], image["image"]) - qp.end() - - self._lastReceive = [] - - def mouseMoveEvent(self, event): - self._adaptor.sendMouseEvent(event) - - def keyPressEvent(self, event): - self._adaptor.sendKeyEvent(event) \ No newline at end of file diff --git a/rdpy/main.py b/rdpy/main.py deleted file mode 100644 index 9556be8..0000000 --- a/rdpy/main.py +++ /dev/null @@ -1,29 +0,0 @@ -''' -Created on 4 sept. 2013 - -@author: sylvain -''' -import sys -from PyQt4 import QtGui -from rdpy.display.qt import adaptor, widget -from rdpy.protocol.rfb import rfb, factory -from rdpy.protocol.rdp import tpkt, tpdu, mcs -from twisted.internet import ssl -from OpenSSL import SSL - -if __name__ == '__main__': - #app = QtGui.QApplication(sys.argv) - #import qt4reactor - #qt4reactor.install() - - #protocol = rfb.Rfb(rfb.Rfb.CLIENT) - #w = widget.QRemoteDesktop(adaptor.RfbAdaptor(protocol)) - #w.resize(1000, 700) - #w.setWindowTitle('QVNCViewer') - #w.show() - from twisted.internet import reactor - #reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol)) - #reactor.connectTCP("192.168.1.90", 3389, factory.RfbFactory(tpkt.TPKT(tpdu.TPDU(mcs.MCS())))) - reactor.connectTCP("192.168.135.50", 3389, factory.RfbFactory(tpkt.TPKT(tpdu.TPDU(mcs.MCS())))) - reactor.run() - #sys.exit(app.exec_()) \ No newline at end of file diff --git a/rdpy/protocol/rfb/factory.py b/rdpy/protocol/rdp/rdp.py similarity index 73% rename from rdpy/protocol/rfb/factory.py rename to rdpy/protocol/rdp/rdp.py index ab911fb..0f8432c 100644 --- a/rdpy/protocol/rfb/factory.py +++ b/rdpy/protocol/rdp/rdp.py @@ -1,16 +1,14 @@ ''' -Created on 22 aout 2013 - @author: sylvain ''' from twisted.internet import protocol - -class RfbFactory(protocol.Factory): +import tpkt, tpdu, mcs +class Factory(protocol.Factory): ''' - classdocs + Factory of RFB protocol ''' - def __init__(self, protocol): - self._protocol = protocol + def __init__(self): + self._protocol = tpkt.TPKT(tpdu.TPDU(mcs.MCS())) def buildProtocol(self, addr): return self._protocol; diff --git a/rdpy/protocol/rfb/observer.py b/rdpy/protocol/rfb/observer.py deleted file mode 100644 index 59ef141..0000000 --- a/rdpy/protocol/rfb/observer.py +++ /dev/null @@ -1,23 +0,0 @@ -''' -Created on 4 sept. 2013 - -@author: sylvain -''' - -class RfbObserver(object): - ''' - Rfb protocol obserser - ''' - def notifyFramebufferUpdate(self, width, height, x, y, pixelFormat, encoding, data): - ''' - recv framebuffer update - width : width of image - height : height of image - x : x position - y : y position - pixelFormat : pixel format struct from rfb.types - encoding : encoding struct from rfb.types - data : in respect of dataFormat and pixelFormat - ''' - pass - \ No newline at end of file diff --git a/rdpy/protocol/rfb/rfb.py b/rdpy/protocol/rfb/rfb.py index 4a3f7b7..a77f49c 100644 --- a/rdpy/protocol/rfb/rfb.py +++ b/rdpy/protocol/rfb/rfb.py @@ -1,24 +1,26 @@ ''' @author: sylvain ''' - +from twisted.internet import protocol from rdpy.protocol.network.type import String, UInt8, UInt16Be, UInt32Be from rdpy.protocol.network.layer import RawLayer from message import * +class ProtocolMode(object): + CLIENT = 0 + SERVER = 1 + class Rfb(RawLayer): ''' implements rfb protocol ''' - CLIENT = 0 - SERVER = 1 def __init__(self, mode): ''' constructor mode can be only client or server mode in this RDPY version only client mode is supported - @param mode: Rfb.CLIENT | Rfb.SERVER + @param mode: ProtocolMode.CLIENT | ProtocolMode.SERVER ''' RawLayer.__init__(self) #usefull for rfb protocol @@ -85,7 +87,7 @@ class Rfb(RawLayer): call when transport layer connection is made ''' - if self._mode == Rfb.CLIENT: + if self._mode == ProtocolMode.CLIENT: self.expect(12, self.readProtocolVersion) else: self.send(self._version) @@ -267,4 +269,40 @@ class Rfb(RawLayer): ''' write client cut text event packet ''' - self.send((ClientToServerMessages.CUT_TEXT, ClientCutText(text))) \ No newline at end of file + self.send((ClientToServerMessages.CUT_TEXT, ClientCutText(text))) + +class Factory(protocol.Factory): + ''' + Factory of RFB protocol + ''' + def __init__(self, mode): + self._protocol = Rfb(mode) + + def buildProtocol(self, addr): + return self._protocol; + + def startedConnecting(self, connector): + print 'Started to connect.' + + def clientConnectionLost(self, connector, reason): + print 'Lost connection. Reason:', reason + + def clientConnectionFailed(self, connector, reason): + print 'Connection failed. Reason:', reason + +class RfbObserver(object): + ''' + Rfb protocol obserser + ''' + def notifyFramebufferUpdate(self, width, height, x, y, pixelFormat, encoding, data): + ''' + recv framebuffer update + width : width of image + height : height of image + x : x position + y : y position + pixelFormat : pixel format struct from rfb.types + encoding : encoding struct from rfb.types + data : in respect of dataFormat and pixelFormat + ''' + pass \ No newline at end of file diff --git a/rdpy/rdpclient.py b/rdpy/rdpclient.py new file mode 100644 index 0000000..3800a1a --- /dev/null +++ b/rdpy/rdpclient.py @@ -0,0 +1,13 @@ +''' +Created on 4 sept. 2013 + +@author: sylvain +''' +from rdpy.protocol.rdp import rdp + +if __name__ == '__main__': + from twisted.internet import reactor + #reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol)) + #reactor.connectTCP("192.168.1.90", 3389, factory.RfbFactory(tpkt.TPKT(tpdu.TPDU(mcs.MCS())))) + reactor.connectTCP("192.168.135.50", 3389, rdp.Factory()) + reactor.run() \ No newline at end of file diff --git a/rdpy/rdpserver.py b/rdpy/rdpserver.py new file mode 100644 index 0000000..5e89d23 --- /dev/null +++ b/rdpy/rdpserver.py @@ -0,0 +1,13 @@ +''' +@author: sylvain +''' + +from rdpy.protocol.rfb import factory +from rdpy.protocol.rdp import tpkt, tpdu, mcs + +if __name__ == '__main__': + from twisted.internet import reactor + #reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol)) + #reactor.connectTCP("192.168.1.90", 3389, factory.RfbFactory(tpkt.TPKT(tpdu.TPDU(mcs.MCS())))) + reactor.listenTCP(33389, factory.RfbFactory(tpkt.TPKT(tpdu.TPDU(mcs.MCS())))) + reactor.run() \ No newline at end of file diff --git a/rdpy/vncclient.py b/rdpy/vncclient.py index b1d9151..ba0b1ac 100644 --- a/rdpy/vncclient.py +++ b/rdpy/vncclient.py @@ -4,8 +4,8 @@ import sys from PyQt4 import QtGui -from rdpy.display.qt import adaptor, widget -from rdpy.protocol.rfb import rfb, factory +from rdpy.display.qt import RfbAdaptor, QRemoteDesktop +from rdpy.protocol.rfb import rfb if __name__ == '__main__': #create application @@ -16,12 +16,12 @@ if __name__ == '__main__': qt4reactor.install() #create rfb protocol - protocol = rfb.Rfb(rfb.Rfb.CLIENT) - w = widget.QRemoteDesktop(adaptor.RfbAdaptor(protocol)) + factory = rfb.Factory(rfb.ProtocolMode.CLIENT) + w = QRemoteDesktop(RfbAdaptor(factory._protocol)) w.resize(1000, 700) w.setWindowTitle('vncclient') w.show() from twisted.internet import reactor - reactor.connectTCP("127.0.0.1", 5901, factory.RfbFactory(protocol)) + reactor.connectTCP("127.0.0.1", 5901, factory) reactor.run() sys.exit(app.exec_()) \ No newline at end of file