diff options
Diffstat (limited to 'Tools/Python/EdkIIWorkspace.py')
-rw-r--r-- | Tools/Python/EdkIIWorkspace.py | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Tools/Python/EdkIIWorkspace.py b/Tools/Python/EdkIIWorkspace.py new file mode 100644 index 0000000000..935ffadc09 --- /dev/null +++ b/Tools/Python/EdkIIWorkspace.py @@ -0,0 +1,148 @@ +#!/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 |