diff options
Diffstat (limited to 'sugar/p2p/Group.py')
-rw-r--r-- | sugar/p2p/Group.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/sugar/p2p/Group.py b/sugar/p2p/Group.py new file mode 100644 index 0000000..dedbc1e --- /dev/null +++ b/sugar/p2p/Group.py @@ -0,0 +1,102 @@ +import avahi + +import presence +from Buddy import * +from Service import * + +SERVICE_ADDED = "service_added" +SERVICE_REMOVED = "service_removed" + +BUDDY_JOIN = "buddy_join" +BUDDY_LEAVE = "buddy_leave" + +class Group: + def __init__(self): + self._service_listeners = [] + self._presence_listeners = [] + + def join(self, buddy): + pass + + def add_service_listener(self, listener): + self._service_listeners.append(listener) + + def add_presence_listener(self, listener): + self._presence_listeners.append(listener) + + def _notify_service_added(self, service): + for listener in self._service_listeners: + listener(SERVICE_ADDED, buddy) + + def _notify_service_removed(self, service): + for listener in self._service_listeners: + listener(SERVICE_REMOVED,buddy) + + def _notify_buddy_join(self, buddy): + for listener in self._presence_listeners: + listener(BUDDY_JOIN, buddy) + + def _notify_buddy_leave(self, buddy): + for listener in self._presence_listeners: + listener(BUDDY_LEAVE, buddy) + +class LocalGroup(Group): + def __init__(self): + Group.__init__(self) + + self._services = {} + self._buddies = {} + + self._pdiscovery = presence.PresenceDiscovery() + self._pdiscovery.add_service_listener(self._on_service_change) + self._pdiscovery.start() + + def get_owner(self): + return self._owner + + def add_service(self, service): + sid = (service.get_name(), service.get_type()) + self._services[sid] = service + self._notify_service_added(service) + + def remove_service(self, sid): + self._notify_service_removed(service) + del self._services[sid] + + def join(self): + self._owner = Owner(self) + self._owner.register() + + def get_service(self, name, stype): + return self._services[(name, stype)] + + def get_buddy(self, name): + return self._buddies[name] + + def _add_buddy(self, buddy): + bid = buddy.get_nick_name() + if not self._buddies.has_key(bid): + self._buddies[bid] = buddy + self._notify_buddy_join(buddy) + + def _remove_buddy(self, buddy): + self._notify_buddy_leave(buddy) + del self._buddies[buddy.get_nick_name()] + + def _on_service_change(self, action, interface, protocol, name, stype, domain, flags): + if action == presence.ACTION_SERVICE_NEW: + self._pdiscovery.resolve_service(interface, protocol, name, stype, domain, + self._on_service_resolved) + elif action == presence.ACTION_SERVICE_REMOVED: + if stype == PRESENCE_SERVICE_TYPE: + self._remove_buddy(name) + elif stype.startswith("_olpc"): + self.remove_service((name, stype)) + + def _on_service_resolved(self, interface, protocol, name, stype, domain, + host, aprotocol, address, port, txt, flags): + service = Service(name, stype, address, port) + if stype == PRESENCE_SERVICE_TYPE: + self._add_buddy(Buddy(service, name)) + elif stype.startswith("_olpc"): + self.add_service(service) |