From 7f9eb78b2585504669d3ebe648e8ee3b356a5d6e Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <[EMAIL PROTECTED]>
Date: Mon, 12 May 2008 20:42:24 +0200
Subject: [PATCH] Merge activities.default into favorites.

---
 data/Makefile.am          |    1 +
 data/activities.defaults  |   19 +++++++
 service/bundleregistry.py |  128 +++++++++++++++++++++++++++++++--------------
 3 files changed, 108 insertions(+), 40 deletions(-)
 create mode 100644 data/activities.defaults

diff --git a/data/Makefile.am b/data/Makefile.am
index 7771ce9..698721d 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -8,6 +8,7 @@ sugar-xo.gtkrc: gtkrc.em
 
 sugardir = $(pkgdatadir)/data
 sugar_DATA =			\
+	activities.defaults	\
 	kbdconfig		\
 	mime.defaults		\
 	$(GTKRC_FILES)
diff --git a/data/activities.defaults b/data/activities.defaults
new file mode 100644
index 0000000..fe229a1
--- /dev/null
+++ b/data/activities.defaults
@@ -0,0 +1,19 @@
+# Activities to be automatically added to the ring after an upgrade
+
+org.laptop.Chat
+org.laptop.WebActivity
+org.laptop.AbiWordActivity
+org.laptop.RecordActivity
+org.laptop.Oficina
+org.laptop.TamTamMini
+org.vpri.EtoysActivity
+org.laptop.TurtleArtActivity
+org.laptop.Pippy
+org.laptop.Calculate
+org.laptop.Terminal
+org.laptop.MeasureActivity
+org.laptop.AcousticMeasure
+org.laptop.Memorize
+org.laptop.TamTamJam
+org.laptop.TamTamEdit
+org.laptop.TamTamSynthLab
diff --git a/service/bundleregistry.py b/service/bundleregistry.py
index 88060c3..133ffbf 100644
--- a/service/bundleregistry.py
+++ b/service/bundleregistry.py
@@ -26,20 +26,6 @@ from sugar import env
 
 import config
 
-def _load_mime_defaults():
-    defaults = {}
-
-    f = open(os.path.join(config.data_path, 'mime.defaults'), 'r')
-    for line in f.readlines():
-        line = line.strip()
-        if line and not line.startswith('#'):
-            mime = line[:line.find(' ')]
-            handler = line[line.rfind(' ') + 1:]
-            defaults[mime] = handler
-    f.close()
-
-    return defaults
-
 class BundleRegistry(gobject.GObject):
     """Service that tracks the available activity bundles"""
 
@@ -54,22 +40,89 @@ class BundleRegistry(gobject.GObject):
 
     def __init__(self):
         gobject.GObject.__init__(self)
-        
+
+        self._mime_defaults = self._load_mime_defaults()
+
         self._bundles = []
-        self._search_path = []
-        self._mime_defaults = _load_mime_defaults()
+        for activity_dir in self._get_activity_directories():
+            self._scan_directory(activity_dir)
 
-        path = env.get_profile_path('favorite_activities')
-        if os.path.exists(path):
+        self._last_defaults_mtime = -1
+        self._favorite_bundles = self._load_favorites()
+        self._merge_default_favorites()
+
+    def _get_activity_directories(self):
+        directories = []
+        if os.environ.has_key('SUGAR_ACTIVITIES'):
+            directories.extend(os.environ['SUGAR_ACTIVITIES'].split(':'))
+
+        directories.append(env.get_user_activities_path())
+
+        return directories
+
+    def _load_mime_defaults(self):
+        defaults = {}
+
+        f = open(os.path.join(config.data_path, 'mime.defaults'), 'r')
+        for line in f.readlines():
+            line = line.strip()
+            if line and not line.startswith('#'):
+                mime = line[:line.find(' ')]
+                handler = line[line.rfind(' ') + 1:]
+                defaults[mime] = handler
+        f.close()
+
+        return defaults
+
+    def _load_favorites(self):
+        favorite_bundles = []
+        favorites_path = env.get_profile_path('favorite_activities')
+        if os.path.exists(favorites_path):
             try:
-                self._favorite_bundles = simplejson.load(open(path))
-                print 'loaded %r' % self._favorite_bundles 
+                favorites_data = simplejson.load(open(favorites_path))
+                # Old structure was a list instead of a dictionary.
+                if isinstance(favorites_data, list):
+                    favorite_bundles = favorites_data
+                else:
+                    favorite_bundles = favorites_data['favorites']
+                    self._last_defaults_mtime = favorites_data['defaults-mtime']
             except ValueError, e:
-                logging.error('Error while loading favorite_activities: %r.' 
-                              % e)
-                self._favorite_bundles = []
-        else:
-            self._favorite_bundles = []
+                logging.error('Error while loading favorite_activities: %r.' %
+                              e)
+
+        return favorite_bundles
+
+    def _merge_default_favorites(self):
+        default_activities = []
+        defaults_path = os.path.join(config.data_path, 'activities.defaults')
+        if os.path.exists(defaults_path):
+            file_mtime = os.stat(defaults_path).st_mtime
+            if file_mtime > self._last_defaults_mtime:
+                f = open(defaults_path, 'r')
+                for line in f.readlines():
+                    line = line.strip()
+                    if line and not line.startswith('#'):
+                        default_activities.append(line)
+                f.close()
+                self._last_defaults_mtime = file_mtime
+
+        if not default_activities:
+            return
+
+        for bundle_id in default_activities:
+            max_version = -1
+            for bundle in self._bundles:
+                if bundle.get_bundle_id() == bundle_id and \
+                        max_version < bundle.get_activity_version():
+                    max_version = bundle.get_activity_version()
+
+            if max_version > -1 and \
+                    (bundle_id, max_version) not in self._favorite_bundles:
+                self._favorite_bundles.append([bundle_id, max_version])
+
+        logging.debug('After merging: %r' % self._favorite_bundles)
+
+        self._write_favorites_file()
 
     def get_bundle(self, bundle_id):
         """Returns an bundle given his service name"""
@@ -77,11 +130,6 @@ class BundleRegistry(gobject.GObject):
             if bundle.get_bundle_id() == bundle_id:
                 return bundle
         return None
-
-    def add_search_path(self, path):
-        """Add a directory to the bundles search path"""
-        self._search_path.append(path)
-        self._scan_directory(path)
     
     def __iter__(self):
         return self._bundles.__iter__()
@@ -171,15 +219,15 @@ class BundleRegistry(gobject.GObject):
 
     def _write_favorites_file(self):
         path = env.get_profile_path('favorite_activities')
-        simplejson.dump(self._favorite_bundles, open(path, 'w'))
+        favorites_data = {'defaults-mtime': self._last_defaults_mtime,
+                          'favorites': self._favorite_bundles}
+        simplejson.dump(favorites_data, open(path, 'w'))
 
-def get_registry():
-    return _bundle_registry
-
-_bundle_registry = BundleRegistry()
+_instance = None
 
-if os.environ.has_key('SUGAR_ACTIVITIES'):
-    for path in os.environ['SUGAR_ACTIVITIES'].split(':'):
-        _bundle_registry.add_search_path(path)
+def get_registry():
+    global _instance
+    if not _instance:
+        _instance = BundleRegistry()
+    return _instance
 
-_bundle_registry.add_search_path(env.get_user_activities_path())
-- 
1.5.2.5

_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar

Reply via email to