Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/sugar
diff options
context:
space:
mode:
authorMarco 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)
commit86bd6f50f0ad5eaaf2110e245c979687eb041d22 (patch)
tree8517b74e5451ee070776576713b15273797cf335 /sugar
parent1d370ca8e5b8f4f4b863adb7bb9ea39fe885d284 (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.am5
-rw-r--r--sugar/__installed__.py.in1
-rw-r--r--sugar/__uninstalled__.py1
-rw-r--r--sugar/activity/Activity.py15
-rw-r--r--sugar/env.py3
-rwxr-xr-xsugar/setup.py67
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])