Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am6
-rw-r--r--activities/browser/Makefile.am5
-rw-r--r--activities/browser/browser.activity2
-rw-r--r--activities/chat/Makefile.am5
-rw-r--r--activities/chat/chat.activity2
-rw-r--r--activities/terminal/Makefile.am9
-rw-r--r--activities/terminal/TerminalActivity.py (renamed from activities/terminal/terminal.py)0
-rw-r--r--activities/terminal/terminal.activity2
-rw-r--r--configure.ac1
-rw-r--r--dbus-installed.conf.in24
-rw-r--r--dbus-uninstalled.conf24
-rw-r--r--shell/ActivityRegistry.py34
-rw-r--r--shell/Session.py24
-rwxr-xr-xshell/Shell.py7
-rwxr-xr-xshell/sugar30
-rwxr-xr-xshell/sugar-activity-factory4
-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
23 files changed, 186 insertions, 86 deletions
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 @@
+<!-- This configuration file controls the per-user-login-session message bus.
+ Add a session-local.conf and edit that rather than changing this
+ file directly. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <!-- Our well-known bus type, don't change this -->
+ <type>session</type>
+
+ <listen>unix:tmpdir=/tmp</listen>
+
+ <servicedir>@prefix@/share/sugar/activities</servicedir>
+
+ <policy context="default">
+ <!-- Allow everything to be sent -->
+ <allow send_destination="*"/>
+ <!-- Allow everything to be received -->
+ <allow eavesdrop="true"/>
+ <!-- Allow anyone to own anything -->
+ <allow own="*"/>
+ </policy>
+
+</busconfig>
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 @@
+<!-- This configuration file controls the per-user-login-session message bus.
+ Add a session-local.conf and edit that rather than changing this
+ file directly. -->
+
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <!-- Our well-known bus type, don't change this -->
+ <type>session</type>
+
+ <listen>unix:tmpdir=/tmp</listen>
+
+ <servicedir>/tmp/sugar</servicedir>
+
+ <policy context="default">
+ <!-- Allow everything to be sent -->
+ <allow send_destination="*"/>
+ <!-- Allow everything to be received -->
+ <allow eavesdrop="true"/>
+ <!-- Allow anyone to own anything -->
+ <allow own="*"/>
+ </policy>
+
+</busconfig>
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])