git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2171 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/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
 |