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.
------------------------------------------------------------------------------
This SF.net email is sponsored by
Make an app they can't live without
Enter the BlackBerry Developer Challenge
http://p.sf.net/sfu/RIM-dev2dev
_______________________________________________
vde-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vde-users