Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/p2p/StreamReader.py
diff options
context:
space:
mode:
Diffstat (limited to 'sugar/p2p/StreamReader.py')
-rw-r--r--sugar/p2p/StreamReader.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/sugar/p2p/StreamReader.py b/sugar/p2p/StreamReader.py
new file mode 100644
index 0000000..c108547
--- /dev/null
+++ b/sugar/p2p/StreamReader.py
@@ -0,0 +1,51 @@
+import network
+
+class StreamReaderRequestHandler(object):
+ def __init__(self, reader):
+ self._reader = reader
+
+ def message(self, nick_name, message):
+ address = network.get_authinfo()
+ self._reader.recv(nick_name, message)
+ return True
+
+class StreamReader:
+ def __init__(self, group, service):
+ self._group = group
+ self._service = service
+
+ if self._service.is_multicast():
+ self._setup_multicast()
+ else:
+ self._setup_unicast()
+
+ def set_listener(self, callback):
+ self._callback = callback
+
+ def _setup_multicast(self):
+ address = self._service.get_address()
+ port = self._service.get_port()
+ server = network.GroupServer(address, port, self._recv_multicast)
+ server.start()
+
+ def _setup_unicast(self):
+ started = False
+ tries = 10
+ port = self._service.get_port()
+ while not started and tries > 0:
+ try:
+ p2p_server = network.GlibXMLRPCServer(("", port))
+ p2p_server.register_instance(StreamReaderRequestHandler(self))
+ started = True
+ except:
+ port = port + 1
+ tries = tries - 1
+ self._service.set_port(port)
+
+ def _recv_multicast(self, msg):
+ [ nick_name, data ] = msg['data'].split(" |**| ", 2)
+ self.recv(nick_name, data)
+
+ def recv(self, nick_name, data):
+ if nick_name != self._group.get_owner().get_nick_name():
+ self._callback(self._group.get_buddy(nick_name), data)