diff options
author | Dan Williams <dcbw@localhost.localdomain> | 2006-09-15 20:41:11 (GMT) |
---|---|---|
committer | Dan Williams <dcbw@localhost.localdomain> | 2006-09-15 20:41:11 (GMT) |
commit | b39eff33655590565aaac3d514df640f1ad3f2a8 (patch) | |
tree | 63588fd03b61abd608f05e24c26d52e629ed6fdb /sugar/presence | |
parent | c36089522bb728fad34d79ad27e111098a5db453 (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.py | 47 |
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'] |