Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/PresenceService/Activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'shell/PresenceService/Activity.py')
-rw-r--r--shell/PresenceService/Activity.py113
1 files changed, 111 insertions, 2 deletions
diff --git a/shell/PresenceService/Activity.py b/shell/PresenceService/Activity.py
index 5fbe8a5..d0267d3 100644
--- a/shell/PresenceService/Activity.py
+++ b/shell/PresenceService/Activity.py
@@ -1,5 +1,7 @@
import dbus
+class NotFoundError(Exception):
+ pass
class ActivityDBusHelper(dbus.service.Object):
def __init__(self, parent, bus_name, object_path):
@@ -8,22 +10,129 @@ class ActivityDBusHelper(dbus.service.Object):
self._object_path = object_path
dbus.service.Object.__init__(self, bus_name, self._object_path)
+ @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ in_signature="s", out_signature="ao")
+ def getServicesOfType(self, stype):
+ services = self._parent.get_services_of_type(stype)
+ if not services:
+ raise NotFoundError("Not found")
+ ret = []
+ for serv in services:
+ ret.append(serv.object_path())
+ return ret
+
+ @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ in_signature="", out_signature="ao")
+ def getServices(self):
+ services = self._parent.get_services()
+ if not services:
+ raise NotFoundError("Not found")
+ ret = []
+ for serv in services:
+ ret.append(serv.object_path())
+ return ret
+
+ @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ in_signature="", out_signature="s")
+ def getId(self):
+ return self._parent.get_id()
+
+ @dbus.service.method(BUDDY_DBUS_INTERFACE,
+ in_signature="", out_signature="ao")
+ def getJoinedBuddies(self):
+ buddies = self._parent.get_joined_buddies()
+ if not buddies:
+ raise NotFoundError("Not found")
+ ret = []
+ for buddy in buddies:
+ ret.append(buddy.object_path())
+ return ret
+
+ @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ out_signature="o")
+ def ServiceAppeared(self, object_path):
+ pass
+
+ @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ out_signature="o")
+ def ServiceDisappeared(self, object_path):
+ pass
+
+ @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ out_signature="o")
+ def BuddyJoined(self, object_path):
+ pass
+
+ @dbus.service.signal(BUDDY_DBUS_INTERFACE,
+ out_signature="o")
+ def BuddyLeft(self, object_path):
+ pass
+
class Activity(object):
def __init__(self, bus_name, object_id, activity_id):
+ if not activity_id:
+ raise ValueError("Service must have a valid Activity ID")
self._activity_id = activity_id
self._buddies = []
- self._services = {} # service type -> Service
+ self._services = {} # service type -> list of Services
+ self._services[service.get_type()] = []
self._object_id = object_id
self._object_path = "/org/laptop/Presence/Activities/%d" % self._object_id
self._dbus_helper = ActivityDBusHelper(self, bus_name, self._object_path)
+ def object_path(self):
+ return dbus.ObjectPath(self._object_path)
+
def get_id(self):
return self._activity_id
- def get_service_of_type(self, stype):
+ def get_services(self):
+ return self._services.values()
+
+ def get_services_of_type(self, stype):
if self._services.has_key(stype):
return self._services[stype]
return None
+
+ def get_joined_buddies(self):
+ buddies = []
+ for serv in self._services.values():
+ buddies.append(serv.get_owner())
+ return buddies
+
+ def add_service(self, service):
+ stype = service.get_type()
+ if not self._services.has_key(stype):
+ self._services[stype] = []
+
+ # Send out the BuddyJoined signal if this is the first
+ # service from the buddy that we've seen
+ buddies = self.get_joined_buddies()
+ serv_owner = service.get_owner()
+ if serv_owner and serv_owner not in buddies:
+ self._dbus_helper.BuddyJoined(serv_owner.object_path())
+ serv_owner.add_activity(self)
+
+ if not service in self._services[stype]:
+ self._services[stype].append(service)
+ self._dbus_helper.ServiceAppeared(service.object_path())
+
+ def remove_service(self, service):
+ stype = service.get_type()
+ if not self._services.has_key(stype):
+ return
+ self._services[stype].remove(service)
+ self._dbus_helper.ServiceDisappeared(service.object_path())
+ if len(self._services[stype]) == 0:
+ del self._services[stype]
+
+ # Send out the BuddyLeft signal if this is the last
+ # service from the buddy
+ buddies = self.get_joined_buddies()
+ serv_owner = service.get_owner()
+ if serv_owner and serv_owner not in buddies:
+ serv_owner.remove_activity(self)
+ self._dbus_helper.BuddyLeft(serv_owner.object_path())