From: <dan...@us...> - 2010-08-14 15:38:57
|
Revision: 442 http://vde.svn.sourceforge.net/vde/?rev=442&view=rev Author: danielel Date: 2010-08-14 15:38:50 +0000 (Sat, 14 Aug 2010) Log Message: ----------- * Python VdePlug library now has its own stream implementation. * Added another python vde_plug clone as example for class VdeStream Modified Paths: -------------- trunk/vde-2/src/lib/python/VdePlug.py Added Paths: ----------- trunk/vde-2/src/lib/python/VdeStream_example.py Modified: trunk/vde-2/src/lib/python/VdePlug.py =================================================================== --- trunk/vde-2/src/lib/python/VdePlug.py 2010-08-13 13:44:44 UTC (rev 441) +++ trunk/vde-2/src/lib/python/VdePlug.py 2010-08-14 15:38:50 UTC (rev 442) @@ -9,18 +9,54 @@ ''' -import vdeplug_python -import os +import vdeplug_python, os, sys, struct from array import array +class VdeStream: + def __init__(self, parent, outf, frecv = None, ferr = None): + self.conn = parent + self.outf = outf + self.frecv = frecv + self.ferr = ferr + self.conn._streams.append(self) + if (self.frecv == None): + self.frecv=self.conn.send + + def recv(self, buf): + (toth, totl) = struct.unpack("BB", buf[0:2]) + tot = (toth << 8) + totl + buffer = buf[2:] + if (len(buffer) < tot): + sys.stderr.write("stream recv: wrong size %d, pkt is %d\n" % (tot, len(buffer))) + return -1 + elif (len(buffer) > tot): + self.frecv(buffer[0:tot]) + return self.recv(buffer[tot:]) # Recursion for remaining data + elif (self.frecv(buffer) < 0): + return -1 + + def send(self, buf): + if self.outf is None: + return -1 + lh = (len(buf)>>8) & 0xFF + ll = len(buf) & 0xFF + a = struct.pack("BB", lh, ll) + self.outf.write(a) + self.outf.write(buf) + self.outf.flush() + + + + + class VdePlug: def __init__(self, sock=None, descr="Python", port=0, group=None, mode=0): self._magic = vdeplug_python.open(sock, descr) - self._ctl = os.fdopen(vdeplug_python.ctlfd(self._magic)) self._data = os.fdopen(vdeplug_python.datafd(self._magic), 'wb+', os.O_NONBLOCK) + self._streams = [] def ctlfd(self): return self._ctl @@ -36,11 +72,17 @@ def recv(self, size): return os.read(self._data.fileno(), size) - + + def recvfrom_streams(self, buf): + for s in self._streams: + s.recv(buf) + + def sendto_streams(self, buf): + for s in self._streams: + s.send(buf) + def close(self): vdeplug_python.close(self._magic) self._magic = None - - Added: trunk/vde-2/src/lib/python/VdeStream_example.py =================================================================== --- trunk/vde-2/src/lib/python/VdeStream_example.py (rev 0) +++ trunk/vde-2/src/lib/python/VdeStream_example.py 2010-08-14 15:38:50 UTC (rev 442) @@ -0,0 +1,21 @@ +#!/usr/bin/python +from VdePlug import VdePlug, VdeStream +from select import poll +import os, sys +from select import POLLIN, POLLOUT, POLLHUP, POLLERR, POLLNVAL + + +v = VdePlug(sys.argv[1]) +s = VdeStream(v, sys.stdout) +p = poll() +p.register(sys.stdin.fileno(), POLLIN) +p.register(v.datafd().fileno(), POLLIN) +while(True): + pollret = p.poll() + for (f,e) in pollret: + if f == v.datafd().fileno() and (e & POLLIN): + buffer = v.recv(2000) + v.sendto_streams(buffer) + elif f == sys.stdin.fileno() and (e & POLLIN): + buffer = os.read(f, 2000) + v.recvfrom_streams(buffer) Property changes on: trunk/vde-2/src/lib/python/VdeStream_example.py ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |