From 86bd6f50f0ad5eaaf2110e245c979687eb041d22 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Thu, 27 Jul 2006 23:25:08 +0000 Subject: Use dbus activation to launch factories. This breaks p-to-p chat and ./sugar/activities. Will fix tomorrow. --- diff --git a/.gitignore b/.gitignore index 7eb2140..c83d665 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ install-sh missing py-compile stamp-h1 +dbus-installed.conf intltool-extract intltool-extract.in diff --git a/Makefile.am b/Makefile.am index 1a80c99..68fe6fa 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1,7 @@ SUBDIRS = activities shell sugar + +dbusconfdir = $(pkgdatadir) +dbusconf_DATA = dbus-installed.conf + +install-data-local: + sugar/setup.py $(top_srcdir)/activities $(pkgdatadir)/activities $(bindir)/sugar-activity-factory diff --git a/activities/browser/Makefile.am b/activities/browser/Makefile.am index 8cb2f84..da87461 100644 --- a/activities/browser/Makefile.am +++ b/activities/browser/Makefile.am @@ -6,7 +6,4 @@ sugar_PYTHON = \ BrowserActivity.py \ NavigationToolbar.py -activitydir = $(pkgdatadir)/activities/browser -activity_DATA = browser.activity - -EXTRA_DIST = $(activity_DATA) +EXTRA_DIST = browser.activity diff --git a/activities/browser/browser.activity b/activities/browser/browser.activity index 631d79c..dcf4e43 100644 --- a/activities/browser/browser.activity +++ b/activities/browser/browser.activity @@ -1,6 +1,6 @@ [Activity] name = Web id = com.redhat.Sugar.BrowserActivity -python_module = BrowserActivity.BrowserActivity +python_module = browser.BrowserActivity.BrowserActivity default_type = _web_olpc._udp show_launcher = yes diff --git a/activities/chat/Makefile.am b/activities/chat/Makefile.am index b97f748..e77c345 100644 --- a/activities/chat/Makefile.am +++ b/activities/chat/Makefile.am @@ -3,7 +3,4 @@ sugar_PYTHON = \ __init__.py \ ChatActivity.py -activitydir = $(pkgdatadir)/activities/chat -activity_DATA = chat.activity - -EXTRA_DIST = $(activity_DATA) +EXTRA_DIST = chat.activity diff --git a/activities/chat/chat.activity b/activities/chat/chat.activity index abf2cca..b42ba8a 100644 --- a/activities/chat/chat.activity +++ b/activities/chat/chat.activity @@ -1,5 +1,5 @@ [Activity] name = Chat id = com.redhat.Sugar.ChatActivity -python_module = ChatActivity.ChatActivity +python_module = chat.ChatActivity.ChatActivity default_type = _chat_activity._tcp diff --git a/activities/terminal/Makefile.am b/activities/terminal/Makefile.am index a2a2397..03f3f61 100644 --- a/activities/terminal/Makefile.am +++ b/activities/terminal/Makefile.am @@ -1,9 +1,6 @@ -sugardir = $(pkgdatadir)/activities/browser +sugardir = $(pkgdatadir)/activities/terminal sugar_PYTHON = \ __init__.py \ - terminal.py + TerminalActivity.py -activitydir = $(pkgdatadir)/activities/browser -activity_DATA = terminal.activity - -EXTRA_DIST = $(activity_DATA) +EXTRA_DIST = terminal.activity diff --git a/activities/terminal/terminal.py b/activities/terminal/TerminalActivity.py index c9ee525..c9ee525 100644 --- a/activities/terminal/terminal.py +++ b/activities/terminal/TerminalActivity.py diff --git a/activities/terminal/terminal.activity b/activities/terminal/terminal.activity index f0e77c8..1f3e1e5 100644 --- a/activities/terminal/terminal.activity +++ b/activities/terminal/terminal.activity @@ -1,4 +1,4 @@ [Activity] name = Terminal id = org.sugar.Terminal -python_module = terminal.TerminalActivity +python_module = terminal.TerminalActivity.TerminalActivity diff --git a/configure.ac b/configure.ac index d9be8cf..46598fd 100644 --- a/configure.ac +++ b/configure.ac @@ -23,6 +23,7 @@ AM_GLIB_GNU_GETTEXT AC_OUTPUT([ Makefile +dbus-installed.conf activities/Makefile activities/browser/Makefile activities/chat/Makefile diff --git a/dbus-installed.conf.in b/dbus-installed.conf.in new file mode 100644 index 0000000..e1e878d --- /dev/null +++ b/dbus-installed.conf.in @@ -0,0 +1,24 @@ + + + + + + session + + unix:tmpdir=/tmp + + @prefix@/share/sugar/activities + + + + + + + + + + + diff --git a/dbus-uninstalled.conf b/dbus-uninstalled.conf new file mode 100644 index 0000000..384c8a3 --- /dev/null +++ b/dbus-uninstalled.conf @@ -0,0 +1,24 @@ + + + + + + session + + unix:tmpdir=/tmp + + /tmp/sugar + + + + + + + + + + + diff --git a/shell/ActivityRegistry.py b/shell/ActivityRegistry.py index 87f5ea6..3ac8a4f 100644 --- a/shell/ActivityRegistry.py +++ b/shell/ActivityRegistry.py @@ -3,16 +3,13 @@ import os from ConfigParser import ConfigParser from ConfigParser import NoOptionError -from sugar import env - class ActivityModule: """Info about an activity module. Wraps a .activity file.""" - def __init__(self, name, activity_id, activity_exec, directory): + def __init__(self, name, activity_id, directory): self._name = name self._id = activity_id self._directory = directory - self._exec = activity_exec self._show_launcher = False def get_name(self): @@ -23,10 +20,6 @@ class ActivityModule: """Get the activity identifier""" return self._id - def get_exec(self): - """Get the activity executable""" - return self._exec - def get_directory(self): """Get the path to activity directory.""" return self._directory @@ -63,12 +56,9 @@ class ActivityRegistry: def scan_directory(self, path): """Scan a directory for activities and add them to the registry.""" if os.path.isdir(path): - for filename in os.listdir(path): - activity_dir = os.path.join(path, filename) - if os.path.isdir(activity_dir): - for filename in os.listdir(activity_dir): - if filename.endswith(".activity"): - self.add(os.path.join(activity_dir, filename)) + for f in os.listdir(path): + if f.endswith(".activity"): + self.add(os.path.join(path, f)) def add(self, path): """Add an activity to the registry. The path points to a .activity file.""" @@ -94,21 +84,7 @@ class ActivityRegistry: else: default_type = None - if cp.has_option('Activity', 'exec'): - activity_exec = cp.get('Activity', 'exec') - elif cp.has_option('Activity', 'python_module'): - python_module = cp.get('Activity', 'python_module') - python_module = cp.get('Activity', 'python_module') - activity_exec = '%s %s %s' % ('sugar-activity-factory', - activity_id, python_module) - if default_type: - activity_exec += ' ' + default_type - env.add_to_python_path(directory) - else: - logging.error('%s must specifiy exec or python_module' % (path)) - return False - - module = ActivityModule(name, activity_id, activity_exec, directory) + module = ActivityModule(name, activity_id, directory) self._activities.append(module) if cp.has_option('Activity', 'show_launcher'): diff --git a/shell/Session.py b/shell/Session.py index efb2c22..c33e5c9 100644 --- a/shell/Session.py +++ b/shell/Session.py @@ -11,17 +11,12 @@ from Process import Process import sugar.theme import sugar.env -class ActivityProcess(Process): - def __init__(self, module): - Process.__init__(self, module.get_exec()) - self._module = module - - def get_name(self): - return self._module.get_name() - class DbusProcess(Process): def __init__(self): - Process.__init__(self, "dbus-daemon --session --print-address") + config = sugar.env.get_dbus_config() + cmd = "dbus-daemon --print-address --config-file %s" % config + print cmd + Process.__init__(self, cmd) def get_name(self): return 'Dbus' @@ -66,9 +61,9 @@ class PresenceServiceProcess(Process): class Session: """Takes care of running the shell and all the sugar processes""" - - def __init__(self): + def __init__(self, registry): sugar.theme.setup() + self._registry = registry def start(self): """Start the session""" @@ -81,14 +76,9 @@ class Session: process = PresenceServiceProcess() process.start() - shell = Shell() + shell = Shell(self._registry) shell.start() - registry = shell.get_registry() - for activity_module in registry.list_activities(): - process = ActivityProcess(activity_module) - process.start() - try: gtk.main() except KeyboardInterrupt: diff --git a/shell/Shell.py b/shell/Shell.py index 680f94f..ff668f0 100755 --- a/shell/Shell.py +++ b/shell/Shell.py @@ -42,8 +42,9 @@ class ShellDbusService(dbus.service.Object): gobject.idle_add(self.__log_idle, (module_id, message)) class Shell: - def __init__(self): + def __init__(self, registry): self._screen = wnck.screen_get_default() + self._registry = registry def start(self): log_writer = LogWriter("Shell", False) @@ -56,10 +57,6 @@ class Shell: self._owner = ShellOwner() self._owner.announce() - self._registry = ActivityRegistry() - self._registry.scan_directory(env.get_activities_dir()) - self._registry.scan_directory(os.path.join(env.get_user_dir(), 'activities')) - self._home_window = HomeWindow(self) self._home_window.show() diff --git a/shell/sugar b/shell/sugar index 132c2fe..76db034 100755 --- a/shell/sugar +++ b/shell/sugar @@ -4,6 +4,7 @@ import sys import os import pwd import random +import tempfile import pygtk pygtk.require('2.0') @@ -47,10 +48,33 @@ if os.path.isfile(os.path.join(basedir, 'sugar/__uninstalled__.py')): add_to_bin_path(os.path.join(basedir, 'shell')) add_to_python_path(basedir) add_to_python_path(os.path.join(basedir, 'shell')) + add_to_python_path(os.path.join(basedir, 'activities')) + + from sugar import env + from sugar import setup + + activities_dest = os.path.join(tempfile.gettempdir(), 'sugar') + + if not os.path.isdir(activities_dest): + os.mkdir(activities_dest) + else: + # FIXME delete the whole directory + pass + + setup.install_activities(env.get_activities_dir(), activities_dest, + os.path.join(basedir, 'shell/sugar-activity-factory')) else: - import sugar.env - add_to_python_path(os.path.join(sugar.env.get_data_dir(), 'shell')) print 'Running the installed sugar...' + from sugar import env + add_to_python_path(os.path.join(env.get_data_dir(), 'shell')) + add_to_python_path(os.path.join(env.get_data_dir(), 'activities')) + activities_dest = env.get_activities_dir() + +from ActivityRegistry import ActivityRegistry + +registry = ActivityRegistry() +registry.scan_directory(activities_dest) +#registry.scan_directory(os.path.join(env.get_user_dir(), 'activities')) from Emulator import Emulator @@ -62,5 +86,5 @@ print 'Redirecting output to the console, press F3 to open it.' from Session import Session -session = Session() +session = Session(registry) session.start() diff --git a/shell/sugar-activity-factory b/shell/sugar-activity-factory index c29c074..99133c5 100755 --- a/shell/sugar-activity-factory +++ b/shell/sugar-activity-factory @@ -15,8 +15,8 @@ logging.info('Starting activity factory %s' % sys.argv[1]) theme.setup() -lw = LogWriter(sys.argv[1]) -lw.start() +#lw = LogWriter(sys.argv[1]) +#lw.start() if len(sys.argv) == 4: Activity.register_factory(sys.argv[1], sys.argv[2], sys.argv[3]) diff --git a/sugar/Makefile.am b/sugar/Makefile.am index 4d25d65..3820c40 100644 --- a/sugar/Makefile.am +++ b/sugar/Makefile.am @@ -1,11 +1,12 @@ SUBDIRS = activity chat p2p presence sugardir = $(pythondir)/sugar -sugar_PYTHON = \ +sugar_PYTHON = \ __init__.py \ - __installed__.py \ + __installed__.py \ bots.py \ env.py \ + setup.py \ theme.py \ util.py \ LogWriter.py diff --git a/sugar/__installed__.py.in b/sugar/__installed__.py.in index cb8222d..15e39a3 100644 --- a/sugar/__installed__.py.in +++ b/sugar/__installed__.py.in @@ -1,3 +1,4 @@ sugar_data_dir = '@prefix@/share/sugar' sugar_activity_runner = '@prefix@/bin/sugar-activity' sugar_activities_dir = '@prefix@/share/sugar/activities' +sugar_dbus_config = '@prefix@/share/sugar/dbus-installed.conf' diff --git a/sugar/__uninstalled__.py b/sugar/__uninstalled__.py index ecaf65a..a478e0c 100644 --- a/sugar/__uninstalled__.py +++ b/sugar/__uninstalled__.py @@ -4,3 +4,4 @@ _source_dir = os.path.dirname(os.path.dirname(__file__)) sugar_data_dir = os.path.join(_source_dir, 'shell/data') sugar_activities_dir = os.path.join(_source_dir, 'activities') +sugar_dbus_config = os.path.join(_source_dir, 'dbus-uninstalled.conf') diff --git a/sugar/activity/Activity.py b/sugar/activity/Activity.py index faaa7d8..b26ac01 100644 --- a/sugar/activity/Activity.py +++ b/sugar/activity/Activity.py @@ -1,5 +1,4 @@ import sys -import imp import dbus import dbus.service @@ -34,20 +33,14 @@ class ActivityFactory(dbus.service.Object): def __init__(self, name, activity_class, default_type): self._default_type = default_type + splitted_module = activity_class.rsplit('.', 1) module_name = splitted_module[0] class_name = splitted_module[1] - - (fp, pathname, description) = imp.find_module(module_name) - module = imp.load_module(module_name, fp, pathname, description) - - try: - start = getattr(module, 'start') - except: - start = None - if start: - start() + module = __import__(module_name) + for comp in module_name.split('.')[1:]: + module = getattr(module, comp) self._class = getattr(module, class_name) diff --git a/sugar/env.py b/sugar/env.py index 4fbad33..b551dad 100644 --- a/sugar/env.py +++ b/sugar/env.py @@ -34,6 +34,9 @@ def get_nick_name(): def get_data_dir(): return sugar_data_dir +def get_dbus_config(): + return sugar_dbus_config + def get_data_file(filename): return os.path.join(get_data_dir(), filename) diff --git a/sugar/setup.py b/sugar/setup.py new file mode 100755 index 0000000..b60112e --- /dev/null +++ b/sugar/setup.py @@ -0,0 +1,67 @@ +#!/usr/bin/python + +import os +import sys +import shutil +import logging +from ConfigParser import ConfigParser +from ConfigParser import NoOptionError + +class ServiceParser(ConfigParser): + def optionxform(self, option): + return option + +def _install_activity(activity_dir, filename, dest_path, bin): + source = os.path.join(activity_dir, filename) + dest = os.path.join(dest_path, filename) + print 'Install ' + filename + ' ...' + shutil.copyfile(source, dest) + + cp = ConfigParser() + cp.read([source]) + + try: + activity_id = cp.get('Activity', 'id') + except NoOptionError: + logging.error('%s miss the required id option' % (path)) + return False + + if cp.has_option('Activity', 'default_type'): + default_type = cp.get('Activity', 'default_type') + else: + default_type = None + + if cp.has_option('Activity', 'exec'): + activity_exec = cp.get('Activity', 'exec') + elif cp.has_option('Activity', 'python_module'): + python_module = cp.get('Activity', 'python_module') + python_module = cp.get('Activity', 'python_module') + activity_exec = '%s %s %s' % (bin, activity_id, python_module) + if default_type: + activity_exec += ' ' + default_type + else: + logging.error('%s must specifiy exec or python_module' % (source)) + return False + + service_cp = ServiceParser() + section = 'D-BUS Service' + service_cp.add_section(section) + service_cp.set(section, 'Name', activity_id + '.Factory') + service_cp.set(section, 'Exec', activity_exec) + + fileobject = open(os.path.join(dest_path, activity_id + '.service'), 'w') + service_cp.write(fileobject) + fileobject.close() + +def install_activities(source_path, dest_path, bin): + """Scan a directory for activities and install them.""" + if os.path.isdir(source_path): + for filename in os.listdir(source_path): + activity_dir = os.path.join(source_path, filename) + if os.path.isdir(activity_dir): + for filename in os.listdir(activity_dir): + if filename.endswith(".activity"): + _install_activity(activity_dir, filename, dest_path, bin) + +if __name__=='__main__': + install_activities(sys.argv[1], sys.argv[2], sys.argv[3]) -- cgit v0.9.1