+## Split each lines in file\r
+#\r
+# This method is used to split the lines in file to make the length of each line \r
+# less than MaxLength.\r
+#\r
+# @param Content The content of file\r
+# @param MaxLength The Max Length of the line\r
+#\r
+def FileLinesSplit(Content=None, MaxLength=None):\r
+ ContentList = Content.split(TAB_LINE_BREAK)\r
+ NewContent = ''\r
+ NewContentList = []\r
+ for Line in ContentList:\r
+ while len(Line.rstrip()) > MaxLength:\r
+ LineSpaceIndex = Line.rfind(TAB_SPACE_SPLIT, 0, MaxLength)\r
+ LineSlashIndex = Line.rfind(TAB_SLASH, 0, MaxLength)\r
+ LineBackSlashIndex = Line.rfind(TAB_BACK_SLASH, 0, MaxLength)\r
+ if max(LineSpaceIndex, LineSlashIndex, LineBackSlashIndex) > 0:\r
+ LineBreakIndex = max(LineSpaceIndex, LineSlashIndex, LineBackSlashIndex)\r
+ else:\r
+ LineBreakIndex = MaxLength\r
+ NewContentList.append(Line[:LineBreakIndex])\r
+ Line = Line[LineBreakIndex:]\r
+ if Line:\r
+ NewContentList.append(Line)\r
+ for NewLine in NewContentList:\r
+ NewContent += NewLine + TAB_LINE_BREAK\r
+ \r
+ NewContent = NewContent.replace(TAB_LINE_BREAK, gEndOfLine).replace('\r\r\n', gEndOfLine)\r
+ return NewContent\r
+ \r
+ \r
+ \r
+##\r
+# Parse binary dependency expression section\r
+#\r
+# This utility class parses the dependency expression section and translate the readable\r
+# GUID name and value.\r
+#\r
+class DepexParser(object):\r
+ ##\r
+ # Constructor function for class DepexParser\r
+ #\r
+ # This constructor function collect GUID values so that the readable\r
+ # GUID name can be translated.\r
+ #\r
+ # @param self The object pointer\r
+ # @param Wa Workspace context information\r
+ #\r
+ def __init__(self, Wa):\r
+ self._GuidDb = {}\r
+ for Pa in Wa.AutoGenObjectList:\r
+ for Package in Pa.PackageList:\r
+ for Protocol in Package.Protocols:\r
+ GuidValue = GuidStructureStringToGuidString(Package.Protocols[Protocol])\r
+ self._GuidDb[GuidValue.upper()] = Protocol\r
+ for Ppi in Package.Ppis:\r
+ GuidValue = GuidStructureStringToGuidString(Package.Ppis[Ppi])\r
+ self._GuidDb[GuidValue.upper()] = Ppi\r
+ for Guid in Package.Guids:\r
+ GuidValue = GuidStructureStringToGuidString(Package.Guids[Guid])\r
+ self._GuidDb[GuidValue.upper()] = Guid\r
+ \r
+ ##\r
+ # Parse the binary dependency expression files.\r
+ # \r
+ # This function parses the binary dependency expression file and translate it\r
+ # to the instruction list.\r
+ #\r
+ # @param self The object pointer\r
+ # @param DepexFileName The file name of binary dependency expression file.\r
+ #\r
+ def ParseDepexFile(self, DepexFileName):\r
+ DepexFile = open(DepexFileName, "rb")\r
+ DepexStatement = []\r
+ OpCode = DepexFile.read(1)\r
+ while OpCode:\r
+ Statement = gOpCodeList[struct.unpack("B", OpCode)[0]]\r
+ if Statement in ["BEFORE", "AFTER", "PUSH"]:\r
+ GuidValue = "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X" % \\r
+ struct.unpack("=LHHBBBBBBBB", DepexFile.read(16))\r
+ GuidString = self._GuidDb.get(GuidValue, GuidValue)\r
+ Statement = "%s %s" % (Statement, GuidString)\r
+ DepexStatement.append(Statement)\r
+ OpCode = DepexFile.read(1)\r
+\r
+ return DepexStatement\r
+ \r