More presence service rework

This commit is contained in:
Dan Williams
2006-06-12 18:31:26 -04:00
parent d931dca579
commit 17c371119d
10 changed files with 381 additions and 224 deletions
+2 -1
View File
@@ -3,4 +3,5 @@ sugar_PYTHON = \
__init__.py \
activity.py \
shell.py \
PresenceWindow.py
PresenceWindow.py \
Owner.py
+20 -56
View File
@@ -3,8 +3,8 @@ pygtk.require('2.0')
import gtk
import gobject
from sugar.p2p.Group import Group
from sugar.p2p.Stream import Stream
from sugar.presence.PresenceService import PresenceService
class PresenceWindow(gtk.Window):
_MODEL_COL_NICK = 0
@@ -14,10 +14,11 @@ class PresenceWindow(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
self._group = Group.get_from_id('local')
self._group.add_presence_listener(self._on_group_presence_event)
self._group.add_service_listener(self._on_group_service_event)
self._group.join()
self._pservice = PresenceService.get_instance()
self._pservice.connect("buddy-appeared", self._on_buddy_appeared_cb)
self._pservice.connect("buddy-disappeared", self._on_buddy_disappeared_cb)
self._pservice.set_debug(True)
self._pservice.start()
self._setup_ui()
@@ -79,62 +80,25 @@ class PresenceWindow(gtk.Window):
self._chats[buddy] = chat
chat.connect_to_shell()
def _request_buddy_icon_cb(self, result_status, response, user_data):
icon = response
buddy = user_data
if result_status == network.RESULT_SUCCESS:
if icon and len(icon):
icon = base64.b64decode(icon)
print "Buddy icon for '%s' is size %d" % (buddy.get_nick_name(), len(icon))
buddy.set_icon(icon)
if (result_status == network.RESULT_FAILED or not icon) and self._buddy_icon_tries < 3:
self._buddy_icon_tries = self._buddy_icon_tries + 1
print "Failed to retrieve buddy icon for '%s' on try %d of %d" % (buddy.get_nick_name(), \
self._buddy_icon_tries, 3)
gobject.timeout_add(1000, self._request_buddy_icon, buddy)
return False
def _request_buddy_icon(self, buddy):
# FIXME need to use the new presence service when it's done
service = buddy.get_service('_olpc_chat._tcp')
buddy_stream = Stream.new_from_service(service, self._group)
writer = buddy_stream.new_writer(service)
icon = writer.custom_request("get_buddy_icon", self._request_buddy_icon_cb, buddy)
def _on_group_service_event(self, action, service):
if action == Group.SERVICE_ADDED:
# Look for the olpc chat service
# FIXME need to use the new presence service when it's done
if service.get_type() == '_olpc_chat._tcp':
# Find the buddy this service belongs to
buddy = self._group.get_buddy(service.get_name())
if buddy and buddy.get_address() == service.get_address():
# Try to get the buddy's icon
if buddy.get_nick_name() != self._group.get_owner().get_nick_name():
print "Requesting buddy icon from '%s'." % buddy.get_nick_name()
gobject.idle_add(self._request_buddy_icon, buddy)
elif action == Group.SERVICE_REMOVED:
pass
def __buddy_icon_changed_cb(self, buddy):
it = self._get_iter_for_buddy(buddy)
self._buddy_list_model.set(it, self._MODEL_COL_ICON, buddy.get_icon_pixbuf())
def _on_group_presence_event(self, action, buddy):
if buddy.get_nick_name() == self._group.get_owner().get_nick_name():
def _on_buddy_appeared_cb(self, pservice, buddy):
if buddy.is_owner():
# Do not show ourself in the buddy list
pass
elif action == Group.BUDDY_JOIN:
aniter = self._buddy_list_model.append(None)
self._buddy_list_model.set(aniter,
self._MODEL_COL_NICK, buddy.get_nick_name(),
self._MODEL_COL_BUDDY, buddy)
buddy.connect('icon-changed', self.__buddy_icon_changed_cb)
elif action == Group.BUDDY_LEAVE:
aniter = self._get_iter_for_buddy(buddy)
if aniter:
self._buddy_list_model.remove(aniter)
return
aniter = self._buddy_list_model.append(None)
self._buddy_list_model.set(aniter,
self._MODEL_COL_NICK, buddy.get_nick_name(),
self._MODEL_COL_BUDDY, buddy)
buddy.connect('icon-changed', self.__buddy_icon_changed_cb)
def _on_buddy_disappeared_cb(self, pservice, buddy):
aniter = self._get_iter_for_buddy(buddy)
if aniter:
self._buddy_list_model.remove(aniter)
def _get_iter_for_buddy(self, buddy):
aniter = self._buddy_list_model.get_iter_first()
+9 -2
View File
@@ -8,6 +8,7 @@ import gtk
import pango
from sugar.shell.PresenceWindow import PresenceWindow
from sugar.shell.Owner import ShellOwner
activity_counter = 0
@@ -240,6 +241,9 @@ class ActivityContainer(dbus.service.Object):
self.current_activity = None
# Create our owner service
self._owner = ShellOwner()
def show(self):
self.window.show()
@@ -359,7 +363,10 @@ def main():
presence_window.show()
console.set_parent_window(activity_container.window)
try:
gtk.main()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()
gtk.main()