diff options
author | Benjamin Schwartz <bens@alum.mit.edu> | 2008-02-29 22:40:12 (GMT) |
---|---|---|
committer | Benjamin Schwartz <bens@alum.mit.edu> | 2008-02-29 22:40:12 (GMT) |
commit | 145d3d5e2d3b10662376c73a659e42a8a34973ff (patch) | |
tree | 26ed1a2e95a47327a5ddcb0218933eef661b37f9 | |
parent | 5c56c76d33f94b504f0fb324835e5e01bfccdd90 (diff) |
Many bugfixes
-rw-r--r-- | dobject.py | 124 | ||||
-rw-r--r-- | dobject_helpers.py | 20 | ||||
-rw-r--r-- | stopwatch.py | 4 |
3 files changed, 132 insertions, 16 deletions
@@ -587,7 +587,8 @@ class AddOnlySet: self._send((y,)) def _send(self, els): - self._handler.send(dbus.Array([self._trans(el, True) for el in els])) + if len(els) > 0: + self._handler.send(dbus.Array([self._trans(el, True) for el in els])) def _net_update(self, y): s = set(y) @@ -600,7 +601,10 @@ class AddOnlySet: self._net_update((self._trans(el, False) for el in msg)) def get_history(self): - return dbus.Array([self._trans(el, True) for el in self._set]) + if len(self._set) > 0: + return dbus.Array([self._trans(el, True) for el in self._set]) + else: + return dbus.Array([], type=dbus.Boolean) #Prevent introspection of empty list, which fails add_history = receive_message @@ -707,7 +711,8 @@ class AddOnlySortedSet: self._send((y,)) def _send(self, els): - self._handler.send(dbus.Array([self._trans(el, True) for el in els])) + if len(els) > 0: + self._handler.send(dbus.Array([self._trans(el, True) for el in els])) def _net_update(self, y): d = ListSet() @@ -721,7 +726,10 @@ class AddOnlySortedSet: self._net_update([self._trans(el, False) for el in msg]) def get_history(self): - return dbus.Array([self._trans(el, True) for el in self._set._list]) + if len(self._set._list) > 0: + return dbus.Array([self._trans(el, True) for el in self._set._list]) + else: + return dbus.Array([], type=dbus.Boolean) #prevent introspection of empty list, which fails add_history = receive_message @@ -1050,3 +1058,111 @@ class CausalDict: def _trigger(self, added, removed): for L in self._listeners: L(added, removed) + +class UserDict(dbus.gobject_service.ExportedGObject): + IFACE = "org.dobject.UserDict" + BASEPATH = "/org/dobject/UserDict/" + + def __init__(self, name, tubebox, myval, translator = empty_translator): + self._myname = name + self.PATH = UserDict.BASEPATH + name + dbus.gobject_service.ExportedGObject.__init__(self) + self._logger = logging.getLogger(self.PATH) + self._tube_box = tube_box + self.tube = None + + self._dict = dict() + self._myval = myval + self._trans = translator + + self._tube_box.register_listener(self.set_tube) + + self.__contains__ = self._dict.__contains__ + #No __delitem__ + self.__eq__ = self._dict.__eq__ + self.__ge__ = self._dict.__ge__ + self.__getitem__ = self._dict.__getitem__ + self.__gt__ = self._dict.__gt__ + self.__le__ = self._dict.__le__ + self.__len__ = self._dict.__len__ + self.__lt__ = self._dict.__lt__ + self.__ne__ = self._dict.__ne__ + #No __setitem__ + + #No clear + self.copy = self._dict.copy + self.get = self._dict.get + self.has_key = self._dict.has_key + self.items = self._dict.items + self.iteritems = self._dict.iteritems + self.iterkeys = self._dict.iterkeys + self.itervalues = self._dict.itervalues + self.keys = self._dict.keys + #No pop + #No popitem + #No setdefault + #No update + self.values = self._dict.values + + def set_tube(self, tube, is_initiator): + """Callback for the TubeBox""" + self.tube = tube + self.add_to_connection(self.tube, self.PATH) + + self.tube.add_signal_receiver(self.receive_value, signal_name='send_value', dbus_interface=UserDict.IFACE, sender_keyword='sender', path=self.PATH) + self.tube.add_signal_receiver(self.tell_value, signal_name='ask_values', dbus_interface=UserDict.IFACE, sender_keyword='sender', path=self.PATH) + self.tube.watch_participants(self.members_changed) + + #Alternative implementation of members_changed (not yet working) + #self.tube.add_signal_receiver(self.members_changed, signal_name="MembersChanged", dbus_interface="org.freedesktop.Telepathy.Channel.Interface.Group") + + self.ask_values() + + def get_path(self): + """Returns the DBus path of this handler. The path is the closest thing + to a unique identifier for each abstract DObject.""" + return self.PATH + + def get_tube(self): + """Returns the TubeBox used to create this handler. This method is + necessary if one DObject wishes to create another.""" + return self._tube_box + + @dbus.service.signal(dbus_interface=IFACE, signature='v') + def send_value(self, value): + """This method broadcasts message to all other handlers for this UO""" + return + + @dbus.service.signal(dbus_interface=IFACE, signature='') + def ask_values(self): + return + + def tell_value(self, sender=None): + self._logger.debug("tell_history to " + str(sender)) + try: + if sender == self.tube.get_unique_name(): + return + remote = self.tube.get_object(sender, self.PATH) + remote.receive_value(self._myval, sender_keyword='sender', reply_handler=PassFunction, error_handler=PassFunction) + finally: + return + + @dbus.service.method(dbus_interface=IFACE, in_signature = 'v', out_signature='', sender_keyword = 'sender') + def receive_value(self, value, sender=None): + self._dict[sender] = self._trans(value, False) + + #Alternative implementation of a members_changed (not yet working) + """ + def members_changed(self, message, added, removed, local_pending, remote_pending, actor, reason): + added_names = self.tube.InspectHandles(telepathy.CONNECTION_HANDLE_TYPE_LIST, added) + for name in added_names: + self.tell_history(name) + """ + def members_changed(self, added, removed): + self._logger.debug("members_changed") + for (handle, name) in removed: + if name in self._dict: + del self._dict[name] + for (handle, name) in added: + self.tell_value(sender=name) + diff --git a/dobject_helpers.py b/dobject_helpers.py index 2c5ba86..f87c7ed 100644 --- a/dobject_helpers.py +++ b/dobject_helpers.py @@ -165,12 +165,14 @@ class ListSet: if i in someset: L.append(i) self._list = L + return self def __ior__(self, someset): if someset.__class__ == self.__class__: self._list = merge_or(self._list, someset._list) else: self.update(someset) + return self def __isub__(self, someset): if someset.__class__ == self.__class__: @@ -178,9 +180,10 @@ class ListSet: else: L = [] for i in self._list: - if i in someset: + if i not in someset: L.append(i) - self._list = merge_sub(self._list, L) + self._list = L + return self def __iter__(self): return self._list.__iter__() @@ -189,11 +192,8 @@ class ListSet: if someset.__class__ == self.__class__: self._list = merge_xor(self._list, someset._list) else: - L = [] - for i in self._list: - if i in someset: - L.append(i) - self._list = merge_sub(self._list, L) + self.symmetric_difference_update(someset) + return self def __le__(self, someset): if someset.__class__ == self.__class__: @@ -245,14 +245,14 @@ class ListSet: else: L = [] for i in self._list: - if i in someset: + if i not in someset: L.append(i) - a._list = merge_sub(self._list, L) + a._list = L return a def __xor__(self, someset): - a = ListSet() if someset.__class__ == self.__class__: + a = ListSet() a._list = merge_xor(self._list, someset._list) else: a = self.symmetric_difference(someset) diff --git a/stopwatch.py b/stopwatch.py index 789b751..4ae43dd 100644 --- a/stopwatch.py +++ b/stopwatch.py @@ -81,7 +81,7 @@ class WatchModel(): def _history_cb(self, diffset): self._update_state() - self._trigger + self._trigger() def add_event_from_view(self, ev): self._history_lock.acquire() @@ -304,7 +304,7 @@ class OneWatchView(): self._is_visible.wait() self._label_lock.acquire() if self._should_update.isSet() and self._is_visible.isSet(): - s = self._format(time.time() + self._offset - self._timeval) + s = self._format(time.time() + self._timer.offset - self._timeval) ev.clear() gobject.idle_add(self._update_label, s, ev) ev.wait() |