diff options
author | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-08-09 10:57:42 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-08-09 10:57:42 (GMT) |
commit | 7e85c5160ec0a04cb7434cd53368a7c5ba8ce0fa (patch) | |
tree | 13a0147daa22113625ce33818b1d938d893970da | |
parent | e4c4e866a5c99d81f7fa0a0972311a604c6f1af2 (diff) |
Setup the activity from the shell process, through dbus,
this simplifies things a lot...
-rw-r--r-- | shell/ActivityHost.py | 5 | ||||
-rw-r--r-- | shell/ActivityRegistry.py | 7 | ||||
-rw-r--r-- | shell/HomeWindow.py | 13 | ||||
-rwxr-xr-x | shell/Shell.py | 28 | ||||
-rw-r--r-- | sugar/activity/Activity.py | 50 | ||||
-rw-r--r-- | sugar/activity/ActivityFactory.py | 30 |
6 files changed, 83 insertions, 50 deletions
diff --git a/shell/ActivityHost.py b/shell/ActivityHost.py index 540d1e2..f2287c4 100644 --- a/shell/ActivityHost.py +++ b/shell/ActivityHost.py @@ -10,11 +10,10 @@ class ActivityHost: self._xid = xid bus = dbus.SessionBus() - service = Activity.ACTIVITY_SERVICE_NAME + "%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._default_type = self._activity.get_default_type() self._window = gtk.gdk.window_foreign_new(xid) diff --git a/shell/ActivityRegistry.py b/shell/ActivityRegistry.py index 3ac8a4f..acf379c 100644 --- a/shell/ActivityRegistry.py +++ b/shell/ActivityRegistry.py @@ -45,6 +45,13 @@ class ActivityRegistry: def __init__(self): 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): """Returns an activity given his default type""" diff --git a/shell/HomeWindow.py b/shell/HomeWindow.py index ef44f61..886068c 100644 --- a/shell/HomeWindow.py +++ b/shell/HomeWindow.py @@ -72,16 +72,7 @@ class ActivitiesGrid(gtk.VBox): self._buttons[activity.get_id()] = button def __button_clicked_cb(self, button, info): - activity = self._shell.get_registry().get_activity(info.get_type()) - - 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.' + self._shell.join_activity(info.get_service()) class TasksGrid(gtk.VBox): def __init__(self, home): @@ -168,7 +159,7 @@ class HomeWindow(gtk.Window): return self._shell.get_registry().list_activities() def create(self, activity_name): - ActivityFactory.create(activity_name) + self._shell.start_activity(activity_name) def activate(self, activity_window): activity_window.activate(gtk.get_current_event_time()) diff --git a/shell/Shell.py b/shell/Shell.py index 2860ed0..f08d724 100755 --- a/shell/Shell.py +++ b/shell/Shell.py @@ -1,4 +1,5 @@ import os +import logging import dbus import dbus.glib @@ -12,9 +13,10 @@ from HomeWindow import HomeWindow from sugar import env from ConsoleWindow import ConsoleWindow from Owner import ShellOwner -from PresenceService import PresenceService +from sugar.presence.PresenceService import PresenceService from ActivityHost import ActivityHost from ChatListener import ChatListener +from sugar.activity import ActivityFactory class ShellDbusService(dbus.service.Object): def __init__(self, shell, bus_name): @@ -106,6 +108,30 @@ class Shell: module = self._registry.get_activity(activity.get_default_type()) console = self.get_console(module.get_id()) 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): console = self.get_console(module_id) diff --git a/sugar/activity/Activity.py b/sugar/activity/Activity.py index 339c085..46848a4 100644 --- a/sugar/activity/Activity.py +++ b/sugar/activity/Activity.py @@ -6,8 +6,9 @@ import gobject from sugar.presence.PresenceService import PresenceService import sugar.util -ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity" -ACTIVITY_SERVICE_PATH = "/com/redhat/Sugar/Activity" +ACTIVITY_SERVICE_NAME = "org.laptop.Activity" +ACTIVITY_SERVICE_PATH = "/org/laptop/Activity" +ACTIVITY_INTERFACE = "org.laptop.Activity" class ActivityDbusService(dbus.service.Object): """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 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._pservice = pservice + bus = dbus.SessionBus() - service_name = ACTIVITY_SERVICE_NAME + "%s" % xid - object_path = ACTIVITY_SERVICE_PATH + "/%s" % xid + 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, object_path) + dbus.service.Object.__init__(self, service, self._object_path) + + def get_object_path(self): + return self._object_path - @dbus.service.method(ACTIVITY_SERVICE_NAME) + @dbus.service.method(ACTIVITY_INTERFACE) def share(self): """Called by the shell to request the activity to share itself on the network.""" 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): """Get the activity identifier""" return self._activity.get_id() - @dbus.service.method(ACTIVITY_SERVICE_NAME) + @dbus.service.method(ACTIVITY_INTERFACE) def get_default_type(self): """Get the activity 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): """Returns True if the activity is shared on the mesh.""" return self._activity.get_shared() @@ -61,12 +77,16 @@ class Activity(gtk.Window): group.realize() 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): - if self._dbus_service: - del self._dbus_service - self._dbus_service = None + if self._bus: + del self._bus + 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): """Set the activity default type. diff --git a/sugar/activity/ActivityFactory.py b/sugar/activity/ActivityFactory.py index ca3dfb8..3d11e34 100644 --- a/sugar/activity/ActivityFactory.py +++ b/sugar/activity/ActivityFactory.py @@ -6,9 +6,7 @@ import dbus.service import gobject from sugar.presence.PresenceService import PresenceService - -ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity" -ACTIVITY_SERVICE_PATH = "/com/redhat/Sugar/Activity" +from sugar.activity import Activity def get_path(activity_name): """Returns the activity path""" @@ -39,23 +37,13 @@ class ActivityFactory(dbus.service.Object): bus_name = dbus.service.BusName(factory, bus = bus) 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") def create(self): activity = self._class() 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.""" bus = dbus.SessionBus() @@ -65,11 +53,13 @@ def create(activity_name, service = None): proxy_obj = bus.get_object(factory_name, factory_path) factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory") - if service: - print service.object_path() - factory.create_with_service(service.object_path()) - else: - factory.create() + activity_path = factory.create() + + bus = dbus.SessionBus() + proxy_obj = bus.get_object(Activity.ACTIVITY_SERVICE_NAME, activity_path) + activity = dbus.Interface(proxy_obj, Activity.ACTIVITY_INTERFACE) + + return activity def register_factory(name, activity_class, default_type=None): """Register the activity factory.""" |