diff options
author | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-07-27 23:25:08 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <marco@localhost.localdomain> | 2006-07-27 23:25:08 (GMT) |
commit | 86bd6f50f0ad5eaaf2110e245c979687eb041d22 (patch) | |
tree | 8517b74e5451ee070776576713b15273797cf335 /sugar | |
parent | 1d370ca8e5b8f4f4b863adb7bb9ea39fe885d284 (diff) |
Use dbus activation to launch factories. This breaks
p-to-p chat and ./sugar/activities. Will fix tomorrow.
Diffstat (limited to 'sugar')
-rw-r--r-- | sugar/Makefile.am | 5 | ||||
-rw-r--r-- | sugar/__installed__.py.in | 1 | ||||
-rw-r--r-- | sugar/__uninstalled__.py | 1 | ||||
-rw-r--r-- | sugar/activity/Activity.py | 15 | ||||
-rw-r--r-- | sugar/env.py | 3 | ||||
-rwxr-xr-x | sugar/setup.py | 67 |
6 files changed, 79 insertions, 13 deletions
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]) |