Implement model changes notification and hook
parent
e0a046cd53
commit
e752cda5e6
@ -0,0 +1,27 @@
|
||||
from Service import Service
|
||||
import network
|
||||
|
||||
class NotificationListener:
|
||||
TYPE = "_olpc_model_notification._udp"
|
||||
ADDRESS = "224.0.0.222"
|
||||
PORT = 6300
|
||||
|
||||
def __init__(self, group, name):
|
||||
server = network.GroupServer(NotificationListener.TYPE,
|
||||
NotificationListener.PORT,
|
||||
self._recv_multicast)
|
||||
server.start()
|
||||
|
||||
service = Service(name, NotificationListener.TYPE,
|
||||
NotificationListener.ADDRESS,
|
||||
NotificationListener.PORT, True)
|
||||
service.register(group)
|
||||
|
||||
self._listeners = {}
|
||||
|
||||
def add_listener(self, listener):
|
||||
self._listeners.add(listener)
|
||||
|
||||
def _recv_multicast(self, msg):
|
||||
for listener in self._listeners:
|
||||
listener(msg)
|
@ -0,0 +1,11 @@
|
||||
import network
|
||||
|
||||
class Notifier:
|
||||
def __init__(self, group, name):
|
||||
service = group.get_service(name)
|
||||
address = service.get_address()
|
||||
port = service.get_port()
|
||||
self._client = network.GroupClient(address, port)
|
||||
|
||||
def notify(self, msg):
|
||||
self._client.send_msg(msg)
|
@ -1,17 +1,26 @@
|
||||
import xmlrpclib
|
||||
|
||||
from sugar.p2p.Service import Service
|
||||
import network
|
||||
from sugar.p2p.NotificationListener import NotificationListener
|
||||
from sugar.p2p.model.AbstractModel import AbstractModel
|
||||
|
||||
class RemoteModel:
|
||||
class RemoteModel(AbstractModel):
|
||||
def __init__(self, service):
|
||||
AbstractModel.__init__(self)
|
||||
|
||||
self._service = service
|
||||
|
||||
addr = "http://%s:%d" % (service.get_address(), service.get_port())
|
||||
self._client = xmlrpclib.ServerProxy(addr)
|
||||
|
||||
self._setup_notification_listener()
|
||||
|
||||
def get_value(self, key):
|
||||
return self._client.get_value(key)
|
||||
|
||||
def set_value(self, key, value):
|
||||
self._client.set_value(key, value)
|
||||
|
||||
def _setup_notification_listener(self):
|
||||
name = self._service.get_name()
|
||||
self._notification = NotificationListener(self._group, name)
|
||||
self._notification.add_listener(self._notify_model_change)
|
||||
|
Loading…
Reference in New Issue