diff --git a/configure.ac b/configure.ac index 16028573..f35f660d 100644 --- a/configure.ac +++ b/configure.ac @@ -155,6 +155,7 @@ sugar/activity/Makefile sugar/browser/Makefile sugar/clipboard/Makefile sugar/graphics/Makefile +sugar/objects/Makefile sugar/p2p/Makefile sugar/presence/Makefile sugar/datastore/Makefile diff --git a/sugar/activity/bundle.py b/sugar/activity/bundle.py index 2ea5a544..b8172e0d 100644 --- a/sugar/activity/bundle.py +++ b/sugar/activity/bundle.py @@ -1,4 +1,22 @@ +# Copyright (C) 2007, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + """Metadata description of a given application/activity""" + import logging import locale import os diff --git a/sugar/activity/bundleregistry.py b/sugar/activity/bundleregistry.py index 58b1700c..84696883 100644 --- a/sugar/activity/bundleregistry.py +++ b/sugar/activity/bundleregistry.py @@ -1,5 +1,21 @@ +# Copyright (C) 2007, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + import os -from ConfigParser import ConfigParser import gobject diff --git a/sugar/objects/Makefile.am b/sugar/objects/Makefile.am new file mode 100644 index 00000000..c93713b5 --- /dev/null +++ b/sugar/objects/Makefile.am @@ -0,0 +1,5 @@ +sugardir = $(pythondir)/sugar/objects +sugar_PYTHON = \ + __init__.py \ + typeregistry.py \ + typeinfo.py diff --git a/sugar/objects/typeinfo.py b/sugar/objects/typeinfo.py new file mode 100644 index 00000000..8ac84710 --- /dev/null +++ b/sugar/objects/typeinfo.py @@ -0,0 +1,58 @@ +# Copyright (C) 2007, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +class TypeInfo(object): + def __init__(self, info_dict=None): + self.type_id = None + self.name = None + self.icon = 'theme:stock-missing' + self.parent = None + self.formats = [] + + if info_dict: + self._read_from_dict(info_dict) + + def get_default_activity(self): + return None + + def get_activities(self): + return [] + + def _read_from_config(self, section, items, l_items): + self.type_id = section + + for item in items: + if item[0] == 'name': + self.name = item[1] + elif item[0] == 'icon': + self.icon = item[1] + elif item[0] == 'parent': + self.parent = item[1] + elif item[0] == 'formats': + self.formats = item[1].split(';') + + for item in litems: + if item[0] == 'name': + self.name = item[1] + + return (self.name and self.parent and self.formats) + + def _read_from_dict(self, info_dict): + self.type_id = info_dict['type_id'] + self.name = info_dict['name'] + self.icon = info_dict['icon'] + self.formats = info_dict['formats'] diff --git a/sugar/objects/typeregistry.py b/sugar/objects/typeregistry.py new file mode 100644 index 00000000..342c50ee --- /dev/null +++ b/sugar/objects/typeregistry.py @@ -0,0 +1,99 @@ +# Copyright (C) 2007, Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +from gettext import gettext as _ +from ConfigParser import ConfigParser + +from sugar.objects.typeinfo import TypeInfo +from sugar.activity import bundleregistry + +_text_type = { + 'type_id' : 'Text', + 'name' : _('Text'), + 'icon' : 'theme:object-text', + 'formats' : [ 'text/plain', 'application/pdf' ] +} + +_image_type = { + 'type_id' : 'Image', + 'name' : _('Image'), + 'icon' : 'theme:object-image', + 'formats' : [ 'image/jpeg', 'image/gif', 'image/png' ] +} + +class _RootNode(_TypeNode): + def __init__(self): + _TypeNode.__init__('') + + def append_primitive(self, info_dict): + self.append(TypeInfo(info_dict) + +class _TypeNode(list): + def __init__(self, type_info): + self.type_info = type_info + + def get_node_from_type(self, type_id): + for node in self: + if node.type_info.type_id == type_id: + return node + + for node in self: + child = node.get_node_from_type() + if child: + return child + + return None + +class TypeRegistry(object): + def __init__(self): + self._tree = _RootNode() + self._tree.append_primitive(_image_type) + self._tree.append_primitive(_text_type) + + self._bundle_registry = bundleregistry.get_registry() + for bundle in self._bundle_registry: + self._read_from_bundle(bundle) + self._bundle_registry.connect('bundle-added', self._bundle_added_cb) + + def _bundle_added_cb (self, registry, bundle): + self._read_from_bundle(bundle) + + def _read_from_bundle(self, bundle): + cp = ConfigParser() + path = bundle.get_path() + cp.read([os.path.join(path, 'activity', 'object_types.info')]) + items = cp.items() + + cp = ConfigParser() + path = bundle.get_locale_path() + cp.read([os.path.join(path, 'object_types.linfo')]) + l_items = cp.items() + + for section in cp.sections(): + type_info = TypeInfo() + if type_info.read_from_config(section, items, l_items) + parent_node = self._tree.get_node_from_type(type_info.parent) + if parent_node: + parent_node.append(_TypeNode(type_info) + return True + + return False + +def get_registry(): + return _type_registry + +_type_registry = TypeRegistry()