Setup the activity from the shell process, through dbus,

this simplifies things a lot...
This commit is contained in:
Marco Pesenti Gritti 2006-08-09 12:57:42 +02:00
parent e4c4e866a5
commit 7e85c5160e
6 changed files with 85 additions and 52 deletions

View File

@ -10,11 +10,10 @@ class ActivityHost:
self._xid = xid self._xid = xid
bus = dbus.SessionBus() bus = dbus.SessionBus()
service = Activity.ACTIVITY_SERVICE_NAME + "%s" % xid
path = Activity.ACTIVITY_SERVICE_PATH + "/%s" % xid path = Activity.ACTIVITY_SERVICE_PATH + "/%s" % xid
proxy_obj = bus.get_object(service, path) proxy_obj = bus.get_object(Activity.ACTIVITY_SERVICE_NAME, path)
self._activity = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Activity') self._activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE)
self._id = self._activity.get_id() self._id = self._activity.get_id()
self._default_type = self._activity.get_default_type() self._default_type = self._activity.get_default_type()
self._window = gtk.gdk.window_foreign_new(xid) self._window = gtk.gdk.window_foreign_new(xid)

View File

@ -45,6 +45,13 @@ class ActivityRegistry:
def __init__(self): def __init__(self):
self._activities = [] self._activities = []
def get_activity_from_id(self, activity_id):
"""Returns an activity given his identifier"""
for activity in self._activities:
if activity.get_id() == activity_id:
return activity
return None
def get_activity(self, default_type): def get_activity(self, default_type):
"""Returns an activity given his default type""" """Returns an activity given his default type"""

View File

@ -72,16 +72,7 @@ class ActivitiesGrid(gtk.VBox):
self._buttons[activity.get_id()] = button self._buttons[activity.get_id()] = button
def __button_clicked_cb(self, button, info): def __button_clicked_cb(self, button, info):
activity = self._shell.get_registry().get_activity(info.get_type()) self._shell.join_activity(info.get_service())
activity_id = info.get_service().get_activity_id()
pservice = PresenceService()
activity_ps = pservice.get_activity(activity_id)
if activity_ps:
ActivityFactory.create(activity.get_id(), activity_ps)
else:
print 'Cannot start activity.'
class TasksGrid(gtk.VBox): class TasksGrid(gtk.VBox):
def __init__(self, home): def __init__(self, home):
@ -168,7 +159,7 @@ class HomeWindow(gtk.Window):
return self._shell.get_registry().list_activities() return self._shell.get_registry().list_activities()
def create(self, activity_name): def create(self, activity_name):
ActivityFactory.create(activity_name) self._shell.start_activity(activity_name)
def activate(self, activity_window): def activate(self, activity_window):
activity_window.activate(gtk.get_current_event_time()) activity_window.activate(gtk.get_current_event_time())

View File

@ -1,4 +1,5 @@
import os import os
import logging
import dbus import dbus
import dbus.glib import dbus.glib
@ -12,9 +13,10 @@ from HomeWindow import HomeWindow
from sugar import env from sugar import env
from ConsoleWindow import ConsoleWindow from ConsoleWindow import ConsoleWindow
from Owner import ShellOwner from Owner import ShellOwner
from PresenceService import PresenceService from sugar.presence.PresenceService import PresenceService
from ActivityHost import ActivityHost from ActivityHost import ActivityHost
from ChatListener import ChatListener from ChatListener import ChatListener
from sugar.activity import ActivityFactory
class ShellDbusService(dbus.service.Object): class ShellDbusService(dbus.service.Object):
def __init__(self, shell, bus_name): def __init__(self, shell, bus_name):
@ -106,6 +108,30 @@ class Shell:
module = self._registry.get_activity(activity.get_default_type()) module = self._registry.get_activity(activity.get_default_type())
console = self.get_console(module.get_id()) console = self.get_console(module.get_id())
activity.show_dialog(console) activity.show_dialog(console)
def join_activity(self, service):
info = self._registry.get_activity(service.get_type())
activity_id = service.get_activity_id()
pservice = PresenceService()
activity_ps = pservice.get_activity(activity_id)
if activity_ps:
activity = ActivityFactory.create(info.get_id())
activity.set_default_type(service.get_type())
activity.join(activity_ps.object_path())
else:
logging.error('Cannot start activity.')
def start_activity(self, activity_name):
activity = ActivityFactory.create(activity_name)
info = self._registry.get_activity_from_id(activity_name)
if info:
activity.set_default_type(info.get_default_type())
return activity
else:
logging.error('No such activity in the directory')
return None
def log(self, module_id, message): def log(self, module_id, message):
console = self.get_console(module_id) console = self.get_console(module_id)

View File

