Orb/python/orb/sysdef.py
changeset 4 468f4c8d3d5b
equal deleted inserted replaced
3:d8fccb2cd802 4:468f4c8d3d5b
       
     1 # Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2 # All rights reserved.
       
     3 # This component and the accompanying materials are made available
       
     4 # under the terms of the License "Eclipse Public License v1.0"
       
     5 # which accompanies this distribution, and is available
       
     6 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 #
       
     8 # Initial Contributors:
       
     9 # Nokia Corporation - initial contribution.
       
    10 #
       
    11 # Contributors:
       
    12 #
       
    13 try:
       
    14     from xml.etree import cElementTree as etree
       
    15 except ImportError:
       
    16     from xml.etree import ElementTree as etree
       
    17 import os
       
    18 import logging
       
    19 import weakref
       
    20 import re
       
    21 import xml
       
    22 
       
    23 
       
    24 logger = logging.getLogger('orb.sysdef')
       
    25 
       
    26 
       
    27 """
       
    28 When time to test with 2.6
       
    29 try:
       
    30     from collections import namedtuple
       
    31 
       
    32     Layer = namedtuple('Layer', 'id name packages')
       
    33     Package = namedtuple('Package', 'id name collections')
       
    34     Collection = namedtuple('Collection', 'id name components')    
       
    35     Component = namedtuple('Component', 'id name bldinfs')    
       
    36 except ImportError, e:
       
    37 """
       
    38 class Layer(object):
       
    39     def __init__(self, id, name, packages):
       
    40         self.id = id
       
    41         self.name = name
       
    42         self.packages = packages
       
    43 
       
    44 class Package(object):
       
    45     def __init__(self, id, name, collections):
       
    46         self.id = id
       
    47         self.name = name
       
    48         self.collections = collections
       
    49 
       
    50 
       
    51 class Collection(object):
       
    52     def __init__(self, id, name, components):
       
    53         self.id = id
       
    54         self.name = name
       
    55         self.components = components
       
    56 
       
    57 
       
    58 class Component(object):
       
    59     def __init__(self, id, name, bldinfs):
       
    60         self.id = id
       
    61         self.name = name
       
    62         self.bldinfs = bldinfs
       
    63 
       
    64 
       
    65 class SystemDefinitionParserException(Exception):
       
    66     "Raised if a System defintion file is invalid"
       
    67 
       
    68 
       
    69 class PackageDefinionNotFoundError(Exception):
       
    70     "Raised if a package definition file could not be found"
       
    71 
       
    72 
       
    73 class PackageDefinitionLoader(object):
       
    74     def __init__(self, sysdefpath, path=os.path):
       
    75         self.sysdefpath = ""
       
    76         if not hasattr(sysdefpath, "read"):
       
    77             self.sysdefpath = path.abspath(path.dirname(sysdefpath))
       
    78         self.path = path
       
    79     
       
    80     def _get_pkgdef_path(self, pkgpath):
       
    81         return self.path.abspath(self.path.join(self.sysdefpath, pkgpath))
       
    82     
       
    83     def load(self, pkgpath):
       
    84         if hasattr(pkgpath, "read"):
       
    85             return pkgpath
       
    86         fullpkgpath = self._get_pkgdef_path(pkgpath)
       
    87         if not self.path.exists(fullpkgpath):
       
    88             raise PackageDefinionNotFoundError(
       
    89              '''Package definition "%s" was not found. 
       
    90                 System definition directory is: "%s".
       
    91                 Relative path in System definition was "%s"''' % (fullpkgpath, self.sysdefpath, pkgpath))
       
    92         return fullpkgpath
       
    93 
       
    94 
       
    95 class SystemDefinitionParser(object):
       
    96     """
       
    97     NOTE: Variable names and comments use System definition 3 terminology
       
    98     
       
    99     Creates an ElementTree from a System definition file and creates
       
   100     a parser (depending on the schema version) and stores the packages
       
   101     and components mentioned in the file.
       
   102     """
       
   103     def __init__(self, sysdeffile, pkgloader=PackageDefinitionLoader):
       
   104         self.parser = None
       
   105         try:        
       
   106             tree = etree.parse(sysdeffile)
       
   107         #except xml.parsers.expat.ExpatError, e:
       
   108         except Exception, e:
       
   109             raise SystemDefinitionParserException(str(e))
       
   110         root = tree.getroot()
       
   111         if "schema" not in root.attrib:
       
   112             raise SystemDefinitionParserException("Unknown XML file found, root node does not have a schema attribute")
       
   113         schema = root.attrib["schema"]
       
   114         if schema.startswith("2.0"):
       
   115             logger.debug("Creating a version 2 system definition parser, schema was: " + schema)
       
   116             self._parser = SystemDefinitionV2Parser(sysdeffile, pkgloader, tree)
       
   117         elif schema.startswith("3.0"):
       
   118             logger.debug("Creating a version 3 system definition parser, schema was: " + schema)
       
   119             self._parser = SystemDefinitionV3Parser(sysdeffile, pkgloader, tree)
       
   120         else:
       
   121             raise SystemDefinitionParserException("Unsupported system definition scheme: '%s'" % schema)
       
   122         self._parser.parse()
       
   123 
       
   124     def __getattr__(self, name):
       
   125         return getattr(self._parser, name)
       
   126 
       
   127 
       
   128 class SystemDefinitionParserBase(object):
       
   129     "Base class inherited by System definition parsers"
       
   130     # Default to version 3 values
       
   131     _id = "id"
       
   132     _name = "name"
       
   133     _layer = "layer"
       
   134     _pkgname = "package"
       
   135     _collection = "collection"
       
   136     _component = "component"    
       
   137 
       
   138     def __init__(self, sysdefpath, pkgloader, tree):
       
   139         self._pkgloader = pkgloader(sysdefpath)
       
   140         self._tree = tree
       
   141         self.__name = ""
       
   142         self.layers = []
       
   143         # Dict of id -> weakrefs to cut down on searches
       
   144         self._components = {}
       
   145         self._packages = {}
       
   146 
       
   147     @property
       
   148     def name(self):
       
   149         if self.__name != "":
       
   150             return self.__name
       
   151         root = self._tree.getroot()
       
   152         if "name" in root.attrib:
       
   153             self.__name = root.attrib["name"]
       
   154         else:
       
   155             sysmodel = root.find("systemModel")
       
   156             if "name" in sysmodel.attrib:
       
   157                 self.__name =  sysmodel.attrib["name"]
       
   158         return self.__name
       
   159 
       
   160     def _load_distributed_pkg(self, href):
       
   161         try:              
       
   162             return etree.parse(self._pkgloader.load(href)).find("//" + self._pkgname)                    
       
   163         except PackageDefinionNotFoundError, e:
       
   164             logger.error("Package definition not found: %s" % str(e))
       
   165             return None     
       
   166     
       
   167     def _get_bldfile_prefix(self, href):
       
   168         bldFile_prefix = ""
       
   169         for p in href.split(".."):
       
   170             if p != "/":
       
   171                 bldFile_prefix = p.replace("package_definition.xml", "")                           
       
   172         return bldFile_prefix
       
   173 
       
   174     def _get_name_and_id(self, item):
       
   175         id = item.attrib[self._id] if self._id in item.attrib else ""
       
   176         name = item.attrib[self._name] if self._name in item.attrib else id        
       
   177         return (id, name)
       
   178 
       
   179     def _get_bldinfs(self, component, bldFile_prefix):
       
   180         bldinfs = []
       
   181         for unit in [unit for unit in component.findall("unit") if "bldFile" in unit.attrib]:
       
   182             bldinfs.append(bldFile_prefix + unit.attrib["bldFile"])
       
   183             logger.debug("Found bldFile: %s" % unit.attrib["bldFile"])        
       
   184         return bldinfs
       
   185             
       
   186     def _get_components(self, pkgel, bldFile_prefix):
       
   187         components = []
       
   188         for component in pkgel.findall(self._component):
       
   189             id, name = self._get_name_and_id(component)
       
   190             logger.debug("Adding component to components list: %s" % id)
       
   191             c = Component(
       
   192                 id = id,
       
   193                 name = name,
       
   194                 bldinfs = self._get_bldinfs(component, bldFile_prefix)  
       
   195             )
       
   196             components.append(c)
       
   197             self._components[c.id] = weakref.ref(c)
       
   198         return components
       
   199 
       
   200     def _get_collections(self, parent, bldFile_prefix):
       
   201         collections = []
       
   202         for coll in parent.findall(self._collection):
       
   203             id, name = self._get_name_and_id(coll)
       
   204             logger.debug("Adding collection to collections list: %s" % id)
       
   205             collections.append(Collection(
       
   206                 id = id,
       
   207                 name = name,
       
   208                 components = self._get_components(coll, bldFile_prefix)
       
   209             ))
       
   210         return collections
       
   211 
       
   212     def _get_packages(self, parent):
       
   213         packages = []
       
   214         bldFile_prefix = ""
       
   215         for pkg in parent.findall(self._pkgname):
       
   216             if "href" in pkg.attrib:
       
   217                 href = pkg.attrib["href"]
       
   218                 pkg = self._load_distributed_pkg(href)
       
   219                 bldFile_prefix = self._get_bldfile_prefix(href)
       
   220             if pkg is not None:                   
       
   221                 logger.debug("Adding package to packages list: %s" % pkg.attrib[self._id])
       
   222                 id, name = self._get_name_and_id(pkg)
       
   223                 p = Package(
       
   224                     id = id,
       
   225                     name = name,
       
   226                     collections = self._get_collections(pkg, bldFile_prefix)
       
   227                 )
       
   228                 packages.append(p)
       
   229                 self._packages[p.id] = weakref.ref(p)
       
   230         return packages
       
   231     
       
   232     def parse(self):
       
   233         """
       
   234         Parses a system definition file and builds a hierarchical list of objects.
       
   235         Hierarchy is:
       
   236         Layer
       
   237          +- Package
       
   238              +- Collection
       
   239                  +- Component
       
   240         So a Layer contains information about itself and a list of Packages. A
       
   241         Package contains infromation about itself and a list of collections, etc.
       
   242         
       
   243         Supports both distributed and non-distributed sysdef 3 files. (Also supports
       
   244         distributed sysdef 2 files for coding simplicity, not sure if they ever existed).
       
   245         """
       
   246         for layer in self._tree.findall("//" + self._layer):
       
   247             id, name = self._get_name_and_id(layer)
       
   248             self.layers.append(Layer(
       
   249                 id = id, 
       
   250                 name = name, 
       
   251                 packages = self._get_packages(layer)
       
   252             ))
       
   253 
       
   254 
       
   255 class SystemDefinitionV2Parser(SystemDefinitionParserBase):
       
   256     "Changes required to get base class to support sysdef 2"
       
   257     _id = "name"
       
   258     _name = "long-name"
       
   259     _pkgname = "block"
       
   260 
       
   261 
       
   262 class SystemDefinitionV3Parser(SystemDefinitionParserBase):
       
   263     "Base class covers sysdef 3 support by default"
       
   264 
       
   265 
       
   266 class SystemDefinition(object):
       
   267     """
       
   268     Used to represent a System Definition file. Presents a queryable
       
   269     interface to clients. Uses a SystemDefinitionParser to query the
       
   270     underlying system definition XML file.
       
   271     """
       
   272     def __init__(self, sysdeffile, cwd="", sysdefparser=SystemDefinitionParser, pkgloader=PackageDefinitionLoader):
       
   273         self._parser = sysdefparser(sysdeffile, pkgloader)
       
   274         self.cwd = cwd.replace("\\", "/")
       
   275         if self.cwd.endswith("/"):
       
   276             self.cwd = self.cwd[:-1]
       
   277         self._pkgs = None
       
   278 
       
   279     @property
       
   280     def name(self):
       
   281         return self._parser.name
       
   282 
       
   283     @property
       
   284     def layers(self):
       
   285         return self._parser.layers
       
   286 
       
   287     def get_packages(self):
       
   288         """
       
   289         Returns the list of Package objects found in the System definition
       
   290         file
       
   291         """
       
   292         return [p() for p in self._parser._packages.values()]            
       
   293 
       
   294     def get_components(self, package_id):
       
   295         """
       
   296         Returns the list of Component objects found in the Package in
       
   297         the System definition file
       
   298         """
       
   299         comps = []
       
   300         try:
       
   301             for collection in self._parser._packages[package_id]().collections:
       
   302                 comps.extend(collection.components)
       
   303         except KeyError:
       
   304             logger.error("Package with package_id: %s, was not found" % package_id)
       
   305         return comps
       
   306 
       
   307     def _get_component(self, component_id):
       
   308         try:
       
   309             return self._parser._components[component_id]()
       
   310         except KeyError:
       
   311             return None
       
   312 
       
   313     def get_sbs_output_dir(self, component_id):
       
   314         """
       
   315         Returns the list of "sbs output directories" found under the
       
   316         Component in the System definition file.
       
   317         
       
   318         An "sbs output directory" is the directory name used by sbs 
       
   319         when creating its output directories.
       
   320         If the bld.inf file is in a directory called "group", it is 
       
   321         the parent directory of the group directory.
       
   322         If the bld.inf file is not in a directory called group, it is
       
   323         the name of the directory that contains the bld.inf file. 
       
   324         """        
       
   325         component = self._get_component(component_id)
       
   326         if component is None:
       
   327             logger.error("Component with an id of: %s, was not found" % component_id)
       
   328             return None
       
   329         if len(component.bldinfs) == 0:
       
   330             logger.info('No bldFiles found for: %s' % component_id)
       
   331             return None
       
   332         # Otherwise take the first one?
       
   333         bldinf = component.bldinfs[0]
       
   334         search = re.search(r".*/(.*)/group", bldinf, re.IGNORECASE)
       
   335         if not search:
       
   336             search = re.search(r".*/(.*)", bldinf)
       
   337             if not search:
       
   338                 logger.error('Could not determine bldFile dir name from unit bldFile attribute: "%s"' % bldinf)
       
   339                 return ""
       
   340         return search.group(1)
       
   341 
       
   342     def get_bldinfs(self, component_id):
       
   343         """
       
   344         Returns the list of "bld.inf" files found in the Component in
       
   345         the System definition file
       
   346         """         
       
   347         bldfiles = []
       
   348         component = self._get_component(component_id)
       
   349         if component is None:
       
   350             logger.error("Component with id: '%s' not found" % component_id)
       
   351         else:
       
   352             for bf in component.bldinfs:
       
   353                 logger.debug("Found bldFile (or directory): %s" % bf) 
       
   354                 bf = bf.replace("\\","/")
       
   355                 if bf.startswith(".."):
       
   356                     bf = bf.replace("..","")    
       
   357                 if bf.startswith("/"):
       
   358                     bf = bf[1:]                   
       
   359                 if bf.startswith("sf"):
       
   360                     bf = "%s/%s" % (os.path.splitdrive(self.cwd)[0], bf)
       
   361                 else:
       
   362                     bf = "%s/sf/%s" % (os.path.splitdrive(self.cwd)[0], bf)  
       
   363                 if not bf.endswith("bld.inf"):
       
   364                     bf = "%s/%s" % (bf, "bld.inf") 
       
   365                 bf = os.path.normpath(bf)
       
   366                 bf = bf.replace("\\","/")
       
   367                 logger.debug("Saving bldFile as: %s" % bf)
       
   368                 bldfiles.append(bf)       
       
   369         return bldfiles
       
   370 
       
   371 
       
   372 ################################################################
       
   373 # Unit test code
       
   374 ################################################################
       
   375 import unittest
       
   376 from cStringIO import StringIO
       
   377 
       
   378 
       
   379 class PathMock(object):
       
   380     "Mock os.path so I can change os.path.exists return values"
       
   381 
       
   382     @classmethod
       
   383     def abspath(self, p):
       
   384         return os.path.abspath(p)
       
   385     
       
   386     @classmethod
       
   387     def dirname(self, p):
       
   388         return os.path.dirname(p)
       
   389 
       
   390     @classmethod
       
   391     def join(self, a, b):
       
   392         return os.path.join(a, b)
       
   393     
       
   394     @classmethod
       
   395     def exists(self, p):
       
   396         if "data" in p:
       
   397             return True
       
   398         else:
       
   399             return False
       
   400 
       
   401 
       
   402 class MockPackageDefinitionLoader(object):
       
   403     def __init__(self, sysdefpath):
       
   404         pass
       
   405 
       
   406     def load(self, pkgpath):
       
   407         if "kernelhwsrv" in pkgpath:
       
   408             return StringIO(kernelhwsrv_pkg_def)
       
   409         elif "classicui" in pkgpath:
       
   410             return StringIO(classicui_pkg_def)
       
   411         else:
       
   412             raise PackageDefinionNotFoundError("File not found")
       
   413 
       
   414 
       
   415 class TestSystemDefinitionParser(unittest.TestCase):
       
   416 
       
   417     def setUp(self):
       
   418         self.sysdefs = {
       
   419             "System definition V2": sysdefv2,
       
   420             "System definition V3 distributed": sysdefv3_distributed,
       
   421             "System definition V3 non-distributed": sysdefv3_nondistributed
       
   422         }
       
   423         self.unsupported_sysdefs = {
       
   424             "System definition V1.4": sysdefv1_unsupported,
       
   425             "System definition V2.1": sysdefv2_unsupported,
       
   426             "System definition V3.1": sysdefv3_unsupported
       
   427         }
       
   428         
       
   429     def test_i_raise_an_exception_if_the_sysdef_file_is_invalid(self):
       
   430         try:
       
   431             SystemDefinitionParser(StringIO("<boo><foo/>"))
       
   432             self.fail("An exception should have been raised")
       
   433         except SystemDefinitionParserException:
       
   434             pass # Expected
       
   435 
       
   436     def test_i_raise_an_exception_if_given_an_unkown_xml_file(self):
       
   437         try:
       
   438             SystemDefinitionParser(StringIO("<SystemDefinition></SystemDefinition>"))
       
   439             self.fail("An exception should have been raised")
       
   440         except SystemDefinitionParserException:
       
   441             pass # Expected
       
   442 
       
   443     def test_i_raise_an_exception_if_given_an_unsupported_SystemDefinition_version(self):
       
   444         for name, sysdef in self.unsupported_sysdefs.items():
       
   445             try:
       
   446                 SystemDefinitionParser(StringIO(sysdef))
       
   447                 self.fail("Should have raised a SystemDefinitionParserException as I do not support %s" % name)
       
   448             except SystemDefinitionParserException:
       
   449                 pass # Expected 
       
   450 
       
   451     def test_i_can_parse_supported_sysdefs_files(self):
       
   452         for name, sysdef in self.sysdefs.items():
       
   453             try:
       
   454                 SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   455             except Exception, e:
       
   456                 self.fail("An exception should not have been raised. Using '%s': %s" % (name, str(e)))
       
   457 
       
   458     def test_i_store_all_the_layers_in_a_sysdef_file(self):
       
   459         for name, sysdef in self.sysdefs.items():
       
   460             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   461             items = len(parser.layers)
       
   462             layer = parser.layers[0]
       
   463             self.assertEquals(items, 2, msg="Expected number of layers '%s' not stored, using %s" % (items, name))
       
   464             self.assertEquals(layer.id, "os", msg="Expected layer id '%s' not stored, using %s" % (parser.layers[0].id, name))
       
   465             self.assertEquals(layer.name, "OS", msg="Expected layer name '%s' not stored, using %s" % (parser.layers[0].name, name))
       
   466 
       
   467     def test_i_store_all_the_packages_in_a_layer(self):
       
   468         for name, sysdef in self.sysdefs.items():
       
   469             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   470             items = len(parser.layers[0].packages)             
       
   471             self.assertEquals(items, 1, msg="Expected number of packages '%s' not stored, using %s" % (items, name))              
       
   472             item = parser.layers[0].packages[0]
       
   473             self.assertEquals(item.id, "kernelhwsrv", msg="Expected package id '%s' not stored, using %s" % (item.id, name))
       
   474             self.assertEquals(item.name, "Kernel and Hardware Services", msg="Expected package name '%s' not stored, using %s" % (item.name, name))
       
   475 
       
   476     def test_i_store_all_the_collections_in_a_package(self):
       
   477         for name, sysdef in self.sysdefs.items():
       
   478             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   479             items = len(parser.layers[0].packages[0].collections)
       
   480             self.assertEquals(items, 12, msg="Expected number of collections '%s' not stored, using %s" % (items, name))              
       
   481             item = parser.layers[0].packages[0].collections[0]
       
   482             self.assertEquals(item.id, "brdbootldr", msg="Expected collection id '%s' not stored, using %s" % (item.id, name))
       
   483             self.assertEquals(item.name, "Board Boot Loader", msg="Expected collection name '%s' not stored, using %s" % (item.name, name))
       
   484 
       
   485     def test_i_store_all_the_components_in_a_collection(self):
       
   486         for name, sysdef in self.sysdefs.items():
       
   487             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   488             items = len(parser.layers[0].packages[0].collections[0].components)
       
   489             self.assertEquals(items, 1, msg="Expected number of components '%s' not stored, using %s" % (items, name))              
       
   490             item = parser.layers[0].packages[0].collections[0].components[0]
       
   491             self.assertEquals(item.id, "ubootldr", msg="Expected component id '%s' not stored, using %s" % (item.id, name))
       
   492             self.assertEquals(item.name, "Boot Loader", msg="Expected component name '%s' not stored, using %s" % (item.name, name))
       
   493 
       
   494     def test_i_store_all_the_bldinfs_in_a_component(self):
       
   495         for name, sysdef in self.sysdefs.items():
       
   496             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   497             items = len(parser.layers[0].packages[0].collections[1].components[0].bldinfs)
       
   498             self.assertEquals(items, 1, msg="Expected number of bldinfs '%s' not stored, using %s" % (items, name))              
       
   499 
       
   500     def test_i_store_a_sysdefs_name(self):
       
   501         for name, sysdef in self.sysdefs.items():
       
   502             parser = SystemDefinitionParser(StringIO(sysdef), pkgloader=MockPackageDefinitionLoader)
       
   503             self.assertEquals(parser.name, "Symbian^3", msg="Expected name not stored. Recieved: '%s', using %s" % (parser.name, name))
       
   504 
       
   505 
       
   506 class TestSystemDefinition(unittest.TestCase):
       
   507     def setUp(self):
       
   508         self.sysdefs = {
       
   509             "sysdefv2":         SystemDefinition(StringIO(sysdefv2), "y:\\"),
       
   510             "sysdefv3_dist":    SystemDefinition(StringIO(sysdefv3_distributed), "y:\\", pkgloader=MockPackageDefinitionLoader),
       
   511             "sysdefv3_nondist": SystemDefinition(StringIO(sysdefv3_nondistributed), "y:\\")
       
   512         }
       
   513         
       
   514     def test_i_return_the_list_of_packages(self):
       
   515         for name, sysdef in self.sysdefs.items():
       
   516             packages = sysdef.get_packages()
       
   517             self.assertEquals(len(packages), 2, msg="Correct number of packages were not found, using %s" % name)
       
   518             self.assertEquals(packages[0].id, "kernelhwsrv", msg="Incorrect package id found, using %s" % name)
       
   519             self.assertEquals(packages[1].id, "classicui", msg="Incorrect package id found, using %s" % name)
       
   520 
       
   521     def test_i_can_handle_invalid_href_urls(self):
       
   522         sysdefv3 = SystemDefinition(StringIO(sysdefv3_distributed_invalid_href), "y:\\", pkgloader=MockPackageDefinitionLoader)
       
   523         try:
       
   524             packages = sysdefv3.get_packages()
       
   525         except Exception, e:
       
   526             self.fail("Should have carried on and not raised an exception. %s" % str(e))
       
   527         self.assertEquals(len(packages), 1)
       
   528 
       
   529     def test_i_can_handle_being_asked_for_components_given_an_nonexistent_packageid(self):
       
   530         for name, sysdef in self.sysdefs.items():
       
   531             components = sysdef.get_components("classicgui")
       
   532             self.assertEquals(len(components), 0, msg="Incorrect number of components returned, using %s" % name)        
       
   533 
       
   534     def test_i_can_return_components_given_a_packageid(self):
       
   535         for name, sysdef in self.sysdefs.items():
       
   536             components = sysdef.get_components("classicui")
       
   537             self.assertEquals(len(components), 34, msg="Incorrect number of components returned, using %s" % name)
       
   538             self.assertTrue("pslngsplugin" in [component.id for component in components], msg="Expected component not found, using %s" % name)        
       
   539 
       
   540     def test_i_can_handle_being_asked_for_bldinfs_given_a_nonexistant_component_name(self):
       
   541         for name, sysdef in self.sysdefs.items():
       
   542             bldfiles = sysdef.get_bldinfs("classicgui")
       
   543             self.assertEquals(len(bldfiles), 0, msg="Incorrect number of bldfiles returned, using %s" % name)
       
   544 
       
   545     def test_i_can_return_bldinfs_given_a_component_name(self):
       
   546         for name, sysdef in self.sysdefs.items():
       
   547             bldfiles = sysdef.get_bldinfs("pslngsplugin")
       
   548             self.assertEquals(len(bldfiles), 1, msg="Incorrect number of bldfiles returned, using %s" % name)
       
   549             self.assertTrue(bldfiles[0].endswith("bld.inf"))
       
   550             bldinf_path = "y:/sf/mw/classicui/psln/pslngsplugin/Group/bld.inf"
       
   551             self.assertEquals(bldfiles[0], bldinf_path, msg="%s != %s. using %s" % (bldfiles[0], bldinf_path, name))
       
   552 
       
   553     def test_i_can_handle_additional_dots_in_the_bldfile_path(self):
       
   554         for name, sysdef in self.sysdefs.items():
       
   555             bldfiles = sysdef.get_bldinfs("animation") # paths start with ../
       
   556             self.assertEquals(len(bldfiles), 1, msg="Incorrect number of bldfiles returned, using %s" % name)
       
   557             self.assertTrue(bldfiles[0].endswith("bld.inf"))
       
   558             bldinf_path = "y:/sf/mw/classicui/lafagnosticuifoundation/animation/group/bld.inf"
       
   559             self.assertEquals(bldfiles[0], bldinf_path, msg="%s != %s. using %s" % (bldfiles[0], bldinf_path, name))   
       
   560 
       
   561     def test_i_can_handle_a_slash_at_the_start_in_the_bldfile_path(self):
       
   562         for name, sysdef in self.sysdefs.items():
       
   563             bldfiles = sysdef.get_bldinfs("bmpanimation") # paths start with /
       
   564             self.assertEquals(len(bldfiles), 1, msg="Incorrect number of bldfiles returned, using %s" % name)
       
   565             self.assertTrue(bldfiles[0].endswith("bld.inf"))
       
   566             bldinf_path = "y:/sf/mw/classicui/lafagnosticuifoundation/bmpanimation/group/bld.inf"
       
   567             self.assertEquals(bldfiles[0], bldinf_path, msg="%s != %s. using %s" % (bldfiles[0], bldinf_path, name)) 
       
   568         
       
   569     def test_i_handle_being_asked_for_sbsdir_when_a_given_component_is_not_found(self):
       
   570         for name, sysdef in self.sysdefs.items():
       
   571             self.assertEquals(sysdef.get_sbs_output_dir("foobar"), None, msg="Did not handle an invalid component name correctly, using: %s" % name)
       
   572 
       
   573     def test_i_handle_being_asked_for_sbsdir_when_a_given_component_has_no_bldinfs(self):
       
   574         for name, sysdef in self.sysdefs.items():
       
   575             self.assertEquals(sysdef.get_sbs_output_dir("pslnengine"), None, msg="Did not handle an invalid component name correctly, using: %s" % name)
       
   576 
       
   577     def test_i_can_return_sbs_output_dir_given_a_component(self):
       
   578         for name, sysdef in self.sysdefs.items():
       
   579             self.assertEquals(sysdef.get_sbs_output_dir("pslngsplugin"), "pslngsplugin", msg="Expected directory value not returned, using %s" % name)
       
   580             outdir = sysdef.get_sbs_output_dir("rofs")
       
   581             self.assertEquals(outdir, "srofs", msg="Expected directory value not returned '%s', using %s" % (outdir, name))
       
   582 
       
   583     def test_i_can_handle_invalid_bldfile_lines_when_asked_for_a_sbs_output_dir(self):
       
   584         for name, sysdef in self.sysdefs.items():
       
   585             self.assertEquals(sysdef.get_sbs_output_dir("uiklaf"), "", msg="Expected directory value not returned, using %s" % name)
       
   586 
       
   587     def test_i_can_return_a_sysdef_name(self):
       
   588         for name, sysdef in self.sysdefs.items():
       
   589             self.assertEquals(sysdef.name, "Symbian^3", msg="Expected title value not returned, using %s" % name)
       
   590 
       
   591 class TestPackageDefinitionLoader(unittest.TestCase):
       
   592     def setUp(self):
       
   593         self.sysdefpath = __file__
       
   594 
       
   595     def test_i_can_raise_an_exception_if_i_cannot_load_a_pkg_definition(self):
       
   596         pl = PackageDefinitionLoader(self.sysdefpath, path=PathMock)
       
   597         try:
       
   598             pl.load("package_definition.xml")
       
   599             self.fail("Should have raised a PackageDefinionNotFoundError")
       
   600         except PackageDefinionNotFoundError:
       
   601             pass # Expected
       
   602 
       
   603     def test_i_can_load_a_pkg_definition(self):
       
   604         pl = PackageDefinitionLoader(self.sysdefpath, path=PathMock)
       
   605         try:
       
   606             pl.load("data/package_definition.xml")
       
   607         except Exception:
       
   608             self.fail("PackageLoader.load did not find a file that exists (mocked)")
       
   609 
       
   610     def test_if_passed_a_file_like_object_i_just_return_it(self):
       
   611         pl = PackageDefinitionLoader(self.sysdefpath, path=PathMock)
       
   612         pkgdef = pl.load(StringIO(kernelhwsrv_pkg_def))
       
   613         try:
       
   614             etree.parse(pkgdef)
       
   615         except Exception:
       
   616             self.fail("PackageLoader.load did not find a file that exists (mocked)")
       
   617 
       
   618     def test_if_passed_a_file_like_object_as_a_sysdef_i_use_it(self):
       
   619         try:
       
   620             PackageDefinitionLoader(StringIO(sysdefv3_nondistributed))
       
   621         except Exception:
       
   622             self.fail("PackageLoader did not handle a file-like object as sysdef")
       
   623 
       
   624 
       
   625 sysdefv1_unsupported = """<?xml version="1.0" encoding="UTF-8"?>
       
   626 <SystemDefinition schema="1.4" name="Symbian^3"></SystemDefinition>"""
       
   627 
       
   628 sysdefv2_unsupported = """<?xml version="1.0" encoding="UTF-8"?>
       
   629 <SystemDefinition schema="2.1.0" name="Symbian^3"></SystemDefinition>"""
       
   630 
       
   631 sysdefv3_unsupported = """<?xml version="1.0" encoding="UTF-8"?>
       
   632 <SystemDefinition schema="2.1.0" name="Symbian^3"></SystemDefinition>"""
       
   633 
       
   634 sysdefv2 = """<?xml version="1.0" encoding="UTF-8"?>
       
   635 <SystemDefinition schema="2.0.1" name="Symbian^3">
       
   636     <systemModel>
       
   637         <layer name="os" long-name="OS" levels="hw services">
       
   638             <block name="kernelhwsrv" level="hw" long-name="Kernel and Hardware Services" levels="hw-if adaptation framework test">
       
   639                 <collection name="brdbootldr" long-name="Board Boot Loader" level="hw-if">
       
   640                     <component name="ubootldr" long-name="Boot Loader" introduced="9.2" purpose="optional">
       
   641                         <unit mrp="brdbootldr/ubootldr/base_ubootldr.mrp"/>
       
   642                     </component>
       
   643                 </collection>
       
   644                 <collection id="bsptemplate" long-name="Board Support Package Template" level="hw-if">
       
   645                     <component name="asspandvariant" long-name="Template ASSP and Variant" introduced="6.0" purpose="development">
       
   646                         <unit bldFile="os/kernelhwsrv/bsptemplate/asspandvariant/template_variant" mrp="bsptemplate/asspandvariant/base_template.mrp"/>
       
   647                     </component>
       
   648                 </collection>
       
   649                 <collection name="kernel" long-name="Kernel Architecture" level="adaptation">
       
   650                     <component name="eka" long-name="Kernel Architecture" introduced="8.0" purpose="mandatory">
       
   651                         <unit bldFile="os/kernelhwsrv/kernel/eka" mrp="kernel/eka/base_e32.mrp"/>
       
   652                     </component>
       
   653                 </collection>
       
   654                 <collection name="kerneltest" long-name="Kernel Test" level="hw-if">
       
   655                     <component name="e32utils" long-name="E32 Utilities" purpose="development">
       
   656                         <unit bldFile="os/kernelhwsrv/kerneltest/e32utils/group" mrp="kerneltest/e32utils/group/base_e32utils.mrp"/>
       
   657                     </component>
       
   658                     <component name="e32test" long-name="E32 Tests" purpose="development">
       
   659                         <unit bldFile="os/kernelhwsrv/kerneltest/e32test/group" mrp="kerneltest/e32test/group/base_e32test.mrp"/>
       
   660                     </component>
       
   661                     <component name="f32test" long-name="File Server Tests" purpose="development">
       
   662                         <unit bldFile="os/kernelhwsrv/kerneltest/f32test/group" mrp="kerneltest/f32test/group/base_f32test.mrp"/>
       
   663                     </component>
       
   664                 </collection>
       
   665                 <collection name="ldds" long-name="Logical Device Drivers" level="adaptation">
       
   666                     <component name="ethernetldd" long-name="Ethernet Drivers" purpose="optional">
       
   667                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ethernet" mrp="kernel/eka/drivers/ethernet/base_e32_drivers_ethernet.mrp"/>
       
   668                     </component>
       
   669                     <component name="audioldd" long-name="Audio Drivers" introduced="8.1b" purpose="optional">     
       
   670                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/soundsc" mrp="kernel/eka/drivers/soundsc/base_e32_drivers_sound.mrp"/>       
       
   671                     </component>
       
   672                     <component name="serialldd" long-name="Serial Port Drivers" purpose="optional">
       
   673                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ecomm" mrp="kernel/eka/drivers/ecomm/base_e32_drivers_ecomm.mrp"/>
       
   674                     </component>
       
   675                     <component name="legacydrivers" long-name="Legacy Drivers" purpose="optional">
       
   676                         <unit mrp="kernel/eka/drivers/adc/base_e32_drivers_adc.mrp"/>
       
   677                     </component>
       
   678                     <component name="locmedia" long-name="Local Media Subsystem" introduced="8.1b" purpose="mandatory">
       
   679                         <!-- these are LDDs for storage media-->
       
   680                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/locmedia" mrp="kernel/eka/drivers/locmedia/base_e32_drivers_locmedia.mrp"/>
       
   681                     </component>
       
   682                     <component name="runmodedebugger" long-name="Run Mode Debugger" purpose="mandatory">
       
   683                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/debug/group" mrp="kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp"/>        
       
   684                     </component>
       
   685                     <component name="btrace" long-name="Kernel Trace Tool" purpose="mandatory">
       
   686                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/trace" mrp="kernel/eka/drivers/trace/base_e32_drivers_trace.mrp"/>
       
   687                     </component>
       
   688                     <component name="cameraldd" long-name="Camera Drivers" introduced="^3" purpose="optional">
       
   689                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/camerasc" mrp="kernel/eka/drivers/camerasc/base_drivers_camerasc.mrp"/>
       
   690                     </component>
       
   691                     <component name="displayldd" long-name="Display Drivers" introduced="^3" purpose="optional">
       
   692                         <!-- owned and maintained by graphics package. To be moved there as soon as technical limitations are resolved -->
       
   693                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/display" mrp="kernel/eka/drivers/display/base_e32_drivers_display.mrp"/>
       
   694                     </component>
       
   695                     <component name="usbclientdrivers" long-name="USB Client Drivers" introduced="8.1b" purpose="optional">
       
   696                         <!-- owned and maintained by usb package. To be moved there as soon as technical limitations are resolved -->
       
   697                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/usbc" mrp="kernel/eka/drivers/usbc/base_e32_drivers_usbcli.mrp"/>
       
   698                     </component>
       
   699                 </collection>
       
   700                 <collection name="driversupport" long-name="Generic Driver Support" level="hw-if">
       
   701                     <component name="mediadrivers" long-name="Media Drivers" purpose="optional">
       
   702                         <!-- these are for storage media-->
       
   703                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/media" mrp="kernel/eka/drivers/media/base_e32_drivers_media.mrp"/>
       
   704                     </component>
       
   705                     <component name="genericboardsupport" long-name="Generic Board Support" purpose="optional">
       
   706                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/bsp" mrp="kernel/eka/drivers/bsp/base_e32_drivers_bsp.mrp"/>
       
   707                     </component>
       
   708                 </collection>
       
   709                 <collection name="userlibandfileserver" long-name="User Library and File Server" level="framework">
       
   710                     <component name="euser" long-name="User Library" purpose="mandatory">
       
   711                         <unit bldFile="os/kernelhwsrv/kernel/eka/euser" mrp="kernel/eka/euser/base_e32_euser.mrp"/>
       
   712                     </component>
       
   713                     <component name="compsupp" long-name="Compiler Runtime Support" filter="gt" purpose="mandatory">
       
   714                         <unit bldFile="os/kernelhwsrv/kernel/eka/compsupp" mrp="kernel/eka/compsupp/base_e32_compsupp.mrp"/>
       
   715                     </component>
       
   716                     <component name="fileserver" long-name="File Server" filter="gt" purpose="mandatory">
       
   717                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/group" mrp="userlibandfileserver/fileserver/group/base_f32.mrp"/>
       
   718                     </component>
       
   719                     <component name="estart" long-name="Base Starter" filter="gt" purpose="optional">
       
   720                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/estart" mrp="userlibandfileserver/fileserver/estart/base_f32_estart.mrp"/>
       
   721                     </component>
       
   722                     <component name="domainmgr" long-name="Domain Manager" introduced="8.1b" purpose="mandatory">
       
   723                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/domainmgr/group" mrp="userlibandfileserver/domainmgr/group/base_domain.mrp"/>
       
   724                     </component>
       
   725                 </collection>
       
   726                 <collection name="filesystems" long-name="File Systems" level="framework">
       
   727                     <component name="romfs" long-name="ROM File System" filter="gt" purpose="optional" class="plugin">
       
   728                         <unit mrp="userlibandfileserver/fileserver/srom/base_f32_srom.mrp"/>
       
   729                     </component>
       
   730                     <component name="rofs" long-name="ROFS" filter="gt" purpose="optional" class="plugin">
       
   731                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/srofs" mrp="userlibandfileserver/fileserver/srofs/base_f32_srofs.mrp"/>
       
   732                     </component>
       
   733                     <component name="usbmsfs" long-name="USB Mass Storage File System" filter="gt" purpose="optional" class="plugin">
       
   734                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage" mrp="userlibandfileserver/fileserver/smassstorage/base_f32_smassstorage.mrp"/>
       
   735                     </component>
       
   736                     <component name="usbhostmssrv" long-name="USB Host Mass Storage Server" filter="gt" introduced="^3" purpose="optional" class="plugin">
       
   737                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/shostmassstorage" mrp="userlibandfileserver/fileserver/shostmassstorage/base_f32_shostmassstorage.mrp"/>
       
   738                     </component>
       
   739                     <component name="fat32fs" long-name="FAT32 File System" filter="gt" purpose="optional" class="plugin">
       
   740                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat32" mrp="userlibandfileserver/fileserver/sfat32/base_f32_sfat32.mrp"/>
       
   741                     </component>
       
   742                     <component name="fatfs" long-name="FAT File System" filter="gt" purpose="optional" class="plugin">
       
   743                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat" mrp="userlibandfileserver/fileserver/sfat/base_f32_sfat.mrp"/>
       
   744                     </component>
       
   745                     <component name="compfs" long-name="Composite File System" filter="gt" purpose="optional" class="plugin">
       
   746                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/scomp" mrp="userlibandfileserver/fileserver/scomp/base_f32_scomp.mrp"/>
       
   747                     </component>
       
   748                 </collection>
       
   749                 <collection name="halservices" long-name="HAL Services" level="framework">
       
   750                     <component name="hal" long-name="User-Side Hardware Abstraction" introduced="6.0" purpose="optional">
       
   751                         <unit bldFile="os/kernelhwsrv/halservices/hal" mrp="halservices/hal/base_hal.mrp"/>
       
   752                     </component>
       
   753                 </collection>
       
   754                 <collection name="textmodeshell" long-name="Text Mode Shell" level="test">
       
   755                     <component name="e32wsrv" long-name="Text Window Server" purpose="optional">
       
   756                         <unit bldFile="os/kernelhwsrv/kernel/eka/ewsrv" mrp="kernel/eka/ewsrv/base_e32_ewsrv.mrp"/>
       
   757                     </component>
       
   758                     <component name="textshell" long-name="Text Shell" filter="gt" purpose="development">
       
   759                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/etshell" mrp="userlibandfileserver/fileserver/etshell/base_f32_eshell.mrp"/>
       
   760                     </component>
       
   761                 </collection>
       
   762                 <collection name="baseapitest" long-name="Base API Tests" level="test">
       
   763                     <component name="basesvs" long-name="Base Verification Suite" introduced="^2" purpose="development" filter="test">
       
   764                         <unit mrp="baseapitest/basesvs/group/basesvs.mrp" bldFile="baseapitest/basesvs/group"/>
       
   765                     </component>
       
   766                 </collection>
       
   767                 <collection name="kernelhwsrv_info" long-name="Kernel and Hardware Services Info" level="test">
       
   768                     <component name="kernelhwsrv_metadata" long-name="Kernel and Hardware Services Metadata" class="config" introduced="^2" purpose="development" target="desktop">
       
   769                         <unit mrp="kernelhwsrv_info/kernelhwsrv_metadata/kernelhwsrv_metadata.mrp"/>
       
   770                     </component>
       
   771                 </collection>
       
   772             </block>
       
   773         </layer>
       
   774         <layer name="mw" long-name="Middleware" levels="generic specific">
       
   775             <block name="classicui" level="generic" long-name="Classic UI" levels="base support server generic specific">
       
   776                 <collection name="psln" long-name="Personalization" level="specific">
       
   777                     <component filter="s60" long-name="Personalization Engine" class="placeholder">
       
   778                         <!-- <unit bldFile="psln/pslnengine/group"/> -->
       
   779                     </component>
       
   780                     <component name="pslnframework" filter="s60" long-name="Personalization Framework" class="placeholder">
       
   781                         <!-- <unit bldFile="psln/pslnframework"/> -->
       
   782                     </component>
       
   783                     <component name="pslnlibraryloaders" filter="s60" long-name="Personalization Library Loaders" class="placeholder">
       
   784                         <!-- no bld.inf, need to create one or remove component -->
       
   785                     </component>
       
   786                     <component name="pslnslidesetdialog" filter="s60" long-name="Personalization Slideset Dialog" plugin="Y" class="placeholder">
       
   787                         <!-- <unit bldFile="psln/pslnslidesetdialog/group"/> -->
       
   788                     </component>
       
   789                     <component name="pslngsplugin" filter="s60" long-name="Personalization GS Plugin" plugin="Y">
       
   790                         <unit bldFile="mw/classicui/psln/pslngsplugin/Group"/>
       
   791                     </component>
       
   792                     <component name="psln_help" filter="s60" long-name="Personalization Help">
       
   793                         <unit bldFile="mw/classicui/psln/help/group"/>
       
   794                     </component>
       
   795                     <component name="psln_build" filter="s60" long-name="Personalization Build">
       
   796                         <!-- the Psln group bld.inf should be distributed into the individual components, or they should be collapsed in a single component -->
       
   797                         <unit bldFile="mw/classicui/psln/group"/>
       
   798                     </component>
       
   799                 </collection>
       
   800                 <collection name="applicationinterworkingfw" long-name="Application Interworking Framework" level="generic">
       
   801                     <component name="aifwservicehandler" filter="s60" long-name="Application Interworking Service Handle">
       
   802                         <unit bldFile="mw/classicui/applicationinterworkingfw/servicehandler/group"/>
       
   803                     </component>
       
   804                 </collection>
       
   805                 <collection name="commonuis" long-name="Common UIs" level="specific">
       
   806                     <component name="commonui" filter="s60" long-name="Common UI">
       
   807                         <unit bldFile="mw/classicui/commonuis/commonui/group"/>
       
   808                     </component>
       
   809                     <component name="commondialogs" filter="s60" long-name="Common Dialogs">
       
   810                         <unit bldFile="mw/classicui/commonuis/commondialogs/group"/>
       
   811                         <!-- <unit bldFile="commonuis/commondialogs/group_test"/> -->
       
   812                     </component>
       
   813                 </collection>
       
   814                 <collection name="uifw" long-name="UI Framework" level="server">
       
   815                     <component name="uiklaf" filter="s60" long-name="Uikon Look-and-Feel">
       
   816                         <unit bldFile=""/>
       
   817                     </component>
       
   818                     <component name="eikctl" filter="s60" long-name="Eikon Controls">
       
   819                         <unit bldFile="mw/classicui/uifw/eikctl/group"/>
       
   820                     </component>
       
   821                     <component name="avkon" filter="s60" long-name="Avkon">
       
   822                         <unit bldFile="mw/classicui/uifw/avkon/aknphysics/group"/>
       
   823                         <unit bldFile="mw/classicui/uifw/avkon/group"/>
       
   824                         <unit bldFile="mw/classicui/uifw/avkon/odeconf/group"/>
       
   825                         <!-- <unit bldFile="uifw/avkon/aknhlist/group"/> -->
       
   826                         <!-- <unit bldFile="uifw/avkon/aknkeyrotator/group"/> -->
       
   827                         <!-- <unit bldFile="uifw/avkon/prebuilder"/> -->
       
   828                         <!-- <unit bldFile="uifw/avkon/tsrc/bc/s60_sdkmcl/bctestmixmcl/group"/> -->
       
   829                     </component>
       
   830                     <component name="eikstd" filter="s60" long-name="Eikon Standard">
       
   831                         <unit bldFile="mw/classicui/uifw/eikstd/group"/>
       
   832                     </component>
       
   833                     <component name="aknglobalui" filter="s60" long-name="Avkon Global UI">
       
   834                         <unit bldFile="mw/classicui/uifw/aknglobalui/group"/>
       
   835                     </component>
       
   836                     <component name="ganes" filter="s60" long-name="Ganes">
       
   837                         <unit bldFile="mw/classicui/uifw/ganes/group"/>
       
   838                     </component>
       
   839                     <component name="uifw_test" filter="s60" long-name="UI Framework Test" purpose="development" class="placeholder">
       
   840                         <!-- <unit bldFile="uifw/tsrc/group"/> -->
       
   841                     </component>
       
   842                 </collection>
       
   843                 <collection name="commonadapter" long-name="Common Adapter" level="support">
       
   844                     <component name="commonadapter_build" filter="s60" long-name="Common Adapter Build">
       
   845                         <unit bldFile="mw/classicui/commonadapter/group"/>
       
   846                     </component>
       
   847                 </collection>
       
   848                 <collection name="ode" long-name="Open Dynamics Engine" level="support">
       
   849                     <component name="ode_build" filter="s60" long-name="ODE">
       
   850                         <unit bldFile="mw/classicui/ode/group"/>
       
   851                     </component>
       
   852                 </collection>
       
   853                 <collection name="commonuisupport" long-name="Common UI Support" level="support">
       
   854                     <component name="uikon" long-name="Uikon" introduced="6.0" purpose="mandatory">
       
   855                         <unit bldFile="mw/classicui/commonuisupport/uikon/group" mrp="mw/classicui/commonuisupport/uikon/group/app-framework_uikon.mrp"/>
       
   856                     </component>
       
   857                     <component name="errorresolverdata" long-name="Error Resolver Data" purpose="mandatory">
       
   858                         <unit bldFile="mw/classicui/commonuisupport/errorresolverdata/group" mrp="mw/classicui/commonuisupport/errorresolverdata/group/app-framework_errorresgt.mrp"/>
       
   859                     </component>
       
   860                     <component name="uilaf" long-name="UI Look and Feel" introduced="6.0" purpose="mandatory">
       
   861                         <unit bldFile="mw/classicui/commonuisupport/uilaf/GROUP" mrp="mw/classicui/commonuisupport/uilaf/GROUP/app-framework_uiklafgt.mrp"/>
       
   862                     </component>
       
   863                     <component name="grid" long-name="Grid" purpose="optional">
       
   864                         <unit bldFile="mw/classicui/commonuisupport/grid/group" mrp="mw/classicui/commonuisupport/grid/group/app-framework_grid.mrp"/>
       
   865                     </component>
       
   866                     <component name="uifwsdocs" long-name="UI Frameworks Documentation" purpose="development" class="doc">
       
   867                         <unit mrp="mw/classicui/commonuisupport/uifwsdocs/app-framework_documentation.mrp"/>
       
   868                     </component>
       
   869                 </collection>
       
   870                 <collection name="lafagnosticuifoundation" long-name="Look-and-Feel Agnostic UI Foundation" level="base">
       
   871                     <component name="cone" long-name="Control Environment" purpose="mandatory">
       
   872                         <unit bldFile="mw/classicui/lafagnosticuifoundation/cone/group" mrp="mw/classicui/lafagnosticuifoundation/cone/group/app-framework_cone.mrp"/>
       
   873                     </component>
       
   874                     <component name="graphicseffects" long-name="Graphics Effects" introduced="9.2" purpose="optional">
       
   875                         <unit bldFile="mw/classicui/lafagnosticuifoundation/graphicseffects/group" mrp="mw/classicui/lafagnosticuifoundation/graphicseffects/group/app-framework_gfxtranseffect.mrp"/>
       
   876                     </component>
       
   877                     <component name="uigraphicsutils" long-name="UI Graphics Utilities" purpose="mandatory">
       
   878                         <unit bldFile="mw/classicui/lafagnosticuifoundation/uigraphicsutils/group" mrp="mw/classicui/lafagnosticuifoundation/uigraphicsutils/group/app-framework_egul.mrp"/>
       
   879                     </component>
       
   880                     <component name="clockanim" long-name="Clock" purpose="optional" plugin="Y">
       
   881                         <unit bldFile="mw/classicui/lafagnosticuifoundation/clockanim/group" mrp="mw/classicui/lafagnosticuifoundation/clockanim/group/app-framework_clock.mrp"/>
       
   882                     </component>
       
   883                     <component name="bmpanimation" long-name="BMP Animation" introduced="6.0" purpose="optional">
       
   884                         <unit bldFile="/mw/classicui/lafagnosticuifoundation/bmpanimation/group" mrp="mw/classicui/lafagnosticuifoundation/bmpanimation/group/app-framework_bmpanim.mrp"/>
       
   885                     </component>
       
   886                     <component name="animation" long-name="Animation" introduced="9.1" purpose="optional">
       
   887                         <unit bldFile="../mw/classicui/lafagnosticuifoundation/animation/group" mrp="mw/classicui/lafagnosticuifoundation/animation/group/app-framework_animation.mrp"/>
       
   888                     </component>
       
   889                 </collection>
       
   890                 <collection name="classicui_info" long-name="Classic UI Info" level="specific">
       
   891                     <!-- the multiple units in the API components need to be resolved -->
       
   892                     <component name="classicui_pub" filter="s60" long-name="Classic UI Public Interfaces" class="api">
       
   893                         <unit bldFile="mw/classicui/classicui_pub/group"/>
       
   894                     </component>
       
   895                     <component name="classicui_plat" filter="s60" long-name="Classic UI Platform Interfaces" class="api">
       
   896                         <unit bldFile="mw/classicui/classicui_plat/group"/>
       
   897                     </component>
       
   898                     <component name="classicui_test" filter="s60" long-name="Classic UI Tests" purpose="development">
       
   899                         <unit bldFile="mw/classicui/classicui_plat/tsrc/group"/>
       
   900                         <unit bldFile="mw/classicui/classicui_pub/document_handler_api/tsrc/group"/>
       
   901                         <unit bldFile="mw/classicui/classicui_pub/server_application_api/tsrc/group"/>
       
   902                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/bctesttemplate/group"/> -->
       
   903                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.0/group"/> -->
       
   904                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.1/group"/> -->
       
   905                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.2/group"/> -->
       
   906                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk5.0/bctestpane/group"/> -->
       
   907                         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk5.0/group"/> -->
       
   908                         <!-- <unit bldFile="classicui_pub/tsrc/bc/group"/> -->
       
   909                         <!-- <unit bldFile="classicui_plat/avkon_testability_api/tsrc/group"/> -->
       
   910                         <!-- <unit bldFile="classicui_plat/extended_sounds_api/tsrc/group"/> -->
       
   911                         <unit bldFile="mw/classicui/classicui_plat/ganes_api/tsrc/group"/>
       
   912                         <unit bldFile="mw/classicui/classicui_plat/physics_api/tsrc/group"/>
       
   913                     </component>
       
   914                     <component name="classicui_metadata" long-name="Classic UI Metadata" introduced="^2" purpose="development" class="config PC">
       
   915                         <unit mrp="mw/classicui/classicui_info/classicui_metadata/classicui_metadata.mrp"/>
       
   916                     </component>
       
   917                 </collection>
       
   918             </block>
       
   919         </layer>
       
   920     </systemModel>
       
   921 </SystemDefinition>"""
       
   922 
       
   923 
       
   924 sysdefv3_nondistributed = """<?xml version="1.0" encoding="UTF-8"?>
       
   925 <SystemDefinition schema="3.0.0">
       
   926     <systemModel name="Symbian^3">
       
   927         <layer id="os" name="OS" levels="hw services">
       
   928             <package id="kernelhwsrv" name="Kernel and Hardware Services" levels="hw-if adaptation framework test">
       
   929                 <collection id="brdbootldr" name="Board Boot Loader" level="hw-if">
       
   930                     <component id="ubootldr" name="Boot Loader" introduced="9.2" purpose="optional">
       
   931                         <unit mrp="brdbootldr/ubootldr/base_ubootldr.mrp"/>
       
   932                     </component>
       
   933                 </collection>
       
   934                 <collection id="bsptemplate" name="Board Support Package Template" level="hw-if">
       
   935                     <component id="asspandvariant" name="Template ASSP and Variant" introduced="6.0" purpose="development">
       
   936                         <unit bldFile="os/kernelhwsrv/bsptemplate/asspandvariant/template_variant" mrp="bsptemplate/asspandvariant/base_template.mrp"/>
       
   937                     </component>
       
   938                 </collection>
       
   939                 <collection id="kernel" name="Kernel Architecture" level="adaptation">
       
   940                     <component id="eka" name="Kernel Architecture" introduced="8.0" purpose="mandatory">
       
   941                         <unit bldFile="os/kernelhwsrv/kernel/eka" mrp="kernel/eka/base_e32.mrp"/>
       
   942                     </component>
       
   943                 </collection>
       
   944                 <collection id="kerneltest" name="Kernel Test" level="hw-if">
       
   945                     <component id="e32utils" name="E32 Utilities" purpose="development">
       
   946                         <unit bldFile="os/kernelhwsrv/kerneltest/e32utils/group" mrp="kerneltest/e32utils/group/base_e32utils.mrp"/>
       
   947                     </component>
       
   948                     <component id="e32test" name="E32 Tests" purpose="development">
       
   949                         <unit bldFile="os/kernelhwsrv/kerneltest/e32test/group" mrp="kerneltest/e32test/group/base_e32test.mrp"/>
       
   950                     </component>
       
   951                     <component id="f32test" name="File Server Tests" purpose="development">
       
   952                         <unit bldFile="os/kernelhwsrv/kerneltest/f32test/group" mrp="kerneltest/f32test/group/base_f32test.mrp"/>
       
   953                     </component>
       
   954                 </collection>
       
   955                 <collection id="ldds" name="Logical Device Drivers" level="adaptation">
       
   956                     <component id="ethernetldd" name="Ethernet Drivers" purpose="optional">
       
   957                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ethernet" mrp="kernel/eka/drivers/ethernet/base_e32_drivers_ethernet.mrp"/>
       
   958                     </component>
       
   959                     <component id="audioldd" name="Audio Drivers" introduced="8.1b" purpose="optional">     
       
   960                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/soundsc" mrp="kernel/eka/drivers/soundsc/base_e32_drivers_sound.mrp"/>       
       
   961                     </component>
       
   962                     <component id="serialldd" name="Serial Port Drivers" purpose="optional">
       
   963                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/ecomm" mrp="kernel/eka/drivers/ecomm/base_e32_drivers_ecomm.mrp"/>
       
   964                     </component>
       
   965                     <component id="legacydrivers" name="Legacy Drivers" purpose="optional">
       
   966                         <unit mrp="kernel/eka/drivers/adc/base_e32_drivers_adc.mrp"/>
       
   967                     </component>
       
   968                     <component id="locmedia" name="Local Media Subsystem" introduced="8.1b" purpose="mandatory">
       
   969                         <!-- these are LDDs for storage media-->
       
   970                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/locmedia" mrp="kernel/eka/drivers/locmedia/base_e32_drivers_locmedia.mrp"/>
       
   971                     </component>
       
   972                     <component id="runmodedebugger" name="Run Mode Debugger" purpose="mandatory">
       
   973                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/debug/group" mrp="kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp"/>        
       
   974                     </component>
       
   975                     <component id="btrace" name="Kernel Trace Tool" purpose="mandatory">
       
   976                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/trace" mrp="kernel/eka/drivers/trace/base_e32_drivers_trace.mrp"/>
       
   977                     </component>
       
   978                     <component id="cameraldd" name="Camera Drivers" introduced="^3" purpose="optional">
       
   979                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/camerasc" mrp="kernel/eka/drivers/camerasc/base_drivers_camerasc.mrp"/>
       
   980                     </component>
       
   981                     <component id="displayldd" name="Display Drivers" introduced="^3" purpose="optional">
       
   982                         <!-- owned and maintained by graphics package. To be moved there as soon as technical limitations are resolved -->
       
   983                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/display" mrp="kernel/eka/drivers/display/base_e32_drivers_display.mrp"/>
       
   984                     </component>
       
   985                     <component id="usbclientdrivers" name="USB Client Drivers" introduced="8.1b" purpose="optional">
       
   986                         <!-- owned and maintained by usb package. To be moved there as soon as technical limitations are resolved -->
       
   987                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/usbc" mrp="kernel/eka/drivers/usbc/base_e32_drivers_usbcli.mrp"/>
       
   988                     </component>
       
   989                 </collection>
       
   990                 <collection id="driversupport" name="Generic Driver Support" level="hw-if">
       
   991                     <component id="mediadrivers" name="Media Drivers" purpose="optional">
       
   992                         <!-- these are for storage media-->
       
   993                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/media" mrp="kernel/eka/drivers/media/base_e32_drivers_media.mrp"/>
       
   994                     </component>
       
   995                     <component id="genericboardsupport" name="Generic Board Support" purpose="optional">
       
   996                         <unit bldFile="os/kernelhwsrv/kernel/eka/drivers/bsp" mrp="kernel/eka/drivers/bsp/base_e32_drivers_bsp.mrp"/>
       
   997                     </component>
       
   998                 </collection>
       
   999                 <collection id="userlibandfileserver" name="User Library and File Server" level="framework">
       
  1000                     <component id="euser" name="User Library" purpose="mandatory">
       
  1001                         <unit bldFile="os/kernelhwsrv/kernel/eka/euser" mrp="kernel/eka/euser/base_e32_euser.mrp"/>
       
  1002                     </component>
       
  1003                     <component id="compsupp" name="Compiler Runtime Support" filter="gt" purpose="mandatory">
       
  1004                         <unit bldFile="os/kernelhwsrv/kernel/eka/compsupp" mrp="kernel/eka/compsupp/base_e32_compsupp.mrp"/>
       
  1005                     </component>
       
  1006                     <component id="fileserver" name="File Server" filter="gt" purpose="mandatory">
       
  1007                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/group" mrp="userlibandfileserver/fileserver/group/base_f32.mrp"/>
       
  1008                     </component>
       
  1009                     <component id="estart" name="Base Starter" filter="gt" purpose="optional">
       
  1010                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/estart" mrp="userlibandfileserver/fileserver/estart/base_f32_estart.mrp"/>
       
  1011                     </component>
       
  1012                     <component id="domainmgr" name="Domain Manager" introduced="8.1b" purpose="mandatory">
       
  1013                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/domainmgr/group" mrp="userlibandfileserver/domainmgr/group/base_domain.mrp"/>
       
  1014                     </component>
       
  1015                 </collection>
       
  1016                 <collection id="filesystems" name="File Systems" level="framework">
       
  1017                     <component id="romfs" name="ROM File System" filter="gt" purpose="optional" class="plugin">
       
  1018                         <unit mrp="userlibandfileserver/fileserver/srom/base_f32_srom.mrp"/>
       
  1019                     </component>
       
  1020                     <component id="rofs" name="ROFS" filter="gt" purpose="optional" class="plugin">
       
  1021                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/srofs" mrp="userlibandfileserver/fileserver/srofs/base_f32_srofs.mrp"/>
       
  1022                     </component>
       
  1023                     <component id="usbmsfs" name="USB Mass Storage File System" filter="gt" purpose="optional" class="plugin">
       
  1024                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage" mrp="userlibandfileserver/fileserver/smassstorage/base_f32_smassstorage.mrp"/>
       
  1025                     </component>
       
  1026                     <component id="usbhostmssrv" name="USB Host Mass Storage Server" filter="gt" introduced="^3" purpose="optional" class="plugin">
       
  1027                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/shostmassstorage" mrp="userlibandfileserver/fileserver/shostmassstorage/base_f32_shostmassstorage.mrp"/>
       
  1028                     </component>
       
  1029                     <component id="fat32fs" name="FAT32 File System" filter="gt" purpose="optional" class="plugin">
       
  1030                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat32" mrp="userlibandfileserver/fileserver/sfat32/base_f32_sfat32.mrp"/>
       
  1031                     </component>
       
  1032                     <component id="fatfs" name="FAT File System" filter="gt" purpose="optional" class="plugin">
       
  1033                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/sfat" mrp="userlibandfileserver/fileserver/sfat/base_f32_sfat.mrp"/>
       
  1034                     </component>
       
  1035                     <component id="compfs" name="Composite File System" filter="gt" purpose="optional" class="plugin">
       
  1036                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/scomp" mrp="userlibandfileserver/fileserver/scomp/base_f32_scomp.mrp"/>
       
  1037                     </component>
       
  1038                 </collection>
       
  1039                 <collection id="halservices" name="HAL Services" level="framework">
       
  1040                     <component id="hal" name="User-Side Hardware Abstraction" introduced="6.0" purpose="optional">
       
  1041                         <unit bldFile="os/kernelhwsrv/halservices/hal" mrp="halservices/hal/base_hal.mrp"/>
       
  1042                     </component>
       
  1043                 </collection>
       
  1044                 <collection id="textmodeshell" name="Text Mode Shell" level="test">
       
  1045                     <component id="e32wsrv" name="Text Window Server" purpose="optional">
       
  1046                         <unit bldFile="os/kernelhwsrv/kernel/eka/ewsrv" mrp="kernel/eka/ewsrv/base_e32_ewsrv.mrp"/>
       
  1047                     </component>
       
  1048                     <component id="textshell" name="Text Shell" filter="gt" purpose="development">
       
  1049                         <unit bldFile="os/kernelhwsrv/userlibandfileserver/fileserver/etshell" mrp="userlibandfileserver/fileserver/etshell/base_f32_eshell.mrp"/>
       
  1050                     </component>
       
  1051                 </collection>
       
  1052                 <collection id="baseapitest" name="Base API Tests" level="test">
       
  1053                     <component id="basesvs" name="Base Verification Suite" introduced="^2" purpose="development" filter="test">
       
  1054                         <unit mrp="baseapitest/basesvs/group/basesvs.mrp" bldFile="baseapitest/basesvs/group"/>
       
  1055                     </component>
       
  1056                 </collection>
       
  1057                 <collection id="kernelhwsrv_info" name="Kernel and Hardware Services Info" level="test">
       
  1058                     <component id="kernelhwsrv_metadata" name="Kernel and Hardware Services Metadata" class="config" introduced="^2" purpose="development" target="desktop">
       
  1059                         <unit mrp="kernelhwsrv_info/kernelhwsrv_metadata/kernelhwsrv_metadata.mrp"/>
       
  1060                     </component>
       
  1061                 </collection>
       
  1062             </package>
       
  1063         </layer>
       
  1064         <layer id="mw" name="Middleware" levels="generic specific">
       
  1065             <package id="classicui" name="Classic UI" levels="base support server generic specific">
       
  1066                 <collection id="psln" name="Personalization" level="specific">
       
  1067                     <component id="pslnengine" filter="s60" name="Personalization Engine">
       
  1068                         <!-- <unit bldFile="mw/classicui/psln/pslnengine/group"/> -->
       
  1069                     </component>
       
  1070                     <component id="pslnframework" filter="s60" name="Personalization Framework">
       
  1071                         <!-- <unit bldFile="mw/classicui/psln/pslnframework"/> -->
       
  1072                     </component>
       
  1073                     <component id="pslnlibraryloaders" filter="s60" name="Personalization Library Loaders">
       
  1074                         <!-- no bld.inf, need to create one or remove component -->
       
  1075                     </component>
       
  1076                     <component id="pslnslidesetdialog" filter="s60" name="Personalization Slideset Dialog" class="plugin">
       
  1077                         <!-- <unit bldFile="mw/classicui/psln/pslnslidesetdialog/group"/> -->
       
  1078                     </component>
       
  1079                     <component id="pslngsplugin" filter="s60" name="Personalization GS Plugin" class="plugin">
       
  1080                         <unit bldFile="mw/classicui/psln/pslngsplugin/Group"/>
       
  1081                     </component>
       
  1082                     <component id="psln_help" filter="s60" name="Personalization Help">
       
  1083                         <unit bldFile="mw/classicui/psln/help/group"/>
       
  1084                     </component>
       
  1085                     <component id="psln_build" filter="s60" name="Personalization Build">
       
  1086                         <!-- the Psln group bld.inf should be distributed into the individual components, or they should be collapsed in a single component -->
       
  1087                         <unit bldFile="mw/classicui/psln/group"/>
       
  1088                     </component>
       
  1089                 </collection>
       
  1090                 <collection id="applicationinterworkingfw" name="Application Interworking Framework" level="generic">
       
  1091                     <component id="aifwservicehandler" filter="s60" name="Application Interworking Service Handle">
       
  1092                         <unit bldFile="mw/classicui/applicationinterworkingfw/servicehandler/group"/>
       
  1093                     </component>
       
  1094                 </collection>
       
  1095                 <collection id="commonuis" name="Common UIs" level="specific">
       
  1096                     <component id="commonui" filter="s60" name="Common UI">
       
  1097                         <unit bldFile="mw/classicui/commonuis/commonui/group"/>
       
  1098                     </component>
       
  1099                     <component id="commondialogs" filter="s60" name="Common Dialogs">
       
  1100                         <unit bldFile="mw/classicui/commonuis/commondialogs/group"/>
       
  1101                         <!-- <unit bldFile="mw/classicui/commonuis/commondialogs/group_test"/> -->
       
  1102                     </component>
       
  1103                 </collection>
       
  1104                 <collection id="uifw" name="UI Framework" level="server">
       
  1105                     <component id="uiklaf" filter="s60" name="Uikon Look-and-Feel">
       
  1106                         <unit bldFile=""/>
       
  1107                     </component>
       
  1108                     <component id="eikctl" filter="s60" name="Eikon Controls">
       
  1109                         <unit bldFile="mw/classicui/uifw/eikctl/group"/>
       
  1110                     </component>
       
  1111                     <component id="avkon" filter="s60" name="Avkon">
       
  1112                         <unit bldFile="mw/classicui/uifw/avkon/aknphysics/group"/>
       
  1113                         <unit bldFile="mw/classicui/uifw/avkon/group"/>
       
  1114                         <unit bldFile="mw/classicui/uifw/avkon/odeconf/group"/>
       
  1115                         <!-- <unit bldFile="mw/classicui/uifw/avkon/aknhlist/group"/> -->
       
  1116                         <!-- <unit bldFile="mw/classicui/uifw/avkon/aknkeyrotator/group"/> -->
       
  1117                         <!-- <unit bldFile="mw/classicui/uifw/avkon/prebuilder"/> -->
       
  1118                         <!-- <unit bldFile="mw/classicui/uifw/avkon/tsrc/bc/s60_sdkmcl/bctestmixmcl/group"/> -->
       
  1119                     </component>
       
  1120                     <component id="eikstd" filter="s60" name="Eikon Standard">
       
  1121                         <unit bldFile="mw/classicui/uifw/eikstd/group"/>
       
  1122                     </component>
       
  1123                     <component id="aknglobalui" filter="s60" name="Avkon Global UI">
       
  1124                         <unit bldFile="mw/classicui/uifw/aknglobalui/group"/>
       
  1125                     </component>
       
  1126                     <component id="ganes" filter="s60" name="Ganes">
       
  1127                         <unit bldFile="mw/classicui/uifw/ganes/group"/>
       
  1128                     </component>
       
  1129                     <component id="uifw_test" filter="s60" name="UI Framework Test" purpose="development">
       
  1130                         <!-- <unit bldFile="mw/classicui/uifw/tsrc/group"/> -->
       
  1131                     </component>
       
  1132                 </collection>
       
  1133                 <collection id="commonadapter" name="Common Adapter" level="support">
       
  1134                     <component id="commonadapter_build" filter="s60" name="Common Adapter Build">
       
  1135                         <unit bldFile="mw/classicui/commonadapter/group"/>
       
  1136                     </component>
       
  1137                 </collection>
       
  1138                 <collection id="ode" name="Open Dynamics Engine" level="support">
       
  1139                     <component id="ode_build" filter="s60" name="ODE">
       
  1140                         <unit bldFile="mw/classicui/ode/group"/>
       
  1141                     </component>
       
  1142                 </collection>
       
  1143                 <collection id="commonuisupport" name="Common UI Support" level="support">
       
  1144                     <component id="uikon" name="Uikon" introduced="6.0" purpose="mandatory">
       
  1145                         <unit bldFile="mw/classicui/commonuisupport/uikon/group" mrp="commonuisupport/uikon/group/app-framework_uikon.mrp"/>
       
  1146                     </component>
       
  1147                     <component id="errorresolverdata" name="Error Resolver Data" purpose="mandatory">
       
  1148                         <unit bldFile="mw/classicui/commonuisupport/errorresolverdata/group" mrp="commonuisupport/errorresolverdata/group/app-framework_errorresgt.mrp"/>
       
  1149                     </component>
       
  1150                     <component id="uilaf" name="UI Look and Feel" introduced="6.0" purpose="mandatory">
       
  1151                         <unit bldFile="mw/classicui/commonuisupport/uilaf/GROUP" mrp="commonuisupport/uilaf/GROUP/app-framework_uiklafgt.mrp"/>
       
  1152                     </component>
       
  1153                     <component id="grid" name="Grid" purpose="optional">
       
  1154                         <unit bldFile="mw/classicui/commonuisupport/grid/group" mrp="commonuisupport/grid/group/app-framework_grid.mrp"/>
       
  1155                     </component>
       
  1156                     <component id="uifwsdocs" name="UI Frameworks Documentation" purpose="development" class="doc">
       
  1157                         <unit mrp="commonuisupport/uifwsdocs/app-framework_documentation.mrp"/>
       
  1158                     </component>
       
  1159                 </collection>
       
  1160                 <collection id="lafagnosticuifoundation" name="Look-and-Feel Agnostic UI Foundation" level="base">
       
  1161                     <component id="cone" name="Control Environment" purpose="mandatory">
       
  1162                         <unit bldFile="mw/classicui/lafagnosticuifoundation/cone/group" mrp="lafagnosticuifoundation/cone/group/app-framework_cone.mrp"/>
       
  1163                     </component>
       
  1164                     <component id="graphicseffects" name="Graphics Effects" introduced="9.2" purpose="optional">
       
  1165                         <unit bldFile="mw/classicui/lafagnosticuifoundation/graphicseffects/group" mrp="lafagnosticuifoundation/graphicseffects/group/app-framework_gfxtranseffect.mrp"/>
       
  1166                     </component>
       
  1167                     <component id="uigraphicsutils" name="UI Graphics Utilities" purpose="mandatory">
       
  1168                         <unit bldFile="mw/classicui/lafagnosticuifoundation/uigraphicsutils/group" mrp="lafagnosticuifoundation/uigraphicsutils/group/app-framework_egul.mrp"/>
       
  1169                     </component>
       
  1170                     <component id="clockanim" name="Clock" purpose="optional" class="plugin">
       
  1171                         <unit bldFile="mw/classicui/lafagnosticuifoundation/clockanim/group" mrp="lafagnosticuifoundation/clockanim/group/app-framework_clock.mrp"/>
       
  1172                     </component>
       
  1173                     <component id="bmpanimation" name="BMP Animation" introduced="6.0" purpose="optional">
       
  1174                         <unit bldFile="/mw/classicui/lafagnosticuifoundation/bmpanimation/group" mrp="lafagnosticuifoundation/bmpanimation/group/app-framework_bmpanim.mrp"/>
       
  1175                     </component>
       
  1176                     <component id="animation" name="Animation" introduced="9.1" purpose="optional">
       
  1177                         <unit bldFile="../mw/classicui/lafagnosticuifoundation/animation/group" mrp="lafagnosticuifoundation/animation/group/app-framework_animation.mrp"/>
       
  1178                     </component>
       
  1179                 </collection>
       
  1180                 <collection id="classicui_info" name="Classic UI Info" level="specific">
       
  1181                     <!-- the multiple units in the API components need to be resolved -->
       
  1182                     <component id="classicui_pub" filter="s60" name="Classic UI Public Interfaces" class="api">
       
  1183                         <unit bldFile="mw/classicui/classicui_pub/group"/>
       
  1184                     </component>
       
  1185                     <component id="classicui_plat" filter="s60" name="Classic UI Platform Interfaces" class="api">
       
  1186                         <unit bldFile="mw/classicui/classicui_plat/group"/>
       
  1187                     </component>
       
  1188                     <component id="classicui_test" filter="s60" name="Classic UI Tests" purpose="development">
       
  1189                         <unit bldFile="mw/classicui/classicui_plat/tsrc/group"/>
       
  1190                         <unit bldFile="mw/classicui/classicui_pub/document_handler_api/tsrc/group"/>
       
  1191                         <unit bldFile="mw/classicui/classicui_pub/server_application_api/tsrc/group"/>
       
  1192                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/bctesttemplate/group"/> -->
       
  1193                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/s60_sdk3.0/group"/> -->
       
  1194                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/s60_sdk3.1/group"/> -->
       
  1195                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/s60_sdk3.2/group"/> -->
       
  1196                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/s60_sdk5.0/bctestpane/group"/> -->
       
  1197                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/apps/s60_sdk5.0/group"/> -->
       
  1198                         <!-- <unit bldFile="mw/classicui/classicui_pub/tsrc/bc/group"/> -->
       
  1199                         <!-- <unit bldFile="mw/classicui/classicui_plat/avkon_testability_api/tsrc/group"/> -->
       
  1200                         <!-- <unit bldFile="mw/classicui/classicui_plat/extended_sounds_api/tsrc/group"/> -->
       
  1201                         <unit bldFile="mw/classicui/classicui_plat/ganes_api/tsrc/group"/>
       
  1202                         <unit bldFile="mw/classicui/classicui_plat/physics_api/tsrc/group"/>
       
  1203                     </component>
       
  1204                     <component id="classicui_metadata" name="Classic UI Metadata" class="config" introduced="^2" purpose="development" target="desktop">
       
  1205                         <unit mrp="classicui_info/classicui_metadata/classicui_metadata.mrp"/>
       
  1206                     </component>
       
  1207                 </collection>
       
  1208             </package>
       
  1209         </layer>
       
  1210     </systemModel>
       
  1211 </SystemDefinition>"""
       
  1212 
       
  1213 sysdefv3_distributed = """<?xml version="1.0" encoding="UTF-8"?>
       
  1214 <SystemDefinition schema="3.0.0">
       
  1215     <systemModel name="Symbian^3">
       
  1216         <layer id="os" name="OS" levels="hw services">
       
  1217           <package id="kernelhwsrv" level="hw" tech-domain="hb" href="../../../../os/kernelhwsrv/package_definition.xml"/>
       
  1218         </layer>
       
  1219         <layer id="mw" name="Middleware" levels="generic specific">
       
  1220           <package id="classicui" level="generic" tech-domain="ui" href="../../../../mw/classicui/package_definition.xml"/>
       
  1221         </layer>
       
  1222   </systemModel>
       
  1223 </SystemDefinition>"""
       
  1224 
       
  1225 sysdefv3_distributed_invalid_href = """<?xml version="1.0" encoding="UTF-8"?>
       
  1226 <SystemDefinition schema="3.0.0">
       
  1227     <systemModel name="Symbian^3">
       
  1228         <layer id="os" name="OS" levels="hw services">
       
  1229           <package id="kernelhwsrv" level="hw" tech-domain="hb" href="xml"/>
       
  1230         </layer>
       
  1231         <layer id="mw" name="Middleware" levels="generic specific">
       
  1232           <package id="classicui" level="generic" tech-domain="ui" href="../../../../mw/classicui/package_definition.xml"/>
       
  1233         </layer>
       
  1234   </systemModel>
       
  1235 </SystemDefinition>"""
       
  1236 
       
  1237 kernelhwsrv_pkg_def = """<?xml version="1.0" encoding="UTF-8"?>
       
  1238 <SystemDefinition schema="3.0.0">
       
  1239   <package id="kernelhwsrv" name="Kernel and Hardware Services" levels="hw-if adaptation framework test">
       
  1240     <collection id="brdbootldr" name="Board Boot Loader" level="hw-if">
       
  1241       <component id="ubootldr" name="Boot Loader" introduced="9.2" purpose="optional">
       
  1242         <unit mrp="brdbootldr/ubootldr/base_ubootldr.mrp"/>
       
  1243       </component>
       
  1244     </collection>
       
  1245     <collection id="bsptemplate" name="Board Support Package Template" level="hw-if">
       
  1246       <component id="asspandvariant" name="Template ASSP and Variant" introduced="6.0" purpose="development">
       
  1247         <unit bldFile="bsptemplate/asspandvariant/template_variant" mrp="bsptemplate/asspandvariant/base_template.mrp"/>
       
  1248       </component>
       
  1249     </collection>
       
  1250     <collection id="kernel" name="Kernel Architecture" level="adaptation">
       
  1251       <component id="eka" name="Kernel Architecture" introduced="8.0" purpose="mandatory">
       
  1252         <unit bldFile="kernel/eka" mrp="kernel/eka/base_e32.mrp"/>
       
  1253       </component>
       
  1254     </collection>
       
  1255     <collection id="kerneltest" name="Kernel Test" level="hw-if">
       
  1256       <component id="e32utils" name="E32 Utilities" purpose="development">
       
  1257       <unit bldFile="kerneltest/e32utils/group" mrp="kerneltest/e32utils/group/base_e32utils.mrp"/>
       
  1258       </component>
       
  1259       <component id="e32test" name="E32 Tests" purpose="development">
       
  1260         <unit bldFile="kerneltest/e32test/group" mrp="kerneltest/e32test/group/base_e32test.mrp"/>
       
  1261       </component>
       
  1262       <component id="f32test" name="File Server Tests" purpose="development">
       
  1263         <unit bldFile="kerneltest/f32test/group" mrp="kerneltest/f32test/group/base_f32test.mrp"/>
       
  1264       </component>
       
  1265     </collection>
       
  1266     <collection id="ldds" name="Logical Device Drivers" level="adaptation">
       
  1267       <component id="ethernetldd" name="Ethernet Drivers" purpose="optional">
       
  1268         <unit bldFile="kernel/eka/drivers/ethernet" mrp="kernel/eka/drivers/ethernet/base_e32_drivers_ethernet.mrp"/>
       
  1269       </component>
       
  1270       <component id="audioldd" name="Audio Drivers" introduced="8.1b" purpose="optional">     
       
  1271         <unit bldFile="kernel/eka/drivers/soundsc" mrp="kernel/eka/drivers/soundsc/base_e32_drivers_sound.mrp"/>       
       
  1272       </component>
       
  1273       <component id="serialldd" name="Serial Port Drivers" purpose="optional">
       
  1274         <unit bldFile="kernel/eka/drivers/ecomm" mrp="kernel/eka/drivers/ecomm/base_e32_drivers_ecomm.mrp"/>
       
  1275       </component>
       
  1276       <component id="legacydrivers" name="Legacy Drivers" purpose="optional">
       
  1277         <unit mrp="kernel/eka/drivers/adc/base_e32_drivers_adc.mrp"/>
       
  1278       </component>
       
  1279       <component id="locmedia" name="Local Media Subsystem" introduced="8.1b" purpose="mandatory">
       
  1280         <!-- these are LDDs for storage media-->
       
  1281         <unit bldFile="kernel/eka/drivers/locmedia" mrp="kernel/eka/drivers/locmedia/base_e32_drivers_locmedia.mrp"/>
       
  1282       </component>
       
  1283       <component id="runmodedebugger" name="Run Mode Debugger" purpose="mandatory">
       
  1284         <unit bldFile="kernel/eka/drivers/debug/group" mrp="kernel/eka/drivers/debug/group/base_e32_drivers_debug.mrp"/>        
       
  1285       </component>
       
  1286       <component id="btrace" name="Kernel Trace Tool" purpose="mandatory">
       
  1287         <unit bldFile="kernel/eka/drivers/trace" mrp="kernel/eka/drivers/trace/base_e32_drivers_trace.mrp"/>
       
  1288       </component>
       
  1289       <component id="cameraldd" name="Camera Drivers" introduced="^3" purpose="optional">
       
  1290         <unit bldFile="kernel/eka/drivers/camerasc" mrp="kernel/eka/drivers/camerasc/base_drivers_camerasc.mrp"/>
       
  1291       </component>
       
  1292       <component id="displayldd" name="Display Drivers" introduced="^3" purpose="optional">
       
  1293         <!-- owned and maintained by graphics package. To be moved there as soon as technical limitations are resolved -->
       
  1294         <unit bldFile="kernel/eka/drivers/display" mrp="kernel/eka/drivers/display/base_e32_drivers_display.mrp"/>
       
  1295       </component>
       
  1296       <component id="usbclientdrivers" name="USB Client Drivers" introduced="8.1b" purpose="optional">
       
  1297         <!-- owned and maintained by usb package. To be moved there as soon as technical limitations are resolved -->
       
  1298         <unit bldFile="kernel/eka/drivers/usbc" mrp="kernel/eka/drivers/usbc/base_e32_drivers_usbcli.mrp"/>
       
  1299       </component>
       
  1300     </collection>
       
  1301     <collection id="driversupport" name="Generic Driver Support" level="hw-if">
       
  1302       <component id="mediadrivers" name="Media Drivers" purpose="optional">
       
  1303         <!-- these are for storage media-->
       
  1304         <unit bldFile="kernel/eka/drivers/media" mrp="kernel/eka/drivers/media/base_e32_drivers_media.mrp"/>
       
  1305       </component>
       
  1306       <component id="genericboardsupport" name="Generic Board Support" purpose="optional">
       
  1307         <unit bldFile="kernel/eka/drivers/bsp" mrp="kernel/eka/drivers/bsp/base_e32_drivers_bsp.mrp"/>
       
  1308       </component>
       
  1309     </collection>
       
  1310     <collection id="userlibandfileserver" name="User Library and File Server" level="framework">
       
  1311       <component id="euser" name="User Library" purpose="mandatory">
       
  1312         <unit bldFile="kernel/eka/euser" mrp="kernel/eka/euser/base_e32_euser.mrp"/>
       
  1313       </component>
       
  1314       <component id="compsupp" name="Compiler Runtime Support" filter="gt" purpose="mandatory">
       
  1315         <unit bldFile="kernel/eka/compsupp" mrp="kernel/eka/compsupp/base_e32_compsupp.mrp"/>
       
  1316       </component>
       
  1317       <component id="fileserver" name="File Server" filter="gt" purpose="mandatory">
       
  1318         <unit bldFile="userlibandfileserver/fileserver/group" mrp="userlibandfileserver/fileserver/group/base_f32.mrp"/>
       
  1319       </component>
       
  1320       <component id="estart" name="Base Starter" filter="gt" purpose="optional">
       
  1321         <unit bldFile="userlibandfileserver/fileserver/estart" mrp="userlibandfileserver/fileserver/estart/base_f32_estart.mrp"/>
       
  1322       </component>
       
  1323       <component id="domainmgr" name="Domain Manager" introduced="8.1b" purpose="mandatory">
       
  1324         <unit bldFile="userlibandfileserver/domainmgr/group" mrp="userlibandfileserver/domainmgr/group/base_domain.mrp"/>
       
  1325       </component>
       
  1326     </collection>
       
  1327     <collection id="filesystems" name="File Systems" level="framework">
       
  1328       <component id="romfs" name="ROM File System" filter="gt" purpose="optional" class="plugin">
       
  1329         <unit mrp="userlibandfileserver/fileserver/srom/base_f32_srom.mrp"/>
       
  1330       </component>
       
  1331       <component id="rofs" name="ROFS" filter="gt" purpose="optional" class="plugin">
       
  1332         <unit bldFile="userlibandfileserver/fileserver/srofs" mrp="userlibandfileserver/fileserver/srofs/base_f32_srofs.mrp"/>
       
  1333       </component>
       
  1334       <component id="usbmsfs" name="USB Mass Storage File System" filter="gt" purpose="optional" class="plugin">
       
  1335         <unit bldFile="userlibandfileserver/fileserver/smassstorage" mrp="userlibandfileserver/fileserver/smassstorage/base_f32_smassstorage.mrp"/>
       
  1336       </component>
       
  1337       <component id="usbhostmssrv" name="USB Host Mass Storage Server" filter="gt" introduced="^3" purpose="optional" class="plugin">
       
  1338         <unit bldFile="userlibandfileserver/fileserver/shostmassstorage" mrp="userlibandfileserver/fileserver/shostmassstorage/base_f32_shostmassstorage.mrp"/>
       
  1339       </component>
       
  1340       <component id="fat32fs" name="FAT32 File System" filter="gt" purpose="optional" class="plugin">
       
  1341         <unit bldFile="userlibandfileserver/fileserver/sfat32" mrp="userlibandfileserver/fileserver/sfat32/base_f32_sfat32.mrp"/>
       
  1342       </component>
       
  1343       <component id="fatfs" name="FAT File System" filter="gt" purpose="optional" class="plugin">
       
  1344         <unit bldFile="userlibandfileserver/fileserver/sfat" mrp="userlibandfileserver/fileserver/sfat/base_f32_sfat.mrp"/>
       
  1345       </component>
       
  1346       <component id="compfs" name="Composite File System" filter="gt" purpose="optional" class="plugin">
       
  1347         <unit bldFile="userlibandfileserver/fileserver/scomp" mrp="userlibandfileserver/fileserver/scomp/base_f32_scomp.mrp"/>
       
  1348       </component>
       
  1349     </collection>
       
  1350     <collection id="halservices" name="HAL Services" level="framework">
       
  1351       <component id="hal" name="User-Side Hardware Abstraction" introduced="6.0" purpose="optional">
       
  1352         <unit bldFile="halservices/hal" mrp="halservices/hal/base_hal.mrp"/>
       
  1353       </component>
       
  1354     </collection>
       
  1355     <collection id="textmodeshell" name="Text Mode Shell" level="test">
       
  1356       <component id="e32wsrv" name="Text Window Server" purpose="optional">
       
  1357         <unit bldFile="kernel/eka/ewsrv" mrp="kernel/eka/ewsrv/base_e32_ewsrv.mrp"/>
       
  1358       </component>
       
  1359       <component id="textshell" name="Text Shell" filter="gt" purpose="development">
       
  1360         <unit bldFile="userlibandfileserver/fileserver/etshell" mrp="userlibandfileserver/fileserver/etshell/base_f32_eshell.mrp"/>
       
  1361       </component>
       
  1362     </collection>
       
  1363     <collection id="baseapitest" name="Base API Tests" level="test">
       
  1364       <component id="basesvs" name="Base Verification Suite" introduced="^2" purpose="development" filter="test">
       
  1365         <unit mrp="baseapitest/basesvs/group/basesvs.mrp" bldFile="baseapitest/basesvs/group"/>
       
  1366       </component>
       
  1367     </collection>
       
  1368     <collection id="kernelhwsrv_info" name="Kernel and Hardware Services Info" level="test">
       
  1369       <component id="kernelhwsrv_metadata" name="Kernel and Hardware Services Metadata" class="config" introduced="^2" purpose="development" target="desktop">
       
  1370         <unit mrp="kernelhwsrv_info/kernelhwsrv_metadata/kernelhwsrv_metadata.mrp"/>
       
  1371       </component>
       
  1372     </collection>
       
  1373   </package>
       
  1374 </SystemDefinition>"""
       
  1375 
       
  1376 classicui_pkg_def = """<?xml version="1.0" encoding="UTF-8"?>
       
  1377 <SystemDefinition schema="3.0.0">
       
  1378   <package id="classicui" name="Classic UI" levels="base support server generic specific">
       
  1379     <collection id="psln" name="Personalization" level="specific">
       
  1380       <component id="pslnengine" filter="s60" name="Personalization Engine">
       
  1381         <!-- <unit bldFile="psln/pslnengine/group"/> -->
       
  1382       </component>
       
  1383       <component id="pslnframework" filter="s60" name="Personalization Framework">
       
  1384         <!-- <unit bldFile="psln/pslnframework"/> -->
       
  1385       </component>
       
  1386       <component id="pslnlibraryloaders" filter="s60" name="Personalization Library Loaders">
       
  1387           <!-- no bld.inf, need to create one or remove component -->
       
  1388       </component>
       
  1389       <component id="pslnslidesetdialog" filter="s60" name="Personalization Slideset Dialog" class="plugin">
       
  1390         <!-- <unit bldFile="psln/pslnslidesetdialog/group"/> -->
       
  1391       </component>
       
  1392       <component id="pslngsplugin" filter="s60" name="Personalization GS Plugin" class="plugin">
       
  1393         <unit bldFile="psln/pslngsplugin/Group"/>
       
  1394       </component>
       
  1395       <component id="psln_help" filter="s60" name="Personalization Help">
       
  1396         <unit bldFile="psln/help/group"/>
       
  1397       </component>
       
  1398       <component id="psln_build" filter="s60" name="Personalization Build">
       
  1399              <!-- the Psln group bld.inf should be distributed into the individual components, or they should be collapsed in a single component -->
       
  1400         <unit bldFile="psln/group"/>
       
  1401       </component>
       
  1402     </collection>
       
  1403     <collection id="applicationinterworkingfw" name="Application Interworking Framework" level="generic">
       
  1404       <component id="aifwservicehandler" filter="s60" name="Application Interworking Service Handle">
       
  1405         <unit bldFile="applicationinterworkingfw/servicehandler/group"/>
       
  1406       </component>
       
  1407     </collection>
       
  1408     <collection id="commonuis" name="Common UIs" level="specific">
       
  1409       <component id="commonui" filter="s60" name="Common UI">
       
  1410         <unit bldFile="commonuis/commonui/group"/>
       
  1411       </component>
       
  1412       <component id="commondialogs" filter="s60" name="Common Dialogs">
       
  1413         <unit bldFile="commonuis/commondialogs/group"/>
       
  1414         <!-- <unit bldFile="commonuis/commondialogs/group_test"/> -->
       
  1415       </component>
       
  1416     </collection>
       
  1417     <collection id="uifw" name="UI Framework" level="server">
       
  1418       <component id="uiklaf" filter="s60" name="Uikon Look-and-Feel">
       
  1419         <unit bldFile=""/>
       
  1420       </component>
       
  1421       <component id="eikctl" filter="s60" name="Eikon Controls">
       
  1422         <unit bldFile="uifw/eikctl/group"/>
       
  1423       </component>
       
  1424       <component id="avkon" filter="s60" name="Avkon">
       
  1425         <unit bldFile="uifw/avkon/aknphysics/group"/>
       
  1426         <unit bldFile="uifw/avkon/group"/>
       
  1427         <unit bldFile="uifw/avkon/odeconf/group"/>
       
  1428         <!-- <unit bldFile="uifw/avkon/aknhlist/group"/> -->
       
  1429         <!-- <unit bldFile="uifw/avkon/aknkeyrotator/group"/> -->
       
  1430         <!-- <unit bldFile="uifw/avkon/prebuilder"/> -->
       
  1431         <!-- <unit bldFile="uifw/avkon/tsrc/bc/s60_sdkmcl/bctestmixmcl/group"/> -->
       
  1432       </component>
       
  1433       <component id="eikstd" filter="s60" name="Eikon Standard">
       
  1434         <unit bldFile="uifw/eikstd/group"/>
       
  1435       </component>
       
  1436       <component id="aknglobalui" filter="s60" name="Avkon Global UI">
       
  1437         <unit bldFile="uifw/aknglobalui/group"/>
       
  1438       </component>
       
  1439       <component id="ganes" filter="s60" name="Ganes">
       
  1440         <unit bldFile="uifw/ganes/group"/>
       
  1441       </component>
       
  1442       <component id="uifw_test" filter="s60" name="UI Framework Test" purpose="development">
       
  1443         <!-- <unit bldFile="uifw/tsrc/group"/> -->
       
  1444       </component>
       
  1445     </collection>
       
  1446     <collection id="commonadapter" name="Common Adapter" level="support">
       
  1447       <component id="commonadapter_build" filter="s60" name="Common Adapter Build">
       
  1448         <unit bldFile="commonadapter/group"/>
       
  1449       </component>
       
  1450     </collection>
       
  1451     <collection id="ode" name="Open Dynamics Engine" level="support">
       
  1452       <component id="ode_build" filter="s60" name="ODE">
       
  1453         <unit bldFile="ode/group"/>
       
  1454       </component>
       
  1455     </collection>
       
  1456     <collection id="commonuisupport" name="Common UI Support" level="support">
       
  1457       <component id="uikon" name="Uikon" introduced="6.0" purpose="mandatory">
       
  1458         <unit bldFile="commonuisupport/uikon/group" mrp="commonuisupport/uikon/group/app-framework_uikon.mrp"/>
       
  1459       </component>
       
  1460       <component id="errorresolverdata" name="Error Resolver Data" purpose="mandatory">
       
  1461         <unit bldFile="commonuisupport/errorresolverdata/group" mrp="commonuisupport/errorresolverdata/group/app-framework_errorresgt.mrp"/>
       
  1462       </component>
       
  1463       <component id="uilaf" name="UI Look and Feel" introduced="6.0" purpose="mandatory">
       
  1464         <unit bldFile="commonuisupport/uilaf/GROUP" mrp="commonuisupport/uilaf/GROUP/app-framework_uiklafgt.mrp"/>
       
  1465       </component>
       
  1466       <component id="grid" name="Grid" purpose="optional">
       
  1467         <unit bldFile="commonuisupport/grid/group" mrp="commonuisupport/grid/group/app-framework_grid.mrp"/>
       
  1468       </component>
       
  1469       <component id="uifwsdocs" name="UI Frameworks Documentation" purpose="development" class="doc">
       
  1470         <unit mrp="commonuisupport/uifwsdocs/app-framework_documentation.mrp"/>
       
  1471       </component>
       
  1472     </collection>
       
  1473     <collection id="lafagnosticuifoundation" name="Look-and-Feel Agnostic UI Foundation" level="base">
       
  1474       <component id="cone" name="Control Environment" purpose="mandatory">
       
  1475         <unit bldFile="lafagnosticuifoundation/cone/group" mrp="lafagnosticuifoundation/cone/group/app-framework_cone.mrp"/>
       
  1476       </component>
       
  1477       <component id="graphicseffects" name="Graphics Effects" introduced="9.2" purpose="optional">
       
  1478         <unit bldFile="lafagnosticuifoundation/graphicseffects/group" mrp="lafagnosticuifoundation/graphicseffects/group/app-framework_gfxtranseffect.mrp"/>
       
  1479       </component>
       
  1480       <component id="uigraphicsutils" name="UI Graphics Utilities" purpose="mandatory">
       
  1481         <unit bldFile="lafagnosticuifoundation/uigraphicsutils/group" mrp="lafagnosticuifoundation/uigraphicsutils/group/app-framework_egul.mrp"/>
       
  1482       </component>
       
  1483       <component id="clockanim" name="Clock" purpose="optional" class="plugin">
       
  1484         <unit bldFile="lafagnosticuifoundation/clockanim/group" mrp="lafagnosticuifoundation/clockanim/group/app-framework_clock.mrp"/>
       
  1485       </component>
       
  1486       <component id="bmpanimation" name="BMP Animation" introduced="6.0" purpose="optional">
       
  1487         <unit bldFile="/lafagnosticuifoundation/bmpanimation/group" mrp="lafagnosticuifoundation/bmpanimation/group/app-framework_bmpanim.mrp"/>
       
  1488       </component>
       
  1489       <component id="animation" name="Animation" introduced="9.1" purpose="optional">
       
  1490         <unit bldFile="lafagnosticuifoundation/animation/group" mrp="lafagnosticuifoundation/animation/group/app-framework_animation.mrp"/>
       
  1491       </component>
       
  1492     </collection>
       
  1493     <collection id="classicui_info" name="Classic UI Info" level="specific">
       
  1494        <!-- the multiple units in the API components need to be resolved -->
       
  1495       <component id="classicui_pub" filter="s60" name="Classic UI Public Interfaces" class="api">
       
  1496         <unit bldFile="classicui_pub/group"/>
       
  1497       </component>
       
  1498       <component id="classicui_plat" filter="s60" name="Classic UI Platform Interfaces" class="api">
       
  1499         <unit bldFile="classicui_plat/group"/>
       
  1500       </component>
       
  1501       <component id="classicui_test" filter="s60" name="Classic UI Tests" purpose="development">
       
  1502         <unit bldFile="classicui_plat/tsrc/group"/>
       
  1503         <unit bldFile="classicui_pub/document_handler_api/tsrc/group"/>
       
  1504         <unit bldFile="classicui_pub/server_application_api/tsrc/group"/>
       
  1505         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/bctesttemplate/group"/> -->
       
  1506         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.0/group"/> -->
       
  1507         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.1/group"/> -->
       
  1508         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk3.2/group"/> -->
       
  1509         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk5.0/bctestpane/group"/> -->
       
  1510         <!-- <unit bldFile="classicui_pub/tsrc/bc/apps/s60_sdk5.0/group"/> -->
       
  1511         <!-- <unit bldFile="classicui_pub/tsrc/bc/group"/> -->
       
  1512         <!-- <unit bldFile="classicui_plat/avkon_testability_api/tsrc/group"/> -->
       
  1513         <!-- <unit bldFile="classicui_plat/extended_sounds_api/tsrc/group"/> -->
       
  1514         <unit bldFile="classicui_plat/ganes_api/tsrc/group"/>
       
  1515         <unit bldFile="classicui_plat/physics_api/tsrc/group"/>
       
  1516       </component>
       
  1517       <component id="classicui_metadata" name="Classic UI Metadata" class="config" introduced="^2" purpose="development" target="desktop">
       
  1518         <unit mrp="classicui_info/classicui_metadata/classicui_metadata.mrp"/>
       
  1519       </component>
       
  1520     </collection>
       
  1521   </package>
       
  1522 </SystemDefinition>"""