Remove umaintained and untested Python tools
diff --git a/python-client/.gitignore b/python-client/.gitignore
deleted file mode 100644
index 5da7ef5..0000000
--- a/python-client/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*.pyc
-*.pyo
-
diff --git a/python-client/tcprelay.py b/python-client/tcprelay.py
deleted file mode 100644
index add200c..0000000
--- a/python-client/tcprelay.py
+++ /dev/null
@@ -1,148 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-#
-#	tcprelay.py - TCP connection relay for usbmuxd
-#
-# Copyright (C) 2009	Hector Martin "marcan" <hector@marcansoft.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 or version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-import usbmux
-import SocketServer
-import select
-from optparse import OptionParser
-import sys
-import threading
-
-class SocketRelay(object):
-	def __init__(self, a, b, maxbuf=65535):
-		self.a = a
-		self.b = b
-		self.atob = ""
-		self.btoa = ""
-		self.maxbuf = maxbuf
-	def handle(self):
-		while True:
-			rlist = []
-			wlist = []
-			xlist = [self.a, self.b]
-			if self.atob:
-				wlist.append(self.b)
-			if self.btoa:
-				wlist.append(self.a)
-			if len(self.atob) < self.maxbuf:
-				rlist.append(self.a)
-			if len(self.btoa) < self.maxbuf:
-				rlist.append(self.b)
-			rlo, wlo, xlo = select.select(rlist, wlist, xlist)
-			if xlo:
-				return
-			if self.a in wlo:
-				n = self.a.send(self.btoa)
-				self.btoa = self.btoa[n:]
-			if self.b in wlo:
-				n = self.b.send(self.atob)
-				self.atob = self.atob[n:]
-			if self.a in rlo:
-				s = self.a.recv(self.maxbuf - len(self.atob))
-				if not s:
-					return
-				self.atob += s
-			if self.b in rlo:
-				s = self.b.recv(self.maxbuf - len(self.btoa))
-				if not s:
-					return
-				self.btoa += s
-			#print "Relay iter: %8d atob, %8d btoa, lists: %r %r %r"%(len(self.atob), len(self.btoa), rlo, wlo, xlo)
-
-class TCPRelay(SocketServer.BaseRequestHandler):
-	def handle(self):
-		print "Incoming connection to %d"%self.server.server_address[1]
-		mux = usbmux.USBMux(options.sockpath)
-		print "Waiting for devices..."
-		if not mux.devices:
-			mux.process(1.0)
-		if not mux.devices:
-			print "No device found"
-			self.request.close()
-			return
-		dev = mux.devices[0]
-		print "Connecting to device %s"%str(dev)
-		dsock = mux.connect(dev, self.server.rport)
-		lsock = self.request
-		print "Connection established, relaying data"
-		try:
-			fwd = SocketRelay(dsock, lsock, self.server.bufsize * 1024)
-			fwd.handle()
-		finally:
-			dsock.close()
-			lsock.close()
-		print "Connection closed"
-
-class TCPServer(SocketServer.TCPServer):
-	allow_reuse_address = True
-
-class ThreadedTCPServer(SocketServer.ThreadingMixIn, TCPServer):
-	pass
-
-HOST = "localhost"
-
-parser = OptionParser(usage="usage: %prog [OPTIONS] RemotePort[:LocalPort] [RemotePort[:LocalPort]]...")
-parser.add_option("-t", "--threaded", dest='threaded', action='store_true', default=False, help="use threading to handle multiple connections at once")
-parser.add_option("-b", "--bufsize", dest='bufsize', action='store', metavar='KILOBYTES', type='int', default=128, help="specify buffer size for socket forwarding")
-parser.add_option("-s", "--socket", dest='sockpath', action='store', metavar='PATH', type='str', default=None, help="specify the path of the usbmuxd socket")
-
-options, args = parser.parse_args()
-
-serverclass = TCPServer
-if options.threaded:
-	serverclass = ThreadedTCPServer
-
-if len(args) == 0:
-	parser.print_help()
-	sys.exit(1)
-
-ports = []
-
-for arg in args:
-	try:
-		if ':' in arg:
-			rport, lport = arg.split(":")
-			rport = int(rport)
-			lport = int(lport)
-			ports.append((rport, lport))
-		else:
-			ports.append((int(arg), int(arg)))
-	except:
-		parser.print_help()
-		sys.exit(1)
-
-servers=[]
-
-for rport, lport in ports:
-	print "Forwarding local port %d to remote port %d"%(lport, rport)
-	server = serverclass((HOST, lport), TCPRelay)
-	server.rport = rport
-	server.bufsize = options.bufsize
-	servers.append(server)
-
-alive = True
-
-while alive:
-	try:
-		rl, wl, xl = select.select(servers, [], [])
-		for server in rl:
-			server.handle_request()
-	except:
-		alive = False
diff --git a/python-client/usbmux.py b/python-client/usbmux.py
deleted file mode 100644
index 79ec26a..0000000
--- a/python-client/usbmux.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-#
-#	usbmux.py - usbmux client library for Python
-#
-# Copyright (C) 2009	Hector Martin "marcan" <hector@marcansoft.com>
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 2 or version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-import socket, struct, select, sys
-
-try:
-	import plistlib
-	haveplist = True
-except:
-	haveplist = False
-
-class MuxError(Exception):
-	pass
-
-class MuxVersionError(MuxError):
-	pass
-
-class SafeStreamSocket:
-	def __init__(self, address, family):
-		self.sock = socket.socket(family, socket.SOCK_STREAM)
-		self.sock.connect(address)
-	def send(self, msg):
-		totalsent = 0
-		while totalsent < len(msg):
-			sent = self.sock.send(msg[totalsent:])
-			if sent == 0:
-				raise MuxError("socket connection broken")
-			totalsent = totalsent + sent
-	def recv(self, size):
-		msg = ''
-		while len(msg) < size:
-			chunk = self.sock.recv(size-len(msg))
-			if chunk == '':
-				raise MuxError("socket connection broken")
-			msg = msg + chunk
-		return msg
-
-class MuxDevice(object):
-	def __init__(self, devid, usbprod, serial, location):
-		self.devid = devid
-		self.usbprod = usbprod
-		self.serial = serial
-		self.location = location
-	def __str__(self):
-		return "<MuxDevice: ID %d ProdID 0x%04x Serial '%s' Location 0x%x>"%(self.devid, self.usbprod, self.serial, self.location)
-
-class BinaryProtocol(object):
-	TYPE_RESULT = 1
-	TYPE_CONNECT = 2
-	TYPE_LISTEN = 3
-	TYPE_DEVICE_ADD = 4
-	TYPE_DEVICE_REMOVE = 5
-	VERSION = 0
-	def __init__(self, socket):
-		self.socket = socket
-		self.connected = False
-
-	def _pack(self, req, payload):
-		if req == self.TYPE_CONNECT:
-			return struct.pack("IH", payload['DeviceID'], payload['PortNumber']) + "\x00\x00"
-		elif req == self.TYPE_LISTEN:
-			return ""
-		else:
-			raise ValueError("Invalid outgoing request type %d"%req)
-	
-	def _unpack(self, resp, payload):
-		if resp == self.TYPE_RESULT:
-			return {'Number':struct.unpack("I", payload)[0]}
-		elif resp == self.TYPE_DEVICE_ADD:
-			devid, usbpid, serial, pad, location = struct.unpack("IH256sHI", payload)
-			serial = serial.split("\0")[0]
-			return {'DeviceID': devid, 'Properties': {'LocationID': location, 'SerialNumber': serial, 'ProductID': usbpid}}
-		elif resp == self.TYPE_DEVICE_REMOVE:
-			devid = struct.unpack("I", payload)[0]
-			return {'DeviceID': devid}
-		else:
-			raise MuxError("Invalid incoming request type %d"%req)
-
-	def sendpacket(self, req, tag, payload={}):
-		payload = self._pack(req, payload)
-		if self.connected:
-			raise MuxError("Mux is connected, cannot issue control packets")
-		length = 16 + len(payload)
-		data = struct.pack("IIII", length, self.VERSION, req, tag) + payload
-		self.socket.send(data)
-	def getpacket(self):
-		if self.connected:
-			raise MuxError("Mux is connected, cannot issue control packets")
-		dlen = self.socket.recv(4)
-		dlen = struct.unpack("I", dlen)[0]
-		body = self.socket.recv(dlen - 4)
-		version, resp, tag = struct.unpack("III",body[:0xc])
-		if version != self.VERSION:
-			raise MuxVersionError("Version mismatch: expected %d, got %d"%(self.VERSION,version))
-		payload = self._unpack(resp, body[0xc:])
-		return (resp, tag, payload)
-
-class PlistProtocol(BinaryProtocol):
-	TYPE_RESULT = "Result"
-	TYPE_CONNECT = "Connect"
-	TYPE_LISTEN = "Listen"
-	TYPE_DEVICE_ADD = "Attached"
-	TYPE_DEVICE_REMOVE = "Detached" #???
-	TYPE_PLIST = 8
-	VERSION = 1
-	def __init__(self, socket):
-		if not haveplist:
-			raise Exception("You need the plistlib module")
-		BinaryProtocol.__init__(self, socket)
-	
-	def _pack(self, req, payload):
-		return payload
-	
-	def _unpack(self, resp, payload):
-		return payload
-	
-	def sendpacket(self, req, tag, payload={}):
-		payload['ClientVersionString'] = 'usbmux.py by marcan'
-		if isinstance(req, int):
-			req = [self.TYPE_CONNECT, self.TYPE_LISTEN][req-2]
-		payload['MessageType'] = req
-		payload['ProgName'] = 'tcprelay'
-		BinaryProtocol.sendpacket(self, self.TYPE_PLIST, tag, plistlib.writePlistToString(payload))
-	def getpacket(self):
-		resp, tag, payload = BinaryProtocol.getpacket(self)
-		if resp != self.TYPE_PLIST:
-			raise MuxError("Received non-plist type %d"%resp)
-		payload = plistlib.readPlistFromString(payload)
-		return payload['MessageType'], tag, payload
-
-class MuxConnection(object):
-	def __init__(self, socketpath, protoclass):
-		self.socketpath = socketpath
-		if sys.platform in ['win32', 'cygwin']:
-			family = socket.AF_INET
-			address = ('127.0.0.1', 27015)
-		else:
-			family = socket.AF_UNIX
-			address = self.socketpath
-		self.socket = SafeStreamSocket(address, family)
-		self.proto = protoclass(self.socket)
-		self.pkttag = 1
-		self.devices = []
-
-	def _getreply(self):
-		while True:
-			resp, tag, data = self.proto.getpacket()
-			if resp == self.proto.TYPE_RESULT:
-				return tag, data
-			else:
-				raise MuxError("Invalid packet type received: %d"%resp)
-	def _processpacket(self):
-		resp, tag, data = self.proto.getpacket()
-		if resp == self.proto.TYPE_DEVICE_ADD:
-			self.devices.append(MuxDevice(data['DeviceID'], data['Properties']['ProductID'], data['Properties']['SerialNumber'], data['Properties']['LocationID']))
-		elif resp == self.proto.TYPE_DEVICE_REMOVE:
-			for dev in self.devices:
-				if dev.devid == data['DeviceID']:
-					self.devices.remove(dev)
-		elif resp == self.proto.TYPE_RESULT:
-			raise MuxError("Unexpected result: %d"%resp)
-		else:
-			raise MuxError("Invalid packet type received: %d"%resp)
-	def _exchange(self, req, payload={}):
-		mytag = self.pkttag
-		self.pkttag += 1
-		self.proto.sendpacket(req, mytag, payload)
-		recvtag, data = self._getreply()
-		if recvtag != mytag:
-			raise MuxError("Reply tag mismatch: expected %d, got %d"%(mytag, recvtag))
-		return data['Number']
-
-	def listen(self):
-		ret = self._exchange(self.proto.TYPE_LISTEN)
-		if ret != 0:
-			raise MuxError("Listen failed: error %d"%ret)
-	def process(self, timeout=None):
-		if self.proto.connected:
-			raise MuxError("Socket is connected, cannot process listener events")
-		rlo, wlo, xlo = select.select([self.socket.sock], [], [self.socket.sock], timeout)
-		if xlo:
-			self.socket.sock.close()
-			raise MuxError("Exception in listener socket")
-		if rlo:
-			self._processpacket()
-	def connect(self, device, port):
-		ret = self._exchange(self.proto.TYPE_CONNECT, {'DeviceID':device.devid, 'PortNumber':((port<<8) & 0xFF00) | (port>>8)})
-		if ret != 0:
-			raise MuxError("Connect failed: error %d"%ret)
-		self.proto.connected = True
-		return self.socket.sock
-	def close(self):
-		self.socket.sock.close()
-
-class USBMux(object):
-	def __init__(self, socketpath=None):
-		if socketpath is None:
-			if sys.platform == 'darwin':
-				socketpath = "/var/run/usbmuxd"
-			else:
-				socketpath = "/var/run/usbmuxd"
-		self.socketpath = socketpath
-		self.listener = MuxConnection(socketpath, BinaryProtocol)
-		try:
-			self.listener.listen()
-			self.version = 0
-			self.protoclass = BinaryProtocol
-		except MuxVersionError:
-			self.listener = MuxConnection(socketpath, PlistProtocol)
-			self.listener.listen()
-			self.protoclass = PlistProtocol
-			self.version = 1
-		self.devices = self.listener.devices
-	def process(self, timeout=None):
-		self.listener.process(timeout)
-	def connect(self, device, port):
-		connector = MuxConnection(self.socketpath, self.protoclass)
-		return connector.connect(device, port)
-
-if __name__ == "__main__":
-	mux = USBMux()
-	print "Waiting for devices..."
-	if not mux.devices:
-		mux.process(0.1)
-	while True:
-		print "Devices:"
-		for dev in mux.devices:
-			print dev
-		mux.process()