@ -6,8 +6,9 @@ import gobject
from sugar.presence.PresenceService import PresenceService from sugar.presence.PresenceService import PresenceService
import sugar.util import sugar.util
ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity" ACTIVITY_SERVICE_NAME = "org.laptop.Activity"
ACTIVITY_SERVICE_PATH = "/com/redhat/Sugar/Activity" ACTIVITY_SERVICE_PATH = "/org/laptop/Activity"
ACTIVITY_INTERFACE = "org.laptop.Activity"
class ActivityDbusService(dbus.service.Object): class ActivityDbusService(dbus.service.Object):
"""Base dbus service object that each Activity uses to export dbus methods. """Base dbus service object that each Activity uses to export dbus methods.
@ -15,31 +16,46 @@ class ActivityDbusService(dbus.service.Object):
The dbus service is separate from the actual Activity object so that we can The dbus service is separate from the actual Activity object so that we can
tightly control what stuff passes through the dbus python bindings.""" tightly control what stuff passes through the dbus python bindings."""
def __init__(self, xid, activity): def __init__(self, pservice, xid, activity):
self._activity = activity self._activity = activity
self._pservice = pservice
bus = dbus.SessionBus()
service_name = ACTIVITY_SERVICE_NAME + "%s" % xid
object_path = ACTIVITY_SERVICE_PATH + "/%s" % xid
service = dbus.service.BusName(service_name, bus=bus)
dbus.service.Object.__init__(self, service, object_path)
@dbus.service.method(ACTIVITY_SERVICE_NAME) bus = dbus.SessionBus()
service_name = ACTIVITY_SERVICE_NAME
self._object_path = ACTIVITY_SERVICE_PATH + "/%s" % xid
service = dbus.service.BusName(service_name, bus=bus)
dbus.service.Object.__init__(self, service, self._object_path)
def get_object_path(self):
return self._object_path
@dbus.service.method(ACTIVITY_INTERFACE)
def share(self): def share(self):
"""Called by the shell to request the activity to share itself on the network.""" """Called by the shell to request the activity to share itself on the network."""
self._activity.share() self._activity.share()
@dbus.service.method(ACTIVITY_SERVICE_NAME) @dbus.service.method(ACTIVITY_INTERFACE)
def join(self, activity_ps_path):
"""Join the activity specified by its presence service path"""
activity_ps = self._pservice.get(activity_ps_path)
return self._activity.join(activity_ps)
@dbus.service.method(ACTIVITY_INTERFACE)
def get_id(self): def get_id(self):
"""Get the activity identifier""" """Get the activity identifier"""
return self._activity.get_id() return self._activity.get_id()
@dbus.service.method(ACTIVITY_SERVICE_NAME) @dbus.service.method(ACTIVITY_INTERFACE)
def get_default_type(self): def get_default_type(self):
"""Get the activity default type""" """Get the activity default type"""
return self._activity.get_default_type() return self._activity.get_default_type()
@dbus.service.method(ACTIVITY_SERVICE_NAME) @dbus.service.method(ACTIVITY_INTERFACE)
def set_default_type(self, default_type):
"""Set the activity default type"""
self._activity.set_default_type(default_type)
@dbus.service.method(ACTIVITY_INTERFACE)
def get_shared(self): def get_shared(self):
"""Returns True if the activity is shared on the mesh.""" """Returns True if the activity is shared on the mesh."""
return self._activity.get_shared() return self._activity.get_shared()
@ -61,12 +77,16 @@ class Activity(gtk.Window):
group.realize() group.realize()
self.window.set_group(group.window) self.window.set_group(group.window)
self._dbus_service = ActivityDbusService(self.window.xid, self) self._bus = ActivityDbusService(self._pservice, self.window.xid, self)
def __del__(self): def __del__(self):
if self._dbus_service: if self._bus:
del self._dbus_service del self._bus
self._dbus_service = None self._bus = None
def get_object_path(self):
"""Returns the path of the activity dbus service"""
return self._bus.get_object_path()
def set_default_type(self, default_type): def set_default_type(self, default_type):
"""Set the activity default type. """Set the activity default type.

View File

@ -6,9 +6,7 @@ import dbus.service
import gobject import gobject
from sugar.presence.PresenceService import PresenceService from sugar.presence.PresenceService import PresenceService
from sugar.activity import Activity
ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity"
ACTIVITY_SERVICE_PATH = "/com/redhat/Sugar/Activity"
def get_path(activity_name): def get_path(activity_name):
"""Returns the activity path""" """Returns the activity path"""
@ -39,23 +37,13 @@ class ActivityFactory(dbus.service.Object):
bus_name = dbus.service.BusName(factory, bus = bus) bus_name = dbus.service.BusName(factory, bus = bus)
dbus.service.Object.__init__(self, bus_name, get_path(factory)) dbus.service.Object.__init__(self, bus_name, get_path(factory))
@dbus.service.method("com.redhat.Sugar.ActivityFactory",
in_signature="o", out_signature="")
def create_with_service(self, service_path):
pservice = PresenceService()
service = pservice.get(service_path)
activity = self._class()
activity.set_default_type(self._default_type)
activity.join(service)
@dbus.service.method("com.redhat.Sugar.ActivityFactory") @dbus.service.method("com.redhat.Sugar.ActivityFactory")
def create(self): def create(self):
activity = self._class() activity = self._class()
activity.set_default_type(self._default_type) activity.set_default_type(self._default_type)
return activity.get_object_path()
def create(activity_name, service = None): def create(activity_name):
"""Create a new activity from his name.""" """Create a new activity from his name."""
bus = dbus.SessionBus() bus = dbus.SessionBus()
@ -65,11 +53,13 @@ def create(activity_name, service = None):
proxy_obj = bus.get_object(factory_name, factory_path) proxy_obj = bus.get_object(factory_name, factory_path)
factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory") factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory")
if service: activity_path = factory.create()
print service.object_path()
factory.create_with_service(service.object_path()) bus = dbus.SessionBus()
else: proxy_obj = bus.get_object(Activity.ACTIVITY_SERVICE_NAME, activity_path)
factory.create() activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE)
return activity
def register_factory(name, activity_class, default_type=None): def register_factory(name, activity_class, default_type=None):
"""Register the activity factory.""" """Register the activity factory."""