Use dbus activation to launch factories. This breaks
p-to-p chat and ./sugar/activities. Will fix tomorrow.
This commit is contained in:
+3
-2
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Executable
+67
@@ -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])
|
||||
Reference in New Issue
Block a user