Merge branch 'master' of git+ssh://ywwg@dev.laptop.org/git/sugar
This commit is contained in:
commit
195e18d7b0
@ -21,11 +21,11 @@ _ACTIVITY_PATH = "/org/laptop/Sugar/Presence/Activities/"
|
||||
_ACTIVITY_INTERFACE = "org.laptop.Sugar.Presence.Activity"
|
||||
|
||||
class Activity(dbus.service.Object):
|
||||
def __init__(self, bus_name, object_id):
|
||||
def __init__(self, bus_name, object_id, activity_id):
|
||||
self._buddies = []
|
||||
self._color = None
|
||||
self._valid = False
|
||||
self._activity_id = None
|
||||
self._activity_id = activity_id
|
||||
|
||||
self._object_id = object_id
|
||||
self._object_path = "/org/laptop/Presence/Activities/%d" % self._object_id
|
||||
@ -90,3 +90,16 @@ class Activity(dbus.service.Object):
|
||||
|
||||
def get_color(self):
|
||||
return self._color
|
||||
|
||||
def get_joined_buddies(self):
|
||||
return self._buddies
|
||||
|
||||
def buddy_joined(self, buddy):
|
||||
if buddy not in self._buddies:
|
||||
self._buddies.append(buddy)
|
||||
self.BuddyJoined(buddy.object_path())
|
||||
|
||||
def buddy_left(self, buddy):
|
||||
if buddy in self._buddies:
|
||||
self._buddies.remove(buddy)
|
||||
self.BuddyLeft(buddy.object_path())
|
||||
|
@ -71,7 +71,6 @@ class Buddy(DBusGObject):
|
||||
self._valid = False
|
||||
self._owner = False
|
||||
self._key = None
|
||||
self._icon = ''
|
||||
|
||||
gobject.GObject.__init__(self, **kwargs)
|
||||
if not self._key:
|
||||
|
@ -43,7 +43,7 @@ class PresenceService(dbus.service.Object):
|
||||
self._next_object_id = 0
|
||||
|
||||
self._buddies = {} # key -> Buddy
|
||||
self._handles = {} # tp client -> (handle -> Buddy)
|
||||
self._handles_buddies = {} # tp client -> (handle -> Buddy)
|
||||
self._activities = {} # activity id -> Activity
|
||||
|
||||
bus = dbus.SessionBus()
|
||||
@ -59,19 +59,19 @@ class PresenceService(dbus.service.Object):
|
||||
|
||||
# Set up the server connection
|
||||
self._server_plugin = ServerPlugin(self._registry)
|
||||
self._handles[self._server_plugin] = {}
|
||||
self._handles_buddies[self._server_plugin] = {}
|
||||
|
||||
self._server_plugin.connect('status', self._server_status_cb)
|
||||
self._server_plugin.connect('contact-online', self._contact_online)
|
||||
self._server_plugin.connect('contact-offline', self._contact_offline)
|
||||
self._server_plugin.connect('avatar-updated', self._avatar_updated)
|
||||
self._server_plugin.connect('properties-changed', self._properties_changed)
|
||||
self._server_plugin.connect('activities-changed', self._activities_changed)
|
||||
self._server_plugin.connect('contact-activities-changed', self._contact_activities_changed)
|
||||
self._server_plugin.start()
|
||||
|
||||
# Set up the link local connection
|
||||
self._ll_plugin = LinkLocalPlugin(self._registry)
|
||||
self._handles[self._ll_plugin] = {}
|
||||
self._handles_buddies[self._ll_plugin] = {}
|
||||
|
||||
dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)
|
||||
|
||||
@ -89,7 +89,7 @@ class PresenceService(dbus.service.Object):
|
||||
buddy.connect("validity-changed", self._buddy_validity_changed_cb)
|
||||
self._buddies[key] = buddy
|
||||
|
||||
buddies = self._handles[tp]
|
||||
buddies = self._handles_buddies[tp]
|
||||
buddies[handle] = buddy
|
||||
# store the handle of the buddy for this CM
|
||||
buddy.handles[tp] = handle
|
||||
@ -105,7 +105,7 @@ class PresenceService(dbus.service.Object):
|
||||
print "Buddy left: %s (%s)" % (buddy.props.nick, buddy.props.color)
|
||||
|
||||
def _contact_offline(self, tp, handle):
|
||||
buddy = self._handles[tp].pop(handle)
|
||||
buddy = self._handles_buddies[tp].pop(handle)
|
||||
key = buddy.props.key
|
||||
|
||||
# the handle of the buddy for this CM is not valid anymore
|
||||
@ -122,19 +122,80 @@ class PresenceService(dbus.service.Object):
|
||||
return self._next_object_id
|
||||
|
||||
def _avatar_updated(self, tp, handle, avatar):
|
||||
buddy = self._handles[tp].get(handle)
|
||||
buddy = self._handles_buddies[tp].get(handle)
|
||||
if buddy and not buddy.props.owner:
|
||||
print "Buddy %s icon updated" % buddy.props.key
|
||||
buddy.props.icon = avatar
|
||||
|
||||
def _properties_changed(self, tp, handle, prop):
|
||||
buddy = self._handles[tp].get(handle)
|
||||
buddy = self._handles_buddies[tp].get(handle)
|
||||
if buddy:
|
||||
buddy.set_properties(prop)
|
||||
print "Buddy %s properties updated" % buddy.props.key
|
||||
|
||||
def _activities_changed(self, tp, handle, prop):
|
||||
pass
|
||||
def _new_activity(self, activity_id):
|
||||
objid = self._get_next_object_id()
|
||||
activity = Activity(self._bus_name, objid, activity_id)
|
||||
# FIXME : don't do that shit !
|
||||
activity._valid = True
|
||||
self._activities[activity_id] = activity
|
||||
|
||||
print "new activity", activity_id
|
||||
self.ActivityAppeared(activity.object_path())
|
||||
|
||||
return activity
|
||||
|
||||
def _remove_activity(self, activity):
|
||||
print "remove activity", activity.get_id()
|
||||
|
||||
self.ActivityDisappeared(activity.object_path())
|
||||
del self._activities[activity.get_id()]
|
||||
|
||||
def _contact_activities_changed(self, tp, contact_handle, activities):
|
||||
print "------------activities changed-------------"
|
||||
buddies = self._handles_buddies[tp]
|
||||
buddy = buddies.get(contact_handle)
|
||||
|
||||
if not buddy:
|
||||
# We don't know this buddy
|
||||
# FIXME: What should we do here?
|
||||
# FIXME: Do we need to check if the buddy is valid or something?
|
||||
print "contact_activities_changed: buddy unknow"
|
||||
return
|
||||
|
||||
old_activities = set()
|
||||
for activity in buddy.get_joined_activities():
|
||||
old_activities.add(activity.get_id())
|
||||
|
||||
new_activities = set(activities)
|
||||
|
||||
activities_joined = new_activities - old_activities
|
||||
for act in activities_joined:
|
||||
print "buddy", contact_handle, "joined", act
|
||||
activity = self._activities.get(act)
|
||||
if not activity:
|
||||
# new activity
|
||||
activity = self._new_activity(act)
|
||||
|
||||
activity.buddy_joined(buddy)
|
||||
buddy.add_activity(activity)
|
||||
|
||||
activities_left = old_activities - new_activities
|
||||
for act in activities_left:
|
||||
print "buddy", contact_handle, "left", act
|
||||
activity = self._activities.get(act)
|
||||
if not activity:
|
||||
continue
|
||||
|
||||
activity.buddy_left(buddy)
|
||||
buddy.remove_activity(activity)
|
||||
|
||||
if not activity.get_joined_buddies():
|
||||
self._remove_activity(activity)
|
||||
|
||||
# current activity
|
||||
if len(activities) > 0:
|
||||
buddy.set_properties({'current-activity':activities[0]})
|
||||
|
||||
@dbus.service.signal(_PRESENCE_INTERFACE, signature="o")
|
||||
def ActivityAppeared(self, activity):
|
||||
@ -190,7 +251,7 @@ class PresenceService(dbus.service.Object):
|
||||
raise NotImplementedError("not implemented yet")
|
||||
|
||||
def cleanup(self):
|
||||
for tp in self._handles:
|
||||
for tp in self._handles_buddies:
|
||||
tp.cleanup()
|
||||
|
||||
def main():
|
||||
|
@ -33,7 +33,7 @@ from telepathy.interfaces import (
|
||||
from telepathy.constants import (
|
||||
CONNECTION_HANDLE_TYPE_NONE, CONNECTION_HANDLE_TYPE_CONTACT,
|
||||
CONNECTION_STATUS_CONNECTED, CONNECTION_STATUS_DISCONNECTED, CONNECTION_STATUS_CONNECTING,
|
||||
CONNECTION_HANDLE_TYPE_LIST, CONNECTION_HANDLE_TYPE_CONTACT,
|
||||
CONNECTION_HANDLE_TYPE_LIST, CONNECTION_HANDLE_TYPE_CONTACT,CONNECTION_HANDLE_TYPE_ROOM,
|
||||
CONNECTION_STATUS_REASON_AUTHENTICATION_FAILED)
|
||||
|
||||
CONN_INTERFACE_BUDDY_INFO = 'org.laptop.Telepathy.BuddyInfo'
|
||||
@ -82,7 +82,7 @@ class ServerPlugin(gobject.GObject):
|
||||
([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT])),
|
||||
'properties-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
|
||||
([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT])),
|
||||
'activities-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
|
||||
'contact-activities-changed': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
|
||||
([gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT]))
|
||||
}
|
||||
|
||||
@ -93,6 +93,7 @@ class ServerPlugin(gobject.GObject):
|
||||
|
||||
self._gabble_mgr = registry.GetManager('gabble')
|
||||
self._online_contacts = {} # handle -> jid
|
||||
self._activities = {} # activity id -> handle
|
||||
self._account = self._get_account_info()
|
||||
|
||||
self._conn = self._init_connection()
|
||||
@ -263,6 +264,8 @@ class ServerPlugin(gobject.GObject):
|
||||
self_handle = self._conn[CONN_INTERFACE].GetSelfHandle()
|
||||
self._conn[CONN_INTERFACE_ALIASING].SetAliases( {self_handle : name} )
|
||||
|
||||
self._conn[CONN_INTERFACE_BUDDY_INFO].SetActivities([])
|
||||
|
||||
self._upload_avatar()
|
||||
|
||||
def _status_changed_cb(self, state, reason):
|
||||
@ -343,6 +346,9 @@ class ServerPlugin(gobject.GObject):
|
||||
self._online_contacts[handle] = jid
|
||||
self.emit("contact-online", handle, props)
|
||||
|
||||
activities = self._conn[CONN_INTERFACE_BUDDY_INFO].GetActivities(handle)
|
||||
self._activities_changed_cb(handle, activities)
|
||||
|
||||
def _presence_update_cb(self, presence):
|
||||
for handle in presence:
|
||||
timestamp, statuses = presence[handle]
|
||||
@ -379,4 +385,7 @@ class ServerPlugin(gobject.GObject):
|
||||
self.emit("properties-changed", contact, properties)
|
||||
|
||||
def _activities_changed_cb(self, contact, activities):
|
||||
self.emit("activities-changed", contact, activities)
|
||||
for act_id, act_handle in activities:
|
||||
self._activities[act_id] = act_handle
|
||||
activities_id = map(lambda x: x[0], activities)
|
||||
self.emit("contact-activities-changed", contact, activities_id)
|
||||
|
@ -15,6 +15,7 @@
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
import gtk, gobject
|
||||
import dbus
|
||||
import hippo
|
||||
import logging
|
||||
from gettext import gettext as _
|
||||
@ -100,11 +101,28 @@ class VideoBox(hippo.CanvasBox, hippo.CanvasItem):
|
||||
self._label.props.font_desc = font.DEFAULT.get_pango_desc()
|
||||
self.append(self._label)
|
||||
|
||||
# check for camera and if not generate a .jpg
|
||||
has_webcam = False
|
||||
try:
|
||||
import glive
|
||||
self._video = glive.LiveVideoSlot(_VIDEO_WIDTH, _VIDEO_HEIGHT)
|
||||
except ImportError:
|
||||
self._video = IntroFallbackVideo()
|
||||
sys_bus = dbus.SystemBus()
|
||||
hal_obj = sys_bus.get_object ('org.freedesktop.Hal', '/org/freedesktop/Hal/Manager')
|
||||
hal = dbus.Interface (hal_obj, 'org.freedesktop.Hal.Manager')
|
||||
|
||||
udis = hal.FindDeviceByCapability ('video4linux')
|
||||
|
||||
# check for the olpc specific camera
|
||||
if not udis:
|
||||
udis = hal.FindDeviceStringMatch('info.linux.driver','cafe1000-ccic')
|
||||
|
||||
if udis:
|
||||
has_webcam = True
|
||||
|
||||
finally:
|
||||
if has_webcam:
|
||||
import glive
|
||||
self._video = glive.LiveVideoSlot(_VIDEO_WIDTH, _VIDEO_HEIGHT)
|
||||
else:
|
||||
self._video = IntroFallbackVideo()
|
||||
|
||||
self._video.set_size_request(_VIDEO_WIDTH, _VIDEO_HEIGHT)
|
||||
self._video.connect('pixbuf', self._new_pixbuf_cb)
|
||||
|
@ -100,7 +100,7 @@ class MeshModel(gobject.GObject):
|
||||
self._add_access_point(nm_device, nm_network)
|
||||
|
||||
def _nm_network_disappeared_cb(self, nm_device, nm_network):
|
||||
self._remove_access_point(nm_device, nm_network)
|
||||
self._remove_access_point(nm_network)
|
||||
|
||||
def _add_network_device(self, nm_device):
|
||||
for nm_network in nm_device.get_networks():
|
||||
|
@ -55,7 +55,7 @@ class Shell(gobject.GObject):
|
||||
self._frame = Frame(self)
|
||||
self._frame.show_and_hide(3)
|
||||
|
||||
self.start_activity('org.laptop.JournalActivity')
|
||||
#self.start_activity('org.laptop.JournalActivity')
|
||||
|
||||
def _activity_added_cb(self, home_model, home_activity):
|
||||
activity_host = ActivityHost(home_activity)
|
||||
|
@ -70,7 +70,7 @@ class ActivityCreationHandler(gobject.GObject):
|
||||
bundle = registry.get_bundle(service_name)
|
||||
|
||||
bus = dbus.SessionBus()
|
||||
proxy_obj = bus.get_object(service_name, bundle.get_object_path())
|
||||
proxy_obj = bus.get_object(service_name, bundle.get_object_path(), follow_name_owner_changes=True)
|
||||
factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory")
|
||||
|
||||
factory.create(self._activity_handle.get_dict(),
|
||||
|
@ -1,6 +1,6 @@
|
||||
VERSION=0.63
|
||||
DATE=`date +%Y%m%d`
|
||||
RELEASE=2.38
|
||||
RELEASE=2.42
|
||||
TARBALL=sugar-$VERSION-$RELEASE.${DATE}git.tar.bz2
|
||||
|
||||
rm sugar-$VERSION.tar.bz2
|
||||
|
Loading…
Reference in New Issue
Block a user