summaryrefslogtreecommitdiff
path: root/Tools/Python/EdkIIWorkspace.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Python/EdkIIWorkspace.py')
-rw-r--r--Tools/Python/EdkIIWorkspace.py148
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