Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar/presence
diff options
context:
space:
mode:
authorDan Williams <dcbw@localhost.localdomain>2006-09-15 20:41:11 (GMT)
committer Dan Williams <dcbw@localhost.localdomain>2006-09-15 20:41:11 (GMT)
commitb39eff33655590565aaac3d514df640f1ad3f2a8 (patch)
tree63588fd03b61abd608f05e24c26d52e629ed6fdb /sugar/presence
parentc36089522bb728fad34d79ad27e111098a5db453 (diff)
Refcount tracked service types; ensure only the process that registers a service can change it; add support for updated service properties/published values
Diffstat (limited to 'sugar/presence')
-rw-r--r--sugar/presence/Service.py47
1 files changed, 44 insertions, 3 deletions
diff --git a/sugar/presence/Service.py b/sugar/presence/Service.py
index eea7fef..01169e4 100644
--- a/sugar/presence/Service.py
+++ b/sugar/presence/Service.py
@@ -2,11 +2,29 @@ import gobject
import dbus
+def __one_dict_differs(dict1, dict2):
+ for key, value in dict1.items():
+ if not dict2.has_key(key) or dict2[key] != value:
+ return True
+ return False
+
+def __dicts_differ(dict1, dict2):
+ if __one_dict_differs(dict1, dict2):
+ return True
+ if __one_dict_differs(dict2, dict1):
+ return True
+ return False
+
class Service(gobject.GObject):
_PRESENCE_SERVICE = "org.laptop.Presence"
_SERVICE_DBUS_INTERFACE = "org.laptop.Presence.Service"
+ __gsignals__ = {
+ 'published-value-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
+ ([gobject.TYPE_PYOBJECT]))
+ }
+
def __init__(self, bus, new_obj_cb, del_obj_cb, object_path):
gobject.GObject.__init__(self)
self._object_path = object_path
@@ -14,17 +32,40 @@ class Service(gobject.GObject):
self._ps_del_object = del_obj_cb
sobj = bus.get_object(self._PRESENCE_SERVICE, object_path)
self._service = dbus.Interface(sobj, self._SERVICE_DBUS_INTERFACE)
- self._service.connect_to_signal('PropertyChanged', self._property_changed_cb)
+ self._service.connect_to_signal('PropertyChanged', self.__property_changed_cb)
+ self._service.connect_to_signal('PublishedValueChanged',
+ self.__published_value_changed_cb)
self._props = self._service.getProperties()
+ self._pubvals = self._service.getPublishedValues()
def object_path(self):
return self._object_path
- def _property_changed_cb(self, prop_list):
+ def __property_changed_cb(self, prop_list):
self._props = self._service.getProperties()
def get_published_value(self, key):
- return self._service.getPublishedValue(key)
+ return self._pubvals[key]
+
+ def get_published_values(self):
+ self._pubvals = self._service.getPublishedValues()
+
+ def set_published_value(self, key, value):
+ if self._pubvals.has_key(key):
+ if self._pubvals[key] == value:
+ return
+ self._pubvals[key] = value
+ self._service.setPublishedValue(key, value)
+
+ def set_published_values(self, vals):
+ self._service.setPublishedValues(vals)
+ self._pubvals = vals
+
+ def __published_value_changed_cb(self, keys):
+ oldvals = self._pubvals
+ self.get_published_values()
+ if __dicts_differ(oldvals, self._pubvals):
+ self.emit('published-value-changed', keys)
def get_name(self):
return self._props['name']