Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin 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)
commit145d3d5e2d3b10662376c73a659e42a8a34973ff (patch)
tree26ed1a2e95a47327a5ddcb0218933eef661b37f9
parent5c56c76d33f94b504f0fb324835e5e01bfccdd90 (diff)
Many bugfixes
-rw-r--r--dobject.py124
-rw-r--r--dobject_helpers.py20
-rw-r--r--stopwatch.py4
3 files changed, 132 insertions, 16 deletions
diff --git a/dobject.py b/dobject.py
index cc76f9d..3f707ed 100644
--- a/dobject.py
+++ b/dobject.py
@@ -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()