diff -r df89378e9223 -r 7b7f0409fc00 sbsv2/raptor/python/raptor_xml.py --- a/sbsv2/raptor/python/raptor_xml.py Tue Nov 30 13:59:58 2010 +0800 +++ b/sbsv2/raptor/python/raptor_xml.py Tue Nov 30 14:05:41 2010 +0800 @@ -173,10 +173,19 @@ class SystemModel(object): """A representation of the SystemModel section of a Symbian system_definition.xml file.""" - def __init__(self, aLogger, aSystemDefinitionFile, aSystemDefinitionBase): + def __init__(self, aLogger, aSystemDefinitionFile = None, aSystemDefinitionBase = None, aDoRead = True): self.__Logger = aLogger - self.__SystemDefinitionFile = aSystemDefinitionFile.GetLocalString() - self.__SystemDefinitionBase = aSystemDefinitionBase.GetLocalString() + + if aSystemDefinitionFile: + self.__SystemDefinitionFile = aSystemDefinitionFile.GetLocalString() + else: + self.__SystemDefinitionFile = generic_path.Path('undefined').GetLocalString() + + if aSystemDefinitionBase: + self.__SystemDefinitionBase = aSystemDefinitionBase.GetLocalString() + else: + self.__SystemDefinitionBase = generic_path.Path('undefined').GetLocalString() + self.__Version = {'MAJOR':0,'MID':0,'MINOR':0} self.__IdAttribute = "name" self.__ComponentRoot = "" @@ -188,12 +197,13 @@ self.__DOM = None self.__SystemDefinitionElement = None - if self.__Read(): - if self.__Validate(): - self.__Parse() + if aDoRead: + if self.__Read(): + if self.__Validate(): + self.__Parse() - if self.__DOM: - self.__DOM.unlink() + if self.__DOM: + self.__DOM.unlink() def HasLayer(self, aLayer): return aLayer in self.__LayerList @@ -201,6 +211,24 @@ def GetLayerNames(self): return self.__LayerList + def AddComponent(self, aComponent): + '''Add a dummy component, sufficient for the purposes of + writing a new system definition file. Argument is a Raptor + Component object. + ''' + layername = aComponent.layername + if layername == '': + raise Exception("Can't add a component ("+str(aComponent.bldinf_filename)+") without a layer name to a system defintion file") + containers = {'layer':layername,'component':aComponent.componentname} + component = SystemModelComponent(aComponent.bldinf_filename, layername, containers, self.__SystemDefinitionFile, self.__SystemDefinitionBase, self.__Version) + + if not layername in self.__LayerList: + self.__LayerList.append(layername) + + if not self.__LayerDetails.has_key(layername): + self.__LayerDetails[layername] = [] + self.__LayerDetails[layername].append(component) + def GetLayerComponents(self, aLayer): if not self.HasLayer(aLayer): self.__Logger.Error("System Definition layer \"%s\" does not exist in %s", aLayer, self.__SystemDefinitionFile) @@ -226,7 +254,6 @@ components.extend(self.GetLayerComponents(layer)) return components - def DumpLayerInfo(self, aLayer): if self.HasLayer(aLayer): self.__Logger.Info("Found %d bld.inf references in layer \"%s\"", len(self.GetLayerComponents(aLayer)), aLayer) @@ -238,6 +265,45 @@ count = len(self.GetLayerNames())) self.__Logger.InfoDiscovery(object_type = "bld.inf references", count = len(self.GetAllComponents())) + + def Write(self, aFilename): + """Write out a system definition that can be used to create an + identical SystemModel object. + Note it isn't guaranteed to be a valid system definition - just one + that will unserialise to an object identical to this one + """ + impl = xml.dom.minidom.getDOMImplementation() + self.__DOM = impl.createDocument(None, "SystemDefinition", None) + self.__SystemDefinitionElement = self.__DOM.documentElement + self.__DOM.insertBefore(self.__DOM.createComment('This document is generated by Raptor. Please do not edit.'),self.__SystemDefinitionElement) + self.__SystemDefinitionElement.setAttribute('name','MCL') + self.__SystemDefinitionElement.setAttribute('schema','2.0.0') + systemModelNode = self.__DOM.createElement('systemModel') + self.__SystemDefinitionElement.appendChild(systemModelNode) + for layer in self.__LayerList: + if len(self.__LayerDetails[layer]) == 0: + continue + if layer == '': + self.__Logger.Error("Can't write out layer with no name to "+aFilename) + else: + layerNode = self.__DOM.createElement('layer') + layerNode.setAttribute('name',layer) + systemModelNode.appendChild(layerNode) + for component in self.__LayerDetails[layer]: + componentNode = self.__DOM.createElement('component') + componentNode.setAttribute('name',component.GetContainerName('component')) + layerNode.appendChild(componentNode) + path = str(component) + unitNode = self.__DOM.createElement('unit') + unitNode.setAttribute('bldFile',path) + componentNode.appendChild(unitNode) + + # Record that we haven't stripped the file names off our bld.infs + self.__SystemDefinitionElement.setAttribute('fullbldinfs','True') + + self.__DOM.writexml(open(aFilename,"w"),newl="\n",indent="",addindent="\t") + + self.__DOM.unlink() def __Read(self): if not os.path.exists(self.__SystemDefinitionFile): @@ -273,6 +339,12 @@ self.__Version['MID'] = int(version.group('MID')) self.__Version['MINOR'] = int(version.group('MINOR')) + self.__fullbldinfs = None + if self.__SystemDefinitionElement.hasAttribute('fullbldinfs'): + # Lower case it since we're not evil + if self.__SystemDefinitionElement.getAttribute('fullbldinfs').lower() == 'true': + self.__fullbldinfs = 1 + if self.__Version['MAJOR'] == 1 and self.__Version['MID'] > 2: self.__ComponentRoot = self.__SystemDefinitionBase elif self.__Version['MAJOR'] == 2 or self.__Version['MAJOR'] == 3: @@ -382,27 +454,31 @@ self.__Logger.Error("Cannot resolve \'root\' attribute value \"%s\" in %s", rootValue, self.__SystemDefinitionFile) return - group = generic_path.Path(bldFileValue) + bldinfval = generic_path.Path(bldFileValue) if self.__Version['MAJOR'] < 3: # absolute paths are not changed by root var in 1.x and 2.x - if not group.isAbsolute() and bldInfRoot: - group = generic_path.Join(bldInfRoot, group) + if not bldinfval.isAbsolute() and bldInfRoot: + bldinfval = generic_path.Join(bldInfRoot, bldinfval) else: # relative paths for v3 - if not group.isAbsolute(): - group = generic_path.Join(generic_path.Join(self.__SystemDefinitionFile).Dir(),group) + if not bldinfval.isAbsolute(): + bldinfval = generic_path.Join(generic_path.Join(self.__SystemDefinitionFile).Dir(),bldinfval) # absolute paths for v3 # are relative to bldInfRoot if set, or relative to the drive root otherwise elif bldInfRoot: - group = generic_path.Join(bldInfRoot, group) - - bldinf = generic_path.Join(group, "bld.inf").FindCaseless() + bldinfval = generic_path.Join(bldInfRoot, bldinfval) + + if self.__fullbldinfs: + bldinf = bldinfval.FindCaseless() + else: + bldinf = generic_path.Join(bldinfval, "bld.inf").FindCaseless() if bldinf == None: # recording layers containing non existent bld.infs - bldinfname = group.GetLocalString() - bldinfname = bldinfname+'/'+'bld.inf' + bldinfname = bldinfval.GetLocalString() + if not self.__fullbldinfs: + bldinfname = bldinfname+'/'+'bld.inf' layer = self.__GetEffectiveLayer(aElement) if not layer in self.__MissingBldInfs: self.__MissingBldInfs[layer]=[]