Add buddy and activity classes (guillaume)
This commit is contained in:
parent
3b863f45a8
commit
1dcb9e9088
@ -1,6 +1,8 @@
|
|||||||
sugardir = $(pkgdatadir)/services/presence2
|
sugardir = $(pkgdatadir)/services/presence2
|
||||||
sugar_PYTHON = \
|
sugar_PYTHON = \
|
||||||
__init__.py \
|
__init__.py \
|
||||||
|
activity.py \
|
||||||
|
buddy.py \
|
||||||
buddyiconcache.py \
|
buddyiconcache.py \
|
||||||
presenceservice.py
|
presenceservice.py
|
||||||
|
|
||||||
|
92
services/presence2/activity.py
Normal file
92
services/presence2/activity.py
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# Copyright (C) 2007, Red Hat, Inc.
|
||||||
|
# Copyright (C) 2007, Collabora Ltd.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
import dbus, dbus.service
|
||||||
|
|
||||||
|
_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):
|
||||||
|
self._buddies = []
|
||||||
|
self._color = None
|
||||||
|
self._valid = False
|
||||||
|
self._activity_id = None
|
||||||
|
|
||||||
|
self._object_id = object_id
|
||||||
|
self._object_path = "/org/laptop/Presence/Activities/%d" % self._object_id
|
||||||
|
|
||||||
|
dbus.service.Object.__init__(self, bus_name, self._object_path)
|
||||||
|
|
||||||
|
|
||||||
|
# dbus signals
|
||||||
|
@dbus.service.signal(_ACTIVITY_INTERFACE,
|
||||||
|
signature="o")
|
||||||
|
def BuddyJoined(self, buddy_path):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(_ACTIVITY_INTERFACE,
|
||||||
|
signature="o")
|
||||||
|
def BuddyLeft(self, buddy_path):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(_ACTIVITY_INTERFACE,
|
||||||
|
signature="o")
|
||||||
|
def NewChannel(self, channel_path):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# dbus methods
|
||||||
|
@dbus.service.method(_ACTIVITY_INTERFACE,
|
||||||
|
in_signature="", out_signature="s")
|
||||||
|
def GetId(self):
|
||||||
|
return self.get_id()
|
||||||
|
|
||||||
|
@dbus.service.method(_ACTIVITY_INTERFACE,
|
||||||
|
in_signature="", out_signature="s")
|
||||||
|
def GetColor(self):
|
||||||
|
return self.get_color()
|
||||||
|
|
||||||
|
@dbus.service.method(_ACTIVITY_INTERFACE,
|
||||||
|
in_signature="", out_signature="")
|
||||||
|
def Join(self):
|
||||||
|
raise NotImplementedError("not implemented yet")
|
||||||
|
|
||||||
|
@dbus.service.method(_ACTIVITY_INTERFACE,
|
||||||
|
in_signature="", out_signature="ao")
|
||||||
|
def GetJoinedBuddies(self):
|
||||||
|
for buddy in self._buddies:
|
||||||
|
ret.append(buddy.object_path())
|
||||||
|
return ret
|
||||||
|
|
||||||
|
@dbus.service.method(_ACTIVITY_INTERFACE,
|
||||||
|
in_signature="", out_signature="soao")
|
||||||
|
def GetChannels(self):
|
||||||
|
raise NotImplementedError("not implemented yet")
|
||||||
|
|
||||||
|
# methods
|
||||||
|
def object_path(self):
|
||||||
|
return dbus.ObjectPath(self._object_path)
|
||||||
|
|
||||||
|
def is_valid(self):
|
||||||
|
"""An activity is only valid when it's color is available."""
|
||||||
|
return self._valid
|
||||||
|
|
||||||
|
def get_id(self):
|
||||||
|
return self._activity_id
|
||||||
|
|
||||||
|
def get_color(self):
|
||||||
|
return self._color
|
201
services/presence2/buddy.py
Normal file
201
services/presence2/buddy.py
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
# Copyright (C) 2007, Red Hat, Inc.
|
||||||
|
# Copyright (C) 2007, Collabora Ltd.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
import gobject
|
||||||
|
import dbus, dbus.service
|
||||||
|
from sugar import profile
|
||||||
|
from sugar.graphics import iconcolor
|
||||||
|
|
||||||
|
_BUDDY_PATH = "/org/laptop/Sugar/Presence/Buddies/"
|
||||||
|
_BUDDY_INTERFACE = "org.laptop.Sugar.Presence.Buddy"
|
||||||
|
_OWNER_INTERFACE = "org.laptop.Sugar.Presence.Buddy.Owner"
|
||||||
|
|
||||||
|
class NotFoundError(dbus.DBusException):
|
||||||
|
def __init__(self):
|
||||||
|
dbus.DBusException.__init__(self)
|
||||||
|
self._dbus_error_name = _PRESENCE_INTERFACE + '.NotFound'
|
||||||
|
|
||||||
|
class Buddy(dbus.service.Object):
|
||||||
|
"""Represents another person on the network and keeps track of the
|
||||||
|
activities and resources they make available for sharing."""
|
||||||
|
|
||||||
|
def __init__(self, bus_name, object_id, icon_cache):
|
||||||
|
if not bus_name:
|
||||||
|
raise ValueError("DBus bus name must be valid")
|
||||||
|
if not object_id or not isinstance(object_id, int):
|
||||||
|
raise ValueError("object id must be a valid number")
|
||||||
|
|
||||||
|
self._bus_name = bus_name
|
||||||
|
self._object_id = object_id
|
||||||
|
self._object_path = _BUDDY_PATH + str(self._object_id)
|
||||||
|
|
||||||
|
dbus.service.Object.__init__(self, self._bus_name, self._object_path)
|
||||||
|
|
||||||
|
self._activities = {} # Activity ID -> Activity
|
||||||
|
|
||||||
|
self._icon_cache = icon_cache
|
||||||
|
|
||||||
|
self._nick_name = None
|
||||||
|
self._color = None
|
||||||
|
self._key = None
|
||||||
|
self._current_activity = None
|
||||||
|
|
||||||
|
# dbus signals
|
||||||
|
@dbus.service.signal(_BUDDY_INTERFACE,
|
||||||
|
signature="ay")
|
||||||
|
def IconChanged(self, icon_data):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(_BUDDY_INTERFACE,
|
||||||
|
signature="o")
|
||||||
|
def JoinedActivity(self, activity_path):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(_BUDDY_INTERFACE,
|
||||||
|
signature="o")
|
||||||
|
def LeftActivity(self, activity_path):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@dbus.service.signal(_BUDDY_INTERFACE,
|
||||||
|
signature="a{sv}")
|
||||||
|
def PropertyChanged(self, updated):
|
||||||
|
pass
|
||||||
|
|
||||||
|
# dbus methods
|
||||||
|
@dbus.service.method(_BUDDY_INTERFACE,
|
||||||
|
in_signature="", out_signature="ay")
|
||||||
|
def GetIcon(self):
|
||||||
|
icon = self.get_icon()
|
||||||
|
if not icon:
|
||||||
|
return ""
|
||||||
|
return icon
|
||||||
|
|
||||||
|
@dbus.service.method(_BUDDY_INTERFACE,
|
||||||
|
in_signature="", out_signature="ao")
|
||||||
|
def GetJoinedActivities(self):
|
||||||
|
acts = []
|
||||||
|
for act in self.get_joined_activities():
|
||||||
|
acts.append(act.object_path())
|
||||||
|
return acts
|
||||||
|
|
||||||
|
@dbus.service.method(_BUDDY_INTERFACE,
|
||||||
|
in_signature="", out_signature="a{sv}")
|
||||||
|
def GetProperties(self):
|
||||||
|
props = {}
|
||||||
|
props['name'] = self.get_name()
|
||||||
|
props['owner'] = self.is_owner()
|
||||||
|
props['key'] = self.get_key()
|
||||||
|
color = self.get_color()
|
||||||
|
if color:
|
||||||
|
props['color'] = color
|
||||||
|
return props
|
||||||
|
|
||||||
|
# methods
|
||||||
|
def object_path(self):
|
||||||
|
return dbus.ObjectPath(self._object_path)
|
||||||
|
|
||||||
|
def add_activity(self, activity):
|
||||||
|
actid = activity.get_id()
|
||||||
|
if self._activities.has_key(actid):
|
||||||
|
return
|
||||||
|
self._activities[actid] = activity
|
||||||
|
if activity.is_valid():
|
||||||
|
self.JoinedActivity(activity.object_path())
|
||||||
|
|
||||||
|
def remove_activity(self, activity):
|
||||||
|
actid = activity.get_id()
|
||||||
|
if not self._activities.has_key(actid):
|
||||||
|
return
|
||||||
|
del self._activities[actid]
|
||||||
|
if activity.is_valid():
|
||||||
|
self.LeftActivity(activity.object_path())
|
||||||
|
|
||||||
|
def get_joined_activities(self):
|
||||||
|
acts = []
|
||||||
|
for act in self._activities.values():
|
||||||
|
if act.is_valid():
|
||||||
|
acts.append(act)
|
||||||
|
return acts
|
||||||
|
|
||||||
|
def get_icon(self):
|
||||||
|
"""Return the buddies icon, if any."""
|
||||||
|
return self._icon
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return self._nick_name
|
||||||
|
|
||||||
|
def get_color(self):
|
||||||
|
return self._color
|
||||||
|
|
||||||
|
def get_current_activity(self):
|
||||||
|
if not self._current_activity:
|
||||||
|
return None
|
||||||
|
if not self._activities.has_key(self._current_activity):
|
||||||
|
return None
|
||||||
|
return self._activities[self._current_activity]
|
||||||
|
|
||||||
|
def _set_icon(self, icon):
|
||||||
|
"""Can only set icon for other buddies. The Owner
|
||||||
|
takes care of setting it's own icon."""
|
||||||
|
if icon != self._icon:
|
||||||
|
self._icon = icon
|
||||||
|
self.IconChanged(icon)
|
||||||
|
|
||||||
|
def is_owner(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_key(self):
|
||||||
|
return self._key
|
||||||
|
|
||||||
|
class Owner(Buddy):
|
||||||
|
"""Class representing the owner of the machine. This is the client
|
||||||
|
portion of the Owner, paired with the server portion in Owner.py."""
|
||||||
|
def __init__(self, ps, bus_name, object_id, icon_cache):
|
||||||
|
Buddy.__init__(self, bus_name, object_id, icon_cache)
|
||||||
|
|
||||||
|
self._ps = ps
|
||||||
|
self._nick_name = profile.get_nick_name()
|
||||||
|
self._color = profile.get_color().to_string()
|
||||||
|
self._key = profile.get_pubkey()
|
||||||
|
|
||||||
|
# dbus methods
|
||||||
|
@dbus.service.method(_OWNER_INTERFACE,
|
||||||
|
in_signature="ay", out_signature="")
|
||||||
|
def SetIcon(self, icon_data):
|
||||||
|
self.set_icon(icon_data)
|
||||||
|
|
||||||
|
@dbus.service.method(_OWNER_INTERFACE,
|
||||||
|
in_signature="a{sv}", out_signature="")
|
||||||
|
def SetProperties(self, properties):
|
||||||
|
if "name" in properties.keys():
|
||||||
|
self.set_name(properties["name"])
|
||||||
|
if "color" in properties.keys():
|
||||||
|
self.set_color(properties["color"])
|
||||||
|
self.PropertyChanged(properties)
|
||||||
|
|
||||||
|
# methods
|
||||||
|
def is_owner(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def set_icon(self, icon):
|
||||||
|
self._icon = icon
|
||||||
|
|
||||||
|
def set_name(self, name):
|
||||||
|
self._nick_name = name
|
||||||
|
|
||||||
|
def set_color(self, color):
|
||||||
|
self._color = color
|
@ -16,7 +16,14 @@
|
|||||||
|
|
||||||
import gobject
|
import gobject
|
||||||
import dbus, dbus.service, dbus.glib
|
import dbus, dbus.service, dbus.glib
|
||||||
|
from telepathy.client import ManagerRegistry, Connection
|
||||||
|
from telepathy.interfaces import CONN_MGR_INTERFACE
|
||||||
|
|
||||||
|
import telepathyclient
|
||||||
|
import buddy
|
||||||
|
import activity
|
||||||
import buddyiconcache
|
import buddyiconcache
|
||||||
|
from sugar import profile
|
||||||
|
|
||||||
|
|
||||||
_PRESENCE_SERVICE = "org.laptop.Sugar.Presence"
|
_PRESENCE_SERVICE = "org.laptop.Sugar.Presence"
|
||||||
@ -42,14 +49,19 @@ class PresenceService(dbus.service.Object):
|
|||||||
bus = dbus.SessionBus()
|
bus = dbus.SessionBus()
|
||||||
self._bus_name = dbus.service.BusName(_PRESENCE_SERVICE, bus=bus)
|
self._bus_name = dbus.service.BusName(_PRESENCE_SERVICE, bus=bus)
|
||||||
|
|
||||||
# Our owner object
|
# Create the Owner object
|
||||||
if profile.get_nick_name():
|
|
||||||
objid = self._get_next_object_id()
|
objid = self._get_next_object_id()
|
||||||
self._owner = buddy.Owner(self, self._bus_name,
|
self._owner = buddy.Owner(self, self._bus_name, objid, self._icon_cache)
|
||||||
objid, self._icon_cache)
|
|
||||||
self._buddies[self._owner.get_key()] = self._owner
|
self._buddies[self._owner.get_key()] = self._owner
|
||||||
else:
|
|
||||||
self._owner = None
|
self._registry = ManagerRegistry()
|
||||||
|
self._registry.LoadManagers()
|
||||||
|
# Telepathy connection to the server
|
||||||
|
self._server_client = None
|
||||||
|
# Telepathy link local connection
|
||||||
|
self._ll_client = None
|
||||||
|
|
||||||
|
self._connect_server ()
|
||||||
|
|
||||||
dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)
|
dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)
|
||||||
|
|
||||||
@ -58,6 +70,19 @@ class PresenceService(dbus.service.Object):
|
|||||||
self._next_object_id = self._next_object_id + 1
|
self._next_object_id = self._next_object_id + 1
|
||||||
return self._next_object_id
|
return self._next_object_id
|
||||||
|
|
||||||
|
def _connect_server (self):
|
||||||
|
mgr = self._registry.GetManager('gabble')
|
||||||
|
protocol = 'jabber'
|
||||||
|
account = {
|
||||||
|
'account': 'olpc@collabora.co.uk',
|
||||||
|
'password': 'learn',
|
||||||
|
'server': 'light.bluelinux.co.uk'
|
||||||
|
}
|
||||||
|
conn_bus_name, conn_object_path = \
|
||||||
|
mgr[CONN_MGR_INTERFACE].RequestConnection(protocol, account)
|
||||||
|
conn = Connection(conn_bus_name, conn_object_path)
|
||||||
|
self._server_client = telepathyclient.TelepathyClient(conn)
|
||||||
|
|
||||||
@dbus.service.signal(_PRESENCE_INTERFACE, signature="o")
|
@dbus.service.signal(_PRESENCE_INTERFACE, signature="o")
|
||||||
def ActivityAppeared(self, activity):
|
def ActivityAppeared(self, activity):
|
||||||
pass
|
pass
|
||||||
|
Loading…
Reference in New Issue
Block a user