Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2007-03-06 16:15:55 (GMT)
committer Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>2007-03-06 16:15:55 (GMT)
commitf716f20191228e77111332da5021dde5728602c1 (patch)
treea96d86a7e40e3dfe6358a1cfebb5ed8e5d9f57ad /services
parent195e18d7b007966dc0bf30c0e6eee26149190bab (diff)
start to implement join and share activities
Diffstat (limited to 'services')
-rw-r--r--services/presence2/activity.py15
-rw-r--r--services/presence2/presenceservice.py30
-rw-r--r--services/presence2/server_plugin.py34
3 files changed, 67 insertions, 12 deletions
diff --git a/services/presence2/activity.py b/services/presence2/activity.py
index 7010d1b..90ed574 100644
--- a/services/presence2/activity.py
+++ b/services/presence2/activity.py
@@ -21,7 +21,7 @@ _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, activity_id):
+ def __init__(self, bus_name, object_id, activity_id, tp):
self._buddies = []
self._color = None
self._valid = False
@@ -29,6 +29,12 @@ class Activity(dbus.service.Object):
self._object_id = object_id
self._object_path = "/org/laptop/Presence/Activities/%d" % self._object_id
+
+ # the telepathy client
+ self._tp = tp
+ self._activity_text_channel = None
+
+ self._joined = False
dbus.service.Object.__init__(self, bus_name, self._object_path)
@@ -63,7 +69,7 @@ class Activity(dbus.service.Object):
@dbus.service.method(_ACTIVITY_INTERFACE,
in_signature="", out_signature="")
def Join(self):
- raise NotImplementedError("not implemented yet")
+ self.join()
@dbus.service.method(_ACTIVITY_INTERFACE,
in_signature="", out_signature="ao")
@@ -103,3 +109,8 @@ class Activity(dbus.service.Object):
if buddy in self._buddies:
self._buddies.remove(buddy)
self.BuddyLeft(buddy.object_path())
+
+ def join(self):
+ if not self._joined:
+ self._activity_text_channel = self._tp.join_activity(self._activity_id)
+ self._joined = True
diff --git a/services/presence2/presenceservice.py b/services/presence2/presenceservice.py
index 47bcdea..61462ba 100644
--- a/services/presence2/presenceservice.py
+++ b/services/presence2/presenceservice.py
@@ -76,7 +76,8 @@ class PresenceService(dbus.service.Object):
dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)
def _server_status_cb(self, plugin, status, reason):
- pass
+ if status == CONNECTION_STATUS_CONNECTED:
+ pass
def _contact_online(self, tp, handle, props):
new_buddy = False
@@ -133,9 +134,9 @@ class PresenceService(dbus.service.Object):
buddy.set_properties(prop)
print "Buddy %s properties updated" % buddy.props.key
- def _new_activity(self, activity_id):
+ def _new_activity(self, activity_id, tp):
objid = self._get_next_object_id()
- activity = Activity(self._bus_name, objid, activity_id)
+ activity = Activity(self._bus_name, objid, activity_id, tp)
# FIXME : don't do that shit !
activity._valid = True
self._activities[activity_id] = activity
@@ -175,11 +176,11 @@ class PresenceService(dbus.service.Object):
activity = self._activities.get(act)
if not activity:
# new activity
- activity = self._new_activity(act)
+ activity = self._new_activity(act, tp)
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
@@ -248,12 +249,29 @@ class PresenceService(dbus.service.Object):
@dbus.service.method(_PRESENCE_INTERFACE, in_signature="sssa{sv}", out_signature="o")
def ShareActivity(self, actid, atype, name, properties):
- raise NotImplementedError("not implemented yet")
+ activity = self._share_activity(actid, atype, name, properties)
+ return activity.object_path()
def cleanup(self):
for tp in self._handles_buddies:
tp.cleanup()
+ def _share_activity(self, actid, atype, name, properties):
+ objid = self._get_next_object_id()
+ # FIXME check which tp client we should use to share the activity
+ activity = Activity(self._bus_name, objid, actid, self._server_plugin)
+ # FIXME : don't do that shit !
+ activity._valid = True
+ self._activities[actid] = activity
+ # FIXME set the type, name, properties...
+
+ print "new activity", actid
+ activity.join()
+ self.ActivityAppeared(activity.object_path())
+
+ return activity
+
+
def main():
loop = gobject.MainLoop()
ps = PresenceService()
diff --git a/services/presence2/server_plugin.py b/services/presence2/server_plugin.py
index 5ca12fd..a5c57e6 100644
--- a/services/presence2/server_plugin.py
+++ b/services/presence2/server_plugin.py
@@ -29,11 +29,11 @@ import hashlib
from telepathy.client import ConnectionManager, ManagerRegistry, Connection, Channel
from telepathy.interfaces import (
CONN_MGR_INTERFACE, CONN_INTERFACE, CHANNEL_TYPE_CONTACT_LIST, CHANNEL_INTERFACE_GROUP, CONN_INTERFACE_ALIASING,
- CONN_INTERFACE_AVATARS, CONN_INTERFACE_PRESENCE)
+ CONN_INTERFACE_AVATARS, CONN_INTERFACE_PRESENCE, CHANNEL_TYPE_TEXT)
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_ROOM,
+ 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'
@@ -93,7 +93,9 @@ class ServerPlugin(gobject.GObject):
self._gabble_mgr = registry.GetManager('gabble')
self._online_contacts = {} # handle -> jid
+
self._activities = {} # activity id -> handle
+ self._joined_activities = [] # (activity_id, handle of the activity channel)
self._account = self._get_account_info()
self._conn = self._init_connection()
@@ -138,6 +140,9 @@ class ServerPlugin(gobject.GObject):
return item
return None
+ def get_connection(self):
+ return self._conn
+
def _init_connection(self):
conn = self._find_existing_connection()
if not conn:
@@ -249,6 +254,27 @@ class ServerPlugin(gobject.GObject):
except RuntimeError, e:
pass
+ def join_activity(self, act):
+ handle = self._activities.get(act)
+
+ if not handle:
+ handle = self._conn[CONN_INTERFACE].RequestHandles(CONNECTION_HANDLE_TYPE_ROOM, [act])[0]
+ self._activities[act] = handle
+
+ if (act, handle) in self._joined_activities:
+ print "%s already joined" % act
+ return
+
+ chan_path = self._conn[CONN_INTERFACE].RequestChannel(
+ CHANNEL_TYPE_TEXT, CONNECTION_HANDLE_TYPE_ROOM,
+ handle, True)
+ channel = Channel(self._conn._dbus_object._named_service, chan_path)
+
+ self._joined_activities.append((act, handle))
+ self._conn[CONN_INTERFACE_BUDDY_INFO].SetActivities(self._joined_activities)
+
+ return channel
+
def _set_self_buddy_info(self):
# Set our OLPC buddy properties
props = {}
@@ -264,7 +290,7 @@ 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._conn[CONN_INTERFACE_BUDDY_INFO].SetActivities(self._joined_activities)
self._upload_avatar()
@@ -273,8 +299,8 @@ class ServerPlugin(gobject.GObject):
print 'connecting: %r' % reason
elif state == CONNECTION_STATUS_CONNECTED:
print 'connected: %r' % reason
- self.emit('status', state, int(reason))
self._connected_cb()
+ self.emit('status', state, int(reason))
elif state == CONNECTION_STATUS_DISCONNECTED:
print 'disconnected: %r' % reason
self.emit('status', state, int(reason))