More presence service rework
This commit is contained in:
@@ -3,4 +3,5 @@ sugar_PYTHON = \
|
||||
__init__.py \
|
||||
activity.py \
|
||||
shell.py \
|
||||
PresenceWindow.py
|
||||
PresenceWindow.py \
|
||||
Owner.py
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user