Generate the id in ActivityFactory. I want it to be easy to

run activities without using the shell. Some regression in
the debug messages, which I'll fix as part of further
refactoring.
This commit is contained in:
Marco Pesenti Gritti 2007-02-21 20:56:14 +01:00
parent ef3f861954
commit 9ba487fa1f
2 changed files with 46 additions and 52 deletions

View File

@ -105,13 +105,11 @@ class Shell(gobject.GObject):
def get_popup_context(self): def get_popup_context(self):
return self._popup_context return self._popup_context
def _join_success_cb(self, handler, activity, activity_ps, activity_id, activity_type): def _join_success_cb(self, handler, activity, activity_ps):
logging.debug("Joining activity %s (%s)" % (activity_id, activity_type))
activity.join(activity_ps.object_path()) activity.join(activity_ps.object_path())
def _join_error_cb(self, handler, err, home_model, activity_id, activity_type): def _join_error_cb(self, handler, err, home_model):
logging.error("Couldn't launch activity %s (%s):\n%s" % (activity_id, activity_type, err)) home_mode.notify_activity_launch_failed(handler.get_activity_id())
home_mode.notify_activity_launch_failed(activity_id)
def join_activity(self, bundle_id, activity_id): def join_activity(self, bundle_id, activity_id):
activity = self.get_activity(activity_id) activity = self.get_activity(activity_id)
@ -138,61 +136,26 @@ class Shell(gobject.GObject):
home_model.notify_activity_launch(activity_id, act_type) home_model.notify_activity_launch(activity_id, act_type)
handler = activityfactory.create(act_type) handler = activityfactory.create(act_type)
handler.connect('success', self._join_success_cb, activity_ps, activity_id, act_type) handler.connect('success', self._join_success_cb, activity_ps)
handler.connect('error', self._join_error_cb, home_model, activity_id, act_type) handler.connect('error', self._join_error_cb, home_model)
def _find_unique_activity_id(self): def _start_success_cb(self, handler, activity):
# create a new unique activity ID activity.start(handler.get_activity_id())
i = 0
act_id = None
while i < 10:
act_id = sugar.util.unique_id()
i += 1
# check through existing activities
found = False
for xid, act_host in self._hosts.items():
if act_host.get_id() == act_id:
found = True
break
if found:
act_id = None
continue
# check through network activities
activities = self._pservice.get_activities()
for act in activities:
if act_id == act.get_id():
found = True
break
if found:
act_id = None
continue
return act_id
def _start_success_cb(self, handler, activity, activity_id, activity_type):
logging.debug("Started activity %s (%s)" % (activity_id, activity_type))
activity.start(activity_id)
def _start_error_cb(self, handler, err, home_model, activity_id, activity_type): def _start_error_cb(self, handler, err, home_model, activity_id, activity_type):
logging.error("Couldn't launch activity %s (%s):\n%s" % (activity_id, activity_type, err)) home_model.notify_activity_launch_failed(handler.get_activity_id())
home_model.notify_activity_launch_failed(activity_id)
def start_activity(self, activity_type): def start_activity(self, activity_type):
logging.debug('Shell.start_activity') logging.debug('Shell.start_activity')
act_id = self._find_unique_activity_id()
if not act_id: handler = activityfactory.create(activity_type)
logging.error("Couldn't find available activity ID.")
return None
home_model = self._model.get_home() home_model = self._model.get_home()
home_model.notify_activity_launch(act_id, activity_type) home_model.notify_activity_launch(handler.get_activity_id(),
activity_type)
logging.debug("Shell.start_activity will start %s (%s)" % (act_id, activity_type)) handler.connect('success', self._start_success_cb)
handler = activityfactory.create(activity_type) handler.connect('error', self._start_error_cb, home_model)
handler.connect('success', self._start_success_cb, act_id, activity_type)
handler.connect('error', self._start_error_cb, home_model, act_id, activity_type)
# Zoom to Home for launch feedback # Zoom to Home for launch feedback
self.set_zoom_level(sugar.ZOOM_HOME) self.set_zoom_level(sugar.ZOOM_HOME)

View File

@ -21,8 +21,9 @@ import dbus
import gobject import gobject
import gtk import gtk
from sugar.presence.PresenceService import PresenceService from sugar.presence import PresenceService
from sugar.activity import bundleregistry from sugar.activity import bundleregistry
from sugar import util
_ACTIVITY_SERVICE_NAME = "org.laptop.Activity" _ACTIVITY_SERVICE_NAME = "org.laptop.Activity"
_ACTIVITY_SERVICE_PATH = "/org/laptop/Activity" _ACTIVITY_SERVICE_PATH = "/org/laptop/Activity"
@ -42,6 +43,10 @@ class ActivityCreationHandler(gobject.GObject):
def __init__(self, service_name): def __init__(self, service_name):
gobject.GObject.__init__(self) gobject.GObject.__init__(self)
self._activity_id = self._find_unique_activity_id()
if not self._activity_id:
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)
@ -51,6 +56,32 @@ class ActivityCreationHandler(gobject.GObject):
factory.create(reply_handler=self._reply_handler, error_handler=self._error_handler) factory.create(reply_handler=self._reply_handler, error_handler=self._error_handler)
def get_activity_id(self):
return self._activity_id
def _find_unique_activity_id(self):
pservice = PresenceService.get_instance()
# create a new unique activity ID
i = 0
act_id = None
while i < 10:
act_id = util.unique_id()
i += 1
# check through network activities
found = False
activities = pservice.get_activities()
for act in activities:
if act_id == act.get_id():
found = True
break
if found:
act_id = None
continue
return act_id
def _reply_handler(self, xid): def _reply_handler(self, xid):
bus = dbus.SessionBus() bus = dbus.SessionBus()
proxy_obj = bus.get_object(_ACTIVITY_SERVICE_NAME + '%d' % xid, proxy_obj = bus.get_object(_ACTIVITY_SERVICE_NAME + '%d' % xid,