Add an handle argument to the factory and to the activity constructor.

This commit is contained in:
Marco Pesenti Gritti 2007-02-22 00:07:08 +01:00
parent d4639a1764
commit 5cf2b49cc1
6 changed files with 61 additions and 20 deletions

View File

@ -20,7 +20,7 @@ import gobject
import wnck import wnck
from view.home.HomeWindow import HomeWindow from view.home.HomeWindow import HomeWindow
from sugar.presence import PresenceService from sugar.activity.activityhandle import ActivityHandle
from sugar.graphics.popupcontext import PopupContext from sugar.graphics.popupcontext import PopupContext
from view.ActivityHost import ActivityHost from view.ActivityHost import ActivityHost
from sugar.activity import activityfactory from sugar.activity import activityfactory
@ -60,8 +60,6 @@ class Shell(gobject.GObject):
self._frame = Frame(self) self._frame = Frame(self)
self._frame.show_and_hide(3) self._frame.show_and_hide(3)
self._pservice = PresenceService.get_instance()
self.start_activity('org.laptop.JournalActivity') self.start_activity('org.laptop.JournalActivity')
def _activity_added_cb(self, home_model, home_activity): def _activity_added_cb(self, home_model, home_activity):
@ -117,11 +115,6 @@ class Shell(gobject.GObject):
activity.present() activity.present()
return return
activity_ps = self._pservice.get_activity(activity_id)
if not activity_ps:
logging.error("Couldn't find shared activity for %s" % activity_id)
return
# Get the service name for this activity, if # Get the service name for this activity, if
# we have a bundle on the system capable of handling # we have a bundle on the system capable of handling
# this activity type # this activity type
@ -135,7 +128,10 @@ class Shell(gobject.GObject):
home_model = self._model.get_home() home_model = self._model.get_home()
home_model.notify_activity_launch(activity_id, act_type) home_model.notify_activity_launch(activity_id, act_type)
handler = activityfactory.create(act_type) handle = ActivityHandle(activity_id)
handle.pservice_id = activity_id
handler = activityfactory.create(act_type, handle)
handler.connect('success', self._join_success_cb, activity_ps) handler.connect('success', self._join_success_cb, activity_ps)
handler.connect('error', self._join_error_cb, home_model) handler.connect('error', self._join_error_cb, home_model)

View File

@ -26,7 +26,7 @@ from sugar import env
class Activity(gtk.Window): class Activity(gtk.Window):
"""Base Activity class that all other Activities derive from.""" """Base Activity class that all other Activities derive from."""
def __init__(self): def __init__(self, activity_handle):
gtk.Window.__init__(self) gtk.Window.__init__(self)
self.connect('destroy', self._destroy_cb) self.connect('destroy', self._destroy_cb)

View File

@ -4,6 +4,7 @@ sugar_PYTHON = \
Activity.py \ Activity.py \
activityfactory.py \ activityfactory.py \
activityfactoryservice.py \ activityfactoryservice.py \
activityhandle.py \
activityservice.py \ activityservice.py \
bundle.py \ bundle.py \
bundlebuilder.py \ bundlebuilder.py \

View File

@ -23,6 +23,7 @@ import gtk
from sugar.presence import PresenceService from sugar.presence import PresenceService
from sugar.activity import bundleregistry from sugar.activity import bundleregistry
from sugar.activity.activityhandle import ActivityHandle
from sugar import util from sugar import util
_ACTIVITY_SERVICE_NAME = "org.laptop.Activity" _ACTIVITY_SERVICE_NAME = "org.laptop.Activity"
@ -40,12 +41,17 @@ class ActivityCreationHandler(gobject.GObject):
([gobject.TYPE_PYOBJECT])) ([gobject.TYPE_PYOBJECT]))
} }
def __init__(self, service_name): def __init__(self, service_name, activity_handle):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._activity_id = self._find_unique_activity_id() if activity_handle:
if not self._activity_id: self._activity_handle = activity_handle
raise RuntimeError("Cannot generate activity id.") else:
activity_id = self._find_unique_activity_id()
if activity_id:
self._activity_handle = ActivityHandle(activity_id)
else:
raise RuntimeError("Cannot generate activity id.")
registry = bundleregistry.get_registry() registry = bundleregistry.get_registry()
bundle = registry.get_bundle(service_name) bundle = registry.get_bundle(service_name)
@ -54,10 +60,12 @@ class ActivityCreationHandler(gobject.GObject):
proxy_obj = bus.get_object(service_name, bundle.get_object_path()) proxy_obj = bus.get_object(service_name, bundle.get_object_path())
factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory") factory = dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityFactory")
factory.create(reply_handler=self._reply_handler, error_handler=self._error_handler) factory.create(str(self._activity_handle),
reply_handler=self._reply_handler,
error_handler=self._error_handler)
def get_activity_id(self): def get_activity_id(self):
return self._activity_id return self._activity_handle.activity_id
def _find_unique_activity_id(self): def _find_unique_activity_id(self):
pservice = PresenceService.get_instance() pservice = PresenceService.get_instance()
@ -93,6 +101,6 @@ class ActivityCreationHandler(gobject.GObject):
logging.debug("Couldn't create activity: %s" % err) logging.debug("Couldn't create activity: %s" % err)
self.emit('error', err) self.emit('error', err)
def create(service_name): def create(service_name, activity_handle=None):
"""Create a new activity from its name.""" """Create a new activity from its name."""
return ActivityCreationHandler(service_name) return ActivityCreationHandler(service_name, activity_handle)

View File

@ -21,6 +21,7 @@ import dbus
import dbus.service import dbus.service
from sugar.activity.bundle import Bundle from sugar.activity.bundle import Bundle
from sugar.activity import activityhandle
from sugar import logger from sugar import logger
class ActivityFactoryService(dbus.service.Object): class ActivityFactoryService(dbus.service.Object):
@ -48,8 +49,9 @@ class ActivityFactoryService(dbus.service.Object):
dbus.service.Object.__init__(self, bus_name, object_path) dbus.service.Object.__init__(self, bus_name, object_path)
@dbus.service.method("com.redhat.Sugar.ActivityFactory") @dbus.service.method("com.redhat.Sugar.ActivityFactory")
def create(self): def create(self, handle):
activity = self._constructor() activity_handle = activityhandle.create_from_string(handle)
activity = self._constructor(activity_handle)
self._activities.append(activity) self._activities.append(activity)
activity.connect('destroy', self._activity_destroy_cb) activity.connect('destroy', self._activity_destroy_cb)

View File

@ -0,0 +1,34 @@
# Copyright (C) 2006, Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
from sugar.presence import PresenceService
class ActivityHandle(object):
def __init__(self, activity_id):
self.activity_id = activity_id
self.pservice_id = None
def __str__(self):
return self.activity_id
def get_presence_service():
pservice = PresenceService.get_instance()
return pservice.get_activity(self._pservice_id)
def create_from_string(handle):
activity_handle = ActivityHandle(handle)
activity_handle.pservice_id = handle