finish connection sequence and clean code

This commit is contained in:
speyrefitte
2014-06-17 18:19:16 +02:00
parent 6844186434
commit b2b2d36dba
4 changed files with 866 additions and 651 deletions

View File

@@ -65,7 +65,7 @@ class RfbAdaptor(RfbObserver, QAdaptor):
else:
print "Receive image in bad format"
return
image = QtGui.QImage(data, width, height, imageFormat)
self._qRemoteDesktop.notifyImage(x, y, image)

529
rdpy/protocol/rdp/caps.py Normal file
View File

@@ -0,0 +1,529 @@
'''
@author: citronneur
'''
from rdpy.network.type import CompositeType, String, UInt8, UInt16Le, UInt32Le, sizeof, ArrayType, FactoryType
from rdpy.network.const import ConstAttributes, TypeAttributes
@ConstAttributes
@TypeAttributes(UInt16Le)
class CapsType(object):
'''
different type of capabilities
@see: http://msdn.microsoft.com/en-us/library/cc240486.aspx
'''
CAPSTYPE_GENERAL = 0x0001
CAPSTYPE_BITMAP = 0x0002
CAPSTYPE_ORDER = 0x0003
CAPSTYPE_BITMAPCACHE = 0x0004
CAPSTYPE_CONTROL = 0x0005
CAPSTYPE_ACTIVATION = 0x0007
CAPSTYPE_POINTER = 0x0008
CAPSTYPE_SHARE = 0x0009
CAPSTYPE_COLORCACHE = 0x000A
CAPSTYPE_SOUND = 0x000C
CAPSTYPE_INPUT = 0x000D
CAPSTYPE_FONT = 0x000E
CAPSTYPE_BRUSH = 0x000F
CAPSTYPE_GLYPHCACHE = 0x0010
CAPSTYPE_OFFSCREENCACHE = 0x0011
CAPSTYPE_BITMAPCACHE_HOSTSUPPORT = 0x0012
CAPSTYPE_BITMAPCACHE_REV2 = 0x0013
CAPSTYPE_VIRTUALCHANNEL = 0x0014
CAPSTYPE_DRAWNINEGRIDCACHE = 0x0015
CAPSTYPE_DRAWGDIPLUS = 0x0016
CAPSTYPE_RAIL = 0x0017
CAPSTYPE_WINDOW = 0x0018
CAPSETTYPE_COMPDESK = 0x0019
CAPSETTYPE_MULTIFRAGMENTUPDATE = 0x001A
CAPSETTYPE_LARGE_POINTER = 0x001B
CAPSETTYPE_SURFACE_COMMANDS = 0x001C
CAPSETTYPE_BITMAP_CODECS = 0x001D
CAPSSETTYPE_FRAME_ACKNOWLEDGE = 0x001E
@ConstAttributes
@TypeAttributes(UInt16Le)
class MajorType(object):
'''
use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
'''
OSMAJORTYPE_UNSPECIFIED = 0x0000
OSMAJORTYPE_WINDOWS = 0x0001
OSMAJORTYPE_OS2 = 0x0002
OSMAJORTYPE_MACINTOSH = 0x0003
OSMAJORTYPE_UNIX = 0x0004
OSMAJORTYPE_IOS = 0x0005
OSMAJORTYPE_OSX = 0x0006
OSMAJORTYPE_ANDROID = 0x0007
@ConstAttributes
@TypeAttributes(UInt16Le)
class MinorType(object):
'''
use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
'''
OSMINORTYPE_UNSPECIFIED = 0x0000
OSMINORTYPE_WINDOWS_31X = 0x0001
OSMINORTYPE_WINDOWS_95 = 0x0002
OSMINORTYPE_WINDOWS_NT = 0x0003
OSMINORTYPE_OS2_V21 = 0x0004
OSMINORTYPE_POWER_PC = 0x0005
OSMINORTYPE_MACINTOSH = 0x0006
OSMINORTYPE_NATIVE_XSERVER = 0x0007
OSMINORTYPE_PSEUDO_XSERVER = 0x0008
OSMINORTYPE_WINDOWS_RT = 0x0009
@ConstAttributes
@TypeAttributes(UInt16Le)
class GeneralExtraFlag(object):
'''
use in general capability
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
'''
FASTPATH_OUTPUT_SUPPORTED = 0x0001
NO_BITMAP_COMPRESSION_HDR = 0x0400
LONG_CREDENTIALS_SUPPORTED = 0x0004
AUTORECONNECT_SUPPORTED = 0x0008
ENC_SALTED_CHECKSUM = 0x0010
@ConstAttributes
@TypeAttributes(UInt8)
class Boolean(object):
FALSE = 0x00
TRUE = 0x01
@ConstAttributes
@TypeAttributes(UInt16Le)
class OrderFlag(object):
'''
use in order capability
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
'''
NEGOTIATEORDERSUPPORT = 0x0002
ZEROBOUNDSDELTASSUPPORT = 0x0008
COLORINDEXSUPPORT = 0x0020
SOLIDPATTERNBRUSHONLY = 0x0040
ORDERFLAGS_EXTRA_FLAGS = 0x0080
@ConstAttributes
@TypeAttributes(UInt8)
class Order(object):
'''
drawing orders supported
use in order capability
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
'''
TS_NEG_DSTBLT_INDEX = 0x00
TS_NEG_PATBLT_INDEX = 0x01
TS_NEG_SCRBLT_INDEX = 0x02
TS_NEG_MEMBLT_INDEX = 0x03
TS_NEG_MEM3BLT_INDEX = 0x04
TS_NEG_DRAWNINEGRID_INDEX = 0x07
TS_NEG_LINETO_INDEX = 0x08
TS_NEG_MULTI_DRAWNINEGRID_INDEX = 0x09
TS_NEG_SAVEBITMAP_INDEX = 0x0B
TS_NEG_MULTIDSTBLT_INDEX = 0x0F
TS_NEG_MULTIPATBLT_INDEX = 0x10
TS_NEG_MULTISCRBLT_INDEX = 0x11
TS_NEG_MULTIOPAQUERECT_INDEX = 0x12
TS_NEG_FAST_INDEX_INDEX = 0x13
TS_NEG_POLYGON_SC_INDEX = 0x14
TS_NEG_POLYGON_CB_INDEX = 0x15
TS_NEG_POLYLINE_INDEX = 0x16
TS_NEG_FAST_GLYPH_INDEX = 0x18
TS_NEG_ELLIPSE_SC_INDEX = 0x19
TS_NEG_ELLIPSE_CB_INDEX = 0x1A
TS_NEG_INDEX_INDEX = 0x1B
@ConstAttributes
@TypeAttributes(UInt16Le)
class OrderEx(object):
'''
extension orders
use in order capability
'''
ORDERFLAGS_EX_CACHE_BITMAP_REV3_SUPPORT = 0x0002
ORDERFLAGS_EX_ALTSEC_FRAME_MARKER_SUPPORT = 0x0004
@ConstAttributes
@TypeAttributes(UInt16Le)
class InputFlags(object):
'''
Input flag use in input capability
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
'''
INPUT_FLAG_SCANCODES = 0x0001
INPUT_FLAG_MOUSEX = 0x0004
INPUT_FLAG_FASTPATH_INPUT = 0x0008
INPUT_FLAG_UNICODE = 0x0010
INPUT_FLAG_FASTPATH_INPUT2 = 0x0020
INPUT_FLAG_UNUSED1 = 0x0040
INPUT_FLAG_UNUSED2 = 0x0080
TS_INPUT_FLAG_MOUSE_HWHEEL = 0x0100
@ConstAttributes
@TypeAttributes(UInt32Le)
class BrushSupport(object):
'''
Brush support of client
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
'''
BRUSH_DEFAULT = 0x00000000
BRUSH_COLOR_8x8 = 0x00000001
BRUSH_COLOR_FULL = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class GlyphSupport(object):
'''
Use by glyph order
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
'''
GLYPH_SUPPORT_NONE = 0x0000
GLYPH_SUPPORT_PARTIAL = 0x0001
GLYPH_SUPPORT_FULL = 0x0002
GLYPH_SUPPORT_ENCODE = 0x0003
@ConstAttributes
@TypeAttributes(UInt32Le)
class OffscreenSupportLevel(object):
'''
Use to determine offscreen cache level supported
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
'''
FALSE = 0x00000000
TRUE = 0x00000001
@ConstAttributes
@TypeAttributes(UInt32Le)
class VirtualChannelCompressionFlag(object):
'''
Use to determine virtual channel compression
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
'''
VCCAPS_NO_COMPR = 0x00000000
VCCAPS_COMPR_SC = 0x00000001
VCCAPS_COMPR_CS_8K = 0x00000002
@ConstAttributes
@TypeAttributes(UInt16Le)
class SoundFlag(object):
'''
Use in sound capability to inform it
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
'''
NONE = 0x0000
SOUND_BEEPS_FLAG = 0x0001
class CacheEntry(CompositeType):
'''
Use in capability cache exchange
@see: http://msdn.microsoft.com/en-us/library/cc240566.aspx
'''
def __init__(self):
CompositeType.__init__(self)
self.cacheEntries = UInt16Le()
self.cacheMaximumCellSize = UInt16Le()
class Capability(CompositeType):
'''
A capability
@see: http://msdn.microsoft.com/en-us/library/cc240486.aspx
'''
def __init__(self, capabilitySetType = UInt16Le(), capability = None):
CompositeType.__init__(self)
self.capabilitySetType = UInt16Le(capabilitySetType.value, constant = (not capability is None))
self.lengthCapability = UInt16Le(lambda:sizeof(self))
def CapabilityFactory():
'''
closure for capability factory
'''
if self.capabilitySetType == CapsType.CAPSTYPE_GENERAL:
return GeneralCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAP:
return BitmapCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_ORDER:
return OrderCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BITMAPCACHE:
return BitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_POINTER:
return PointerCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_INPUT:
return InputCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_BRUSH:
return BrushCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_GLYPHCACHE:
return GlyphCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_OFFSCREENCACHE:
return OffscreenBitmapCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_VIRTUALCHANNEL:
return VirtualChannelCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_SOUND:
return SoundCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_CONTROL:
return ControlCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_ACTIVATION:
return WindowActivationCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_FONT:
return FontCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_COLORCACHE:
return ColorCacheCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
elif self.capabilitySetType == CapsType.CAPSTYPE_SHARE:
return ShareCapability(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
else:
return String(readLen = UInt16Le(lambda:self.lengthCapability.value - 4))
if capability is None:
capability = CapabilityFactory
self.capability = FactoryType(capability)
class GeneralCapability(CompositeType):
'''
General capability (protocol version and compression mode)
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240549.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.osMajorType = UInt16Le()
self.osMinorType = UInt16Le()
self.protocolVersion = UInt16Le(0x0200, constant = True)
self.pad2octetsA = UInt16Le()
self.generalCompressionTypes = UInt16Le(0, constant = True)
self.extraFlags = UInt16Le()
self.updateCapabilityFlag = UInt16Le(0, constant = True)
self.remoteUnshareFlag = UInt16Le(0, constant = True)
self.generalCompressionLevel = UInt16Le(0, constant = True)
self.refreshRectSupport = UInt8()
self.suppressOutputSupport = UInt8()
class BitmapCapability(CompositeType):
'''
Bitmap format Capability
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240554.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.preferredBitsPerPixel = UInt16Le()
self.receive1BitPerPixel = UInt16Le(0x0001)
self.receive4BitsPerPixel = UInt16Le(0x0001)
self.receive8BitsPerPixel = UInt16Le(0x0001)
self.desktopWidth = UInt16Le()
self.desktopHeight = UInt16Le()
self.pad2octets = UInt16Le()
self.desktopResizeFlag = UInt16Le()
self.bitmapCompressionFlag = UInt16Le(0x0001, constant = True)
self.highColorFlags = UInt8(0)
self.drawingFlags = UInt8()
self.multipleRectangleSupport = UInt16Le(0x0001, constant = True)
self.pad2octetsB = UInt16Le()
class OrderCapability(CompositeType):
'''
Order capability list all drawing order supported
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240556.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.terminalDescriptor = String("\x00" * 16, readLen = UInt8(16))
self.pad4octetsA = UInt32Le(0)
self.desktopSaveXGranularity = UInt16Le(1)
self.desktopSaveYGranularity = UInt16Le(20)
self.pad2octetsA = UInt16Le(0)
self.maximumOrderLevel = UInt16Le(1)
self.numberFonts = UInt16Le()
self.orderFlags = OrderFlag.NEGOTIATEORDERSUPPORT
self.orderSupport = ArrayType(UInt8, init = [UInt8(0) for i in range (0, 32)], readLen = UInt8(32))
self.textFlags = UInt16Le()
self.orderSupportExFlags = UInt16Le()
self.pad4octetsB = UInt32Le()
self.desktopSaveSize = UInt32Le(480 * 480)
self.pad2octetsC = UInt16Le()
self.pad2octetsD = UInt16Le()
self.textANSICodePage = UInt16Le(0)
self.pad2octetsE = UInt16Le()
class BitmapCacheCapability(CompositeType):
'''
Order use to cache bitmap very usefull
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240559.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.pad1 = UInt32Le()
self.pad2 = UInt32Le()
self.pad3 = UInt32Le()
self.pad4 = UInt32Le()
self.pad5 = UInt32Le()
self.pad6 = UInt32Le()
self.cache0Entries = UInt16Le()
self.cache0MaximumCellSize = UInt16Le()
self.cache1Entries = UInt16Le()
self.cache1MaximumCellSize = UInt16Le()
self.cache2Entries = UInt16Le()
self.cache2MaximumCellSize = UInt16Le()
class PointerCapability(CompositeType):
'''
Use to indicate pointer handle of client
Paint by server or per client
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240562.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.colorPointerFlag = UInt16Le()
self.colorPointerCacheSize = UInt16Le()
self.pointerCacheSize = UInt16Le()
class InputCapability(CompositeType):
'''
Use to indicate input capabilities
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240563.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.inputFlags = UInt16Le()
self.pad2octetsA = UInt16Le()
#same value as gcc.ClientCoreSettings.kbdLayout
self.keyboardLayout = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardType
self.keyboardType = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardSubType
self.keyboardSubType = UInt32Le()
#same value as gcc.ClientCoreSettings.keyboardFnKeys
self.keyboardFunctionKey = UInt32Le()
#same value as gcc.ClientCoreSettingrrs.imeFileName
self.imeFileName = String("\x00" * 64, readLen = UInt8(64))
class BrushCapability(CompositeType):
'''
Use to indicate brush capability
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240564.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.brushSupportLevel = BrushSupport.BRUSH_DEFAULT
class GlyphCapability(CompositeType):
'''
Use in font order
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240565.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.glyphCache = ArrayType(CacheEntry, init = [CacheEntry() for i in range(0,10)], readLen = UInt8(10))
self.fragCache = UInt32Le()
#all fonts are sent with bitmap format (very expensive)
self.glyphSupportLevel = GlyphSupport.GLYPH_SUPPORT_NONE
self.pad2octets = UInt16Le()
class OffscreenBitmapCacheCapability(CompositeType):
'''
use to cached bitmap in offscreen area
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240550.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.offscreenSupportLevel = OffscreenSupportLevel.FALSE
self.offscreenCacheSize = UInt16Le()
self.offscreenCacheEntries = UInt16Le()
class VirtualChannelCapability(CompositeType):
'''
use to determine virtual channel compression
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240551.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.flags = VirtualChannelCompressionFlag.VCCAPS_NO_COMPR
self.VCChunkSize = UInt32Le(optional = True)
class SoundCapability(CompositeType):
'''
use to exchange sound capability
client -> server
@see: http://msdn.microsoft.com/en-us/library/cc240552.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.soundFlags = SoundFlag.NONE
self.pad2octetsA = UInt16Le()
class ControlCapability(CompositeType):
'''
client -> server but server ignore contents! Thanks krosoft for brandwidth
@see: http://msdn.microsoft.com/en-us/library/cc240568.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.controlFlags = UInt16Le()
self.remoteDetachFlag = UInt16Le()
self.controlInterest = UInt16Le(0x0002)
self.detachInterest = UInt16Le(0x0002)
class WindowActivationCapability(CompositeType):
'''
client -> server but server ignore contents! Thanks krosoft for brandwidth
@see: http://msdn.microsoft.com/en-us/library/cc240569.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.helpKeyFlag = UInt16Le()
self.helpKeyIndexFlag = UInt16Le()
self.helpExtendedKeyFlag = UInt16Le()
self.windowManagerKeyFlag = UInt16Le()
class FontCapability(CompositeType):
'''
use to indicate font support
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240571.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.fontSupportFlags = UInt16Le(0x0001)
self.pad2octets = UInt16Le()
class ColorCacheCapability(CompositeType):
'''
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc241564.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.colorTableCacheSize = UInt16Le(0x0006)
self.pad2octets = UInt16Le()
class ShareCapability(CompositeType):
'''
use to advertise channel id of server
client -> server
server -> client
@see: http://msdn.microsoft.com/en-us/library/cc240570.aspx
'''
def __init__(self, readLen = None):
CompositeType.__init__(self, readLen = readLen)
self.nodeId = UInt16Le()
self.pad2octets = UInt16Le()

View File

@@ -3,7 +3,7 @@
'''
from rdpy.network.const import ConstAttributes, TypeAttributes
from rdpy.network.layer import LayerAutomata
from rdpy.network.layer import LayerAutomata, Layer
from rdpy.network.type import sizeof, Stream, UInt8, UInt16Be
from rdpy.network.error import InvalidExpectedDataException, InvalidValue, InvalidSize
from rdpy.protocol.rdp.ber import writeLength
@@ -46,6 +46,53 @@ class MCS(LayerAutomata):
the main layer of RDP protocol
is why he can do everything and more!
'''
class MCSProxySender(Layer):
'''
Proxy use to set as trnsport layer for upper channel
use to abstract channel id for presentation layer
'''
def __init__(self, mcs, channelId):
'''
ctor
@param mcs: mcs layer use as proxy
@param channelId: channel id for presentation layer
'''
self._mcs = mcs
self._channelId = channelId
def send(self, data):
'''
a send proxy function, use channel id and specific
send function of mcs layer
'''
self._mcs.send(self._channelId, data)
def getUserId(self):
'''
@return: mcs user id
'''
return self._mcs._userId
def getChannelId(self):
'''
@return: return channel id of proxy
'''
return self._channelId
def getGCCClientSettings(self):
'''
@return: mcs layer gcc client settings
'''
return self._mcs._clientSettings
def getGCCServerSettings(self):
'''
@return: mcs layer gcc server settings
'''
return self._mcs._serverSettings
def __init__(self, presentation):
'''
ctor call base class ctor
@@ -85,8 +132,8 @@ class MCS(LayerAutomata):
#try connection on all requested channel
for (channelId, layer) in self._channelIds.iteritems():
if self._channelIdsRequest[channelId] and not layer is None:
layer._transport = self
layer._channelId = channelId
#use proxy foreach channell
layer._transport = MCS.MCSProxySender(self, channelId)
layer.connect()
def sendConnectInitial(self):
@@ -164,7 +211,7 @@ class MCS(LayerAutomata):
#build channel list because we have user id
#add default channel + channels accepted by gcc connection sequence
self._channelIds[self._userId + Channel.MCS_USERCHANNEL_BASE] = None#TODO + [(x, False) for x in self._serverSettings.channelsId])
self._channelIds[self._userId + Channel.MCS_USERCHANNEL_BASE] = None
self.connectNextChannel()

File diff suppressed because it is too large Load Diff