#!/usr/bin/env python # This is the base class for applications that operate on an EDK II Workspace import os, sys from XmlRoutines import * class EdkIIWorkspace: def __init__(self): """Collect WorkspaceDir from the environment, the Verbose command line flag, and detect an icon bitmap file.""" if os.environ.get('WORKSPACE') == None: print 'ERROR: WORKSPACE not defined. Please run EdkSetup from the EDK II install directory.' return False self.WorkspaceDir = os.path.realpath(os.environ.get('WORKSPACE')) (Drive, Path) = os.path.splitdrive(self.WorkspaceDir) if Drive == '': (Drive, CwdPath) = os.path.splitdrive(os.getcwd()) if Drive != '': self.WorkspaceDir = Drive + Path else: self.WorkspaceDir = Drive.upper() + Path try: self.Icon = wx.Icon(self.WorkspaceFile('tools/Python/TianoCoreOrgLogo.gif'),wx.BITMAP_TYPE_GIF) except: self.Icon = None self.Verbose = False for arg in sys.argv: if arg.lower() == '-v': self.Verbose = True return True def WorkspaceRelativePath(self, FileName): """Convert a full path filename to a workspace relative filename.""" FileName = os.path.realpath(FileName) if FileName.find(self.WorkspaceDir) != 0: return '' return FileName.replace (self.WorkspaceDir, '').strip('\\').strip('/') def WorkspaceFile(self, FileName): """Convert a workspace relative filename to a full path filename.""" return os.path.realpath(os.path.join(self.WorkspaceDir,FileName)) def XmlParseFile (self, FileName): """Parse an XML file into a DOM and return the DOM.""" if self.Verbose: print FileName return XmlParseFile (self.WorkspaceFile(FileName)) def XmlParseFileSection (self, FileName, SectionTag): """Parse a section of an XML file into a DOM(Document Object Model) and return the DOM.""" if self.Verbose: print FileName return XmlParseFileSection (self.WorkspaceFile(FileName), SectionTag) def XmlSaveFile (self, Dom, FileName): """Save a DOM(Document Object Model) into an XML file.""" if self.Verbose: print FileName return XmlSaveFile (Dom, self.WorkspaceFile(FileName)) def ConvertTextFileToDictionary(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter): """Convert a workspace relative text file to a dictionary of (name:value) pairs.""" if self.Verbose: print FileName return ConvertTextFileToDictionary(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter) def ConvertDictionaryToTextFile(self, FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter): """Convert a dictionary of (name:value) pairs to a workspace relative text file.""" if self.Verbose: print FileName return ConvertDictionaryToTextFile(self.WorkspaceFile(FileName), Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter) # # Convert a text file to a dictionary # def ConvertTextFileToDictionary(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter): """Convert a text file to a dictionary of (name:value) pairs.""" try: f = open(FileName,'r') except: return False Keys = [] for Line in f: LineList = Line.split(KeySplitCharacter,1) if len(LineList) >= 2: Key = LineList[0].split() if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] not in Keys: if ValueSplitFlag: Dictionary[Key[0]] = LineList[1].replace('\\','/').split(ValueSplitCharacter) else: Dictionary[Key[0]] = LineList[1].strip().replace('\\','/') Keys += [Key[0]] f.close() return True def ConvertDictionaryToTextFile(FileName, Dictionary, CommentCharacter, KeySplitCharacter, ValueSplitFlag, ValueSplitCharacter): """Convert a dictionary of (name:value) pairs to a text file.""" try: f = open(FileName,'r') Lines = [] Lines = f.readlines() f.close() except: Lines = [] Keys = Dictionary.keys() MaxLength = 0 for Key in Keys: if len(Key) > MaxLength: MaxLength = len(Key) Index = 0 for Line in Lines: LineList = Line.split(KeySplitCharacter,1) if len(LineList) >= 2: Key = LineList[0].split() if len(Key) == 1 and Key[0][0] != CommentCharacter and Key[0] in Dictionary: if ValueSplitFlag: Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, ' '.join(Dictionary[Key[0]])) else: Line = '%-*s %c %s\n' % (MaxLength, Key[0], KeySplitCharacter, Dictionary[Key[0]]) Lines.pop(Index) if Key[0] in Keys: Lines.insert(Index,Line) Keys.remove(Key[0]) Index += 1 for RemainingKey in Keys: if ValueSplitFlag: Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter,' '.join(Dictionary[RemainingKey])) else: Line = '%-*s %c %s\n' % (MaxLength, RemainingKey, KeySplitCharacter, Dictionary[RemainingKey]) Lines.append(Line) try: f = open(FileName,'w') except: return False f.writelines(Lines) f.close() return True # This acts like the main() function for the script, unless it is 'import'ed into another # script. if __name__ == '__main__': # Nothing to do here. Could do some unit tests. pass