]> git.proxmox.com Git - mirror_edk2.git/commitdiff
This patch is going to:
authorHess Chen <hesheng.chen@intel.com>
Tue, 26 Aug 2014 05:58:02 +0000 (05:58 +0000)
committerhchen30 <hchen30@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 26 Aug 2014 05:58:02 +0000 (05:58 +0000)
1. Add a recovery mode for UPT failure
2. Add UNI file support
3. Add binary file header support
4. Add support for PCD error message
5. Add support for replace
6. Format generated INF/DEC files
7. Update dependency check
8. Other minor fixes

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hess Chen <hesheng.chen@intel.com>
Reviewed-by: Gao, Liming <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15896 6f19259b-4bc3-4df7-8a09-765794883524

56 files changed:
BaseTools/Source/Python/UPT/Core/DependencyRules.py
BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py
BaseTools/Source/Python/UPT/Core/FileHook.py [new file with mode: 0644]
BaseTools/Source/Python/UPT/Core/IpiDb.py
BaseTools/Source/Python/UPT/Core/PackageFile.py
BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py
BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
BaseTools/Source/Python/UPT/InstallPkg.py
BaseTools/Source/Python/UPT/InventoryWs.py [new file with mode: 0644]
BaseTools/Source/Python/UPT/Library/CommentGenerating.py
BaseTools/Source/Python/UPT/Library/CommentParsing.py
BaseTools/Source/Python/UPT/Library/DataType.py
BaseTools/Source/Python/UPT/Library/ExpressionValidate.py
BaseTools/Source/Python/UPT/Library/GlobalData.py
BaseTools/Source/Python/UPT/Library/Misc.py
BaseTools/Source/Python/UPT/Library/ParserValidate.py
BaseTools/Source/Python/UPT/Library/Parsing.py
BaseTools/Source/Python/UPT/Library/String.py
BaseTools/Source/Python/UPT/Library/UniClassObject.py [new file with mode: 0644]
BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py
BaseTools/Source/Python/UPT/Logger/StringTable.py
BaseTools/Source/Python/UPT/MkPkg.py
BaseTools/Source/Python/UPT/Object/POM/CommonObject.py
BaseTools/Source/Python/UPT/Object/POM/ModuleObject.py
BaseTools/Source/Python/UPT/Object/POM/PackageObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfBuildOptionObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py
BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py
BaseTools/Source/Python/UPT/Parser/DecParser.py
BaseTools/Source/Python/UPT/Parser/DecParserMisc.py
BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
BaseTools/Source/Python/UPT/Parser/InfBinarySectionParser.py
BaseTools/Source/Python/UPT/Parser/InfLibrarySectionParser.py
BaseTools/Source/Python/UPT/Parser/InfParser.py
BaseTools/Source/Python/UPT/Parser/InfParserMisc.py
BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py
BaseTools/Source/Python/UPT/Parser/InfSectionParser.py
BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignmentMisc.py
BaseTools/Source/Python/UPT/ReplacePkg.py [new file with mode: 0644]
BaseTools/Source/Python/UPT/RmPkg.py
BaseTools/Source/Python/UPT/UPT.py
BaseTools/Source/Python/UPT/UnitTest/CommentGeneratingUnitTest.py
BaseTools/Source/Python/UPT/UnitTest/CommentParsingUnitTest.py
BaseTools/Source/Python/UPT/Xml/CommonXml.py
BaseTools/Source/Python/UPT/Xml/IniToXml.py
BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
BaseTools/Source/Python/UPT/Xml/PackageSurfaceAreaXml.py
BaseTools/Source/Python/UPT/Xml/PcdXml.py
BaseTools/Source/Python/UPT/Xml/XmlParser.py
BaseTools/Source/Python/UPT/Xml/XmlParserMisc.py

index 752d8e8f41051dd703546b2077b6fd4634ea5bb6..4608ed60303b842e4334463492e0291302d84f70 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is for installed package information database operations\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -20,14 +20,14 @@ Dependency
 ##\r
 # Import Modules\r
 #\r
-from os import getenv\r
-from os import environ\r
 from os.path import dirname\r
 \r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Library.Parsing import GetWorkspacePackage\r
 from Library.Parsing import GetWorkspaceModule\r
+from Library.Misc import GetRelativePath\r
+from Library import GlobalData\r
 from PomAdapter.InfPomAlignment import InfPomAlignment\r
 from Logger.ToolError import FatalError\r
 from Logger.ToolError import EDK1_INF_ERROR\r
@@ -36,11 +36,9 @@ from Logger.ToolError import UNKNOWN_ERROR
 DEPEX_CHECK_PACKAGE_NOT_FOUND, DEPEX_CHECK_DP_NOT_FOUND) = (0, 1, 2, 3)\r
 \r
 \r
-## IpiDb\r
+## DependencyRules\r
 #\r
-# This class represents the installed package information database\r
-# Add/Remove/Get installed distribution package information here.\r
-# \r
+# This class represents the dependency rule check mechanism\r
 # \r
 # @param object:      Inherited from object class\r
 #\r
@@ -49,15 +47,17 @@ class DependencyRules(object):
         self.IpiDb = Datab\r
         self.WsPkgList = GetWorkspacePackage()\r
         self.WsModuleList = GetWorkspaceModule()\r
-\r
-    ## Check whether a module exists in current workspace.\r
+        self.PkgsToBeDepend = []\r
+        \r
+    ## Check whether a module exists by checking the Guid+Version+Name+Path combination\r
     #\r
     # @param Guid:  Guid of a module\r
     # @param Version: Version of a module\r
+    # @param Name: Name of a module\r
+    # @param Path: Path of a module\r
+    # @return:  True if module existed, else False\r
     #\r
-    def CheckModuleExists(self, Guid, Version, Name, Path, ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        if ReturnCode:\r
-            pass\r
+    def CheckModuleExists(self, Guid, Version, Name, Path):\r
         Logger.Verbose(ST.MSG_CHECK_MODULE_EXIST)\r
         ModuleList = self.IpiDb.GetModInPackage(Guid, Version, Name, Path)\r
         ModuleList.extend(self.IpiDb.GetStandaloneModule(Guid, Version, Name, Path))\r
@@ -67,15 +67,14 @@ class DependencyRules(object):
         else:\r
             return False\r
         \r
-    ## Check whether a module depex satisfied by current workspace or dist.\r
+    ## Check whether a module depex satisfied.\r
     #\r
     # @param ModuleObj: A module object\r
-    # @param DpObj: A depex object\r
+    # @param DpObj: A distribution object\r
+    # @return: True if module depex satisfied\r
+    #          False else\r
     #\r
-    def CheckModuleDepexSatisfied(self, ModuleObj, DpObj=None, \\r
-                                  ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        if ReturnCode:\r
-            pass\r
+    def CheckModuleDepexSatisfied(self, ModuleObj, DpObj=None):\r
         Logger.Verbose(ST.MSG_CHECK_MODULE_DEPEX_START)\r
         Result = True\r
         Dep = None\r
@@ -114,97 +113,122 @@ class DependencyRules(object):
                                                         Dep.GetVersion()))\r
         return Result\r
             \r
-    ## Check whether a package exists in current workspace.\r
+    ## Check whether a package exists in a package list specified by PkgsToBeDepend.\r
     #\r
     # @param Guid: Guid of a package\r
     # @param Version: Version of a package\r
+    # @return: True if package exist\r
+    #          False else\r
     #\r
     def CheckPackageExists(self, Guid, Version):\r
         Logger.Verbose(ST.MSG_CHECK_PACKAGE_START)\r
-        for (PkgName, PkgGuid, PkgVer, PkgPath) in self.WsPkgList:\r
-            if PkgName or PkgPath:\r
-                pass\r
+        Found = False\r
+        for (PkgGuid, PkgVer) in self.PkgsToBeDepend:\r
             if (PkgGuid == Guid):\r
                 #\r
                 # if version is not empty and not equal, then not match\r
                 #\r
                 if Version and (PkgVer != Version):\r
-                    return False\r
+                    Found = False\r
+                    break\r
                 else:\r
-                    return True\r
+                    Found = True\r
+                    break\r
         else:\r
-            return False\r
-                        \r
+            Found = False\r
+\r
         Logger.Verbose(ST.MSG_CHECK_PACKAGE_FINISH)\r
+        return Found\r
          \r
-    ## Check whether a package depex satisfied by current workspace.\r
+    ## Check whether a package depex satisfied.\r
     #\r
     # @param PkgObj: A package object\r
-    # @param DpObj: A package depex object\r
+    # @param DpObj: A distribution object\r
+    # @return: True if package depex satisified\r
+    #          False else\r
     #\r
-    def CheckPackageDepexSatisfied(self, PkgObj, DpObj=None, \\r
-                                   ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        \r
+    def CheckPackageDepexSatisfied(self, PkgObj, DpObj=None):\r
         ModuleDict = PkgObj.GetModuleDict()\r
         for ModKey in ModuleDict.keys():\r
             ModObj = ModuleDict[ModKey]\r
-            if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):\r
+            if self.CheckModuleDepexSatisfied(ModObj, DpObj):\r
                 continue\r
             else:\r
                 return False\r
         return True\r
         \r
-    ## Check whether a DP exists in current workspace.\r
+    ## Check whether a DP exists.\r
     #\r
-    # @param Guid: Guid of a module\r
-    # @param Version: Version of a module\r
-    #\r
-    def CheckDpExists(self, Guid, Version, ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        if ReturnCode:\r
-            pass\r
+    # @param Guid: Guid of a Distribution\r
+    # @param Version: Version of a Distribution\r
+    # @return: True if Distribution exist\r
+    #          False else\r
+    def CheckDpExists(self, Guid, Version):\r
         Logger.Verbose(ST.MSG_CHECK_DP_START)\r
         DpList = self.IpiDb.GetDp(Guid, Version)\r
         if len(DpList) > 0:\r
-            return True\r
+            Found = True\r
         else:\r
-            return False\r
-            \r
-        Logger.Verbose(ST.MSG_CHECK_DP_FINISH) \r
-        \r
+            Found = False\r
+\r
+        Logger.Verbose(ST.MSG_CHECK_DP_FINISH)\r
+        return Found\r
+\r
+    ## Check whether a DP depex satisfied by current workspace for Install\r
+    #\r
+    # @param DpObj:  A distribution object\r
+    # @return: True if distribution depex satisfied\r
+    #          False else\r
+    #\r
+    def CheckInstallDpDepexSatisfied(self, DpObj):\r
+        self.PkgsToBeDepend = [(PkgInfo[1], PkgInfo[2]) for PkgInfo in self.WsPkgList]\r
+        return self.CheckDpDepexSatisfied(DpObj)\r
+\r
+    ## Check whether a DP depex satisfied by current workspace \r
+    #  (excluding the original distribution's packages to be replaced) for Replace\r
+    #\r
+    # @param DpObj:  A distribution object\r
+    # @param OrigDpGuid: The original distribution's Guid\r
+    # @param OrigDpVersion: The original distribution's Version\r
+    #\r
+    def ReplaceCheckNewDpDepex(self, DpObj, OrigDpGuid, OrigDpVersion):\r
+        self.PkgsToBeDepend = [(PkgInfo[1], PkgInfo[2]) for PkgInfo in self.WsPkgList]\r
+        OrigDpPackageList = self.IpiDb.GetPackageListFromDp(OrigDpGuid, OrigDpVersion)\r
+        for OrigPkgInfo in OrigDpPackageList:\r
+            Guid, Version = OrigPkgInfo[0], OrigPkgInfo[1]\r
+            if (Guid, Version) in self.PkgsToBeDepend:\r
+                self.PkgsToBeDepend.remove((Guid, Version))\r
+        return self.CheckDpDepexSatisfied(DpObj)\r
+\r
     ## Check whether a DP depex satisfied by current workspace.\r
     #\r
-    # @param DpObj:  Depex object\r
-    # @param ReturnCode: ReturnCode\r
+    # @param DpObj:  A distribution object\r
     #\r
-    def CheckDpDepexSatisfied(self, DpObj, ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        \r
+    def CheckDpDepexSatisfied(self, DpObj):\r
         for PkgKey in DpObj.PackageSurfaceArea.keys():\r
             PkgObj = DpObj.PackageSurfaceArea[PkgKey]\r
-            if self.CheckPackageDepexSatisfied(PkgObj, DpObj, ReturnCode):\r
+            if self.CheckPackageDepexSatisfied(PkgObj, DpObj):\r
                 continue\r
             else:\r
                 return False\r
             \r
         for ModKey in DpObj.ModuleSurfaceArea.keys():\r
             ModObj = DpObj.ModuleSurfaceArea[ModKey]\r
-            if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):\r
+            if self.CheckModuleDepexSatisfied(ModObj, DpObj):\r
                 continue\r
             else:\r
                 return False\r
         \r
         return True\r
     \r
-    ## Check whether a DP depex satisfied by current workspace. Return False \r
-    # if Can not remove (there is dependency), True else\r
+    ## Check whether a DP could be removed from current workspace. \r
     #\r
     # @param DpGuid:  File's guid\r
     # @param DpVersion: File's version\r
-    # @param ReturnCode: ReturnCode\r
-    # \r
-    def CheckDpDepexForRemove(self, DpGuid, DpVersion, \\r
-                              ReturnCode=DEPEX_CHECK_SUCCESS):\r
-        if ReturnCode:\r
-            pass\r
+    # @retval Removable: True if distribution could be removed, False Else\r
+    # @retval DependModuleList: the list of modules that make distribution can not be removed\r
+    #\r
+    def CheckDpDepexForRemove(self, DpGuid, DpVersion):\r
         Removable = True\r
         DependModuleList = []\r
         WsModuleList = self.WsModuleList\r
@@ -223,15 +247,14 @@ class DependencyRules(object):
         # List of item (PkgGuid, PkgVersion, InstallPath)\r
         DpPackageList = self.IpiDb.GetPackageListFromDp(DpGuid, DpVersion) \r
         DpPackagePathList = []\r
-        WorkSP = environ["WORKSPACE"]\r
+        WorkSP = GlobalData.gWORKSPACE\r
         for (PkgName, PkgGuid, PkgVersion, DecFile) in self.WsPkgList:\r
             if PkgName:\r
                 pass\r
             DecPath = dirname(DecFile)\r
             if DecPath.find(WorkSP) > -1:\r
-                InstallPath = DecPath[DecPath.find(WorkSP) + len(WorkSP) + 1:]\r
-                DecFileRelaPath = \\r
-                DecFile[DecFile.find(WorkSP) + len(WorkSP) + 1:]\r
+                InstallPath = GetRelativePath(DecPath,WorkSP)\r
+                DecFileRelaPath = GetRelativePath(DecFile,WorkSP)\r
             else:\r
                 InstallPath = DecPath\r
                 DecFileRelaPath = DecFile\r
@@ -251,26 +274,87 @@ class DependencyRules(object):
         # check modules to see if has dependency on package of current DP\r
         #\r
         for Module in WsModuleList:\r
-            if (CheckModuleDependFromInf(Module, DpPackagePathList)):\r
+            if (not VerifyRemoveModuleDep(Module, DpPackagePathList)):\r
                 Removable = False\r
                 DependModuleList.append(Module)\r
         return (Removable, DependModuleList)\r
 \r
 \r
+    ## Check whether a DP could be replaced by a distribution containing NewDpPkgList\r
+    # from current workspace.\r
+    #\r
+    # @param OrigDpGuid:  original Dp's Guid\r
+    # @param OrigDpVersion: original Dp's version\r
+    # @param NewDpPkgList: a list of package information (Guid, Version) in new Dp\r
+    # @retval Replaceable: True if distribution could be replaced, False Else\r
+    # @retval DependModuleList: the list of modules that make distribution can not be replaced\r
+    # \r
+    def CheckDpDepexForReplace(self, OrigDpGuid, OrigDpVersion, NewDpPkgList):\r
+        Replaceable = True\r
+        DependModuleList = []\r
+        WsModuleList = self.WsModuleList\r
+        #\r
+        # remove modules that included in current DP\r
+        # List of item (FilePath)\r
+        DpModuleList = self.IpiDb.GetDpModuleList(OrigDpGuid, OrigDpVersion) \r
+        for Module in DpModuleList:\r
+            if Module in WsModuleList:\r
+                WsModuleList.remove(Module)\r
+            else:\r
+                Logger.Warn("UPT\n",\r
+                            ST.ERR_MODULE_NOT_INSTALLED % Module)\r
+        \r
+        OtherPkgList = NewDpPkgList\r
+        #\r
+        # get packages in current Dp and find the install path\r
+        # List of item (PkgGuid, PkgVersion, InstallPath)\r
+        DpPackageList = self.IpiDb.GetPackageListFromDp(OrigDpGuid, OrigDpVersion) \r
+        DpPackagePathList = []\r
+        WorkSP = GlobalData.gWORKSPACE\r
+        for (PkgName, PkgGuid, PkgVersion, DecFile) in self.WsPkgList:\r
+            if PkgName:\r
+                pass\r
+            DecPath = dirname(DecFile)\r
+            if DecPath.find(WorkSP) > -1:\r
+                InstallPath = GetRelativePath(DecPath,WorkSP)\r
+                DecFileRelaPath = GetRelativePath(DecFile,WorkSP)\r
+            else:\r
+                InstallPath = DecPath\r
+                DecFileRelaPath = DecFile\r
+                \r
+            if (PkgGuid, PkgVersion, InstallPath) in DpPackageList:\r
+                DpPackagePathList.append(DecFileRelaPath)\r
+                DpPackageList.remove((PkgGuid, PkgVersion, InstallPath))\r
+            else:\r
+                OtherPkgList.append((PkgGuid, PkgVersion))\r
+\r
+        #\r
+        # the left items in DpPackageList are the packages that installed but not found anymore\r
+        #\r
+        for (PkgGuid, PkgVersion, InstallPath) in DpPackageList:\r
+            Logger.Warn("UPT",\r
+                        ST.WARN_INSTALLED_PACKAGE_NOT_FOUND%(PkgGuid, PkgVersion, InstallPath))\r
+        \r
+        #\r
+        # check modules to see if it can be satisfied by package not belong to removed DP\r
+        #\r
+        for Module in WsModuleList:\r
+            if (not VerifyReplaceModuleDep(Module, DpPackagePathList, OtherPkgList)):\r
+                Replaceable = False\r
+                DependModuleList.append(Module)\r
+        return (Replaceable, DependModuleList)\r
+\r
+    \r
 ## check whether module depends on packages in DpPackagePathList, return True \r
 # if found, False else\r
 #\r
 # @param Path: a module path\r
 # @param DpPackagePathList: a list of Package Paths\r
+# @retval:  False: module depends on package in DpPackagePathList\r
+#           True:  module doesn't depend on package in DpPackagePathList\r
 #\r
-def CheckModuleDependFromInf(Path, DpPackagePathList):\r
-    \r
-    #  \r
-    # use InfParser to parse inf, then get the information for now,\r
-    # later on, may consider only parse to get the package dependency info \r
-    # (Need to take care how to deal wit Macros)\r
-    #\r
-    WorkSP = getenv('WORKSPACE')\r
+def VerifyRemoveModuleDep(Path, DpPackagePathList):\r
+    WorkSP = GlobalData.gWORKSPACE\r
     \r
     try:\r
         PomAli = InfPomAlignment(Path, WorkSP, Skip=True)\r
@@ -278,16 +362,47 @@ def CheckModuleDependFromInf(Path, DpPackagePathList):
         for Item in PomAli.GetPackageDependencyList():\r
             if Item.GetPackageFilePath() in DpPackagePathList:\r
                 Logger.Info(ST.MSG_MODULE_DEPEND_ON % (Path, Item.GetPackageFilePath()))\r
-                return True\r
+                return False\r
         else:\r
-            return False\r
+            return True\r
     except FatalError, ErrCode:\r
         if ErrCode.message == EDK1_INF_ERROR:\r
             Logger.Warn("UPT",\r
                         ST.WRN_EDK1_INF_FOUND%Path)\r
-            return False\r
+            return True\r
         else:\r
-            return False\r
-        \r
+            return True\r
+\r
+## check whether module depends on packages in DpPackagePathList and can not be satisfied by OtherPkgList\r
+#\r
+# @param Path: a module path\r
+# @param DpPackagePathList:  a list of Package Paths\r
+# @param OtherPkgList:       a list of Package Information (Guid, Version)\r
+# @retval:  False: module depends on package in DpPackagePathList and can not be satisfied by OtherPkgList\r
+#           True:  either module doesn't depend on DpPackagePathList or module depends on DpPackagePathList \r
+#                 but can be satisfied by OtherPkgList\r
+#\r
+def VerifyReplaceModuleDep(Path, DpPackagePathList, OtherPkgList):\r
+    WorkSP = GlobalData.gWORKSPACE\r
+    \r
+    try:\r
+        PomAli = InfPomAlignment(Path, WorkSP, Skip=True)\r
+\r
+        for Item in PomAli.GetPackageDependencyList():\r
+            if Item.GetPackageFilePath() in DpPackagePathList:\r
+                Guid, Version = Item.GetGuid(), Item.GetVersion()\r
+                if (Guid, Version) not in OtherPkgList:\r
+                    Logger.Info(ST.MSG_MODULE_DEPEND_ON % (Path, Item.GetPackageFilePath()))\r
+                    return False\r
+        else:\r
+            return True\r
+    except FatalError, ErrCode:\r
+        if ErrCode.message == EDK1_INF_ERROR:\r
+            Logger.Warn("UPT",\r
+                        ST.WRN_EDK1_INF_FOUND%Path)\r
+            return True\r
+        else:\r
+            return True\r
+   \r
 \r
 \r
index 8ac8d4ed5255253ef9415f0a6cc99ba74646bb9a..6db13b06b69bac2b23fb7f1e0810afb943556550 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define a class object to describe a distribution package\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -195,6 +195,7 @@ class DistributionPackageClass(object):
     #\r
     def GetDistributionFileList(self):\r
         MetaDataFileList = []\r
+        SkipModulesUniList = []\r
         \r
         for Guid, Version, Path in self.PackageSurfaceArea:\r
             Package = self.PackageSurfaceArea[Guid, Version, Path]\r
@@ -206,7 +207,15 @@ class DistributionPackageClass(object):
                 SearchPath = os.path.normpath(os.path.join(os.path.dirname(FullPath), IncludePath))\r
                 AddPath = os.path.normpath(os.path.join(PackagePath, IncludePath))\r
                 self.FileList += GetNonMetaDataFiles(SearchPath, ['CVS', '.svn'], False, AddPath)\r
-        \r
+            #\r
+            # Add the miscellaneous files on DEC file\r
+            #\r
+            for MiscFileObj in Package.GetMiscFileList():\r
+                for FileObj in MiscFileObj.GetFileList():\r
+                    MiscFileFullPath = os.path.normpath(os.path.join(os.path.dirname(FullPath), FileObj.GetURI()))\r
+                    if MiscFileFullPath not in self.FileList:\r
+                        self.FileList.append(MiscFileFullPath)\r
+            \r
             Module = None\r
             ModuleDict = Package.GetModuleDict()\r
             for Guid, Version, Name, Path in ModuleDict:\r
@@ -215,15 +224,43 @@ class DistributionPackageClass(object):
                 FullPath = Module.GetFullPath()\r
                 PkgRelPath = os.path.normpath(os.path.join(PackagePath, ModulePath))\r
                 MetaDataFileList.append(Path)\r
-                self.FileList += GetNonMetaDataFiles(os.path.dirname(FullPath), ['CVS', '.svn'], False, PkgRelPath)\r
-     \r
+                SkipList = ['CVS', '.svn']\r
+                NonMetaDataFileList = []\r
+                if Module.UniFileClassObject:\r
+                    for UniFile in Module.UniFileClassObject.IncFileList:\r
+                        OriPath = os.path.normpath(os.path.dirname(FullPath))\r
+                        UniFilePath = os.path.normpath(os.path.join(PkgRelPath, UniFile.Path[len(OriPath) + 1:]))\r
+                        if UniFilePath not in SkipModulesUniList:\r
+                            SkipModulesUniList.append(UniFilePath)\r
+                    for IncludeFile in Module.UniFileClassObject.IncludePathList:\r
+                        if IncludeFile not in SkipModulesUniList:\r
+                            SkipModulesUniList.append(IncludeFile)\r
+                NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, PkgRelPath)\r
+                for NonMetaDataFile in NonMetaDataFileList:\r
+                    if NonMetaDataFile not in self.FileList:\r
+                        self.FileList.append(NonMetaDataFile)\r
         for Guid, Version, Name, Path in self.ModuleSurfaceArea:\r
             Module = self.ModuleSurfaceArea[Guid, Version, Name, Path]\r
             ModulePath = Module.GetModulePath()\r
             FullPath = Module.GetFullPath()\r
             MetaDataFileList.append(Path)\r
-            self.FileList += GetNonMetaDataFiles(os.path.dirname(FullPath), ['CVS', '.svn'], False, ModulePath)\r
-        \r
+            SkipList = ['CVS', '.svn']\r
+            NonMetaDataFileList = []\r
+            if Module.UniFileClassObject:\r
+                for UniFile in Module.UniFileClassObject.IncFileList:\r
+                    OriPath = os.path.normpath(os.path.dirname(FullPath))\r
+                    UniFilePath = os.path.normpath(os.path.join(ModulePath, UniFile.Path[len(OriPath) + 1:]))\r
+                    if UniFilePath not in SkipModulesUniList:\r
+                        SkipModulesUniList.append(UniFilePath)\r
+            NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, ModulePath)\r
+            for NonMetaDataFile in NonMetaDataFileList:\r
+                if NonMetaDataFile not in self.FileList:\r
+                    self.FileList.append(NonMetaDataFile)\r
+            \r
+        for SkipModuleUni in SkipModulesUniList:\r
+            if SkipModuleUni in self.FileList:\r
+                self.FileList.remove(SkipModuleUni)\r
+\r
         return  self.FileList, MetaDataFileList\r
 \r
         \r
diff --git a/BaseTools/Source/Python/UPT/Core/FileHook.py b/BaseTools/Source/Python/UPT/Core/FileHook.py
new file mode 100644 (file)
index 0000000..d8736a8
--- /dev/null
@@ -0,0 +1,199 @@
+## @file\r
+# This file hooks file and directory creation and removal\r
+#\r
+# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+'''\r
+File hook\r
+'''\r
+\r
+import os\r
+import stat\r
+import time\r
+import zipfile\r
+from time import sleep\r
+from Library import GlobalData\r
+\r
+__built_in_remove__ = os.remove\r
+__built_in_mkdir__  = os.mkdir\r
+__built_in_rmdir__  = os.rmdir\r
+__built_in_chmod__  = os.chmod\r
+__built_in_open__   = open\r
+\r
+_RMFILE      = 0\r
+_MKFILE      = 1\r
+_RMDIR       = 2\r
+_MKDIR       = 3\r
+_CHMOD       = 4\r
+\r
+gBACKUPFILE = 'file.backup'\r
+gEXCEPTION_LIST = ['Conf'+os.sep+'DistributionPackageDatabase.db', '.tmp', gBACKUPFILE]\r
+\r
+class _PathInfo:\r
+    def __init__(self, action, path, mode=-1):\r
+        self.action = action\r
+        self.path = path\r
+        self.mode = mode\r
+\r
+class RecoverMgr:\r
+    def __init__(self, workspace):\r
+        self.rlist = []\r
+        self.zip = None\r
+        self.workspace = os.path.normpath(workspace)\r
+        self.backupfile = gBACKUPFILE\r
+        self.zipfile = os.path.join(self.workspace, gBACKUPFILE)\r
+\r
+    def _createzip(self):\r
+        if self.zip:\r
+            return\r
+        self.zip = zipfile.ZipFile(self.zipfile, 'w', zipfile.ZIP_DEFLATED)\r
+\r
+    def _save(self, tmp, path):\r
+        if not self._tryhook(path):\r
+            return\r
+        self.rlist.append(_PathInfo(tmp, path))\r
+\r
+    def bkrmfile(self, path):\r
+        arc = self._tryhook(path)\r
+        if arc and os.path.isfile(path):\r
+            self._createzip()\r
+            self.zip.write(path, arc.encode('utf_8'))\r
+            sta = os.stat(path)\r
+            oldmode = stat.S_IMODE(sta.st_mode)\r
+            self.rlist.append(_PathInfo(_CHMOD, path, oldmode))\r
+            self.rlist.append(_PathInfo(_RMFILE, path))\r
+        __built_in_remove__(path)\r
+\r
+    def bkmkfile(self, path, mode, bufsize):\r
+        if not os.path.exists(path):\r
+            self._save(_MKFILE, path)\r
+        return __built_in_open__(path, mode, bufsize)\r
+\r
+    def bkrmdir(self, path):\r
+        if os.path.exists(path):\r
+            sta = os.stat(path)\r
+            oldmode = stat.S_IMODE(sta.st_mode)\r
+            self.rlist.append(_PathInfo(_CHMOD, path, oldmode))\r
+            self._save(_RMDIR, path)\r
+        __built_in_rmdir__(path)\r
+\r
+    def bkmkdir(self, path, mode):\r
+        if not os.path.exists(path):\r
+            self._save(_MKDIR, path)\r
+        __built_in_mkdir__(path, mode)\r
+\r
+    def bkchmod(self, path, mode):\r
+        if self._tryhook(path) and os.path.exists(path):\r
+            sta = os.stat(path)\r
+            oldmode = stat.S_IMODE(sta.st_mode)\r
+            self.rlist.append(_PathInfo(_CHMOD, path, oldmode))\r
+        __built_in_chmod__(path, mode)\r
+\r
+    def rollback(self):\r
+        if self.zip:\r
+            self.zip.close()\r
+            self.zip = None\r
+        index = len(self.rlist) - 1\r
+        while index >= 0:\r
+            item = self.rlist[index]\r
+            exist = os.path.exists(item.path)\r
+            if item.action == _MKFILE and exist:\r
+                #if not os.access(item.path, os.W_OK):\r
+                #    os.chmod(item.path, S_IWUSR)\r
+                __built_in_remove__(item.path)\r
+            elif item.action == _RMFILE and not exist:\r
+                if not self.zip:\r
+                    self.zip = zipfile.ZipFile(self.zipfile, 'r', zipfile.ZIP_DEFLATED)\r
+                arcname = os.path.normpath(item.path)\r
+                arcname = arcname[len(self.workspace)+1:].encode('utf_8')\r
+                if os.sep != "/" and os.sep in arcname:\r
+                    arcname = arcname.replace(os.sep, '/')\r
+                mtime = self.zip.getinfo(arcname).date_time\r
+                content = self.zip.read(arcname)\r
+                filep = __built_in_open__(item.path, "wb")\r
+                filep.write(content)\r
+                filep.close()\r
+                intime = time.mktime(mtime + (0, 0, 0))\r
+                os.utime(item.path, (intime, intime))\r
+            elif item.action == _MKDIR and exist:\r
+                while True:\r
+                    try:\r
+                        __built_in_rmdir__(item.path)\r
+                        break\r
+                    except IOError:\r
+                        # Sleep a short time and try again\r
+                        # The anti-virus software may delay the file removal in this directory\r
+                        sleep(0.1)\r
+            elif item.action == _RMDIR and not exist:\r
+                __built_in_mkdir__(item.path)\r
+            elif item.action == _CHMOD and exist:\r
+                try:\r
+                    __built_in_chmod__(item.path, item.mode)\r
+                except EnvironmentError:\r
+                    pass\r
+            index -= 1\r
+        self.commit()\r
+\r
+    def commit(self):\r
+        if self.zip:\r
+            self.zip.close()\r
+            __built_in_remove__(self.zipfile)\r
+\r
+    # Check if path needs to be hooked\r
+    def _tryhook(self, path):\r
+        path = os.path.normpath(path)\r
+        works = self.workspace if str(self.workspace).endswith(os.sep) else (self.workspace  + os.sep)\r
+        if not path.startswith(works):\r
+            return ''\r
+        for exceptdir in gEXCEPTION_LIST:\r
+            full = os.path.join(self.workspace, exceptdir)\r
+            if full == path or path.startswith(full + os.sep) or os.path.split(full)[0] == path:\r
+                return ''\r
+        return path[len(self.workspace)+1:]\r
+\r
+def _hookrm(path):\r
+    if GlobalData.gRECOVERMGR:\r
+        GlobalData.gRECOVERMGR.bkrmfile(path)\r
+    else:\r
+        __built_in_remove__(path)\r
+\r
+def _hookmkdir(path, mode=0777):\r
+    if GlobalData.gRECOVERMGR:\r
+        GlobalData.gRECOVERMGR.bkmkdir(path, mode)\r
+    else:\r
+        __built_in_mkdir__(path, mode)\r
+\r
+def _hookrmdir(path):\r
+    if GlobalData.gRECOVERMGR:\r
+        GlobalData.gRECOVERMGR.bkrmdir(path)\r
+    else:\r
+        __built_in_rmdir__(path)\r
+\r
+def _hookmkfile(path, mode='r', bufsize=-1):\r
+    if GlobalData.gRECOVERMGR:\r
+        return GlobalData.gRECOVERMGR.bkmkfile(path, mode, bufsize)\r
+    return __built_in_open__(path, mode, bufsize)\r
+\r
+def _hookchmod(path, mode):\r
+    if GlobalData.gRECOVERMGR:\r
+        GlobalData.gRECOVERMGR.bkchmod(path, mode)\r
+    else:\r
+        __built_in_chmod__(path, mode)\r
+\r
+def SetRecoverMgr(mgr):\r
+    GlobalData.gRECOVERMGR = mgr\r
+\r
+os.remove   = _hookrm\r
+os.mkdir    = _hookmkdir\r
+os.rmdir    = _hookrmdir\r
+os.chmod    = _hookchmod\r
+__FileHookOpen__    = _hookmkfile\r
index e45acb7d48ab189001fc0db80189b5094e2d8c45..2c444f903c0f569e3cceeb575d77594dbf37187a 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is for installed package information database operations\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -27,6 +27,7 @@ import Logger.Log as Logger
 from Logger import StringTable as ST\r
 from Logger.ToolError import UPT_ALREADY_RUNNING_ERROR\r
 from Logger.ToolError import UPT_DB_UPDATE_ERROR\r
+import platform as pf\r
 \r
 ## IpiDb\r
 #\r
@@ -39,7 +40,7 @@ from Logger.ToolError import UPT_DB_UPDATE_ERROR
 #\r
 #\r
 class IpiDatabase(object):\r
-    def __init__(self, DbPath):\r
+    def __init__(self, DbPath, Workspace):\r
         Dir = os.path.dirname(DbPath)\r
         if not os.path.isdir(Dir):\r
             os.mkdir(Dir)\r
@@ -54,6 +55,7 @@ class IpiDatabase(object):
         self.ModDepexTable = 'ModDepexInfo'\r
         self.DpFileListTable = 'DpFileListInfo'\r
         self.DummyTable = 'Dummy'\r
+        self.Workspace = os.path.normpath(Workspace)\r
 \r
     ## Initialize build database\r
     #\r
@@ -156,6 +158,12 @@ class IpiDatabase(object):
         \r
         Logger.Verbose(ST.MSG_INIT_IPI_FINISH)\r
 \r
+    def RollBack(self):\r
+        self.Conn.rollback()\r
+\r
+    def Commit(self):\r
+        self.Conn.commit()\r
+\r
     ## Add a distribution install information from DpObj\r
     #\r
     # @param DpObj:\r
@@ -222,7 +230,6 @@ class IpiDatabase(object):
             self._AddDp(DpObj.Header.GetGuid(), DpObj.Header.GetVersion(), \\r
                         NewDpPkgFileName, DpPkgFileName, RePackage)\r
     \r
-            self.Conn.commit()\r
         except sqlite3.IntegrityError, DetailMsg:\r
             Logger.Error("UPT",\r
                          UPT_DB_UPDATE_ERROR,\r
@@ -266,7 +273,13 @@ class IpiDatabase(object):
     # @param Path: A Md5Sum\r
     #\r
     def _AddDpFilePathList(self, DpGuid, DpVersion, Path, Md5Sum):\r
-        \r
+        Path = os.path.normpath(Path)\r
+        if pf.system() == 'Windows':\r
+            if Path.startswith(self.Workspace):\r
+                Path = Path[len(self.Workspace):]\r
+        else:\r
+            if Path.startswith(self.Workspace + os.sep):\r
+                Path = Path[len(self.Workspace)+1:]\r
         SqlCommand = """insert into %s values('%s', '%s', '%s', '%s')""" % \\r
         (self.DpFileListTable, Path, DpGuid, DpVersion, Md5Sum)\r
 \r
@@ -320,6 +333,11 @@ class IpiDatabase(object):
         \r
         if PkgVersion == None or len(PkgVersion.strip()) == 0:\r
             PkgVersion = 'N/A'\r
+            \r
+        if os.name == 'posix':\r
+            Path = Path.replace('\\', os.sep)\r
+        else:\r
+            Path = Path.replace('/', os.sep)\r
         \r
         #\r
         # Add module from package information to DB.\r
@@ -378,6 +396,11 @@ class IpiDatabase(object):
         \r
         if DepexVersion == None or len(DepexVersion.strip()) == 0:\r
             DepexVersion = 'N/A'\r
+            \r
+        if os.name == 'posix':\r
+            Path = Path.replace('\\', os.sep)\r
+        else:\r
+            Path = Path.replace('/', os.sep)\r
         \r
         #\r
         # Add module depex information to DB.\r
@@ -478,7 +501,7 @@ class IpiDatabase(object):
         (self.DpTable, DpGuid, DpVersion)\r
         self.Cur.execute(SqlCommand)\r
         \r
-        self.Conn.commit()\r
+        #self.Conn.commit()\r
         \r
     ## Get a list of distribution install information.\r
     #\r
@@ -554,7 +577,7 @@ class IpiDatabase(object):
         for Result in self.Cur:\r
             Path = Result[0]\r
             Md5Sum = Result[3]\r
-            PathList.append((Path, Md5Sum))\r
+            PathList.append((os.path.join(self.Workspace, Path), Md5Sum))\r
         \r
         return PathList\r
 \r
@@ -824,7 +847,7 @@ class IpiDatabase(object):
         self.Cur.execute(SqlCommand)\r
         for ModuleInfo in self.Cur:\r
             FilePath = ModuleInfo[0]\r
-            ModList.append(FilePath)\r
+            ModList.append(os.path.join(self.Workspace, FilePath))\r
             \r
         return ModList        \r
 \r
@@ -844,7 +867,7 @@ class IpiDatabase(object):
         ModuleVersion = '%s' and InstallPath ='%s'\r
                             """ % (self.ModDepexTable, Guid, Version, Path)\r
         self.Cur.execute(SqlCommand)\r
-        self.Conn.commit()\r
+\r
         \r
         DepexList = []\r
         for DepInfo in self.Cur:\r
@@ -853,7 +876,25 @@ class IpiDatabase(object):
             DepexList.append((DepexGuid, DepexVersion))\r
         \r
         return DepexList\r
-    \r
\r
+    ## Inventory the distribution installed to current workspace\r
+    #\r
+    # Inventory the distribution installed to current workspace\r
+    #   \r
+    def InventoryDistInstalled(self):\r
+        SqlCommand = """select * from %s """ % (self.DpTable)\r
+        self.Cur.execute(SqlCommand)\r
+        \r
+        DpInfoList = []\r
+        for Result in self.Cur:\r
+            DpGuid = Result[0]\r
+            DpVersion = Result[1]\r
+            DpAliasName = Result[3]\r
+            DpFileName = Result[4]            \r
+            DpInfoList.append((DpGuid, DpVersion, DpFileName, DpAliasName))\r
+        \r
+        return DpInfoList     \r
+\r
     ## Close entire database\r
     #\r
     # Close the connection and cursor\r
index 04c5d4e8d0a8cd5d4822d58a17ae8116cc3dd3e6..47ea0bc0a932ef618a08f3ade08e821986b91c0f 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 # PackageFile class represents the zip file of a distribution package.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -36,7 +36,7 @@ import Logger.Log as Logger
 from Logger import StringTable as ST\r
 from Library.Misc import CreateDirectory\r
 from Library.Misc import RemoveDirectory\r
-\r
+from Core.FileHook import __FileHookOpen__\r
 \r
 \r
 class PackageFile:\r
@@ -96,7 +96,7 @@ class PackageFile:
     ## Extract the file\r
     # \r
     # @param Which:  the source path \r
-    # @param To:  the destination path \r
+    # @param ToDest:  the destination path \r
     #\r
     def Extract(self, Which, ToDest):\r
         Which = os.path.normpath(Which)\r
@@ -116,7 +116,8 @@ class PackageFile:
                 Logger.Warn("PackagingTool", \\r
                             ST.WRN_FILE_NOT_OVERWRITTEN % ToDest)\r
                 return\r
-            ToFile = open(ToDest, "wb")\r
+            else:\r
+                ToFile = __FileHookOpen__(ToDest, 'wb')\r
         except BaseException, Xstr:\r
             Logger.Error("PackagingTool", FILE_OPEN_FAILURE, \r
                             ExtraData="%s (%s)" % (ToDest, str(Xstr)))\r
@@ -234,6 +235,8 @@ class PackageFile:
     #\r
     def PackData(self, Data, ArcName):\r
         try:\r
+            if os.path.splitext(ArcName)[1].lower() == '.pkg':\r
+                Data = Data.encode('utf_8')\r
             self._ZipFile.writestr(ArcName, Data)\r
         except BaseException, Xstr:\r
             Logger.Error("PackagingTool", FILE_COMPRESS_FAILURE,\r
index 575c216e589e55e0cd5557639d95bf4b25c87e25..d886958f97f1cd2d850380e3c9cf3c79cc76e4f0 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 # This file contained the logical of transfer package object to DEC files.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
 '''\r
 GenDEC\r
 '''\r
-\r
+import os\r
+import stat\r
+import codecs\r
+import md5\r
+from Core.FileHook import __FileHookOpen__\r
 from Library.Parsing import GenSection\r
 from Library.CommentGenerating import GenHeaderCommentSection\r
 from Library.CommentGenerating import GenGenericCommentF\r
@@ -25,14 +29,41 @@ from Library.CommentGenerating import _GetHelpStr
 from Library.Misc import GuidStringToGuidStructureString\r
 from Library.Misc import SaveFileOnChange\r
 from Library.Misc import ConvertPath\r
+from Library.Misc import GetLocalValue\r
 from Library.DataType import TAB_SPACE_SPLIT\r
 from Library.DataType import TAB_COMMA_SPLIT\r
+from Library.DataType import END_OF_LINE\r
 from Library.DataType import TAB_ARCH_COMMON\r
+from Library.DataType import TAB_VALUE_SPLIT\r
+from Library.DataType import TAB_COMMENT_SPLIT\r
+from Library.DataType import TAB_PCD_VALIDRANGE\r
+from Library.DataType import TAB_PCD_VALIDLIST\r
+from Library.DataType import TAB_PCD_EXPRESSION\r
 from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
-\r
+from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
+from Library.DataType import TAB_DEC_PACKAGE_ABSTRACT\r
+from Library.DataType import TAB_DEC_PACKAGE_DESCRIPTION\r
+from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
+from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_BINARY_HEADER_USERID\r
+from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
+from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
+from Library.DataType import TAB_ENCODING_UTF16LE\r
+from Library.DataType import TAB_CAPHEX_START\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import TAB_UNDERLINE_SPLIT\r
+from Library.DataType import TAB_STR_TOKENERR\r
+from Library.DataType import TAB_STR_TOKENCNAME\r
+from Library.DataType import TAB_PCD_ERROR_SECTION_COMMENT\r
+from Library.DataType import TAB_PCD_ERROR\r
+from Library.DataType import TAB_SECTION_START\r
+from Library.DataType import TAB_SECTION_END\r
+from Library.DataType import TAB_SPLIT\r
+from Library.UniClassObject import FormatUniEntry\r
 \r
 def GenPcd(Package, Content):\r
     #\r
@@ -47,12 +78,16 @@ def GenPcd(Package, Content):
         HelpTextList = Pcd.GetHelpTextList()\r
         HelpStr = _GetHelpStr(HelpTextList)\r
         CommentStr = GenGenericCommentF(HelpStr, 2)\r
-\r
+        \r
+        PromptList = Pcd.GetPromptList()\r
+        PromptStr = _GetHelpStr(PromptList)\r
+        CommentStr += GenGenericCommentF(PromptStr.strip(), 1, True)\r
+        \r
         PcdErrList = Pcd.GetPcdErrorsList()\r
-        if PcdErrList:\r
-            CommentStr += GenPcdErrComment(PcdErrList[0])\r
+        for PcdErr in PcdErrList:\r
+            CommentStr += GenPcdErrComment(PcdErr)\r
         Statement = CommentStr\r
-\r
\r
         CName = Pcd.GetCName()\r
         TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()\r
         DefaultValue = Pcd.GetDefaultValue()\r
@@ -96,15 +131,61 @@ def GenPcd(Package, Content):
             NewSectionDict[SortedArch] = [Statement]            \r
         \r
     for ValidUsage in ValidUsageDict:\r
-        Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage])\r
+        Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage], True, True)\r
     \r
     return Content\r
 \r
+def GenPcdErrorMsgSection(Package, Content):\r
+    if not Package.PcdErrorCommentDict:\r
+        return Content\r
+    \r
+    #\r
+    # Generate '# [Error.<TokenSpcCName>]' section\r
+    #\r
+    Content += END_OF_LINE + END_OF_LINE\r
+    SectionComment = TAB_COMMENT_SPLIT + END_OF_LINE\r
+    SectionComment += TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_ERROR_SECTION_COMMENT + END_OF_LINE\r
+    SectionComment += TAB_COMMENT_SPLIT + END_OF_LINE\r
+    TokenSpcCNameList = []\r
+    \r
+    #\r
+    # Get TokenSpcCName list in PcdErrorCommentDict in Package object\r
+    #\r
+    for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
+        if TokenSpcCName not in TokenSpcCNameList:\r
+            TokenSpcCNameList.append(TokenSpcCName)\r
+    \r
+    for TokenSpcCNameItem in TokenSpcCNameList:\r
+        SectionName = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SECTION_START + TAB_PCD_ERROR + \\r
+                      TAB_SPLIT + TokenSpcCNameItem + TAB_SECTION_END + END_OF_LINE\r
+        Content += SectionComment\r
+        Content += SectionName\r
+        for (TokenSpcCName, ErrorNumber) in Package.PcdErrorCommentDict:\r
+            if TokenSpcCNameItem == TokenSpcCName:\r
+                PcdErrorMsg = GetLocalValue(Package.PcdErrorCommentDict[(TokenSpcCName, ErrorNumber)])\r
+                SectionItem = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_SPACE_SPLIT + \\r
+                              ErrorNumber + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT + \\r
+                              PcdErrorMsg + END_OF_LINE\r
+                Content += SectionItem\r
+                \r
+    Content += TAB_COMMENT_SPLIT\r
+    return Content\r
+            \r
 def GenGuidProtocolPpi(Package, Content):\r
     #\r
     # generate [Guids] section\r
     #\r
     NewSectionDict = {}\r
+\r
+    LeftOffset = 46\r
+    # Get the line offset need\r
+    # If the real one < the min one, use the min one\r
+    # else use the real one\r
+    for Guid in Package.GetGuidList():\r
+        if len(Guid.GetCName()) > LeftOffset:\r
+            LeftOffset = len(Guid.GetCName())\r
+\r
+    # Generate\r
     for Guid in Package.GetGuidList():\r
         #\r
         # Generate generic comment\r
@@ -116,7 +197,7 @@ def GenGuidProtocolPpi(Package, Content):
         Statement = CommentStr\r
         CName = Guid.GetCName()\r
         Value = GuidStringToGuidStructureString(Guid.GetGuid())\r
-        Statement += CName + '  =  ' + Value\r
+        Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
         #\r
         # generate tail comment\r
         #\r
@@ -131,12 +212,20 @@ def GenGuidProtocolPpi(Package, Content):
         else:\r
             NewSectionDict[SortedArch] = [Statement]            \r
 \r
-    Content += GenSection('Guids', NewSectionDict)    \r
+    Content += GenSection('Guids', NewSectionDict, True, True)\r
  \r
     #\r
     # generate [Protocols] section\r
     #\r
     NewSectionDict = {}\r
+    LeftOffset = 46\r
+    # Get the line offset need\r
+    # If the real one < the min one, use the min one\r
+    # else use the real one\r
+    for Protocol in Package.GetProtocolList():\r
+        if len(Protocol.GetCName()) > LeftOffset:\r
+            LeftOffset = len(Protocol.GetCName())\r
+\r
     for Protocol in Package.GetProtocolList():\r
         #\r
         # Generate generic comment\r
@@ -148,7 +237,7 @@ def GenGuidProtocolPpi(Package, Content):
         Statement = CommentStr        \r
         CName = Protocol.GetCName()\r
         Value = GuidStringToGuidStructureString(Protocol.GetGuid())\r
-        Statement += CName + '  =  ' + Value\r
+        Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
 \r
         #\r
         # generate tail comment\r
@@ -164,12 +253,20 @@ def GenGuidProtocolPpi(Package, Content):
         else:\r
             NewSectionDict[SortedArch] = [Statement]            \r
 \r
-    Content += GenSection('Protocols', NewSectionDict) \r
+    Content += GenSection('Protocols', NewSectionDict, True, True\r
 \r
     #\r
     # generate [Ppis] section\r
     #\r
     NewSectionDict = {}\r
+    LeftOffset = 46\r
+    # Get the line offset need\r
+    # If the real one < the min one, use the min one\r
+    # else use the real one\r
+    for Ppi in Package.GetPpiList():\r
+        if len(Ppi.GetCName()) > LeftOffset:\r
+            LeftOffset = len(Ppi.GetCName())\r
+\r
     for Ppi in Package.GetPpiList():\r
         #\r
         # Generate generic comment\r
@@ -181,7 +278,7 @@ def GenGuidProtocolPpi(Package, Content):
         Statement = CommentStr\r
         CName = Ppi.GetCName()\r
         Value = GuidStringToGuidStructureString(Ppi.GetGuid())\r
-        Statement += CName + '  =  ' + Value\r
+        Statement += CName.ljust(LeftOffset) + ' = ' + Value\r
 \r
         #\r
         # generate tail comment\r
@@ -197,7 +294,7 @@ def GenGuidProtocolPpi(Package, Content):
         else:\r
             NewSectionDict[SortedArch] = [Statement]            \r
 \r
-    Content += GenSection('Ppis', NewSectionDict)\r
+    Content += GenSection('Ppis', NewSectionDict, True, True)\r
     \r
     return Content\r
 \r
@@ -207,21 +304,77 @@ def GenGuidProtocolPpi(Package, Content):
 #\r
 # @param Package:  A Package \r
 #\r
-def PackageToDec(Package):\r
+def PackageToDec(Package, DistHeader = None):\r
     #\r
     # Init global information for the file\r
     #\r
     ContainerFile = Package.GetFullPath()\r
     \r
     Content = ''\r
+    \r
     #\r
-    # generate header comment section\r
+    # Generate file header \r
     #\r
-    Content += GenHeaderCommentSection(Package.GetAbstract(), \\r
-                                       Package.GetDescription(), \\r
-                                       Package.GetCopyright(), \\r
-                                       Package.GetLicense())\r
-    \r
+    PackageAbstract = GetLocalValue(Package.GetAbstract())\r
+    PackageDescription = GetLocalValue(Package.GetDescription())\r
+    PackageCopyright = ''\r
+    PackageLicense = ''\r
+    for (Lang, Copyright) in Package.GetCopyright():\r
+        if Lang:\r
+            pass\r
+        PackageCopyright = Copyright\r
+    for (Lang, License) in Package.GetLicense():\r
+        if Lang:\r
+            pass\r
+        PackageLicense = License\r
+    if not PackageAbstract and DistHeader:\r
+        PackageAbstract = GetLocalValue(DistHeader.GetAbstract())\r
+    if not PackageDescription and DistHeader:\r
+        PackageDescription = GetLocalValue(DistHeader.GetDescription())\r
+    if not PackageCopyright and DistHeader:\r
+        for (Lang, Copyright) in DistHeader.GetCopyright():\r
+            PackageCopyright = Copyright\r
+    if not PackageLicense and DistHeader:\r
+        for (Lang, License) in DistHeader.GetLicense():\r
+            PackageLicense = License\r
+         \r
+    #\r
+    # Generate header comment section of DEC file\r
+    #\r
+    Content += GenHeaderCommentSection(PackageAbstract, \\r
+                                       PackageDescription, \\r
+                                       PackageCopyright, \\r
+                                       PackageLicense)\r
+\r
+    #\r
+    # Generate Binary header \r
+    #\r
+    for UserExtension in Package.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
+        and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+            PackageBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())\r
+            PackageBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())\r
+            PackageBinaryCopyright = ''\r
+            PackageBinaryLicense = ''\r
+            for (Lang, Copyright) in UserExtension.GetBinaryCopyright():\r
+                PackageBinaryCopyright = Copyright\r
+            for (Lang, License) in UserExtension.GetBinaryLicense():\r
+                PackageBinaryLicense = License \r
+            if PackageBinaryAbstract and PackageBinaryDescription and \\r
+            PackageBinaryCopyright and PackageBinaryLicense:\r
+                Content += GenHeaderCommentSection(PackageBinaryAbstract, \r
+                                           PackageBinaryDescription, \r
+                                           PackageBinaryCopyright, \r
+                                           PackageBinaryLicense,\r
+                                           True)\r
+\r
+    #\r
+    # Generate PACKAGE_UNI_FILE for the Package\r
+    #\r
+    FileHeader = GenHeaderCommentSection(PackageAbstract, PackageDescription, PackageCopyright, PackageLicense, False, \\r
+                                         TAB_COMMENT_EDK1_SPLIT)\r
+    GenPackageUNIEncodeFile(Package, FileHeader)\r
+\r
     #\r
     # for each section, maintain a dict, sorted arch will be its key, \r
     #statement list will be its data\r
@@ -233,21 +386,29 @@ def PackageToDec(Package):
     #\r
     # generate [Defines] section                     \r
     #\r
+    LeftOffset = 31\r
     NewSectionDict = {TAB_ARCH_COMMON : []}\r
     SpecialItemList = []\r
     \r
-    Statement = '%s = %s' % (TAB_DEC_DEFINES_DEC_SPECIFICATION, '0x00010017')\r
+    Statement = (u'%s ' % TAB_DEC_DEFINES_DEC_SPECIFICATION).ljust(LeftOffset) + u'= %s' % '0x00010017'\r
     SpecialItemList.append(Statement)\r
     \r
     BaseName = Package.GetBaseName()\r
     if BaseName.startswith('.') or BaseName.startswith('-'):\r
         BaseName = '_' + BaseName\r
-    Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_NAME, BaseName)\r
+    Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_NAME).ljust(LeftOffset) + u'= %s' % BaseName\r
     SpecialItemList.append(Statement)\r
-    Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_VERSION, Package.GetVersion())\r
+\r
+    Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_VERSION).ljust(LeftOffset) + u'= %s' % Package.GetVersion()\r
     SpecialItemList.append(Statement)\r
-    Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_GUID, Package.GetGuid())\r
-    SpecialItemList.append(Statement)        \r
+\r
+    Statement = (u'%s ' % TAB_DEC_DEFINES_PACKAGE_GUID).ljust(LeftOffset) + u'= %s' % Package.GetGuid()\r
+    SpecialItemList.append(Statement)\r
+\r
+    if Package.UNIFlag:\r
+        Statement = (u'%s ' % TAB_DEC_DEFINES_PKG_UNI_FILE).ljust(LeftOffset) + u'= %s' % Package.GetBaseName() + '.uni'\r
+        SpecialItemList.append(Statement)               \r
+\r
     for SortedArch in NewSectionDict:\r
         NewSectionDict[SortedArch] = \\r
         NewSectionDict[SortedArch] + SpecialItemList\r
@@ -269,8 +430,11 @@ def PackageToDec(Package):
             else:\r
                 NewSectionDict[SortedArch] = [ConvertPath(Statement)]\r
 \r
-    Content += GenSection('Includes', NewSectionDict)                     \r
+    Content += GenSection('Includes', NewSectionDict)\r
 \r
+    #\r
+    # generate [guids][protocols][ppis] sections\r
+    #\r
     Content = GenGuidProtocolPpi(Package, Content)\r
 \r
     #\r
@@ -284,8 +448,8 @@ def PackageToDec(Package):
         HelpTextList = LibraryClass.GetHelpTextList()\r
         HelpStr = _GetHelpStr(HelpTextList)\r
         if HelpStr:\r
-            HelpStr = '@libraryclass ' + HelpStr\r
-        CommentStr = GenGenericCommentF(HelpStr, 2)\r
+            HelpStr = '@libraryclass' + HelpStr\r
+        CommentStr = GenGenericCommentF(HelpStr, 2, False, True)\r
 \r
         Statement = CommentStr\r
         Name = LibraryClass.GetLibraryClass()\r
@@ -306,18 +470,31 @@ def PackageToDec(Package):
         else:\r
             NewSectionDict[SortedArch] = [Statement]            \r
 \r
-    Content += GenSection('LibraryClasses', NewSectionDict)\r
+    Content += GenSection('LibraryClasses', NewSectionDict, True, True)\r
 \r
-    Content = GenPcd(Package, Content)\r
+    #\r
+    # Generate '# [Error.<TokenSpcCName>]' section\r
+    #\r
+    Content = GenPcdErrorMsgSection(Package, Content)\r
     \r
+    Content = GenPcd(Package, Content)\r
+\r
     #\r
     # generate [UserExtensions] section\r
     #\r
     NewSectionDict = {}\r
     for UserExtension in Package.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID and \\r
+            UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+            continue\r
         Statement = UserExtension.GetStatement()\r
         if not Statement:\r
             continue\r
+        else:\r
+            LineList = Statement.split('\n')\r
+            NewStatement = ""\r
+            for Line in LineList:\r
+                NewStatement += "  %s\n" % Line\r
         \r
         SectionList = []\r
         SectionName = 'UserExtensions'\r
@@ -335,11 +512,147 @@ def PackageToDec(Package):
                 SectionList.append(SectionName + '.' + Arch)\r
         SectionName = ', '.join(SectionList)\r
         SectionName = ''.join(['[', SectionName, ']\n'])\r
-        Content += '\n\n' + SectionName + Statement\r
+        Content += '\n' + SectionName + NewStatement\r
 \r
     SaveFileOnChange(ContainerFile, Content, False)\r
+    if DistHeader.ReadOnly:\r
+        os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
+    else:\r
+        os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)\r
     return ContainerFile\r
 \r
+## GenPackageUNIEncodeFile\r
+# GenPackageUNIEncodeFile, default is a UCS-2LE encode file\r
+#\r
+def GenPackageUNIEncodeFile(PackageObject, UniFileHeader = '', Encoding=TAB_ENCODING_UTF16LE):\r
+    GenUNIFlag = False\r
+    OnlyLANGUAGE_EN_X = True\r
+    BinaryAbstract = []\r
+    BinaryDescription = []\r
+    #\r
+    # If more than one language code is used for any element that would be present in the PACKAGE_UNI_FILE, \r
+    # then the PACKAGE_UNI_FILE must be created.\r
+    #\r
+    for (Key, Value) in PackageObject.GetAbstract() + PackageObject.GetDescription():\r
+        if Key == TAB_LANGUAGE_EN_X:\r
+            GenUNIFlag = True\r
+        else:\r
+            OnlyLANGUAGE_EN_X = False\r
+            \r
+    for UserExtension in PackageObject.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == TAB_BINARY_HEADER_USERID \\r
+        and UserExtension.GetIdentifier() == TAB_BINARY_HEADER_IDENTIFIER:\r
+            for (Key, Value) in UserExtension.GetBinaryAbstract():\r
+                if Key == TAB_LANGUAGE_EN_X:\r
+                    GenUNIFlag = True\r
+                else:\r
+                    OnlyLANGUAGE_EN_X = False\r
+                BinaryAbstract.append((Key, Value))\r
+\r
+            for (Key, Value) in UserExtension.GetBinaryDescription():\r
+                if Key == TAB_LANGUAGE_EN_X:\r
+                    GenUNIFlag = True\r
+                else:\r
+                    OnlyLANGUAGE_EN_X = False\r
+                BinaryDescription.append((Key, Value))\r
+\r
+    for Pcd in PackageObject.GetPcdList():\r
+        for TxtObj in Pcd.GetPromptList() + Pcd.GetHelpTextList():\r
+            if TxtObj.GetLang() == TAB_LANGUAGE_EN_X:\r
+                GenUNIFlag = True\r
+            else:\r
+                OnlyLANGUAGE_EN_X = False\r
+                \r
+        for PcdError in Pcd.GetPcdErrorsList():\r
+            if PcdError.GetErrorNumber().startswith('0x') or PcdError.GetErrorNumber().startswith('0X'):\r
+                for (Key, Value) in PcdError.GetErrorMessageList():\r
+                    if Key == TAB_LANGUAGE_EN_X:\r
+                        GenUNIFlag = True\r
+                    else:\r
+                        OnlyLANGUAGE_EN_X = False\r
+    if not GenUNIFlag:\r
+        return\r
+    elif OnlyLANGUAGE_EN_X:\r
+        return\r
+    else:\r
+        PackageObject.UNIFlag = True\r
+        \r
+    if not os.path.exists(os.path.dirname(PackageObject.GetFullPath())):\r
+        os.makedirs(os.path.dirname(PackageObject.GetFullPath()))\r
+    ContainerFile = os.path.normpath(os.path.join(os.path.dirname(PackageObject.GetFullPath()), \r
+                                                  (PackageObject.GetBaseName() + '.uni')))\r
+    \r
+    Content = UniFileHeader + os.linesep\r
+    Content += os.linesep\r
+    \r
+    Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_ABSTRACT, PackageObject.GetAbstract(), ContainerFile) \\r
+    + os.linesep\r
+        \r
+    Content += FormatUniEntry('#string ' + TAB_DEC_PACKAGE_DESCRIPTION, PackageObject.GetDescription(), ContainerFile) \\r
+    + os.linesep\r
+    \r
+    Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_ABSTRACT, BinaryAbstract, ContainerFile) \\r
+    + os.linesep\r
+    \r
+    Content += FormatUniEntry('#string ' + TAB_DEC_BINARY_DESCRIPTION, BinaryDescription, ContainerFile) \\r
+    + os.linesep\r
+    \r
+    PromptGenList = []\r
+    HelpTextGenList = []    \r
+    for Pcd in PackageObject.GetPcdList():\r
+        # Generate Prompt for each Pcd\r
+        PcdPromptStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_PROMPT '\r
+        TokenValueList = []\r
+        for TxtObj in Pcd.GetPromptList():\r
+            Lang = TxtObj.GetLang()\r
+            PromptStr = TxtObj.GetString()\r
+            #\r
+            # Avoid generating the same PROMPT entry more than one time. \r
+            #\r
+            if (PcdPromptStrName, Lang) not in PromptGenList:\r
+                TokenValueList.append((Lang, PromptStr))\r
+                PromptGenList.append((PcdPromptStrName, Lang))\r
+        PromptString = FormatUniEntry(PcdPromptStrName, TokenValueList, ContainerFile) + os.linesep\r
+        if PromptString not in Content:\r
+            Content += PromptString\r
+            \r
+        # Generate Help String for each Pcd\r
+        PcdHelpStrName = '#string ' + 'STR_' + Pcd.GetTokenSpaceGuidCName() + '_' + Pcd.GetCName() + '_HELP '\r
+        TokenValueList = []\r
+        for TxtObj in Pcd.GetHelpTextList():\r
+            Lang = TxtObj.GetLang()\r
+            HelpStr = TxtObj.GetString()\r
+            #\r
+            # Avoid generating the same HELP entry more than one time. \r
+            #\r
+            if (PcdHelpStrName, Lang) not in HelpTextGenList:\r
+                TokenValueList.append((Lang, HelpStr))\r
+                HelpTextGenList.append((PcdHelpStrName, Lang))\r
+        HelpTextString = FormatUniEntry(PcdHelpStrName, TokenValueList, ContainerFile) + os.linesep\r
+        if HelpTextString not in Content:\r
+            Content += HelpTextString\r
+            \r
+        # Generate PcdError for each Pcd if ErrorNo exist.\r
+        for PcdError in Pcd.GetPcdErrorsList():\r
+            ErrorNo = PcdError.GetErrorNumber()\r
+            if ErrorNo.startswith(TAB_HEX_START) or ErrorNo.startswith(TAB_CAPHEX_START):\r
+                PcdErrStrName = '#string ' + TAB_STR_TOKENCNAME + TAB_UNDERLINE_SPLIT + Pcd.GetTokenSpaceGuidCName() \\r
+                    + TAB_UNDERLINE_SPLIT + TAB_STR_TOKENERR \\r
+                    + TAB_UNDERLINE_SPLIT + ErrorNo[2:]\r
+                PcdErrString = FormatUniEntry(PcdErrStrName, PcdError.GetErrorMessageList(), ContainerFile) + os.linesep\r
+                if PcdErrString not in Content:\r
+                    Content += PcdErrString\r
+                    \r
+    File = codecs.open(ContainerFile, 'w', Encoding)\r
+    File.write(u'\uFEFF' + Content)\r
+    File.stream.close()\r
+    Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
+    Md5Sum = Md5Sigature.hexdigest()\r
+    if (ContainerFile, Md5Sum) not in PackageObject.FileList:\r
+        PackageObject.FileList.append((ContainerFile, Md5Sum))\r
+\r
+    return ContainerFile\r
+    \r
 ## GenPcdErrComment\r
 #\r
 #  @param PcdErrObject:  PcdErrorObject\r
@@ -347,21 +660,30 @@ def PackageToDec(Package):
 #  @retval CommentStr:   Generated comment lines, with prefix "#"\r
 # \r
 def GenPcdErrComment (PcdErrObject):\r
-    EndOfLine = "\n"    \r
+    CommentStr = '' \r
+    ErrorCode = PcdErrObject.GetErrorNumber()\r
     ValidValueRange = PcdErrObject.GetValidValueRange()\r
     if ValidValueRange:\r
-        CommentStr = "# @ValidRange " + ValidValueRange + EndOfLine\r
+        CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDRANGE + TAB_SPACE_SPLIT \r
+        if ErrorCode:\r
+            CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+        CommentStr += ValidValueRange + END_OF_LINE\r
     \r
     ValidValue = PcdErrObject.GetValidValue()\r
     if ValidValue:\r
         ValidValueList = \\r
         [Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]\r
-        CommentStr = \\r
-        "# @ValidList " + TAB_COMMA_SPLIT.join(ValidValueList) + EndOfLine\r
+        CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_VALIDLIST + TAB_SPACE_SPLIT\r
+        if ErrorCode:\r
+            CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+        CommentStr += TAB_COMMA_SPLIT.join(ValidValueList) + END_OF_LINE\r
         \r
     Expression = PcdErrObject.GetExpression()\r
     if Expression:\r
-        CommentStr = "# @Expression " + Expression + EndOfLine\r
+        CommentStr = TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT + TAB_PCD_EXPRESSION + TAB_SPACE_SPLIT\r
+        if ErrorCode:\r
+            CommentStr += ErrorCode + TAB_SPACE_SPLIT + TAB_VALUE_SPLIT + TAB_SPACE_SPLIT\r
+        CommentStr += Expression + END_OF_LINE\r
         \r
     return CommentStr\r
 \r
index 78bb6ea4f1807eef20b80f3086f3b430ae9ee855..0daa96af25f03c410b9b3d391339986f83d143ca 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 # This file contained the logical of transfer package object to INF files.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
 '''\r
 GenInf\r
 '''\r
-from os import getenv\r
+import os\r
+import stat\r
+import codecs\r
+import md5\r
+from Core.FileHook import __FileHookOpen__\r
 from Library.String import GetSplitValueList\r
 from Library.Parsing import GenSection\r
 from Library.Parsing import GetWorkspacePackage\r
-from Library.Parsing import ConvertArchForInstall                     \r
+from Library.Parsing import ConvertArchForInstall\r
 from Library.Misc import SaveFileOnChange\r
 from Library.Misc import IsAllModuleList\r
 from Library.Misc import Sdict\r
 from Library.Misc import ConvertPath\r
 from Library.Misc import ConvertSpec\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import GetLocalValue\r
 from Library.CommentGenerating import GenHeaderCommentSection\r
 from Library.CommentGenerating import GenGenericCommentF\r
 from Library.CommentGenerating import _GetHelpStr\r
@@ -34,29 +40,107 @@ from Logger import ToolError
 import Logger.Log as Logger\r
 from Library import DataType as DT\r
 from GenMetaFile import GenMetaFileMisc\r
+from Library.UniClassObject import FormatUniEntry\r
+\r
 \r
 ## Transfer Module Object to Inf files\r
 #\r
 # Transfer all contents of a standard Module Object to an Inf file \r
 # @param ModuleObject: A Module Object  \r
 #\r
-def ModuleToInf(ModuleObject):\r
-    if not GlobalData.gWSPKG_LIST:  \r
+def ModuleToInf(ModuleObject, PackageObject=None, DistHeader=None):\r
+    if not GlobalData.gWSPKG_LIST:\r
         GlobalData.gWSPKG_LIST = GetWorkspacePackage()\r
-    \r
     #\r
     # Init global information for the file\r
     #\r
     ContainerFile = ModuleObject.GetFullPath()\r
+\r
     Content = ''\r
     #\r
-    # generate header comment section\r
+    # Generate file header, If any Abstract, Description, Copyright or License XML elements are missing, \r
+    # should 1) use the Abstract, Description, Copyright or License from the PackageSurfaceArea.Header elements \r
+    # that the module belongs to, or 2) if this is a stand-alone module that is not included in a PackageSurfaceArea, \r
+    # use the abstract, description, copyright or license from the DistributionPackage.Header elements.\r
+    #\r
+    ModuleAbstract = GetLocalValue(ModuleObject.GetAbstract())\r
+    if not ModuleAbstract and PackageObject:\r
+        ModuleAbstract = GetLocalValue(PackageObject.GetAbstract())\r
+    if not ModuleAbstract and DistHeader:\r
+        ModuleAbstract = GetLocalValue(DistHeader.GetAbstract())\r
+    ModuleDescription = GetLocalValue(ModuleObject.GetDescription())\r
+    if not ModuleDescription and PackageObject:\r
+        ModuleDescription = GetLocalValue(PackageObject.GetDescription())\r
+    if not ModuleDescription and DistHeader:\r
+        ModuleDescription = GetLocalValue(DistHeader.GetDescription())\r
+    ModuleCopyright = ''\r
+    for (Lang, Copyright) in ModuleObject.GetCopyright():\r
+        if Lang:\r
+            pass\r
+        ModuleCopyright = Copyright\r
+    if not ModuleCopyright and PackageObject:\r
+        for (Lang, Copyright) in PackageObject.GetCopyright():\r
+            if Lang:\r
+                pass\r
+            ModuleCopyright = Copyright\r
+    if not ModuleCopyright and DistHeader:\r
+        for (Lang, Copyright) in DistHeader.GetCopyright():\r
+            if Lang:\r
+                pass\r
+            ModuleCopyright = Copyright\r
+    ModuleLicense = ''\r
+    for (Lang, License) in ModuleObject.GetLicense():\r
+        if Lang:\r
+            pass\r
+        ModuleLicense = License\r
+    if not ModuleLicense and PackageObject:\r
+        for (Lang, License) in PackageObject.GetLicense():\r
+            if Lang:\r
+                pass\r
+            ModuleLicense = License\r
+    if not ModuleLicense and DistHeader:\r
+        for (Lang, License) in DistHeader.GetLicense():\r
+            if Lang:\r
+                pass\r
+            ModuleLicense = License\r
+\r
+    #\r
+    # Generate header comment section of INF file\r
     #        \r
-    Content += GenHeaderCommentSection(ModuleObject.GetAbstract(), \r
-                                       ModuleObject.GetDescription(), \r
-                                       ModuleObject.GetCopyright(), \r
-                                       ModuleObject.GetLicense())\r
-    \r
+    Content += GenHeaderCommentSection(ModuleAbstract,\r
+                                       ModuleDescription,\r
+                                       ModuleCopyright,\r
+                                       ModuleLicense)\r
+\r
+    #\r
+    # Generate Binary Header \r
+    # \r
+    for UserExtension in ModuleObject.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \\r
+        and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:\r
+            ModuleBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())\r
+            ModuleBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())\r
+            ModuleBinaryCopyright = ''\r
+            ModuleBinaryLicense = ''\r
+            for (Lang, Copyright) in UserExtension.GetBinaryCopyright():\r
+                ModuleBinaryCopyright = Copyright\r
+            for (Lang, License) in UserExtension.GetBinaryLicense():\r
+                ModuleBinaryLicense = License\r
+            if ModuleBinaryAbstract and ModuleBinaryDescription and \\r
+            ModuleBinaryCopyright and ModuleBinaryLicense:\r
+                Content += GenHeaderCommentSection(ModuleBinaryAbstract,\r
+                                           ModuleBinaryDescription,\r
+                                           ModuleBinaryCopyright,\r
+                                           ModuleBinaryLicense,\r
+                                           True)\r
+\r
+    #\r
+    # Generate MODULE_UNI_FILE for module\r
+    #\r
+    FileHeader = GenHeaderCommentSection(ModuleAbstract, ModuleDescription, ModuleCopyright, ModuleLicense, False, \\r
+                                         DT.TAB_COMMENT_EDK1_SPLIT)\r
+    GenModuleUNIEncodeFile(ModuleObject, FileHeader)\r
+\r
     #\r
     # Judge whether the INF file is an AsBuild INF.\r
     #\r
@@ -64,15 +148,12 @@ def ModuleToInf(ModuleObject):
         GlobalData.gIS_BINARY_INF = True\r
     else:\r
         GlobalData.gIS_BINARY_INF = False\r
-    \r
     #\r
     # for each section, maintain a dict, sorted arch will be its key, \r
     # statement list will be its data\r
     # { 'Arch1 Arch2 Arch3': [statement1, statement2],\r
     #   'Arch1' : [statement1, statement3] \r
     #  }\r
-    #\r
-    \r
     #\r
     # Gen section contents\r
     #\r
@@ -82,36 +163,110 @@ def ModuleToInf(ModuleObject):
     Content += GenPackages(ModuleObject)\r
     Content += GenPcdSections(ModuleObject)\r
     Content += GenSources(ModuleObject)\r
-    Content += GenProtocolPPiSections(ModuleObject.GetProtocolList(), True) \r
-    Content += GenProtocolPPiSections(ModuleObject.GetPpiList(), False) \r
-    Content += GenGuidSections(ModuleObject.GetGuidList())    \r
+    Content += GenProtocolPPiSections(ModuleObject.GetProtocolList(), True)\r
+    Content += GenProtocolPPiSections(ModuleObject.GetPpiList(), False)\r
+    Content += GenGuidSections(ModuleObject.GetGuidList())\r
     Content += GenBinaries(ModuleObject)\r
     Content += GenDepex(ModuleObject)\r
-    Content += GenUserExtensions(ModuleObject)        \r
-\r
+    Content += GenUserExtensions(ModuleObject)\r
     if ModuleObject.GetEventList() or ModuleObject.GetBootModeList() or ModuleObject.GetHobList():\r
-        Content += '\n\n'\r
+        Content += '\n'\r
     #\r
     # generate [Event], [BootMode], [Hob] section\r
     #\r
-    Content += GenSpecialSections(ModuleObject.GetEventList(), 'Event')    \r
+    Content += GenSpecialSections(ModuleObject.GetEventList(), 'Event')\r
     Content += GenSpecialSections(ModuleObject.GetBootModeList(), 'BootMode')\r
     Content += GenSpecialSections(ModuleObject.GetHobList(), 'Hob')\r
-\r
     SaveFileOnChange(ContainerFile, Content, False)\r
+    if DistHeader.ReadOnly:\r
+        os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
+    else:\r
+        os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)\r
     return ContainerFile\r
 \r
+## GenModuleUNIEncodeFile\r
+# GenModuleUNIEncodeFile, default is a UCS-2LE encode file\r
+#\r
+def GenModuleUNIEncodeFile(ModuleObject, UniFileHeader='', Encoding=DT.TAB_ENCODING_UTF16LE):\r
+    GenUNIFlag = False\r
+    OnlyLANGUAGE_EN_X = True\r
+    BinaryAbstract = []\r
+    BinaryDescription = []\r
+    #\r
+    # If more than one language code is used for any element that would be present in the MODULE_UNI_FILE, \r
+    # then the MODULE_UNI_FILE must be created.\r
+    #\r
+    for (Key, Value) in ModuleObject.GetAbstract() + ModuleObject.GetDescription():\r
+        if Key == DT.TAB_LANGUAGE_EN_X:\r
+            GenUNIFlag = True\r
+        else:\r
+            OnlyLANGUAGE_EN_X = False\r
+\r
+    for UserExtension in ModuleObject.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \\r
+        and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:\r
+            for (Key, Value) in UserExtension.GetBinaryAbstract():\r
+                if Key == DT.TAB_LANGUAGE_EN_X:\r
+                    GenUNIFlag = True\r
+                else:\r
+                    OnlyLANGUAGE_EN_X = False\r
+                BinaryAbstract.append((Key, Value))\r
+            for (Key, Value) in UserExtension.GetBinaryDescription():\r
+                if Key == DT.TAB_LANGUAGE_EN_X:\r
+                    GenUNIFlag = True\r
+                else:\r
+                    OnlyLANGUAGE_EN_X = False\r
+                BinaryDescription.append((Key, Value))\r
+\r
+\r
+    if not GenUNIFlag:\r
+        return\r
+    elif OnlyLANGUAGE_EN_X:\r
+        return\r
+    else:\r
+        ModuleObject.UNIFlag = True\r
+    ContainerFile = os.path.normpath(os.path.join(os.path.dirname(ModuleObject.GetFullPath()),\r
+                                                  (ModuleObject.GetBaseName() + '.uni')))\r
+    if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())):\r
+        os.makedirs(os.path.dirname(ModuleObject.GetFullPath()))\r
+\r
+    Content = UniFileHeader + os.linesep\r
+    Content += DT.END_OF_LINE\r
+\r
+    Content += FormatUniEntry('#string ' + DT.TAB_INF_ABSTRACT, ModuleObject.GetAbstract(), ContainerFile) + os.linesep\r
+\r
+    Content += FormatUniEntry('#string ' + DT.TAB_INF_DESCRIPTION, ModuleObject.GetDescription(), ContainerFile) \\r
+    + os.linesep\r
+\r
+    BinaryAbstractString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_ABSTRACT, BinaryAbstract, ContainerFile)\r
+    if BinaryAbstractString:\r
+        Content += BinaryAbstractString + os.linesep\r
+\r
+    BinaryDescriptionString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_DESCRIPTION, BinaryDescription, \\r
+                                             ContainerFile)\r
+    if BinaryDescriptionString:\r
+        Content += BinaryDescriptionString + os.linesep\r
+\r
+    if not os.path.exists(ContainerFile):\r
+        File = codecs.open(ContainerFile, 'wb', Encoding)\r
+        File.write(u'\uFEFF' + Content)\r
+        File.stream.close()\r
+    Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())\r
+    Md5Sum = Md5Sigature.hexdigest()\r
+    if (ContainerFile, Md5Sum) not in ModuleObject.FileList:\r
+        ModuleObject.FileList.append((ContainerFile, Md5Sum))\r
+\r
+    return ContainerFile\r
 def GenDefines(ModuleObject):\r
     #\r
     # generate [Defines] section\r
     #\r
-    Content = ''          \r
-    NewSectionDict = {}     \r
+    Content = ''\r
+    NewSectionDict = {}\r
     for UserExtension in ModuleObject.GetUserExtensionList():\r
         DefinesDict = UserExtension.GetDefinesDict()\r
         if not DefinesDict:\r
             continue\r
-        \r
         for Statement in DefinesDict:\r
             SortedArch = DT.TAB_ARCH_COMMON\r
             if Statement.strip().startswith(DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE):\r
@@ -123,52 +278,79 @@ def GenDefines(ModuleObject):
             if SortedArch in NewSectionDict:\r
                 NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]\r
             else:\r
-                NewSectionDict[SortedArch] = [Statement]        \r
-\r
+                NewSectionDict[SortedArch] = [Statement]\r
     SpecialStatementList = []\r
-    \r
     #\r
     # Add INF_VERSION statement firstly\r
     #\r
-    Statement = 'INF_VERSION = 0x00010017'\r
+    \r
+    LeftOffset = 31\r
+    # TAB_INF_DEFINES_INF_VERSION\r
+    Statement = (u'%s ' % DT.TAB_INF_DEFINES_INF_VERSION).ljust(LeftOffset) + u'= %s' % '0x00010017'\r
     SpecialStatementList.append(Statement)\r
 \r
+    # BaseName\r
     BaseName = ModuleObject.GetBaseName()\r
     if BaseName.startswith('.') or BaseName.startswith('-'):\r
         BaseName = '_' + BaseName\r
-    Statement = '%s = %s' % (DT.TAB_INF_DEFINES_BASE_NAME, BaseName)\r
+    Statement = (u'%s ' % DT.TAB_INF_DEFINES_BASE_NAME).ljust(LeftOffset) + u'= %s' % BaseName\r
     SpecialStatementList.append(Statement)\r
-    Statement = '%s = %s' % (DT.TAB_INF_DEFINES_FILE_GUID, ModuleObject.GetGuid())\r
-    SpecialStatementList.append(Statement)\r
-    Statement = '%s = %s' % (DT.TAB_INF_DEFINES_VERSION_STRING, ModuleObject.GetVersion())\r
+    \r
+    # TAB_INF_DEFINES_FILE_GUID\r
+    Statement = (u'%s ' % DT.TAB_INF_DEFINES_FILE_GUID).ljust(LeftOffset) + u'= %s' % ModuleObject.GetGuid()\r
     SpecialStatementList.append(Statement)\r
     \r
+    # TAB_INF_DEFINES_VERSION_STRING\r
+    Statement = (u'%s ' % DT.TAB_INF_DEFINES_VERSION_STRING).ljust(LeftOffset) + u'= %s' % ModuleObject.GetVersion()\r
+    SpecialStatementList.append(Statement)\r
+\r
+    # TAB_INF_DEFINES_VERSION_STRING\r
+    if ModuleObject.UNIFlag:\r
+        Statement = (u'%s ' % DT.TAB_INF_DEFINES_MODULE_UNI_FILE).ljust(LeftOffset) + \\r
+                    u'= %s' % ModuleObject.GetBaseName() + '.uni'\r
+        SpecialStatementList.append(Statement)\r
+\r
+    # TAB_INF_DEFINES_MODULE_TYPE\r
     if ModuleObject.GetModuleType():\r
-        Statement = '%s = %s' % (DT.TAB_INF_DEFINES_MODULE_TYPE, ModuleObject.GetModuleType())\r
+        Statement = (u'%s ' % DT.TAB_INF_DEFINES_MODULE_TYPE).ljust(LeftOffset) + u'= %s' % ModuleObject.GetModuleType()\r
         SpecialStatementList.append(Statement)\r
+\r
+    # TAB_INF_DEFINES_PCD_IS_DRIVER\r
     if ModuleObject.GetPcdIsDriver():\r
-        Statement = '%s = %s' % (DT.TAB_INF_DEFINES_PCD_IS_DRIVER, ModuleObject.GetPcdIsDriver())\r
+        Statement = (u'%s ' % DT.TAB_INF_DEFINES_PCD_IS_DRIVER).ljust(LeftOffset) + \\r
+                    u'= %s' % ModuleObject.GetPcdIsDriver()\r
         SpecialStatementList.append(Statement)\r
+\r
+    # TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION\r
     if ModuleObject.GetUefiSpecificationVersion():\r
-        Statement = '%s = %s' % (DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, \\r
-                                 ModuleObject.GetUefiSpecificationVersion())\r
+        Statement = (u'%s ' % DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION).ljust(LeftOffset) + \\r
+                    u'= %s' % ModuleObject.GetUefiSpecificationVersion()\r
         SpecialStatementList.append(Statement)\r
+\r
+    # TAB_INF_DEFINES_PI_SPECIFICATION_VERSION\r
     if ModuleObject.GetPiSpecificationVersion():\r
-        Statement = '%s = %s' % (DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION, ModuleObject.GetPiSpecificationVersion())\r
-        SpecialStatementList.append(Statement)        \r
+        Statement = (u'%s ' % DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION).ljust(LeftOffset) + \\r
+                    u'= %s' % ModuleObject.GetPiSpecificationVersion()\r
+        SpecialStatementList.append(Statement)\r
+\r
+    # LibraryClass\r
     for LibraryClass in ModuleObject.GetLibraryClassList():\r
         if LibraryClass.GetUsage() == DT.USAGE_ITEM_PRODUCES or \\r
            LibraryClass.GetUsage() == DT.USAGE_ITEM_SOMETIMES_PRODUCES:\r
-            Statement = '%s = %s' % (DT.TAB_INF_DEFINES_LIBRARY_CLASS, LibraryClass.GetLibraryClass())\r
+            Statement = (u'%s ' % DT.TAB_INF_DEFINES_LIBRARY_CLASS).ljust(LeftOffset) + \\r
+                        u'= %s' % LibraryClass.GetLibraryClass()\r
             if LibraryClass.GetSupModuleList():\r
                 Statement += '|' + DT.TAB_SPACE_SPLIT.join(l for l in LibraryClass.GetSupModuleList())\r
             SpecialStatementList.append(Statement)\r
+\r
+    # Spec Item\r
     for SpecItem in ModuleObject.GetSpecList():\r
         Spec, Version = SpecItem\r
         Spec = ConvertSpec(Spec)\r
         Statement = '%s %s = %s' % (DT.TAB_INF_DEFINES_SPEC, Spec, Version)\r
         SpecialStatementList.append(Statement)\r
-        \r
+\r
+    # Extern\r
     ExternList = []\r
     for Extern in ModuleObject.GetExternList():\r
         ArchList = Extern.GetSupArchList()\r
@@ -179,27 +361,23 @@ def GenDefines(ModuleObject):
         HelpStringList = Extern.GetHelpTextList()\r
         FFE = Extern.GetFeatureFlag()\r
         ExternList.append([ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList])\r
-    \r
     #\r
     # Add VALID_ARCHITECTURES information\r
     #\r
     ValidArchStatement = None\r
     if ModuleObject.SupArchList:\r
-        ValidArchStatement = '# ' + '\n'\r
+        ValidArchStatement = '\n' + '# ' + '\n'\r
         ValidArchStatement += '# The following information is for reference only and not required by the build tools.\n'\r
         ValidArchStatement += '# ' + '\n'\r
         ValidArchStatement += '# VALID_ARCHITECTURES = %s' % (' '.join(ModuleObject.SupArchList)) + '\n'\r
-        ValidArchStatement += '# ' + '\n'\r
-        \r
+        ValidArchStatement += '# '\r
     if DT.TAB_ARCH_COMMON not in NewSectionDict:\r
         NewSectionDict[DT.TAB_ARCH_COMMON] = []\r
     NewSectionDict[DT.TAB_ARCH_COMMON] = NewSectionDict[DT.TAB_ARCH_COMMON] + SpecialStatementList\r
     GenMetaFileMisc.AddExternToDefineSec(NewSectionDict, DT.TAB_ARCH_COMMON, ExternList)\r
     if ValidArchStatement is not None:\r
         NewSectionDict[DT.TAB_ARCH_COMMON] = NewSectionDict[DT.TAB_ARCH_COMMON] + [ValidArchStatement]\r
-        \r
     Content += GenSection('Defines', NewSectionDict)\r
-    \r
     return Content\r
 \r
 def GenLibraryClasses(ModuleObject):\r
@@ -223,17 +401,16 @@ def GenLibraryClasses(ModuleObject):
             FFE = LibraryClass.GetFeatureFlag()\r
             Statement += Name\r
             if FFE:\r
-                Statement += '|' + FFE \r
+                Statement += '|' + FFE\r
             ModuleList = LibraryClass.GetSupModuleList()\r
             ArchList = LibraryClass.GetSupArchList()\r
             for Index in xrange(0, len(ArchList)):\r
                 ArchList[Index] = ConvertArchForInstall(ArchList[Index])\r
             ArchList.sort()\r
             SortedArch = ' '.join(ArchList)\r
-            \r
             KeyList = []\r
             if not ModuleList or IsAllModuleList(ModuleList):\r
-                KeyList = [SortedArch]        \r
+                KeyList = [SortedArch]\r
             else:\r
                 ModuleString = DT.TAB_VALUE_SPLIT.join(l for l in ModuleList)\r
                 if not ArchList:\r
@@ -241,7 +418,6 @@ def GenLibraryClasses(ModuleObject):
                     KeyList = [SortedArch + '.' + ModuleString]\r
                 else:\r
                     KeyList = [Arch + '.' + ModuleString for Arch in ArchList]\r
-                                \r
             for Key in KeyList:\r
                 if Key in NewSectionDict:\r
                     NewSectionDict[Key] = NewSectionDict[Key] + [Statement]\r
@@ -254,9 +430,10 @@ def GenLibraryClasses(ModuleObject):
             if not BinaryFile.AsBuiltList:\r
                 continue\r
             for LibraryItem in BinaryFile.AsBuiltList[0].LibraryInstancesList:\r
-                Statement = '# Guid: ' +  LibraryItem.Guid + ' Version: ' + LibraryItem.Version\r
+                Statement = '# Guid: ' + LibraryItem.Guid + ' Version: ' + LibraryItem.Version\r
+\r
                 if len(BinaryFile.SupArchList) == 0:\r
-                    if LibraryClassDict.has_key('COMMON'):\r
+                    if LibraryClassDict.has_key('COMMON') and Statement not in LibraryClassDict['COMMON']:\r
                         LibraryClassDict['COMMON'].append(Statement)\r
                     else:\r
                         LibraryClassDict['COMMON'] = ['## @LIB_INSTANCES']\r
@@ -264,13 +441,15 @@ def GenLibraryClasses(ModuleObject):
                 else:\r
                     for Arch in BinaryFile.SupArchList:\r
                         if LibraryClassDict.has_key(Arch):\r
-                            LibraryClassDict[Arch].append(Statement)\r
+                            if Statement not in LibraryClassDict[Arch]:\r
+                                LibraryClassDict[Arch].append(Statement)\r
+                            else:\r
+                                continue\r
                         else:\r
                             LibraryClassDict[Arch] = ['## @LIB_INSTANCES']\r
                             LibraryClassDict[Arch].append(Statement)\r
-                    \r
         Content += GenSection('LibraryClasses', LibraryClassDict)\r
-    \r
+\r
     return Content\r
 \r
 def GenPackages(ModuleObject):\r
@@ -279,7 +458,7 @@ def GenPackages(ModuleObject):
     # generate [Packages] section\r
     #\r
     NewSectionDict = Sdict()\r
-    WorkspaceDir = getenv('WORKSPACE')\r
+    WorkspaceDir = GlobalData.gWORKSPACE\r
     for PackageDependency in ModuleObject.GetPackageDependencyList():\r
         #\r
         # Generate generic comment\r
@@ -288,11 +467,12 @@ def GenPackages(ModuleObject):
         HelpText = PackageDependency.GetHelpText()\r
         if HelpText:\r
             HelpStr = HelpText.GetString()\r
-            CommentStr = GenGenericCommentF(HelpStr)   \r
+            CommentStr = GenGenericCommentF(HelpStr)\r
         Statement = CommentStr\r
         Guid = PackageDependency.GetGuid()\r
         Version = PackageDependency.GetVersion()\r
         FFE = PackageDependency.GetFeatureFlag()\r
+        Path = ''\r
         #\r
         # find package path/name\r
         # \r
@@ -304,20 +484,18 @@ def GenPackages(ModuleObject):
         #\r
         # get relative path\r
         #\r
-        RelaPath = Path[Path.upper().find(WorkspaceDir.upper()) + len(WorkspaceDir) + 1:]\r
+        RelaPath = GetRelativePath(Path, WorkspaceDir)\r
         Statement += RelaPath.replace('\\', '/')\r
         if FFE:\r
-            Statement += '|' + FFE        \r
+            Statement += '|' + FFE\r
         ArchList = PackageDependency.GetSupArchList()\r
         ArchList.sort()\r
         SortedArch = ' '.join(ArchList)\r
         if SortedArch in NewSectionDict:\r
             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]\r
         else:\r
-            NewSectionDict[SortedArch] = [Statement]            \r
-\r
+            NewSectionDict[SortedArch] = [Statement]\r
     Content += GenSection('Packages', NewSectionDict)\r
-    \r
     return Content\r
 \r
 def GenSources(ModuleObject):\r
@@ -326,23 +504,20 @@ def GenSources(ModuleObject):
     #\r
     Content = ''\r
     NewSectionDict = {}\r
-    \r
-    for Source in ModuleObject.GetSourceFileList():    \r
+    for Source in ModuleObject.GetSourceFileList():\r
         SourceFile = Source.GetSourceFile()\r
         Family = Source.GetFamily()\r
         FeatureFlag = Source.GetFeatureFlag()\r
         SupArchList = Source.GetSupArchList()\r
         SupArchList.sort()\r
-        SortedArch = ' '.join(SupArchList)    \r
-\r
+        SortedArch = ' '.join(SupArchList)\r
         Statement = GenSourceStatement(ConvertPath(SourceFile), Family, FeatureFlag)\r
         if SortedArch in NewSectionDict:\r
             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]\r
         else:\r
             NewSectionDict[SortedArch] = [Statement]\r
-\r
     Content += GenSection('Sources', NewSectionDict)\r
-    \r
+\r
     return Content\r
 \r
 def GenDepex(ModuleObject):\r
@@ -359,7 +534,6 @@ def GenDepex(ModuleObject):
         SupModList = Depex.GetModuleType()\r
         Expression = Depex.GetDepex()\r
         Statement = CommentStr + Expression\r
-        \r
         SupArchList.sort()\r
         KeyList = []\r
         if not SupArchList:\r
@@ -370,17 +544,14 @@ def GenDepex(ModuleObject):
             for ModuleType in SupModList:\r
                 for Arch in SupArchList:\r
                     KeyList.append(ConvertArchForInstall(Arch) + '.' + ModuleType)\r
-                            \r
         for Key in KeyList:\r
             if Key in NewSectionDict:\r
                 NewSectionDict[Key] = NewSectionDict[Key] + [Statement]\r
             else:\r
                 NewSectionDict[Key] = [Statement]\r
-        \r
     Content += GenSection('Depex', NewSectionDict, False)\r
     \r
     return Content\r
-\r
 ## GenUserExtensions\r
 #\r
 # GenUserExtensions\r
@@ -388,17 +559,18 @@ def GenDepex(ModuleObject):
 def GenUserExtensions(ModuleObject):\r
     NewSectionDict = {}\r
     for UserExtension in ModuleObject.GetUserExtensionList():\r
+        if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID and \\r
+            UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:\r
+            continue\r
         if UserExtension.GetIdentifier() == 'Depex':\r
             continue\r
         Statement = UserExtension.GetStatement()\r
         if not Statement:\r
             continue\r
-        \r
         ArchList = UserExtension.GetSupArchList()\r
         for Index in xrange(0, len(ArchList)):\r
             ArchList[Index] = ConvertArchForInstall(ArchList[Index])\r
         ArchList.sort()\r
-                \r
         KeyList = []\r
         CommonPreFix = ''\r
         if UserExtension.GetUserID():\r
@@ -410,17 +582,16 @@ def GenUserExtensions(ModuleObject):
             if ArchList:\r
                 KeyList = [CommonPreFix + '.' + Arch for Arch in ArchList]\r
             else:\r
-                KeyList = [CommonPreFix]    \r
-        \r
+                KeyList = [CommonPreFix]\r
         for Key in KeyList:\r
             if Key in NewSectionDict:\r
                 NewSectionDict[Key] = NewSectionDict[Key] + [Statement]\r
             else:\r
                 NewSectionDict[Key] = [Statement]\r
     Content = GenSection('UserExtensions', NewSectionDict, False)\r
-    \r
+\r
     return Content\r
-    \r
+\r
 # GenSourceStatement\r
 #\r
 #  @param SourceFile: string of source file path/name\r
@@ -432,23 +603,21 @@ def GenUserExtensions(ModuleObject):
 #\r
 #  @retval Statement: The generated statement for source\r
 #\r
-def GenSourceStatement(SourceFile, Family, FeatureFlag, TagName=None, \r
+def GenSourceStatement(SourceFile, Family, FeatureFlag, TagName=None,\r
                        ToolCode=None, HelpStr=None):\r
     Statement = ''\r
     if HelpStr:\r
-        Statement += GenGenericCommentF(HelpStr)   \r
+        Statement += GenGenericCommentF(HelpStr)\r
     #\r
     # format of SourceFile|Family|TagName|ToolCode|FeatureFlag\r
     #\r
     Statement += SourceFile\r
-    \r
     if TagName == None:\r
         TagName = ''\r
     if ToolCode == None:\r
         ToolCode = ''\r
     if HelpStr == None:\r
         HelpStr = ''\r
-    \r
     if FeatureFlag:\r
         Statement += '|' + Family + '|' + TagName + '|' + ToolCode + '|' + FeatureFlag\r
     elif ToolCode:\r
@@ -457,7 +626,6 @@ def GenSourceStatement(SourceFile, Family, FeatureFlag, TagName=None,
         Statement += '|' + Family + '|' + TagName\r
     elif Family:\r
         Statement += '|' + Family\r
-    \r
     return Statement\r
 \r
 # GenBinaryStatement\r
@@ -466,7 +634,7 @@ def GenSourceStatement(SourceFile, Family, FeatureFlag, TagName=None,
 #  @param Value:     (Target, Family, TagName, Comment)\r
 #\r
 #\r
-def GenBinaryStatement(Key, Value):\r
+def GenBinaryStatement(Key, Value, SubTypeGuidValue=None):\r
     (FileName, FileType, FFE, SortedArch) = Key\r
     if SortedArch:\r
         pass\r
@@ -477,14 +645,14 @@ def GenBinaryStatement(Key, Value):
         Family = ''\r
         TagName = ''\r
         Comment = ''\r
-    \r
     if Comment:\r
         Statement = GenGenericCommentF(Comment)\r
     else:\r
         Statement = ''\r
-    \r
-    Statement += FileType + '|' + FileName\r
-\r
+    if FileType == 'SUBTYPE_GUID' and SubTypeGuidValue:\r
+        Statement += FileType + '|' + SubTypeGuidValue + '|' + FileName\r
+    else:\r
+        Statement += FileType + '|' + FileName\r
     if FileType in DT.BINARY_FILE_TYPE_UI_LIST + DT.BINARY_FILE_TYPE_VER_LIST:\r
         if FFE:\r
             Statement += '|' + Target + '|' + FFE\r
@@ -499,9 +667,7 @@ def GenBinaryStatement(Key, Value):
             Statement += '|' + Target + '|' + Family\r
         elif Target:\r
             Statement += '|' + Target\r
-\r
     return Statement\r
-\r
 ## GenGuidSections\r
 # \r
 #  @param GuidObjList: List of GuidObject\r
@@ -511,26 +677,21 @@ def GenGuidSections(GuidObjList):
     #\r
     # generate [Guids] section\r
     #\r
-    Content = '' \r
+    Content = ''\r
     GuidDict = Sdict()\r
-\r
     for Guid in GuidObjList:\r
         HelpTextList = Guid.GetHelpTextList()\r
         HelpStr = _GetHelpStr(HelpTextList)\r
-\r
         CName = Guid.GetCName()\r
         FFE = Guid.GetFeatureFlag()\r
         Statement = CName\r
         if FFE:\r
             Statement += '|' + FFE\r
-        \r
         Usage = Guid.GetUsage()\r
         GuidType = Guid.GetGuidTypeList()[0]\r
         VariableName = Guid.GetVariableName()\r
-        \r
         #\r
-        # we need to differentiate the generic comment and usage comment\r
-        # as multiple generic comment need to be put at first\r
+        # Differentiate the generic comment and usage comment as multiple generic comment need to be put at first\r
         #\r
         if Usage == DT.ITEM_UNDEFINED and GuidType == DT.ITEM_UNDEFINED:\r
             # generate list of generic comment\r
@@ -543,17 +704,15 @@ def GenGuidSections(GuidObjList):
                 Comment = ' # ' + Comment\r
             else:\r
                 Comment = ''\r
-            \r
             if Usage != DT.ITEM_UNDEFINED and GuidType == DT.ITEM_UNDEFINED:\r
-                Comment = '## ' + Usage + Comment\r
+                Comment = '## ' + Usage + ' ## GUID ' + Comment\r
             elif GuidType == 'Variable':\r
                 Comment = '## ' + Usage + ' ## ' + GuidType + ':' + VariableName + Comment\r
             else:\r
                 Comment = '## ' + Usage + ' ## ' + GuidType + Comment\r
-            \r
+\r
             if Comment:\r
                 Comment += '\n'\r
-        \r
         #\r
         # merge duplicate items\r
         #\r
@@ -562,18 +721,15 @@ def GenGuidSections(GuidObjList):
         SortedArch = ' '.join(ArchList)\r
         if (Statement, SortedArch) in GuidDict:\r
             PreviousComment = GuidDict[Statement, SortedArch]\r
-            Comment = PreviousComment +  Comment     \r
+            Comment = PreviousComment + Comment\r
         GuidDict[Statement, SortedArch] = Comment\r
-\r
-    \r
-    NewSectionDict = GenMetaFileMisc.TransferDict(GuidDict) \r
-\r
+    NewSectionDict = GenMetaFileMisc.TransferDict(GuidDict, 'INF_GUID')\r
     #\r
     # generate the section contents\r
     #\r
     if NewSectionDict:\r
         Content = GenSection('Guids', NewSectionDict)\r
-    \r
+\r
     return Content\r
 \r
 ## GenProtocolPPiSections\r
@@ -587,19 +743,15 @@ def GenProtocolPPiSections(ObjList, IsProtocol):
     for Object in ObjList:\r
         HelpTextList = Object.GetHelpTextList()\r
         HelpStr = _GetHelpStr(HelpTextList)\r
-\r
         CName = Object.GetCName()\r
         FFE = Object.GetFeatureFlag()\r
         Statement = CName\r
         if FFE:\r
             Statement += '|' + FFE\r
-        \r
         Usage = Object.GetUsage()\r
         Notify = Object.GetNotify()\r
-        \r
         #\r
-        # we need to differentiate the generic comment and usage comment\r
-        # as consecutive generic comment need to be put together\r
+        # Differentiate the generic comment and usage comment as consecutive generic comment need to be put together\r
         #\r
         if Usage == DT.ITEM_UNDEFINED and Notify == '':\r
             # generate list of generic comment\r
@@ -612,7 +764,6 @@ def GenProtocolPPiSections(ObjList, IsProtocol):
                 Comment = ' # ' + Comment\r
             else:\r
                 Comment = ''\r
-            \r
             if Usage == DT.ITEM_UNDEFINED and not Comment and Notify == '':\r
                 Comment = ''\r
             else:\r
@@ -620,10 +771,8 @@ def GenProtocolPPiSections(ObjList, IsProtocol):
                     Comment = '## ' + Usage + ' ## ' + 'NOTIFY' + Comment\r
                 else:\r
                     Comment = '## ' + Usage + Comment\r
-           \r
             if Comment:\r
                 Comment += '\n'\r
-        \r
         #\r
         # merge duplicate items\r
         #\r
@@ -634,9 +783,7 @@ def GenProtocolPPiSections(ObjList, IsProtocol):
             PreviousComment = Dict[Statement, SortedArch]\r
             Comment = PreviousComment + Comment\r
         Dict[Statement, SortedArch] = Comment\r
-    \r
-    NewSectionDict = GenMetaFileMisc.TransferDict(Dict)         \r
-\r
+    NewSectionDict = GenMetaFileMisc.TransferDict(Dict, 'INF_PPI_PROTOCOL')\r
     #\r
     # generate the section contents\r
     #\r
@@ -645,7 +792,7 @@ def GenProtocolPPiSections(ObjList, IsProtocol):
             Content = GenSection('Protocols', NewSectionDict)\r
         else:\r
             Content = GenSection('Ppis', NewSectionDict)\r
-    \r
+\r
     return Content\r
 \r
 ## GenPcdSections\r
@@ -662,7 +809,6 @@ def GenPcdSections(ModuleObject):
         for Pcd in ModuleObject.GetPcdList():\r
             HelpTextList = Pcd.GetHelpTextList()\r
             HelpStr = _GetHelpStr(HelpTextList)\r
-    \r
             Statement = ''\r
             CName = Pcd.GetCName()\r
             TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()\r
@@ -673,7 +819,6 @@ def GenPcdSections(ModuleObject):
             else:\r
                 Dict = Sdict()\r
                 ItemTypeDict[ItemType] = Dict\r
-                \r
             FFE = Pcd.GetFeatureFlag()\r
             Statement += TokenSpaceGuidCName + '.' + CName\r
             if DefaultValue:\r
@@ -682,18 +827,14 @@ def GenPcdSections(ModuleObject):
                     Statement += '|' + FFE\r
             elif FFE:\r
                 Statement += '||' + FFE\r
-    \r
             #\r
             # Generate comment\r
             #\r
             Usage = Pcd.GetValidUsage()\r
-            \r
-            #\r
             # if FeatureFlag Pcd, then assume all Usage is CONSUMES\r
-            #\r
             if ItemType == DT.TAB_INF_FEATURE_PCD:\r
                 Usage = DT.USAGE_ITEM_CONSUMES\r
-            if Usage == DT.ITEM_UNDEFINED or (ItemType == DT.TAB_INF_FEATURE_PCD):\r
+            if Usage == DT.ITEM_UNDEFINED:\r
                 # generate list of generic comment\r
                 Comment = GenGenericCommentF(HelpStr)\r
             else:\r
@@ -704,12 +845,9 @@ def GenPcdSections(ModuleObject):
                     Comment = ' # ' + Comment\r
                 else:\r
                     Comment = ''\r
-    \r
                 Comment = '## ' + Usage + Comment\r
-               \r
                 if Comment:\r
                     Comment += '\n'\r
-        \r
             #\r
             # Merge duplicate entries\r
             #\r
@@ -719,15 +857,11 @@ def GenPcdSections(ModuleObject):
             if (Statement, SortedArch) in Dict:\r
                 PreviousComment = Dict[Statement, SortedArch]\r
                 Comment = PreviousComment + Comment\r
-            Dict[Statement, SortedArch] = Comment             \r
-                 \r
+            Dict[Statement, SortedArch] = Comment\r
         for ItemType in ItemTypeDict:\r
-            #\r
             # First we need to transfer the Dict to use SortedArch as key\r
-            #\r
             Dict = ItemTypeDict[ItemType]\r
-            NewSectionDict = GenMetaFileMisc.TransferDict(Dict)   \r
-            \r
+            NewSectionDict = GenMetaFileMisc.TransferDict(Dict, 'INF_PCD')\r
             if NewSectionDict:\r
                 Content += GenSection(ItemType, NewSectionDict)\r
     #\r
@@ -736,7 +870,7 @@ def GenPcdSections(ModuleObject):
     else:\r
         Content += GenAsBuiltPacthPcdSections(ModuleObject)\r
         Content += GenAsBuiltPcdExSections(ModuleObject)\r
-    \r
+\r
     return Content\r
 \r
 ## GenPcdSections\r
@@ -746,8 +880,8 @@ def GenAsBuiltPacthPcdSections(ModuleObject):
     PatchPcdDict = {}\r
     for BinaryFile in ModuleObject.GetBinaryFileList():\r
         if not BinaryFile.AsBuiltList:\r
-            continue            \r
-        for PatchPcd in BinaryFile.AsBuiltList[0].PatchPcdList:      \r
+            continue\r
+        for PatchPcd in BinaryFile.AsBuiltList[0].PatchPcdList:\r
             TokenSpaceName = ''\r
             PcdCName = PatchPcd.CName\r
             PcdValue = PatchPcd.DefaultValue\r
@@ -758,31 +892,38 @@ def GenAsBuiltPacthPcdSections(ModuleObject):
             HelpString = ''\r
             for HelpStringItem in HelpTextList:\r
                 for HelpLine in GetSplitValueList(HelpStringItem.String, '\n'):\r
-                    HelpString += '# ' + HelpLine + '\n'\r
-                    \r
-            TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList, \r
-                                                                     TokenSpaceGuidValue, \r
+                    HelpString += '## ' + HelpLine + '\n'\r
+            TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList,\r
+                                                                     TokenSpaceGuidValue,\r
                                                                      Token)\r
-            if TokenSpaceName == '' or PcdCName == '':    \r
-                Logger.Error("Upt", \r
+            if TokenSpaceName == '' or PcdCName == '':\r
+                Logger.Error("Upt",\r
                              ToolError.RESOURCE_NOT_AVAILABLE,\r
-                             ST.ERR_INSTALL_FILE_DEC_FILE_ERROR%(TokenSpaceGuidValue, Token), \r
-                             File=ModuleObject.GetFullPath())                 \r
-            Statement = HelpString[:-3] + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue + ' | ' + PcdOffset\r
-            \r
-            if len(BinaryFile.SupArchList) == 0:\r
-                if PatchPcdDict.has_key('COMMON'):\r
-                    PatchPcdDict['COMMON'].append(Statement)\r
+                             ST.ERR_INSTALL_FILE_DEC_FILE_ERROR % (TokenSpaceGuidValue, Token),\r
+                             File=ModuleObject.GetFullPath())\r
+            Statement = HelpString + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue + ' | ' + \\r
+                         PcdOffset + DT.TAB_SPACE_SPLIT\r
+            #\r
+            # Use binary file's Arch to be Pcd's Arch \r
+            #\r
+            ArchList = []\r
+            FileNameObjList = BinaryFile.GetFileNameList()\r
+            if FileNameObjList:\r
+                ArchList = FileNameObjList[0].GetSupArchList()\r
+            if len(ArchList) == 0:\r
+                if PatchPcdDict.has_key(DT.TAB_ARCH_COMMON):\r
+                    if Statement not in PatchPcdDict[DT.TAB_ARCH_COMMON]:\r
+                        PatchPcdDict[DT.TAB_ARCH_COMMON].append(Statement)\r
                 else:\r
-                    PatchPcdDict['COMMON'] = [Statement]\r
+                    PatchPcdDict[DT.TAB_ARCH_COMMON] = [Statement]\r
             else:\r
-                for Arch in BinaryFile.SupArchList:\r
+                for Arch in ArchList:\r
                     if PatchPcdDict.has_key(Arch):\r
-                        PatchPcdDict[Arch].append(Statement)\r
+                        if Statement not in PatchPcdDict[Arch]:\r
+                            PatchPcdDict[Arch].append(Statement)\r
                     else:\r
                         PatchPcdDict[Arch] = [Statement]\r
-    return GenSection('PatchPcd', PatchPcdDict)\r
-\r
+    return GenSection(DT.TAB_INF_PATCH_PCD, PatchPcdDict)\r
 ## GenPcdSections\r
 #\r
 #\r
@@ -790,42 +931,49 @@ def GenAsBuiltPcdExSections(ModuleObject):
     PcdExDict = {}\r
     for BinaryFile in ModuleObject.GetBinaryFileList():\r
         if not BinaryFile.AsBuiltList:\r
-            continue   \r
+            continue\r
         for PcdExItem in BinaryFile.AsBuiltList[0].PcdExValueList:\r
             TokenSpaceName = ''\r
             PcdCName = PcdExItem.CName\r
-            PcdValue = PcdExItem.DefaultValue\r
             TokenSpaceGuidValue = PcdExItem.TokenSpaceGuidValue\r
             Token = PcdExItem.Token\r
             HelpTextList = PcdExItem.HelpTextList\r
             HelpString = ''\r
             for HelpStringItem in HelpTextList:\r
                 for HelpLine in GetSplitValueList(HelpStringItem.String, '\n'):\r
-                    HelpString += '# ' + HelpLine + '\n'            \r
-            TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList, \r
+                    HelpString += '## ' + HelpLine + '\n'\r
+            TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList,\r
                                                                      TokenSpaceGuidValue, Token)\r
-            \r
-            if TokenSpaceName == '' or PcdCName == '':    \r
+            if TokenSpaceName == '' or PcdCName == '':\r
                 Logger.Error("Upt",\r
                              ToolError.RESOURCE_NOT_AVAILABLE,\r
-                             ST.ERR_INSTALL_FILE_DEC_FILE_ERROR%(TokenSpaceGuidValue, Token), \r
-                             File=ModuleObject.GetFullPath()) \r
-                                      \r
-            Statement = HelpString[:-3] + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue\r
-            \r
-            if len(BinaryFile.SupArchList) == 0:\r
+                             ST.ERR_INSTALL_FILE_DEC_FILE_ERROR % (TokenSpaceGuidValue, Token),\r
+                             File=ModuleObject.GetFullPath())\r
+\r
+            Statement = HelpString + TokenSpaceName + DT.TAB_SPLIT + PcdCName + DT.TAB_SPACE_SPLIT\r
+\r
+            #\r
+            # Use binary file's Arch to be Pcd's Arch \r
+            #\r
+            ArchList = []\r
+            FileNameObjList = BinaryFile.GetFileNameList()\r
+            if FileNameObjList:\r
+                ArchList = FileNameObjList[0].GetSupArchList()\r
+\r
+            if len(ArchList) == 0:\r
                 if PcdExDict.has_key('COMMON'):\r
                     PcdExDict['COMMON'].append(Statement)\r
                 else:\r
                     PcdExDict['COMMON'] = [Statement]\r
             else:\r
-                for Arch in BinaryFile.SupArchList:\r
+                for Arch in ArchList:\r
                     if PcdExDict.has_key(Arch):\r
-                        PcdExDict[Arch].append(Statement)\r
+                        if Statement not in PcdExDict[Arch]:\r
+                            PcdExDict[Arch].append(Statement)\r
                     else:\r
                         PcdExDict[Arch] = [Statement]\r
     return GenSection('PcdEx', PcdExDict)\r
-               \r
+\r
 ## GenSpecialSections\r
 #  generate special sections for Event/BootMode/Hob\r
 #\r
@@ -843,7 +991,6 @@ def GenSpecialSections(ObjectList, SectionName):
         HelpTextList = Obj.GetHelpTextList()\r
         HelpStr = _GetHelpStr(HelpTextList)\r
         CommentStr = GenGenericCommentF(HelpStr)\r
-        \r
         if SectionName == 'Hob':\r
             Type = Obj.GetHobType()\r
         elif SectionName == 'Event':\r
@@ -852,25 +999,20 @@ def GenSpecialSections(ObjectList, SectionName):
             Type = Obj.GetSupportedBootModes()\r
         else:\r
             assert(SectionName)\r
-        \r
         Usage = Obj.GetUsage()\r
         Statement = ' ' + Type + ' ## ' + Usage\r
-        \r
         if CommentStr in ['#\n', '#\n#\n']:\r
             CommentStr = '#\n#\n#\n'\r
         #\r
-        # the first head comment line should start with '##\n', \r
-        # if it starts with '#\n', then add one '#'\r
+        # the first head comment line should start with '##\n', if it starts with '#\n', then add one '#'\r
         # else add '##\n' to meet the format defined in INF spec\r
         #\r
         if CommentStr.startswith('#\n'):\r
             CommentStr = '#' + CommentStr\r
         elif CommentStr:\r
             CommentStr = '##\n' + CommentStr\r
-\r
         if CommentStr and not CommentStr.endswith('\n#\n'):\r
-            CommentStr = CommentStr + '#\n' \r
-        \r
+            CommentStr = CommentStr + '#\n'\r
         NewStateMent = CommentStr + Statement\r
         SupArch = Obj.GetSupArchList()\r
         SupArch.sort()\r
@@ -879,20 +1021,17 @@ def GenSpecialSections(ObjectList, SectionName):
             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [NewStateMent]\r
         else:\r
             NewSectionDict[SortedArch] = [NewStateMent]\r
-    \r
     SectionContent = GenSection(SectionName, NewSectionDict)\r
     SectionContent = SectionContent.strip()\r
     if SectionContent:\r
         Content = '# ' + ('\n' + '# ').join(GetSplitValueList(SectionContent, '\n'))\r
         Content = Content.lstrip()\r
     #\r
-    # add two empty line after the generated section content to differentiate \r
-    # it between other possible sections\r
-    #\r
-    if Content: \r
+    # add two empty line after the generated section content to differentiate it between other possible sections\r
+    # \r
+    if Content:\r
         Content += '\n#\n#\n'\r
     return Content\r
-\r
 ## GenBuildOptions\r
 #\r
 #\r
@@ -912,7 +1051,6 @@ def GenBuildOptions(ModuleObject):
                     NewSectionDict[Arch] = NewSectionDict[Arch] + [BuildOptionDict[Arch]]\r
                 else:\r
                     NewSectionDict[Arch] = [BuildOptionDict[Arch]]\r
-    \r
         Content = GenSection('BuildOptions', NewSectionDict)\r
     else:\r
         BuildOptionDict = {}\r
@@ -920,7 +1058,7 @@ def GenBuildOptions(ModuleObject):
             if not BinaryFile.AsBuiltList:\r
                 continue\r
             for BuilOptionItem in BinaryFile.AsBuiltList[0].BinaryBuildFlagList:\r
-                Statement = '#' +  BuilOptionItem.AsBuiltOptionFlags\r
+                Statement = '#' + BuilOptionItem.AsBuiltOptionFlags\r
                 if len(BinaryFile.SupArchList) == 0:\r
                     if BuildOptionDict.has_key('COMMON'):\r
                         if Statement not in BuildOptionDict['COMMON']:\r
@@ -936,11 +1074,9 @@ def GenBuildOptions(ModuleObject):
                         else:\r
                             BuildOptionDict[Arch] = ['## @AsBuilt']\r
                             BuildOptionDict[Arch].append(Statement)\r
-                    \r
         Content = GenSection('BuildOptions', BuildOptionDict)\r
-    \r
-    return Content\r
 \r
+    return Content\r
 ## GenBinaries\r
 #\r
 #\r
@@ -951,7 +1087,6 @@ def GenBinaries(ModuleObject):
         BinariesDict = UserExtension.GetBinariesDict()\r
         if BinariesDict:\r
             break\r
-        \r
     for BinaryFile in ModuleObject.GetBinaryFileList():\r
         FileNameObjList = BinaryFile.GetFileNameList()\r
         for FileNameObj in FileNameObjList:\r
@@ -960,10 +1095,8 @@ def GenBinaries(ModuleObject):
             FFE = FileNameObj.GetFeatureFlag()\r
             ArchList = FileNameObj.GetSupArchList()\r
             ArchList.sort()\r
-            SortedArch = ' '.join(ArchList)      \r
-            \r
+            SortedArch = ' '.join(ArchList)\r
             Key = (FileName, FileType, FFE, SortedArch)\r
-\r
             if Key in BinariesDict:\r
                 ValueList = BinariesDict[Key]\r
                 for ValueItem in ValueList:\r
@@ -973,16 +1106,19 @@ def GenBinaries(ModuleObject):
                     else:\r
                         NewSectionDict[SortedArch] = [Statement]\r
                 #\r
-                # as we already generated statement for this DictKey\r
-                # here set the Valuelist to be empty to avoid generate duplicate entries \r
-                # as the DictKey may have multiple entries\r
+                # as we already generated statement for this DictKey here set the Valuelist to be empty \r
+                # to avoid generate duplicate entries as the DictKey may have multiple entries\r
                 #\r
                 BinariesDict[Key] = []\r
             else:\r
-                Statement = GenBinaryStatement(Key, None)\r
+                if FileType == 'SUBTYPE_GUID' and FileNameObj.GetGuidValue():\r
+                    Statement = GenBinaryStatement(Key, None, FileNameObj.GetGuidValue())\r
+                else:\r
+                    Statement = GenBinaryStatement(Key, None)\r
                 if SortedArch in NewSectionDict:\r
                     NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]\r
                 else:\r
-                    NewSectionDict[SortedArch] = [Statement]               \r
\r
-    return GenSection('Binaries', NewSectionDict)
\ No newline at end of file
+                    NewSectionDict[SortedArch] = [Statement]\r
+    Content = GenSection('Binaries', NewSectionDict)\r
+\r
+    return Content\r
index 54c113a9d06b8e52bf81881750c71d42dc529e66..0a8624c67fafebeed26905d66e28909318b85d3a 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 # This file contained the miscellaneous routines for GenMetaFile usage.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -28,10 +28,11 @@ from Parser.DecParser import Dec
 #  @param ExternList:  string of source file FeatureFlag field\r
 #   \r
 def AddExternToDefineSec(SectionDict, Arch, ExternList):\r
+    LeftOffset = 31\r
     for ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList in ExternList:\r
         if Arch or ArchList:\r
             if EntryPoint:\r
-                Statement = '%s = %s' % (DT.TAB_INF_DEFINES_ENTRY_POINT, EntryPoint)\r
+                Statement = (u'%s ' % DT.TAB_INF_DEFINES_ENTRY_POINT).ljust(LeftOffset) + u'= %s' % EntryPoint\r
                 if FFE:\r
                     Statement += ' | %s' % FFE\r
                 if len(HelpStringList) > 0:\r
@@ -39,37 +40,40 @@ def AddExternToDefineSec(SectionDict, Arch, ExternList):
                 if len(HelpStringList) > 1:\r
                     Statement = Statement + HelpStringList[1].GetString()\r
                 SectionDict[Arch] = SectionDict[Arch] + [Statement]\r
+\r
             if UnloadImage:\r
-                Statement = '%s = %s' % (DT.TAB_INF_DEFINES_UNLOAD_IMAGE, UnloadImage)\r
+                Statement = (u'%s ' % DT.TAB_INF_DEFINES_UNLOAD_IMAGE).ljust(LeftOffset) + u'= %s' % UnloadImage\r
                 if FFE:\r
                     Statement += ' | %s' % FFE\r
-                \r
+\r
                 if len(HelpStringList) > 0:\r
                     Statement = HelpStringList[0].GetString() + '\n' + Statement\r
                 if len(HelpStringList) > 1:\r
                     Statement = Statement + HelpStringList[1].GetString()\r
                 SectionDict[Arch] = SectionDict[Arch] + [Statement]\r
+\r
             if Constructor:\r
-                Statement = '%s = %s' % (DT.TAB_INF_DEFINES_CONSTRUCTOR, Constructor)\r
+                Statement = (u'%s ' % DT.TAB_INF_DEFINES_CONSTRUCTOR).ljust(LeftOffset) + u'= %s' % Constructor\r
                 if FFE:\r
                     Statement += ' | %s' % FFE\r
-                    \r
+\r
                 if len(HelpStringList) > 0:\r
                     Statement = HelpStringList[0].GetString() + '\n' + Statement\r
                 if len(HelpStringList) > 1:\r
-                    Statement = Statement + HelpStringList[1].GetString()      \r
-                SectionDict[Arch] = SectionDict[Arch] + [Statement]  \r
+                    Statement = Statement + HelpStringList[1].GetString()\r
+                SectionDict[Arch] = SectionDict[Arch] + [Statement]\r
+\r
             if Destructor:\r
-                Statement = '%s = %s' % (DT.TAB_INF_DEFINES_DESTRUCTOR, Destructor)\r
+                Statement = (u'%s ' % DT.TAB_INF_DEFINES_DESTRUCTOR).ljust(LeftOffset) + u'= %s' % Destructor\r
                 if FFE:\r
                     Statement += ' | %s' % FFE\r
-                    \r
+\r
                 if len(HelpStringList) > 0:\r
                     Statement = HelpStringList[0].GetString() + '\n' + Statement\r
                 if len(HelpStringList) > 1:\r
                     Statement = Statement + HelpStringList[1].GetString()\r
                 SectionDict[Arch] = SectionDict[Arch] + [Statement]\r
-                \r
+\r
 ## ObtainPcdName\r
 #\r
 # Using TokenSpaceGuidValue and Token to obtain PcdName from DEC file\r
@@ -81,7 +85,7 @@ def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
         #\r
         Guid = PackageDependency.GetGuid()\r
         Version = PackageDependency.GetVersion()\r
-          \r
+\r
         #\r
         # find package path/name\r
         # \r
@@ -90,16 +94,22 @@ def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
                 if (not Version) or (Version == PkgInfo[2]):\r
                     Path = PkgInfo[3]\r
                     break\r
-    \r
-        DecFile = Dec(Path)\r
+\r
+        DecFile = None\r
+        if Path not in GlobalData.gPackageDict:\r
+            DecFile = Dec(Path)\r
+            GlobalData.gPackageDict[Path] = DecFile\r
+        else:\r
+            DecFile = GlobalData.gPackageDict[Path]\r
+\r
         DecGuidsDict = DecFile.GetGuidSectionObject().ValueDict\r
         DecPcdsDict = DecFile.GetPcdSectionObject().ValueDict\r
-        \r
+\r
         TokenSpaceGuidName = ''\r
         PcdCName = ''\r
         TokenSpaceGuidNameFound = False\r
         PcdCNameFound = False\r
-        \r
+\r
         #\r
         # Get TokenSpaceGuidCName from Guids section \r
         #\r
@@ -108,24 +118,24 @@ def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
             if TokenSpaceGuidNameFound:\r
                 break\r
             for GuidItem in GuidList:\r
-                if TokenSpaceGuidValue == GuidItem.GuidString:\r
+                if TokenSpaceGuidValue.upper() == GuidItem.GuidString.upper():\r
                     TokenSpaceGuidName = GuidItem.GuidCName\r
                     TokenSpaceGuidNameFound = True\r
                     break\r
-    \r
+\r
         #\r
         # Retrieve PcdCName from Pcds Section\r
         #\r
         for PcdKey in DecPcdsDict:\r
             PcdList = DecPcdsDict[PcdKey]\r
             if PcdCNameFound:\r
-                break\r
+                return TokenSpaceGuidName, PcdCName\r
             for PcdItem in PcdList:\r
                 if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.TokenValue:\r
                     PcdCName = PcdItem.TokenCName\r
                     PcdCNameFound = True\r
-                    break        \r
-        \r
+                    break\r
+\r
     return TokenSpaceGuidName, PcdCName\r
 \r
 ## _TransferDict\r
@@ -133,23 +143,35 @@ def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
 #  (GenericComment, UsageComment) as value into a dict that using SortedArch as\r
 #  key and NewStatement as value \r
 #\r
-def TransferDict(OrigDict):\r
+def TransferDict(OrigDict, Type=None):\r
     NewDict = {}\r
-\r
+    LeftOffset = 0\r
+    if Type in ['INF_GUID', 'INF_PPI_PROTOCOL']:\r
+        LeftOffset = 45\r
+    if Type in ['INF_PCD']:\r
+        LeftOffset = 75\r
+    if LeftOffset > 0:\r
+        for Statement, SortedArch in OrigDict:\r
+            if len(Statement) > LeftOffset:\r
+                LeftOffset = len(Statement)\r
+        \r
     for Statement, SortedArch in OrigDict:\r
         Comment = OrigDict[Statement, SortedArch]\r
         #\r
         # apply the NComment/1Comment rule\r
         #\r
-        if Comment.find('\n') != len(Comment) - 1:    \r
+        if Comment.find('\n') != len(Comment) - 1:\r
             NewStateMent = Comment + Statement\r
         else:\r
-            NewStateMent = Statement + ' ' + Comment.rstrip('\n')\r
+            if LeftOffset:\r
+                NewStateMent = Statement.ljust(LeftOffset) + ' ' + Comment.rstrip('\n')\r
+            else:\r
+                NewStateMent = Statement + ' ' + Comment.rstrip('\n')\r
 \r
         if SortedArch in NewDict:\r
             NewDict[SortedArch] = NewDict[SortedArch] + [NewStateMent]\r
         else:\r
             NewDict[SortedArch] = [NewStateMent]\r
 \r
-    return NewDict                \r
-                
\ No newline at end of file
+    return NewDict\r
+\r
index 776196e8ea8b44a684c64f265ce6c8f043995343..3084b60bff3f0fb566adbcafc2a68c8d18816d03 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Install distribution package.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -17,12 +17,14 @@ Install a distribution package
 ##\r
 # Import Modules\r
 #\r
+from Core.FileHook import __FileHookOpen__\r
 import os.path\r
 from os import chmod\r
 from os import SEEK_SET\r
 from os import SEEK_END\r
 import stat\r
 import md5\r
+import copy\r
 from sys import stdin\r
 from sys import platform\r
 from shutil import rmtree\r
@@ -42,7 +44,6 @@ from Logger.ToolError import FORMAT_INVALID
 from Logger.ToolError import FILE_TYPE_MISMATCH\r
 import Logger.Log as Logger\r
 \r
-from Library.Misc import CheckEnvVariable\r
 from Library.Misc import Sdict\r
 from Library.Misc import ConvertPath\r
 from Library.ParserValidate import IsValidInstallPath\r
@@ -83,7 +84,6 @@ def InstallNewPackage(WorkspaceDir, Path, CustomPath = False):
     Input = Input.replace('\r', '').replace('\n', '')\r
     return InstallNewPackage(WorkspaceDir, Input, False)\r
 \r
-\r
 ## InstallNewModule\r
 #\r
 # @param WorkspaceDir:   Workspace Directory\r
@@ -133,10 +133,9 @@ def InstallNewFile(WorkspaceDir, File):
 #\r
 # UnZipDp\r
 #\r
-def UnZipDp(WorkspaceDir, Options, DataBase):\r
+def UnZipDp(WorkspaceDir, DpPkgFileName):\r
     ContentZipFile = None\r
     Logger.Quiet(ST.MSG_UZIP_PARSE_XML)\r
-    DpPkgFileName = Options.PackageFile\r
     DistFile = PackageFile(DpPkgFileName)\r
     \r
     DpDescFileName, ContentFileName = GetDPFile(DistFile.GetZipFile())\r
@@ -156,26 +155,7 @@ def UnZipDp(WorkspaceDir, Options, DataBase):
         DistPkg.Header.RePackage = False\r
     if DistPkg.Header.ReadOnly == '':\r
         DistPkg.Header.ReadOnly = False\r
-    \r
-    #\r
-    # prepare check dependency\r
-    #\r
-    Dep = DependencyRules(DataBase)\r
-    #\r
-    # Check distribution package installed or not\r
-    #\r
-    if Dep.CheckDpExists(DistPkg.Header.GetGuid(),\r
-        DistPkg.Header.GetVersion()):\r
-        Logger.Error("InstallPkg", UPT_ALREADY_INSTALLED_ERROR,\r
-            ST.WRN_DIST_PKG_INSTALLED)\r
-    #\r
-    # Check distribution dependency (all module dependency should be\r
-    # satisfied)\r
-    #\r
-    if not Dep.CheckDpDepexSatisfied(DistPkg):\r
-        Logger.Error("InstallPkg", UNKNOWN_ERROR,\r
-            ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,\r
-            ExtraData=DistPkg.Header.Name)\r
+\r
     #\r
     # unzip contents.zip file\r
     #\r
@@ -185,7 +165,7 @@ def UnZipDp(WorkspaceDir, Options, DataBase):
         Logger.Error("InstallPkg", FILE_NOT_FOUND,\r
             ST.ERR_FILE_BROKEN % ContentFileName)\r
 \r
-    FilePointer = open(ContentFile, "rb")\r
+    FilePointer = __FileHookOpen__(ContentFile, "rb")\r
     #\r
     # Assume no archive comment.\r
     #\r
@@ -204,13 +184,13 @@ def UnZipDp(WorkspaceDir, Options, DataBase):
     # verify MD5 signature when existed\r
     #\r
     if DistPkg.Header.Signature != '':\r
-        Md5Sigature = md5.new(open(ContentFile, 'rb').read())\r
+        Md5Sigature = md5.new(__FileHookOpen__(ContentFile, 'rb').read())\r
         if DistPkg.Header.Signature != Md5Sigature.hexdigest():\r
             ContentZipFile.Close()\r
             Logger.Error("InstallPkg", FILE_CHECKSUM_FAILURE,\r
                 ExtraData=ContentFile)\r
 \r
-    return DistPkg, Dep, ContentZipFile, DpPkgFileName\r
+    return DistPkg, ContentZipFile, DpPkgFileName, DistFile\r
 \r
 ## GetPackageList\r
 #\r
@@ -224,7 +204,11 @@ def GetPackageList(DistPkg, Dep, WorkspaceDir, Options, ContentZipFile, ModuleLi
         Logger.Info(ST.MSG_INSTALL_PACKAGE % Package.GetName())\r
         if Dep.CheckPackageExists(Guid, Version):\r
             Logger.Info(ST.WRN_PACKAGE_EXISTED %(Guid, Version))\r
-        NewPackagePath = InstallNewPackage(WorkspaceDir, PackagePath, Options.CustomPath)\r
+        if Options.UseGuidedPkgPath:\r
+            GuidedPkgPath = "%s_%s_%s" % (Package.GetName(), Guid, Version)\r
+            NewPackagePath = InstallNewPackage(WorkspaceDir, GuidedPkgPath, Options.CustomPath)\r
+        else:\r
+            NewPackagePath = InstallNewPackage(WorkspaceDir, PackagePath, Options.CustomPath)\r
         InstallPackageContent(PackagePath, NewPackagePath, Package, ContentZipFile, Dep, WorkspaceDir, ModuleList, \r
                               DistPkg.Header.ReadOnly)\r
         PackageList.append(Package)\r
@@ -238,8 +222,8 @@ def GetPackageList(DistPkg, Dep, WorkspaceDir, Options, ContentZipFile, ModuleLi
     # dependency (Hard to get the location of the newly installed package)\r
     #\r
     for Package in PackageList:\r
-        FilePath = PackageToDec(Package)\r
-        Md5Sigature = md5.new(open(str(FilePath), 'rb').read())\r
+        FilePath = PackageToDec(Package, DistPkg.Header)\r
+        Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read())\r
         Md5Sum = Md5Sigature.hexdigest()\r
         if (FilePath, Md5Sum) not in Package.FileList:\r
             Package.FileList.append((FilePath, Md5Sum))\r
@@ -258,7 +242,7 @@ def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList):
     # install them directly. If not, we will try to create a new directory \r
     # for it.\r
     #\r
-    ModulePathList = []   \r
+    ModulePathList = []\r
     \r
     #\r
     # Check module exist and install\r
@@ -297,8 +281,9 @@ def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList):
     # generate all inf for modules\r
     #\r
     for (Module, Package) in ModuleList:\r
-        FilePath = ModuleToInf(Module)\r
-        Md5Sigature = md5.new(open(str(FilePath), 'rb').read())\r
+        CheckCNameInModuleRedefined(Module, DistPkg)\r
+        FilePath = ModuleToInf(Module, Package, DistPkg.Header)\r
+        Md5Sigature = md5.new(__FileHookOpen__(str(FilePath), 'rb').read())\r
         Md5Sum = Md5Sigature.hexdigest()\r
         if Package:\r
             if (FilePath, Md5Sum) not in Package.FileList:\r
@@ -306,9 +291,167 @@ def GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList):
         else:\r
             if (FilePath, Md5Sum) not in Module.FileList:\r
                 Module.FileList.append((FilePath, Md5Sum))\r
+        #\r
+        # append the module unicode files to Package FileList\r
+        #\r
+        for (FilePath, Md5Sum) in Module.FileList:\r
+            if str(FilePath).endswith('.uni') and Package and (FilePath, Md5Sum) not in Package.FileList:\r
+                Package.FileList.append((FilePath, Md5Sum))\r
     \r
     return NewDict\r
 \r
+##\r
+# Get all protocol/ppi/guid CNames and pcd name from all dependent DEC file\r
+#\r
+def GetDepProtocolPpiGuidPcdNames(DePackageObjList):\r
+    #\r
+    # [[Dec1Protocol1, Dec1Protocol2...], [Dec2Protocols...],...]\r
+    #\r
+    DependentProtocolCNames = []\r
+    DependentPpiCNames = []\r
+    DependentGuidCNames = []\r
+    DependentPcdNames = []\r
+    \r
+    for PackageObj in DePackageObjList:\r
+        #\r
+        # Get protocol CName list from all dependent DEC file\r
+        #\r
+        ProtocolCNames = []\r
+        for Protocol in PackageObj.GetProtocolList():\r
+            if Protocol.GetCName() not in ProtocolCNames:\r
+                ProtocolCNames.append(Protocol.GetCName())\r
+  \r
+        DependentProtocolCNames.append(ProtocolCNames)\r
+            \r
+        #\r
+        # Get Ppi CName list from all dependent DEC file\r
+        #            \r
+        PpiCNames = []\r
+        for Ppi in PackageObj.GetPpiList():\r
+            if Ppi.GetCName() not in PpiCNames:\r
+                PpiCNames.append(Ppi.GetCName())\r
+\r
+        DependentPpiCNames.append(PpiCNames)\r
+            \r
+        #\r
+        # Get Guid CName list from all dependent DEC file\r
+        #      \r
+        GuidCNames = []\r
+        for Guid in PackageObj.GetGuidList():\r
+            if Guid.GetCName() not in GuidCNames:\r
+                GuidCNames.append(Guid.GetCName())\r
+        \r
+        DependentGuidCNames.append(GuidCNames)\r
+        \r
+        #\r
+        # Get PcdName list from all dependent DEC file\r
+        #\r
+        PcdNames = []\r
+        for Pcd in PackageObj.GetPcdList():\r
+            PcdName = '.'.join([Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()])\r
+            if PcdName not in PcdNames:\r
+                PcdNames.append(PcdName)\r
+        \r
+        DependentPcdNames.append(PcdNames)\r
+                \r
+            \r
+    return DependentProtocolCNames, DependentPpiCNames, DependentGuidCNames, DependentPcdNames\r
+\r
+##\r
+# Check if protocol CName is redefined\r
+#\r
+def CheckProtoclCNameRedefined(Module, DependentProtocolCNames):\r
+    for ProtocolInModule in Module.GetProtocolList():\r
+        IsCNameDefined = False\r
+        for PackageProtocolCNames in DependentProtocolCNames:\r
+            if ProtocolInModule.GetCName() in PackageProtocolCNames:\r
+                if IsCNameDefined:\r
+                    Logger.Error("\nUPT", FORMAT_INVALID, \r
+                                 File = Module.GetFullPath(), \r
+                                 ExtraData = \\r
+                                 ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % ProtocolInModule.GetCName())\r
+                else:\r
+                    IsCNameDefined = True\r
+\r
+##\r
+# Check if Ppi CName is redefined\r
+#\r
+def CheckPpiCNameRedefined(Module, DependentPpiCNames):\r
+    for PpiInModule in Module.GetPpiList():\r
+        IsCNameDefined = False\r
+        for PackagePpiCNames in DependentPpiCNames:\r
+            if PpiInModule.GetCName() in PackagePpiCNames:\r
+                if IsCNameDefined:\r
+                    Logger.Error("\nUPT", FORMAT_INVALID, \r
+                                 File = Module.GetFullPath(), \r
+                                 ExtraData = ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % PpiInModule.GetCName())\r
+                else:\r
+                    IsCNameDefined = True    \r
+\r
+##\r
+# Check if Guid CName is redefined\r
+#\r
+def CheckGuidCNameRedefined(Module, DependentGuidCNames):\r
+    for GuidInModule in Module.GetGuidList():\r
+        IsCNameDefined = False\r
+        for PackageGuidCNames in DependentGuidCNames:\r
+            if GuidInModule.GetCName() in PackageGuidCNames:\r
+                if IsCNameDefined:\r
+                    Logger.Error("\nUPT", FORMAT_INVALID, \r
+                                 File = Module.GetFullPath(), \r
+                                 ExtraData = \\r
+                                 ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % GuidInModule.GetCName())\r
+                else:\r
+                    IsCNameDefined = True\r
+\r
+##\r
+# Check if PcdName is redefined\r
+#\r
+def CheckPcdNameRedefined(Module, DependentPcdNames):\r
+    PcdObjs = []\r
+    if not Module.GetBinaryFileList():\r
+        PcdObjs += Module.GetPcdList()\r
+    else:\r
+        Binary = Module.GetBinaryFileList()[0]\r
+        for AsBuild in Binary.GetAsBuiltList():\r
+            PcdObjs += AsBuild.GetPatchPcdList() + AsBuild.GetPcdExList()\r
+\r
+    for PcdObj in PcdObjs:\r
+        PcdName = '.'.join([PcdObj.GetTokenSpaceGuidCName(), PcdObj.GetCName()])\r
+        IsPcdNameDefined = False\r
+        for PcdNames in DependentPcdNames:\r
+            if PcdName in PcdNames:\r
+                if IsPcdNameDefined:\r
+                    Logger.Error("\nUPT", FORMAT_INVALID, \r
+                                 File = Module.GetFullPath(), \r
+                                 ExtraData = ST.ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC % PcdName)\r
+                else:\r
+                    IsPcdNameDefined = True\r
+\r
+##\r
+# Check if any Protocol/Ppi/Guid and Pcd name is redefined in its dependent DEC files\r
+#\r
+def CheckCNameInModuleRedefined(Module, DistPkg):\r
+    DePackageObjList = []\r
+    #\r
+    # Get all dependent package objects\r
+    # \r
+    for Obj in Module.GetPackageDependencyList():\r
+        Guid = Obj.GetGuid()\r
+        Version = Obj.GetVersion()\r
+        for Key in DistPkg.PackageSurfaceArea:\r
+            if Key[0] == Guid and Key[1] == Version:\r
+                if DistPkg.PackageSurfaceArea[Key] not in DePackageObjList:\r
+                    DePackageObjList.append(DistPkg.PackageSurfaceArea[Key])\r
+    \r
+    DependentProtocolCNames, DependentPpiCNames, DependentGuidCNames, DependentPcdNames = \\r
+    GetDepProtocolPpiGuidPcdNames(DePackageObjList)\r
+\r
+    CheckProtoclCNameRedefined(Module, DependentProtocolCNames)\r
+    CheckPpiCNameRedefined(Module, DependentPpiCNames)\r
+    CheckGuidCNameRedefined(Module, DependentGuidCNames)\r
+    CheckPcdNameRedefined(Module, DependentPcdNames)\r
+\r
 ## GenToolMisc\r
 #\r
 # GenToolMisc\r
@@ -369,8 +512,7 @@ def Main(Options = None):
     ContentZipFile, DistFile = None, None\r
 \r
     try:\r
-        DataBase = GlobalData.gDB        \r
-        CheckEnvVariable()\r
+        DataBase = GlobalData.gDB\r
         WorkspaceDir = GlobalData.gWORKSPACE\r
         if not Options.PackageFile:\r
             Logger.Error("InstallPkg", OPTION_MISSING, ExtraData=ST.ERR_SPECIFY_PACKAGE)\r
@@ -378,63 +520,30 @@ def Main(Options = None):
         #\r
         # unzip dist.pkg file\r
         #\r
-        DistPkg, Dep, ContentZipFile, DpPkgFileName = UnZipDp(WorkspaceDir, Options, DataBase)\r
-\r
-        #\r
-        # PackageList, ModuleList record the information for the meta-data\r
-        # files that need to be generated later\r
-        #\r
-        PackageList = []\r
-        ModuleList = []\r
-        DistPkg.PackageSurfaceArea = GetPackageList(DistPkg, Dep, WorkspaceDir, Options, \r
-                                                    ContentZipFile, ModuleList, PackageList)\r
+        DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackageFile)\r
 \r
-        DistPkg.ModuleSurfaceArea = GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList)       \r
-        \r
-        \r
-        GenToolMisc(DistPkg, WorkspaceDir, ContentZipFile)\r
-        \r
         #\r
-        # copy "Distribution File" to directory $(WORKSPACE)/conf/upt\r
+        # check dependency\r
         #\r
-        DistFileName = os.path.split(DpPkgFileName)[1]\r
-        DestDir = os.path.normpath(os.path.join(WorkspaceDir, GlobalData.gUPT_DIR))\r
-        CreateDirectory(DestDir)\r
-        DestFile = os.path.normpath(os.path.join(DestDir, DistFileName))\r
-        if os.path.exists(DestFile):\r
-            FileName, Ext = os.path.splitext(DistFileName)\r
-            NewFileName = FileName + '_' + DistPkg.Header.GetGuid() + '_' + DistPkg.Header.GetVersion() + Ext\r
-            DestFile = os.path.normpath(os.path.join(DestDir, NewFileName))\r
-            if os.path.exists(DestFile):\r
-                #\r
-                # ask for user input the new file name\r
-                #\r
-                Logger.Info( ST.MSG_NEW_FILE_NAME_FOR_DIST)\r
-                Input = stdin.readline()\r
-                Input = Input.replace('\r', '').replace('\n', '')\r
-                DestFile = os.path.normpath(os.path.join(DestDir, Input))\r
-        copyfile(DpPkgFileName, DestFile)\r
-        NewDpPkgFileName = DestFile[DestFile.find(DestDir) + len(DestDir) + 1:]\r
+        Dep = DependencyRules(DataBase)\r
+        CheckInstallDpx(Dep, DistPkg)\r
 \r
         #\r
-        # update database\r
+        # Install distribution\r
         #\r
-        Logger.Quiet(ST.MSG_UPDATE_PACKAGE_DATABASE)\r
-        DataBase.AddDPObject(DistPkg, NewDpPkgFileName, DistFileName, \r
-                       DistPkg.Header.RePackage)\r
-        \r
+        InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)\r
         ReturnCode = 0\r
         \r
     except FatalError, XExcept:\r
         ReturnCode = XExcept.args[0]\r
         if Logger.GetLevel() <= Logger.DEBUG_9:\r
-            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
-                platform) + format_exc())\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
+            \r
     except KeyboardInterrupt:\r
         ReturnCode = ABORT_ERROR\r
         if Logger.GetLevel() <= Logger.DEBUG_9:\r
-            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
-                platform) + format_exc())\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
+            \r
     except:\r
         ReturnCode = CODE_ERROR\r
         Logger.Error(\r
@@ -446,7 +555,6 @@ def Main(Options = None):
                     )\r
         Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
             platform) + format_exc())\r
-\r
     finally:\r
         Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)\r
         if DistFile:\r
@@ -457,12 +565,66 @@ def Main(Options = None):
             rmtree(GlobalData.gUNPACK_DIR)\r
             GlobalData.gUNPACK_DIR = None\r
         Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)\r
-\r
     if ReturnCode == 0:\r
         Logger.Quiet(ST.MSG_FINISH)\r
-    \r
     return ReturnCode\r
 \r
+# BackupDist method\r
+#  \r
+# This method will backup the Distribution file into the $(WORKSPACE)/conf/upt, and rename it \r
+# if there is already a same-named distribution existed.\r
+#\r
+# @param DpPkgFileName: The distribution path\r
+# @param Guid:          The distribution Guid\r
+# @param Version:       The distribution Version\r
+# @param WorkspaceDir:  The workspace directory\r
+# @retval NewDpPkgFileName: The exact backup file name\r
+#\r
+def BackupDist(DpPkgFileName, Guid, Version, WorkspaceDir):\r
+    DistFileName = os.path.split(DpPkgFileName)[1]\r
+    DestDir = os.path.normpath(os.path.join(WorkspaceDir, GlobalData.gUPT_DIR))\r
+    CreateDirectory(DestDir)\r
+    DestFile = os.path.normpath(os.path.join(DestDir, DistFileName))\r
+    if os.path.exists(DestFile):\r
+        FileName, Ext = os.path.splitext(DistFileName)\r
+        NewFileName = FileName + '_' + Guid + '_' + Version + Ext\r
+        DestFile = os.path.normpath(os.path.join(DestDir, NewFileName))\r
+        if os.path.exists(DestFile):\r
+            #\r
+            # ask for user input the new file name\r
+            #\r
+            Logger.Info( ST.MSG_NEW_FILE_NAME_FOR_DIST)\r
+            Input = stdin.readline()\r
+            Input = Input.replace('\r', '').replace('\n', '')\r
+            DestFile = os.path.normpath(os.path.join(DestDir, Input))\r
+    copyfile(DpPkgFileName, DestFile)\r
+    NewDpPkgFileName = DestFile[DestFile.find(DestDir) + len(DestDir) + 1:]\r
+    return NewDpPkgFileName\r
+\r
+## CheckInstallDpx method\r
+#\r
+#  check whether distribution could be installed\r
+#\r
+#   @param  Dep: the DependencyRules instance that used to check dependency\r
+#   @param  DistPkg: the distribution object\r
+#\r
+def CheckInstallDpx(Dep, DistPkg):\r
+    #\r
+    # Check distribution package installed or not\r
+    #\r
+    if Dep.CheckDpExists(DistPkg.Header.GetGuid(),\r
+        DistPkg.Header.GetVersion()):\r
+        Logger.Error("InstallPkg", UPT_ALREADY_INSTALLED_ERROR,\r
+            ST.WRN_DIST_PKG_INSTALLED)\r
+    #\r
+    # Check distribution dependency (all module dependency should be\r
+    # satisfied)\r
+    #\r
+    if not Dep.CheckInstallDpDepexSatisfied(DistPkg):\r
+        Logger.Error("InstallPkg", UNKNOWN_ERROR,\r
+            ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,\r
+            ExtraData=DistPkg.Header.Name)\r
+\r
 ## InstallModuleContent method\r
 #\r
 # If this is standalone module, then Package should be none,\r
@@ -501,7 +663,7 @@ def InstallModuleContent(FromPath, NewPath, ModulePath, Module, ContentZipFile,
             \r
             if not IsValidInstallPath(File):\r
                 Logger.Error("UPT", FORMAT_INVALID, ST.ERR_FILE_NAME_INVALIDE%File)\r
-                      \r
+\r
             FromFile = os.path.join(FromPath, ModulePath, File)\r
             Executable = Item.GetExecutable()            \r
             ToFile = os.path.normpath(os.path.join(NewModuleFullPath, ConvertPath(File)))\r
@@ -575,7 +737,7 @@ def InstallModuleContentZipFile(ContentZipFile, FromPath, ModulePath, WorkspaceD
                 FromFile = FileName\r
                 ToFile = os.path.normpath(os.path.join(WorkspaceDir, \r
                         ConvertPath(FileName.replace(FromPath, NewPath, 1))))\r
-                CheckList = Module.FileList\r
+                CheckList = copy.copy(Module.FileList)\r
                 if Package:\r
                     CheckList += Package.FileList\r
                 for Item in CheckList:\r
@@ -619,23 +781,28 @@ def FileUnderPath(FileName, CheckPath):
 # @return:  True or False  \r
 #\r
 def InstallFile(ContentZipFile, FromFile, ToFile, ReadOnly, Executable=False):\r
-    if not ContentZipFile or not ContentZipFile.UnpackFile(FromFile, ToFile):\r
-        Logger.Error("UPT", FILE_NOT_FOUND, ST.ERR_INSTALL_FILE_FROM_EMPTY_CONTENT%FromFile)\r
+    if os.path.exists(os.path.normpath(ToFile)):\r
+        pass\r
+    else:\r
+        if not ContentZipFile or not ContentZipFile.UnpackFile(FromFile, ToFile):\r
+            Logger.Error("UPT", FILE_NOT_FOUND, ST.ERR_INSTALL_FILE_FROM_EMPTY_CONTENT % FromFile)\r
 \r
-    if ReadOnly:\r
-        if not Executable:\r
-            chmod(ToFile, stat.S_IREAD)\r
+        if ReadOnly:\r
+            if not Executable:\r
+                chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)\r
+            else:\r
+                chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)\r
+        elif Executable:\r
+            chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP |\r
+                  stat.S_IWOTH | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)\r
         else:\r
-            chmod(ToFile, stat.S_IREAD|stat.S_IEXEC)\r
-    elif Executable:\r
-        chmod(ToFile, stat.S_IREAD|stat.S_IWRITE|stat.S_IEXEC)\r
-    else:\r
-        chmod(ToFile, stat.S_IREAD|stat.S_IWRITE)\r
+            chmod(ToFile, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH | stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH)\r
                 \r
-    Md5Sigature = md5.new(open(str(ToFile), 'rb').read())\r
+    Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read())\r
     Md5Sum = Md5Sigature.hexdigest()\r
+\r
     return Md5Sum\r
-        \r
+\r
 ## InstallPackageContent method\r
 #\r
 #   @param  FromPath: FromPath\r
@@ -701,10 +868,10 @@ def InstallPackageContent(FromPath, ToPath, Package, ContentZipFile, Dep,
             CreateDirectory(ToFile)\r
             continue\r
         if ReadOnly:\r
-            chmod(ToFile, stat.S_IREAD)\r
+            chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)\r
         else:\r
-            chmod(ToFile, stat.S_IREAD|stat.S_IWRITE)            \r
-        Md5Sigature = md5.new(open(str(ToFile), 'rb').read())\r
+            chmod(ToFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)            \r
+        Md5Sigature = md5.new(__FileHookOpen__(str(ToFile), 'rb').read())\r
         Md5Sum = Md5Sigature.hexdigest()\r
         if (ToFile, Md5Sum) not in Package.FileList:\r
             Package.FileList.append((ToFile, Md5Sum))\r
@@ -768,3 +935,34 @@ def GetDPFile(ZipFile):
             ExtraData=ST.ERR_DIST_FILE_TOOFEW)\r
     return DescFile, ContentFile\r
 \r
+## InstallDp method\r
+#\r
+#   Install the distribution to current workspace\r
+#\r
+def InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase):\r
+    #\r
+    # PackageList, ModuleList record the information for the meta-data\r
+    # files that need to be generated later\r
+    #\r
+    PackageList = []\r
+    ModuleList = []\r
+    DistPkg.PackageSurfaceArea = GetPackageList(DistPkg, Dep, WorkspaceDir, Options, \r
+                                                ContentZipFile, ModuleList, PackageList)\r
+\r
+    DistPkg.ModuleSurfaceArea = GetModuleList(DistPkg, Dep, WorkspaceDir, ContentZipFile, ModuleList)\r
+    \r
+    GenToolMisc(DistPkg, WorkspaceDir, ContentZipFile)\r
+    \r
+    #\r
+    # copy "Distribution File" to directory $(WORKSPACE)/conf/upt\r
+    #\r
+    DistFileName = os.path.split(DpPkgFileName)[1]\r
+    NewDpPkgFileName = BackupDist(DpPkgFileName, DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion(), WorkspaceDir)\r
+\r
+    #\r
+    # update database\r
+    #\r
+    Logger.Quiet(ST.MSG_UPDATE_PACKAGE_DATABASE)\r
+    DataBase.AddDPObject(DistPkg, NewDpPkgFileName, DistFileName, \r
+                   DistPkg.Header.RePackage)\r
+\r
diff --git a/BaseTools/Source/Python/UPT/InventoryWs.py b/BaseTools/Source/Python/UPT/InventoryWs.py
new file mode 100644 (file)
index 0000000..824e1c2
--- /dev/null
@@ -0,0 +1,117 @@
+## @file\r
+# Inventory workspace's distribution package information.\r
+#\r
+# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+"""\r
+Inventory workspace's distribution package information.\r
+"""\r
+##\r
+# Import Modules\r
+#\r
+from sys import platform\r
+from traceback import format_exc\r
+from platform import python_version\r
+\r
+from Logger import StringTable as ST\r
+from Logger.ToolError import FatalError\r
+from Logger.ToolError import ABORT_ERROR\r
+from Logger.ToolError import CODE_ERROR\r
+import Logger.Log as Logger\r
+\r
+from Library import GlobalData\r
+\r
+## InventoryDistInstalled\r
+#\r
+# This method retrieves the installed distribution information from the internal UPT database\r
+#\r
+# @param  DataBase: the UPT database\r
+#\r
+def InventoryDistInstalled(DataBase):\r
+    DistInstalled = DataBase.InventoryDistInstalled()\r
+    \r
+    #\r
+    # find the max length for each item\r
+    #\r
+    DpNameStr = "DpName"\r
+    DpGuidStr = "DpGuid"\r
+    DpVerStr = "DpVer"\r
+    DpOriginalNameStr = "DpOriginalName"\r
+    MaxGuidlen = len(DpGuidStr)\r
+    MaxVerlen = len(DpVerStr)\r
+    MaxDpAliasFileNameLen = len(DpNameStr) \r
+    MaxDpOrigFileNamelen = len(DpOriginalNameStr)\r
+    \r
+    for (DpGuid, DpVersion, DpOriginalName, DpAliasFileName) in DistInstalled:\r
+        MaxGuidlen = max(MaxGuidlen, len(DpGuid))\r
+        MaxVerlen = max(MaxVerlen, len(DpVersion))\r
+        MaxDpAliasFileNameLen = max(MaxDpAliasFileNameLen, len(DpAliasFileName))\r
+        MaxDpOrigFileNamelen = max(MaxDpOrigFileNamelen, len(DpOriginalName))\r
+\r
+    OutMsgFmt = "%-*s\t%-*s\t%-*s\t%-s"\r
+    OutMsg = OutMsgFmt % (MaxDpAliasFileNameLen, \r
+                          DpNameStr, \r
+                          MaxGuidlen, \r
+                          DpGuidStr, \r
+                          MaxVerlen, \r
+                          DpVerStr, \r
+                          DpOriginalNameStr)\r
+    Logger.Info(OutMsg)\r
+    \r
+    for (DpGuid, DpVersion, DpFileName, DpAliasFileName) in DistInstalled:\r
+        OutMsg = OutMsgFmt % (MaxDpAliasFileNameLen, \r
+                            DpAliasFileName, \r
+                            MaxGuidlen, \r
+                            DpGuid, \r
+                            MaxVerlen, \r
+                            DpVersion, \r
+                            DpFileName)\r
+        Logger.Info(OutMsg)\r
+\r
+## Tool entrance method\r
+#\r
+# This method mainly dispatch specific methods per the command line options.\r
+# If no error found, return zero value so the caller of this tool can know\r
+# if it's executed successfully or not.\r
+#\r
+# @param  Options: command Options\r
+#\r
+def Main(Options = None):\r
+    if Options:\r
+        pass\r
+\r
+    try:\r
+        DataBase = GlobalData.gDB\r
+        InventoryDistInstalled(DataBase)     \r
+        ReturnCode = 0       \r
+    except FatalError, XExcept:\r
+        ReturnCode = XExcept.args[0]\r
+        if Logger.GetLevel() <= Logger.DEBUG_9:\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
+    except KeyboardInterrupt: \r
+        ReturnCode = ABORT_ERROR\r
+        if Logger.GetLevel() <= Logger.DEBUG_9:\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
+    except:\r
+        ReturnCode = CODE_ERROR\r
+        Logger.Error("\nInventoryWs",\r
+                    CODE_ERROR,\r
+                    ST.ERR_UNKNOWN_FATAL_INVENTORYWS_ERR,\r
+                    ExtraData=ST.MSG_SEARCH_FOR_HELP,\r
+                    RaiseError=False\r
+                    )\r
+        Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
+            platform) + format_exc())\r
+\r
+    if ReturnCode == 0:\r
+        Logger.Quiet(ST.MSG_FINISH)\r
+    \r
+    return ReturnCode
\ No newline at end of file
index 06da61b3e911a3404dba5471e005ed9e80e7676b..1cf919a96bae46309c0040f45b4c83d32a83b973 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define comment generating interface\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -24,8 +24,18 @@ from Library.DataType import TAB_SPACE_SPLIT
 from Library.DataType import TAB_INF_GUIDTYPE_VAR\r
 from Library.DataType import USAGE_ITEM_NOTIFY\r
 from Library.DataType import ITEM_UNDEFINED\r
-from Library.DataType import LANGUAGE_EN_US\r
-\r
+from Library.DataType import TAB_HEADER_COMMENT\r
+from Library.DataType import TAB_BINARY_HEADER_COMMENT\r
+from Library.DataType import TAB_COMMENT_SPLIT\r
+from Library.DataType import TAB_SPECIAL_COMMENT\r
+from Library.DataType import END_OF_LINE\r
+from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
+from Library.DataType import TAB_COMMENT_EDK1_START\r
+from Library.DataType import TAB_COMMENT_EDK1_END\r
+from Library.DataType import TAB_STAR\r
+from Library.DataType import TAB_PCD_PROMPT\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.Misc import GetLocalValue\r
 ## GenTailCommentLines\r
 #\r
 # @param TailCommentLines:  the tail comment lines that need to be generated\r
@@ -33,11 +43,11 @@ from Library.DataType import LANGUAGE_EN_US
 #                            line tail comment\r
 # \r
 def GenTailCommentLines (TailCommentLines, LeadingSpaceNum = 0):\r
-    EndOfLine = "\n"\r
-    TailCommentLines = TailCommentLines.rstrip(EndOfLine)\r
-    CommentStr = "  ## " + (EndOfLine + LeadingSpaceNum * TAB_SPACE_SPLIT + \\r
-                            "  ## ").join(GetSplitValueList(TailCommentLines, \\r
-                                                            EndOfLine))\r
+    TailCommentLines = TailCommentLines.rstrip(END_OF_LINE)\r
+    CommentStr = TAB_SPACE_SPLIT*2 + TAB_SPECIAL_COMMENT + TAB_SPACE_SPLIT + \\r
+    (END_OF_LINE + LeadingSpaceNum * TAB_SPACE_SPLIT + TAB_SPACE_SPLIT*2 + TAB_SPECIAL_COMMENT + \\r
+     TAB_SPACE_SPLIT).join(GetSplitValueList(TailCommentLines, END_OF_LINE))\r
+     \r
     return CommentStr\r
 \r
 ## GenGenericComment\r
@@ -47,10 +57,9 @@ def GenTailCommentLines (TailCommentLines, LeadingSpaceNum = 0):
 def GenGenericComment (CommentLines):\r
     if not CommentLines:\r
         return ''\r
-    EndOfLine = "\n"\r
-    CommentLines = CommentLines.rstrip(EndOfLine)\r
-    CommentStr = '## ' + (EndOfLine + '# ').join\\r
-    (GetSplitValueList(CommentLines, EndOfLine)) + EndOfLine\r
+    CommentLines = CommentLines.rstrip(END_OF_LINE)\r
+    CommentStr = TAB_SPECIAL_COMMENT + TAB_SPACE_SPLIT + (END_OF_LINE + TAB_COMMENT_SPLIT + TAB_SPACE_SPLIT).join\\r
+    (GetSplitValueList(CommentLines, END_OF_LINE)) + END_OF_LINE\r
     return CommentStr\r
 \r
 ## GenGenericCommentF\r
@@ -61,23 +70,40 @@ def GenGenericComment (CommentLines):
 # @param CommentLines:   Generic comment Text, maybe Multiple Lines\r
 # @return CommentStr:    Generated comment line \r
 # \r
-def GenGenericCommentF (CommentLines, NumOfPound=1):\r
+def GenGenericCommentF (CommentLines, NumOfPound=1, IsPrompt=False, IsInfLibraryClass=False):\r
     if not CommentLines:\r
         return ''\r
-    EndOfLine = "\n"\r
     #\r
     # if comment end with '\n', then remove it to prevent one extra line\r
     # generate later on\r
     #\r
-    if CommentLines.endswith(EndOfLine):\r
+    if CommentLines.endswith(END_OF_LINE):\r
         CommentLines = CommentLines[:-1]\r
-    CommentLineList = GetSplitValueList(CommentLines, EndOfLine)\r
     CommentStr = ''\r
-    for Line in CommentLineList:\r
-        if Line == '':\r
-            CommentStr += '#' * NumOfPound + '\n'\r
-        else:\r
-            CommentStr += '#' * NumOfPound + ' ' + Line + '\n'\r
+    if IsPrompt:\r
+        CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + TAB_PCD_PROMPT + TAB_SPACE_SPLIT + \\r
+        CommentLines.replace(END_OF_LINE, '') + END_OF_LINE\r
+    else:\r
+        CommentLineList = GetSplitValueList(CommentLines, END_OF_LINE)\r
+        FindLibraryClass = False\r
+        for Line in CommentLineList:\r
+            # If this comment is for @libraryclass and it has multiple lines\r
+            # make sure the second lines align to the first line after @libraryclass as below\r
+            #\r
+            # ## @libraryclass XYZ FIRST_LINE\r
+            # ##               ABC SECOND_LINE\r
+            #\r
+            if IsInfLibraryClass and Line.find(u'@libraryclass ') > -1:\r
+                FindLibraryClass = True\r
+            if Line == '':\r
+                CommentStr += TAB_COMMENT_SPLIT * NumOfPound + END_OF_LINE\r
+            else:\r
+                if FindLibraryClass and Line.find(u'@libraryclass ') > -1:\r
+                    CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + Line + END_OF_LINE\r
+                elif FindLibraryClass:\r
+                    CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT * 16 + Line + END_OF_LINE\r
+                else:\r
+                    CommentStr += TAB_COMMENT_SPLIT * NumOfPound + TAB_SPACE_SPLIT + Line + END_OF_LINE\r
      \r
     return CommentStr\r
 \r
@@ -91,40 +117,57 @@ def GenGenericCommentF (CommentLines, NumOfPound=1):
 # @param Copyright     possible multiple copyright lines\r
 # @param License       possible multiple license lines\r
 #\r
-def GenHeaderCommentSection(Abstract, Description, Copyright, License):\r
-    EndOfLine = '\n'\r
+def GenHeaderCommentSection(Abstract, Description, Copyright, License, IsBinaryHeader=False, \\r
+                            CommChar=TAB_COMMENT_SPLIT):\r
     Content = ''\r
-    \r
-    Content += '## @file' + EndOfLine\r
+\r
+    #\r
+    # Convert special character to (c), (r) and (tm).\r
+    #\r
+    if isinstance(Abstract, unicode):\r
+        Abstract = ConvertSpecialUnicodes(Abstract)\r
+    if isinstance(Description, unicode):\r
+        Description = ConvertSpecialUnicodes(Description)\r
+    if IsBinaryHeader:\r
+        Content += CommChar * 2 + TAB_SPACE_SPLIT + TAB_BINARY_HEADER_COMMENT + END_OF_LINE\r
+    elif CommChar == TAB_COMMENT_EDK1_SPLIT:\r
+        Content += CommChar + TAB_SPACE_SPLIT + TAB_COMMENT_EDK1_START + TAB_STAR + TAB_SPACE_SPLIT +\\r
+         TAB_HEADER_COMMENT + END_OF_LINE\r
+    else:\r
+        Content += CommChar * 2 + TAB_SPACE_SPLIT + TAB_HEADER_COMMENT + END_OF_LINE\r
     if Abstract:\r
-        Abstract = Abstract.rstrip(EndOfLine)\r
-        Content += '# ' + Abstract + EndOfLine\r
-        Content += '#' + EndOfLine\r
+        Abstract = Abstract.rstrip(END_OF_LINE)\r
+        Content += CommChar + TAB_SPACE_SPLIT + (END_OF_LINE + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\\r
+                                                                                                (Abstract, END_OF_LINE))\r
+        Content += END_OF_LINE + CommChar + END_OF_LINE\r
     else:\r
-        Content += '#' + EndOfLine\r
+        Content += CommChar + END_OF_LINE\r
 \r
     if Description:\r
-        Description = Description.rstrip(EndOfLine)\r
-        Content += '# ' + (EndOfLine + '# ').join(GetSplitValueList\\r
-                                                  (Description, '\n'))\r
-        Content += EndOfLine + '#' + EndOfLine        \r
+        Description = Description.rstrip(END_OF_LINE)\r
+        Content += CommChar + TAB_SPACE_SPLIT + (END_OF_LINE + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\\r
+                                                  (Description, END_OF_LINE))\r
+        Content += END_OF_LINE + CommChar + END_OF_LINE        \r
   \r
     #\r
     # There is no '#\n' line to separate multiple copyright lines in code base \r
     #\r
     if Copyright:\r
-        Copyright = Copyright.rstrip(EndOfLine)\r
-        Content += '# ' + (EndOfLine + '# ').join\\r
-        (GetSplitValueList(Copyright, '\n'))\r
-        Content += EndOfLine + '#' + EndOfLine\r
+        Copyright = Copyright.rstrip(END_OF_LINE)\r
+        Content += CommChar + TAB_SPACE_SPLIT + (END_OF_LINE + CommChar + TAB_SPACE_SPLIT).join\\r
+        (GetSplitValueList(Copyright, END_OF_LINE))\r
+        Content += END_OF_LINE + CommChar + END_OF_LINE\r
 \r
     if License:\r
-        License = License.rstrip(EndOfLine)\r
-        Content += '# ' + (EndOfLine + '# ').join(GetSplitValueList\\r
-                                                  (License, '\n'))\r
-        Content += EndOfLine + '#' + EndOfLine\r
-\r
-    Content += '##' + EndOfLine\r
+        License = License.rstrip(END_OF_LINE)\r
+        Content += CommChar + TAB_SPACE_SPLIT + (END_OF_LINE + CommChar + TAB_SPACE_SPLIT).join(GetSplitValueList\\r
+                                                  (License, END_OF_LINE))\r
+        Content += END_OF_LINE + CommChar + END_OF_LINE\r
+    \r
+    if CommChar == TAB_COMMENT_EDK1_SPLIT:\r
+        Content += CommChar + TAB_SPACE_SPLIT + TAB_STAR + TAB_COMMENT_EDK1_END + END_OF_LINE\r
+    else:\r
+        Content += CommChar * 2 + END_OF_LINE\r
     \r
     return Content\r
 \r
@@ -197,21 +240,7 @@ def GenDecTailComment (SupModuleList):
 #  @return HelpStr: the help text string found, '' means no help text found\r
 #\r
 def _GetHelpStr(HelpTextObjList):\r
-    HelpStr = ''\r
-\r
-    for HelpObj in HelpTextObjList:\r
-        if HelpObj and HelpObj.GetLang() == LANGUAGE_EN_US:\r
-            HelpStr = HelpObj.GetString()\r
-            return HelpStr\r
-    \r
-    for HelpObj in HelpTextObjList:\r
-        if HelpObj and HelpObj.GetLang().startswith('en'):\r
-            HelpStr = HelpObj.GetString()\r
-            return HelpStr\r
-\r
+    ValueList = []        \r
     for HelpObj in HelpTextObjList:\r
-        if HelpObj and not HelpObj.GetLang():\r
-            HelpStr = HelpObj.GetString()\r
-            return HelpStr\r
-    \r
-    return HelpStr
\ No newline at end of file
+        ValueList.append((HelpObj.GetLang(), HelpObj.GetString()))\r
+    return GetLocalValue(ValueList, True)\r
index 5c07f34a7467e8c8947233339c5fb311d8f50ab0..e6d45103f94be2902354d01eac32b5210b316961 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define comment parsing interface\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -32,6 +32,17 @@ from Library.DataType import HEADER_COMMENT_DESCRIPTION
 from Library.DataType import TAB_SPACE_SPLIT\r
 from Library.DataType import TAB_COMMA_SPLIT\r
 from Library.DataType import SUP_MODULE_LIST\r
+from Library.DataType import TAB_VALUE_SPLIT\r
+from Library.DataType import TAB_PCD_VALIDRANGE\r
+from Library.DataType import TAB_PCD_VALIDLIST\r
+from Library.DataType import TAB_PCD_EXPRESSION\r
+from Library.DataType import TAB_PCD_PROMPT\r
+from Library.DataType import TAB_CAPHEX_START\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import PCD_ERR_CODE_MAX_SIZE\r
+from Library.ExpressionValidate import IsValidRangeExpr\r
+from Library.ExpressionValidate import IsValidListExpr\r
+from Library.ExpressionValidate import IsValidLogicalExpr\r
 from Object.POM.CommonObject import TextObject\r
 from Object.POM.CommonObject import PcdErrorObject\r
 import Logger.Log as Logger\r
@@ -47,13 +58,16 @@ from Logger import StringTable as ST
 # @param CommentList:   List of (Comment, LineNumber)\r
 # @param FileName:      FileName of the comment\r
 #\r
-def ParseHeaderCommentSection(CommentList, FileName = None):\r
+def ParseHeaderCommentSection(CommentList, FileName = None, IsBinaryHeader = False):\r
     Abstract = ''\r
     Description = ''\r
     Copyright = ''\r
     License = ''\r
     EndOfLine = "\n"\r
-    STR_HEADER_COMMENT_START = "@file"\r
+    if IsBinaryHeader:\r
+        STR_HEADER_COMMENT_START = "@BinaryHeader"\r
+    else:\r
+        STR_HEADER_COMMENT_START = "@file"\r
     HeaderCommentStage = HEADER_COMMENT_NOT_STARTED\r
     \r
     #\r
@@ -94,7 +108,6 @@ def ParseHeaderCommentSection(CommentList, FileName = None):
                 # in case there is no abstract and description\r
                 #\r
                 if not Comment:\r
-                    Abstract = ''\r
                     HeaderCommentStage = HEADER_COMMENT_DESCRIPTION\r
                 elif _IsCopyrightLine(Comment):\r
                     Result, ErrMsg = _ValidateCopyright(Comment)\r
@@ -134,14 +147,7 @@ def ParseHeaderCommentSection(CommentList, FileName = None):
                 if not Comment and not License:\r
                     continue\r
                 License += Comment + EndOfLine\r
-    \r
-    if not Copyright:\r
-        Logger.Error("\nUPT", FORMAT_INVALID, ST.ERR_COPYRIGHT_MISSING, \\r
-                     FileName)\r
-\r
-    if not License:\r
-        Logger.Error("\nUPT", FORMAT_INVALID, ST.ERR_LICENSE_MISSING, FileName)\r
-                     \r
+                  \r
     return Abstract.strip(), Description.strip(), Copyright.strip(), License.strip()\r
 \r
 ## _IsCopyrightLine\r
@@ -158,7 +164,7 @@ def _IsCopyrightLine (LineContent):
     ReIsCopyrightRe = re.compile(r"""(^|\s)COPYRIGHT *\(""", re.DOTALL)\r
     if ReIsCopyrightRe.search(LineContent):\r
         Result = True\r
-        \r
+\r
     return Result\r
 \r
 ## ParseGenericComment\r
@@ -188,6 +194,37 @@ def ParseGenericComment (GenericComment, ContainerFile=None, SkipTag=None):
 \r
     return HelpTxt\r
 \r
+## ParsePcdErrorCode\r
+#\r
+# @param Value: original ErrorCode value \r
+# @param ContainerFile: Input value for filename of Dec file\r
+# @param LineNum: Line Num \r
+# \r
+def ParsePcdErrorCode (Value = None, ContainerFile = None, LineNum = None):      \r
+    try: \r
+        if Value.strip().startswith((TAB_HEX_START, TAB_CAPHEX_START)):\r
+            Base = 16\r
+        else:\r
+            Base = 10\r
+        ErrorCode = long(Value, Base)\r
+        if ErrorCode > PCD_ERR_CODE_MAX_SIZE or ErrorCode < 0:\r
+            Logger.Error('Parser', \r
+                        FORMAT_NOT_SUPPORTED,\r
+                        "The format %s of ErrorCode is not valid, should be UNIT32 type or long type" % Value,\r
+                        File = ContainerFile, \r
+                        Line = LineNum)\r
+        #\r
+        # To delete the tailing 'L'\r
+        #\r
+        return hex(ErrorCode)[:-1]\r
+    except ValueError, XStr:\r
+        if XStr:\r
+            pass\r
+        Logger.Error('Parser', \r
+                    FORMAT_NOT_SUPPORTED,\r
+                    "The format %s of ErrorCode is not valid, should be UNIT32 type or long type" % Value,\r
+                    File = ContainerFile, \r
+                    Line = LineNum)\r
     \r
 ## ParseDecPcdGenericComment\r
 #\r
@@ -195,46 +232,135 @@ def ParseGenericComment (GenericComment, ContainerFile=None, SkipTag=None):
 #                         LineNum)\r
 # @param ContainerFile:  Input value for filename of Dec file\r
 # \r
-def ParseDecPcdGenericComment (GenericComment, ContainerFile):       \r
+def ParseDecPcdGenericComment (GenericComment, ContainerFile, TokenSpaceGuidCName, CName, MacroReplaceDict):       \r
     HelpStr = '' \r
+    PromptStr = ''\r
     PcdErr = None\r
+    PcdErrList = []\r
+    ValidValueNum = 0\r
+    ValidRangeNum = 0\r
+    ExpressionNum = 0\r
         \r
     for (CommentLine, LineNum) in GenericComment:\r
         Comment = CleanString2(CommentLine)[1]\r
-        if Comment.startswith("@ValidRange"):\r
-            if PcdErr:\r
+        #\r
+        # To replace Macro\r
+        #\r
+        MACRO_PATTERN = '[\t\s]*\$\([A-Z][_A-Z0-9]*\)'\r
+        MatchedStrs =  re.findall(MACRO_PATTERN, Comment)\r
+        for MatchedStr in MatchedStrs:\r
+            if MatchedStr:\r
+                Macro = MatchedStr.strip().lstrip('$(').rstrip(')').strip()\r
+                if Macro in MacroReplaceDict:\r
+                    Comment = Comment.replace(MatchedStr, MacroReplaceDict[Macro])    \r
+        if Comment.startswith(TAB_PCD_VALIDRANGE):\r
+            if ValidValueNum > 0 or ExpressionNum > 0:\r
                 Logger.Error('Parser', \r
                              FORMAT_NOT_SUPPORTED,\r
                              ST.WRN_MULTI_PCD_RANGES,\r
                              File = ContainerFile, \r
                              Line = LineNum)\r
-            ValidRange = Comment.replace("@ValidRange", "", 1)\r
-            if _CheckRangeExpression(ValidRange):\r
+            else:\r
                 PcdErr = PcdErrorObject()\r
-                PcdErr.SetValidValueRange(ValidRange)\r
-        elif Comment.startswith("@ValidList"):\r
-            if PcdErr:\r
+                PcdErr.SetTokenSpaceGuidCName(TokenSpaceGuidCName)\r
+                PcdErr.SetCName(CName)\r
+                PcdErr.SetFileLine(Comment)\r
+                PcdErr.SetLineNum(LineNum)\r
+                ValidRangeNum += 1\r
+            ValidRange = Comment.replace(TAB_PCD_VALIDRANGE, "", 1).strip()\r
+            Valid, Cause = _CheckRangeExpression(ValidRange)\r
+            if Valid:\r
+                ValueList = ValidRange.split(TAB_VALUE_SPLIT)\r
+                if len(ValueList) > 1:\r
+                    PcdErr.SetValidValueRange((TAB_VALUE_SPLIT.join(ValueList[1:])).strip())\r
+                    PcdErr.SetErrorNumber(ParsePcdErrorCode(ValueList[0], ContainerFile, LineNum))\r
+                else:\r
+                    PcdErr.SetValidValueRange(ValidRange)\r
+                PcdErrList.append(PcdErr)\r
+            else:\r
+                Logger.Error("Parser",\r
+                         FORMAT_NOT_SUPPORTED,\r
+                         Cause, \r
+                         ContainerFile, \r
+                         LineNum)\r
+        elif Comment.startswith(TAB_PCD_VALIDLIST):\r
+            if ValidRangeNum > 0 or ExpressionNum > 0:\r
                 Logger.Error('Parser', \r
                              FORMAT_NOT_SUPPORTED,\r
                              ST.WRN_MULTI_PCD_RANGES,\r
                              File = ContainerFile, \r
                              Line = LineNum)\r
-            ValidValue = Comment.replace("@ValidList", "", 1).replace(TAB_COMMA_SPLIT, TAB_SPACE_SPLIT)\r
-            PcdErr = PcdErrorObject()\r
-            PcdErr.SetValidValue(ValidValue)\r
-        elif Comment.startswith("@Expression"):\r
-            if PcdErr:\r
+            elif ValidValueNum > 0:\r
+                Logger.Error('Parser', \r
+                             FORMAT_NOT_SUPPORTED,\r
+                             ST.WRN_MULTI_PCD_VALIDVALUE,\r
+                             File = ContainerFile, \r
+                             Line = LineNum)\r
+            else:\r
+                PcdErr = PcdErrorObject()\r
+                PcdErr.SetTokenSpaceGuidCName(TokenSpaceGuidCName)\r
+                PcdErr.SetCName(CName)\r
+                PcdErr.SetFileLine(Comment)\r
+                PcdErr.SetLineNum(LineNum)\r
+                ValidValueNum += 1\r
+                ValidValueExpr = Comment.replace(TAB_PCD_VALIDLIST, "", 1).strip()\r
+            Valid, Cause = _CheckListExpression(ValidValueExpr)\r
+            if Valid:\r
+                ValidValue = Comment.replace(TAB_PCD_VALIDLIST, "", 1).replace(TAB_COMMA_SPLIT, TAB_SPACE_SPLIT)\r
+                ValueList = ValidValue.split(TAB_VALUE_SPLIT)\r
+                if len(ValueList) > 1:\r
+                    PcdErr.SetValidValue((TAB_VALUE_SPLIT.join(ValueList[1:])).strip())\r
+                    PcdErr.SetErrorNumber(ParsePcdErrorCode(ValueList[0], ContainerFile, LineNum))\r
+                else:\r
+                    PcdErr.SetValidValue(ValidValue)\r
+                PcdErrList.append(PcdErr)\r
+            else:\r
+                Logger.Error("Parser",\r
+                         FORMAT_NOT_SUPPORTED,\r
+                         Cause, \r
+                         ContainerFile, \r
+                         LineNum)\r
+        elif Comment.startswith(TAB_PCD_EXPRESSION):\r
+            if ValidRangeNum > 0 or ValidValueNum > 0:\r
                 Logger.Error('Parser', \r
                              FORMAT_NOT_SUPPORTED,\r
                              ST.WRN_MULTI_PCD_RANGES,\r
                              File = ContainerFile, \r
                              Line = LineNum)\r
-            Expression = Comment.replace("@Expression", "", 1)\r
-            if _CheckRangeExpression(Expression):\r
+            else:\r
                 PcdErr = PcdErrorObject()\r
-                PcdErr.SetExpression(Expression)\r
+                PcdErr.SetTokenSpaceGuidCName(TokenSpaceGuidCName)\r
+                PcdErr.SetCName(CName)\r
+                PcdErr.SetFileLine(Comment)\r
+                PcdErr.SetLineNum(LineNum)\r
+                ExpressionNum += 1\r
+            Expression = Comment.replace(TAB_PCD_EXPRESSION, "", 1).strip()\r
+            Valid, Cause = _CheckExpression(Expression)\r
+            if Valid:\r
+                ValueList = Expression.split(TAB_VALUE_SPLIT)\r
+                if len(ValueList) > 1:\r
+                    PcdErr.SetExpression((TAB_VALUE_SPLIT.join(ValueList[1:])).strip())\r
+                    PcdErr.SetErrorNumber(ParsePcdErrorCode(ValueList[0], ContainerFile, LineNum))\r
+                else:\r
+                    PcdErr.SetExpression(Expression)\r
+                PcdErrList.append(PcdErr)\r
+            else:        \r
+                Logger.Error("Parser",\r
+                         FORMAT_NOT_SUPPORTED,\r
+                         Cause, \r
+                         ContainerFile, \r
+                         LineNum)                \r
+        elif Comment.startswith(TAB_PCD_PROMPT):\r
+            if PromptStr:\r
+                Logger.Error('Parser', \r
+                             FORMAT_NOT_SUPPORTED,\r
+                             ST.WRN_MULTI_PCD_PROMPT,\r
+                             File = ContainerFile, \r
+                             Line = LineNum)\r
+            PromptStr = Comment.replace(TAB_PCD_PROMPT, "", 1).strip()\r
         else:\r
-            HelpStr += Comment + '\n'\r
+            if Comment:\r
+                HelpStr += Comment + '\n'\r
     \r
     #\r
     # remove the last EOL if the comment is of format 'FOO\n'\r
@@ -243,7 +369,7 @@ def ParseDecPcdGenericComment (GenericComment, ContainerFile):
         if HelpStr != '\n' and not HelpStr.endswith('\n\n'):\r
             HelpStr = HelpStr[:-1]\r
 \r
-    return HelpStr, PcdErr\r
+    return HelpStr, PcdErrList, PromptStr\r
 \r
 ## ParseDecPcdTailComment\r
 #\r
@@ -289,18 +415,43 @@ def ParseDecPcdTailComment (TailCommentList, ContainerFile):
 \r
     return SupModuleList, HelpStr\r
 \r
+## _CheckListExpression\r
+#\r
+# @param Expression: Pcd value list expression \r
+#\r
+def _CheckListExpression(Expression):\r
+    ListExpr = ''\r
+    if TAB_VALUE_SPLIT in Expression:\r
+        ListExpr = Expression[Expression.find(TAB_VALUE_SPLIT)+1:] \r
+    else:\r
+        ListExpr = Expression\r
+        \r
+    return IsValidListExpr(ListExpr)\r
+\r
+## _CheckExpreesion\r
+#\r
+# @param Expression: Pcd value expression\r
+#\r
+def _CheckExpression(Expression):\r
+    Expr = ''\r
+    if TAB_VALUE_SPLIT in Expression:\r
+        Expr = Expression[Expression.find(TAB_VALUE_SPLIT)+1:]\r
+    else:\r
+        Expr = Expression\r
+    return IsValidLogicalExpr(Expr, True)\r
 \r
 ## _CheckRangeExpression\r
 #\r
 # @param Expression:    Pcd range expression\r
 #          \r
 def _CheckRangeExpression(Expression):\r
-    #\r
-    # check grammar for Pcd range expression is not required yet\r
-    #\r
-    if Expression:\r
-        pass\r
-    return True\r
+    RangeExpr = ''\r
+    if TAB_VALUE_SPLIT in Expression:\r
+        RangeExpr = Expression[Expression.find(TAB_VALUE_SPLIT)+1:]\r
+    else:\r
+        RangeExpr = Expression\r
+        \r
+    return IsValidRangeExpr(RangeExpr)\r
 \r
 ## ValidateCopyright\r
 #\r
@@ -349,7 +500,6 @@ def ParseComment (Comment, UsageTokens, TypeTokens, RemoveTokens, ParseVariable)
     Usage = None\r
     Type = None\r
     String = None\r
-    HelpText = None\r
     \r
     Comment = Comment[0]\r
     \r
index 4b30f3343e11ac8d7ad0532765d2b1e5aca4da8a..8449dc8d6d328ce0dbe6cc404a648338f1f174de 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define class for data type structure\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -47,7 +47,10 @@ USAGE_LIST = ["CONSUMES",
               "PRODUCES",\r
               "SOMETIMES_PRODUCES"]\r
 \r
-LANGUAGE_EN_US = 'en-US'\r
+TAB_LANGUAGE_EN_US = 'en-US'\r
+TAB_LANGUAGE_ENG   = 'eng'\r
+TAB_LANGUAGE_EN    = 'en'\r
+TAB_LANGUAGE_EN_X  = 'en-x-tianocore'\r
 \r
 USAGE_ITEM_PRODUCES           = 'PRODUCES'\r
 USAGE_ITEM_SOMETIMES_PRODUCES = 'SOMETIMES_PRODUCES'\r
@@ -80,6 +83,14 @@ USAGE_SOMETIMES_CONSUMES_LIST = [USAGE_ITEM_SOMETIMES_CONSUMES,
 \r
 ITEM_UNDEFINED = 'UNDEFINED'\r
 \r
+TAB_PCD_VALIDRANGE = '@ValidRange'\r
+TAB_PCD_VALIDLIST = '@ValidList'\r
+TAB_PCD_EXPRESSION = '@Expression'\r
+TAB_PCD_PROMPT = '@Prompt'\r
+TAB_STR_TOKENCNAME = 'STR'\r
+TAB_STR_TOKENPROMPT = 'PROMPT'\r
+TAB_STR_TOKENHELP = 'HELP'\r
+TAB_STR_TOKENERR = 'ERR'\r
 \r
 #\r
 # Dictionary of usage tokens and their synonmys\r
@@ -269,11 +280,12 @@ PCD_USAGE_TYPE_LIST_OF_UPT = PCD_USAGE_TYPE_LIST_OF_MODULE
 ##\r
 # Binary File Type List\r
 #\r
-BINARY_FILE_TYPE_LIST = ["GUID", "PE32", "PIC", "TE", "DXE_DEPEX", "VER", "UI", "COMPAT16", "FV", "BIN", "RAW",\r
+BINARY_FILE_TYPE_LIST = ["PE32", "PIC", "TE", "DXE_DEPEX", "VER", "UI", "COMPAT16", "FV", "BIN", "RAW",\r
                          "ACPI", "ASL",\r
                          "PEI_DEPEX",\r
                          "SMM_DEPEX",\r
-                         "SUBTYPE_GUID"                                    \r
+                         "SUBTYPE_GUID",\r
+                         "DISPOSABLE"\r
                          ]\r
 BINARY_FILE_TYPE_LIST_IN_UDP = \\r
                         ["GUID", "FREEFORM",\r
@@ -285,6 +297,7 @@ BINARY_FILE_TYPE_LIST_IN_UDP = \
                          "BIN", "VER", "UI"                      \r
                          ]\r
 \r
+SUBTYPE_GUID_BINARY_FILE_TYPE = "FREEFORM"\r
 ##\r
 # Possible values for COMPONENT_TYPE, and their descriptions, are listed in \r
 # the table, \r
@@ -328,6 +341,7 @@ TAB_EQUAL_SPLIT = '='
 TAB_DEQUAL_SPLIT = '=='\r
 TAB_VALUE_SPLIT = '|'\r
 TAB_COMMA_SPLIT = ','\r
+TAB_HORIZON_LINE_SPLIT = '-'\r
 TAB_SPACE_SPLIT = ' '\r
 TAB_UNDERLINE_SPLIT = '_'\r
 TAB_SEMI_COLON_SPLIT = ';'\r
@@ -341,7 +355,13 @@ TAB_BACK_SLASH = '/'
 TAB_SPECIAL_COMMENT = '##'\r
 TAB_HEADER_COMMENT = '@file'\r
 TAB_BINARY_HEADER_COMMENT = '@BinaryHeader'\r
-TAB_STAR = "*"\r
+TAB_STAR = '*'\r
+TAB_ENCODING_UTF16LE = 'utf_16_le'\r
+TAB_CAPHEX_START = '0X'\r
+TAB_HEX_START = '0x'\r
+TAB_PCD_ERROR = 'Error'\r
+TAB_PCD_ERROR_SECTION_COMMENT = 'Error message section'\r
+TAB_UNI_FILE_SUFFIXS = ['.uni', '.UNI', '.Uni']\r
 \r
 TAB_EDK_SOURCE = '$(EDK_SOURCE)'\r
 TAB_EFI_SOURCE = '$(EFI_SOURCE)'\r
@@ -354,10 +374,9 @@ TAB_ARCH_X64 = 'X64'
 TAB_ARCH_IPF = 'IPF'\r
 TAB_ARCH_ARM = 'ARM'\r
 TAB_ARCH_EBC = 'EBC'\r
-TAB_ARCH_AARCH64 = 'AARCH64'\r
 \r
 ARCH_LIST = \\r
-[TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_IPF, TAB_ARCH_ARM, TAB_ARCH_EBC, TAB_ARCH_AARCH64]\r
+[TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_IPF, TAB_ARCH_ARM, TAB_ARCH_EBC]\r
 \r
 SUP_MODULE_BASE = 'BASE'\r
 SUP_MODULE_SEC = 'SEC'\r
@@ -442,7 +461,6 @@ TAB_SOURCES_X64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_X64
 TAB_SOURCES_IPF = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_SOURCES_ARM = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_SOURCES_EBC = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_SOURCES_AARCH64 = TAB_SOURCES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_BINARIES = 'Binaries'\r
 TAB_BINARIES_COMMON = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -451,7 +469,6 @@ TAB_BINARIES_X64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_X64
 TAB_BINARIES_IPF = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_BINARIES_ARM = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_BINARIES_EBC = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_BINARIES_AARCH64 = TAB_BINARIES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_INCLUDES = 'Includes'\r
 TAB_INCLUDES_COMMON = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -460,7 +477,6 @@ TAB_INCLUDES_X64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_X64
 TAB_INCLUDES_IPF = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_INCLUDES_ARM = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_INCLUDES_EBC = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_INCLUDES_AARCH64 = TAB_INCLUDES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_GUIDS = 'Guids'\r
 TAB_GUIDS_COMMON = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -469,7 +485,6 @@ TAB_GUIDS_X64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_X64
 TAB_GUIDS_IPF = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_GUIDS_ARM = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_GUIDS_EBC = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_GUIDS_AARCH64 = TAB_GUIDS + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PROTOCOLS = 'Protocols'\r
 TAB_PROTOCOLS_COMMON = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -478,7 +493,6 @@ TAB_PROTOCOLS_X64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_X64
 TAB_PROTOCOLS_IPF = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_PROTOCOLS_ARM = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PROTOCOLS_EBC = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PROTOCOLS_AARCH64 = TAB_PROTOCOLS + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PPIS = 'Ppis'\r
 TAB_PPIS_COMMON = TAB_PPIS + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -487,7 +501,6 @@ TAB_PPIS_X64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_X64
 TAB_PPIS_IPF = TAB_PPIS + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_PPIS_ARM = TAB_PPIS + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PPIS_EBC = TAB_PPIS + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PPIS_AARCH64 = TAB_PPIS + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_LIBRARY_CLASSES = 'LibraryClasses'\r
 TAB_LIBRARY_CLASSES_COMMON = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -496,7 +509,6 @@ TAB_LIBRARY_CLASSES_X64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_X64
 TAB_LIBRARY_CLASSES_IPF = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_LIBRARY_CLASSES_ARM = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_LIBRARY_CLASSES_EBC = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_LIBRARY_CLASSES_AARCH64 = TAB_LIBRARY_CLASSES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PACKAGES = 'Packages'\r
 TAB_PACKAGES_COMMON = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -505,7 +517,6 @@ TAB_PACKAGES_X64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_X64
 TAB_PACKAGES_IPF = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_PACKAGES_ARM = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PACKAGES_EBC = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PACKAGES_AARCH64 = TAB_PACKAGES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PCDS = 'Pcds'\r
 TAB_PCDS_FIXED_AT_BUILD = 'FixedAtBuild'\r
@@ -545,8 +556,6 @@ TAB_PCDS_FIXED_AT_BUILD_ARM = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \
 TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PCDS_FIXED_AT_BUILD_EBC = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \\r
 TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PCDS_FIXED_AT_BUILD_AARCH64 = TAB_PCDS + TAB_PCDS_FIXED_AT_BUILD + \\r
-TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PCDS_PATCHABLE_IN_MODULE_NULL = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE\r
 TAB_PCDS_PATCHABLE_IN_MODULE_COMMON = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE \\r
@@ -561,8 +570,6 @@ TAB_PCDS_PATCHABLE_IN_MODULE_ARM = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \
 TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PCDS_PATCHABLE_IN_MODULE_EBC = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \\r
 TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PCDS_PATCHABLE_IN_MODULE_AARCH64 = TAB_PCDS + TAB_PCDS_PATCHABLE_IN_MODULE + \\r
-TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PCDS_FEATURE_FLAG_NULL = TAB_PCDS + TAB_PCDS_FEATURE_FLAG\r
 TAB_PCDS_FEATURE_FLAG_COMMON = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT \\r
@@ -577,8 +584,6 @@ TAB_PCDS_FEATURE_FLAG_ARM = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \
 TAB_ARCH_ARM\r
 TAB_PCDS_FEATURE_FLAG_EBC = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \\r
 TAB_ARCH_EBC\r
-TAB_PCDS_FEATURE_FLAG_AARCH64 = TAB_PCDS + TAB_PCDS_FEATURE_FLAG + TAB_SPLIT + \\r
-TAB_ARCH_AARCH64\r
 \r
 TAB_PCDS_DYNAMIC_EX_NULL = TAB_PCDS + TAB_PCDS_DYNAMIC_EX\r
 TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL = TAB_PCDS + TAB_PCDS_DYNAMIC_EX_DEFAULT\r
@@ -596,8 +601,6 @@ TAB_PCDS_DYNAMIC_EX_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \
 TAB_ARCH_ARM\r
 TAB_PCDS_DYNAMIC_EX_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \\r
 TAB_ARCH_EBC\r
-TAB_PCDS_DYNAMIC_EX_AARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC_EX + TAB_SPLIT + \\r
-TAB_ARCH_AARCH64\r
 \r
 TAB_PCDS_DYNAMIC_NULL = TAB_PCDS + TAB_PCDS_DYNAMIC\r
 TAB_PCDS_DYNAMIC_DEFAULT_NULL = TAB_PCDS + TAB_PCDS_DYNAMIC_DEFAULT\r
@@ -610,7 +613,6 @@ TAB_PCDS_DYNAMIC_X64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_X64
 TAB_PCDS_DYNAMIC_IPF = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_PCDS_DYNAMIC_ARM = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_PCDS_DYNAMIC_EBC = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_PCDS_DYNAMIC_AARCH64 = TAB_PCDS + TAB_PCDS_DYNAMIC + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_PCD_DYNAMIC_TYPE_LIST = [TAB_PCDS_DYNAMIC_DEFAULT_NULL, \\r
                              TAB_PCDS_DYNAMIC_VPD_NULL, \\r
@@ -651,7 +653,6 @@ TAB_DEPEX_X64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_X64
 TAB_DEPEX_IPF = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_DEPEX_ARM = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_DEPEX_EBC = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_DEPEX_AARCH64 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_SKUIDS = 'SkuIds'\r
 \r
@@ -662,7 +663,6 @@ TAB_LIBRARIES_X64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_X64
 TAB_LIBRARIES_IPF = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_LIBRARIES_ARM = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_LIBRARIES_EBC = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_LIBRARIES_AARCH64 = TAB_LIBRARIES + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_COMPONENTS = 'Components'\r
 TAB_COMPONENTS_COMMON = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_COMMON\r
@@ -671,7 +671,6 @@ TAB_COMPONENTS_X64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_X64
 TAB_COMPONENTS_IPF = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_IPF\r
 TAB_COMPONENTS_ARM = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_ARM\r
 TAB_COMPONENTS_EBC = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_EBC\r
-TAB_COMPONENTS_AARCH64 = TAB_COMPONENTS + TAB_SPLIT + TAB_ARCH_AARCH64\r
 \r
 TAB_COMPONENTS_SOURCE_OVERRIDE_PATH = 'SOURCE_OVERRIDE_PATH'\r
 \r
@@ -699,6 +698,7 @@ TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION = 'EFI_SPECIFICATION_VERSION'
 TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION = 'UEFI_SPECIFICATION_VERSION'\r
 TAB_INF_DEFINES_PI_SPECIFICATION_VERSION = 'PI_SPECIFICATION_VERSION'\r
 TAB_INF_DEFINES_EDK_RELEASE_VERSION = 'EDK_RELEASE_VERSION'\r
+TAB_INF_DEFINES_MODULE_UNI_FILE    = 'MODULE_UNI_FILE'\r
 TAB_INF_DEFINES_BINARY_MODULE = 'BINARY_MODULE'\r
 TAB_INF_DEFINES_LIBRARY_CLASS = 'LIBRARY_CLASS'\r
 TAB_INF_DEFINES_COMPONENT_TYPE = 'COMPONENT_TYPE'\r
@@ -750,7 +750,7 @@ TAB_DEC_DEFINES_DEC_SPECIFICATION = 'DEC_SPECIFICATION'
 TAB_DEC_DEFINES_PACKAGE_NAME = 'PACKAGE_NAME'\r
 TAB_DEC_DEFINES_PACKAGE_GUID = 'PACKAGE_GUID'\r
 TAB_DEC_DEFINES_PACKAGE_VERSION = 'PACKAGE_VERSION'\r
-TAB_DEC_DEFINES_PKG_UNI_FILE    = 'PKG_UNI_FILE'\r
+TAB_DEC_DEFINES_PKG_UNI_FILE    = 'PACKAGE_UNI_FILE'\r
 TAB_DEC_PACKAGE_ABSTRACT = 'STR_PACKAGE_ABSTRACT'\r
 TAB_DEC_PACKAGE_DESCRIPTION = 'STR_PACKAGE_DESCRIPTION'\r
 TAB_DEC_PACKAGE_LICENSE = 'STR_PACKAGE_LICENSE'\r
@@ -827,6 +827,7 @@ TAB_HEADER_COPYRIGHT = 'Copyright'
 TAB_HEADER_LICENSE = 'License'\r
 TAB_BINARY_HEADER_IDENTIFIER = 'BinaryHeader'\r
 TAB_BINARY_HEADER_USERID = 'TianoCore'\r
+\r
 #\r
 # Build database path\r
 #\r
@@ -951,3 +952,5 @@ TOOL_FAMILY_LIST = ["MSFT",
 TYPE_HOB_SECTION = 'HOB'\r
 TYPE_EVENT_SECTION = 'EVENT'\r
 TYPE_BOOTMODE_SECTION = 'BOOTMODE' \r
+\r
+PCD_ERR_CODE_MAX_SIZE = 4294967295\r
index 3b476b4c48c4d208722db40991ee0be165981e57..090c7eb95716fa223bd791f07605568a2ebe8625 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to check PCD logical expression\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -106,16 +106,21 @@ class _ExprBase:
             '>' : '=',\r
             '<' : '='\r
         }\r
+        \r
         for Operator in OpList:\r
             if not self.Token[self.Index:].startswith(Operator):\r
                 continue\r
+            \r
             self.Index += len(Operator)\r
             Char = self.Token[self.Index : self.Index + 1]\r
+\r
             if (Operator in LetterOp and (Char == '_' or Char.isalnum())) \\r
                 or (Operator in OpMap and OpMap[Operator] == Char):\r
                 self.Index -= len(Operator)\r
                 break\r
+            \r
             return True\r
+        \r
         return False\r
 \r
 ## _LogicalExpressionParser\r
@@ -166,6 +171,7 @@ class _LogicalExpressionParser(_ExprBase):
                     return False\r
                 \r
                 return True\r
+        \r
         return False\r
     \r
     def IsAtomicNumVal(self):\r
@@ -216,32 +222,32 @@ class _LogicalExpressionParser(_ExprBase):
     #\r
     def LogicalExpression(self):\r
         Ret = self.SpecNot()\r
-        while self.IsCurrentOp(['||', 'OR', 'or', '&&', 'AND', 'and', 'XOR']):\r
+        while self.IsCurrentOp(['||', 'OR', 'or', '&&', 'AND', 'and', 'XOR', 'xor', '^']):\r
             if self.Token[self.Index-1] == '|' and self.Parens <= 0:\r
-                raise  _ExprError(ST.ERR_EXPR_OR)\r
-            if Ret == self.ARITH:\r
+                raise  _ExprError(ST.ERR_EXPR_OR % self.Token)\r
+            if Ret not in [self.ARITH, self.LOGICAL, self.REALLOGICAL, self.STRINGITEM]:\r
                 raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)\r
             Ret = self.SpecNot()\r
-            if Ret == self.ARITH:\r
+            if Ret not in [self.ARITH, self.LOGICAL, self.REALLOGICAL, self.STRINGITEM]:\r
                 raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)\r
             Ret = self.REALLOGICAL\r
         return Ret\r
     \r
     def SpecNot(self):\r
-        if self.IsCurrentOp(["NOT", "!"]):\r
+        if self.IsCurrentOp(["NOT", "!", "not"]):\r
             return self.SpecNot()\r
         return self.Rel()\r
     \r
-    ## A < B, A > B, A <= B, A >= b\r
+    ## A < B, A > B, A <= B, A >= B\r
     #\r
     def Rel(self):\r
         Ret = self.Expr()\r
         if self.IsCurrentOp(["<=", ">=", ">", "<", "GT", "LT", "GE", "LE",\r
                              "==", "EQ", "!=", "NE"]):\r
-            if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:\r
+            if Ret == self.STRINGITEM:\r
                 raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)\r
             Ret = self.Expr()\r
-            if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:\r
+            if Ret == self.REALLOGICAL:\r
                 raise _ExprError(ST.ERR_EXPR_LOGICAL % self.Token)\r
             Ret = self.REALLOGICAL\r
         return Ret\r
@@ -250,7 +256,7 @@ class _LogicalExpressionParser(_ExprBase):
     #\r
     def Expr(self):\r
         Ret = self.Factor()\r
-        while self.IsCurrentOp(["+", "-", "&", "|", "^"]):\r
+        while self.IsCurrentOp(["+", "-", "&", "|", "^", "XOR", "xor"]):\r
             if self.Token[self.Index-1] == '|' and self.Parens <= 0:\r
                 raise  _ExprError(ST.ERR_EXPR_OR)\r
             if Ret == self.STRINGITEM or Ret == self.REALLOGICAL:\r
@@ -281,15 +287,15 @@ class _LogicalExpressionParser(_ExprBase):
             return self.ARITH\r
         else:\r
             raise _ExprError(ST.ERR_EXPR_FACTOR % \\r
-                             (self.Token, self.Token[self.Index:]))\r
+                             (self.Token[self.Index:], self.Token))\r
             \r
     ## IsValidLogicalExpression\r
     #\r
     def IsValidLogicalExpression(self):\r
         if self.Len == 0:\r
-            return False, ST.ERR_EXPR_EMPTY\r
+            return False, ST.ERR_EXPRESS_EMPTY\r
         try:\r
-            if self.LogicalExpression() == self.ARITH:\r
+            if self.LogicalExpression() not in [self.ARITH, self.LOGICAL, self.REALLOGICAL, self.STRINGITEM]:\r
                 return False, ST.ERR_EXPR_LOGICAL % self.Token\r
         except _ExprError, XExcept:\r
             return False, XExcept.Error\r
@@ -307,55 +313,84 @@ class _ValidRangeExpressionParser(_ExprBase):
         '[\t\s]*0[xX][a-fA-F0-9]+[\t\s]*-[\t\s]*0[xX][a-fA-F0-9]+'\r
     def __init__(self, Token):\r
         _ExprBase.__init__(self, Token)\r
+        self.Parens = 0\r
+        self.HEX = 1\r
+        self.INT = 2\r
+        self.IsParenHappen = False\r
+        self.IsLogicalOpHappen = False\r
     \r
     ## IsValidRangeExpression\r
     #\r
     def IsValidRangeExpression(self):\r
         if self.Len == 0:\r
-            return False\r
+            return False, ST.ERR_EXPR_RANGE_EMPTY\r
         try:\r
-            self.RangeExpression()\r
-        except _ExprError:\r
-            return False\r
+            if self.RangeExpression() not in [self.HEX, self.INT]:\r
+                return False, ST.ERR_EXPR_RANGE % self.Token\r
+        except _ExprError, XExcept:\r
+            return False, XExcept.Error\r
+        \r
         self.SkipWhitespace()\r
         if self.Index != self.Len:\r
-            return False\r
-        return True\r
+            return False, (ST.ERR_EXPR_RANGE % self.Token)\r
+        return True, ''\r
     \r
     ## RangeExpression\r
     #\r
     def RangeExpression(self):\r
-        self.Unary()\r
-        while self.IsCurrentOp(['OR', 'AND', 'XOR']):\r
-            self.Unary()\r
+        Ret = self.Unary()\r
+        while self.IsCurrentOp(['OR', 'AND', 'and', 'or']):\r
+            self.IsLogicalOpHappen = True\r
+            if not self.IsParenHappen:\r
+                raise _ExprError(ST.ERR_PAREN_NOT_USED % self.Token)\r
+            self.IsParenHappen = False\r
+            Ret = self.Unary()\r
+        \r
+        if self.IsCurrentOp(['XOR']):\r
+            Ret = self.Unary()\r
+        \r
+        return Ret\r
     \r
     ## Unary\r
     #\r
     def Unary(self):\r
-        if self.IsCurrentOp(["NOT", "-"]):\r
+        if self.IsCurrentOp(["NOT"]):\r
             return self.Unary()\r
+        \r
         return self.ValidRange()\r
     \r
     ## ValidRange\r
     #    \r
     def ValidRange(self):\r
+        Ret = -1\r
         if self.IsCurrentOp(["("]):\r
-            self.RangeExpression()\r
+            self.IsLogicalOpHappen = False\r
+            self.IsParenHappen = True\r
+            self.Parens += 1\r
+            if self.Parens > 1:\r
+                raise _ExprError(ST.ERR_EXPR_RANGE_DOUBLE_PAREN_NESTED % self.Token)\r
+            Ret = self.RangeExpression()\r
             if not self.IsCurrentOp([")"]):\r
-                raise _ExprError('')\r
-            return\r
+                raise _ExprError(ST.ERR_EXPR_RIGHT_PAREN % self.Token)\r
+            self.Parens -= 1\r
+            return Ret\r
+        \r
+        if self.IsLogicalOpHappen:\r
+            raise _ExprError(ST.ERR_PAREN_NOT_USED % self.Token)\r
         \r
-        if self.IsCurrentOp(["LT", "GT", "LE", "GE", "EQ"]):\r
+        if self.IsCurrentOp(["LT", "GT", "LE", "GE", "EQ", "XOR"]):\r
             IntMatch = \\r
                 re.compile(self.INT_PATTERN).match(self.Token[self.Index:])\r
             HexMatch = \\r
                 re.compile(self.HEX_PATTERN).match(self.Token[self.Index:])\r
             if HexMatch and HexMatch.start() == 0:\r
                 self.Index += HexMatch.end()\r
+                Ret = self.HEX\r
             elif IntMatch and IntMatch.start() == 0:\r
                 self.Index += IntMatch.end()\r
+                Ret = self.INT\r
             else:\r
-                raise _ExprError('')\r
+                raise _ExprError(ST.ERR_EXPR_RANGE_FACTOR % (self.Token[self.Index:], self.Token))\r
         else:\r
             IntRangeMatch = re.compile(\r
                 self.INT_RANGE_PATTERN).match(self.Token[self.Index:]\r
@@ -365,15 +400,50 @@ class _ValidRangeExpressionParser(_ExprBase):
             )\r
             if HexRangeMatch and HexRangeMatch.start() == 0:\r
                 self.Index += HexRangeMatch.end()\r
+                Ret = self.HEX\r
             elif IntRangeMatch and IntRangeMatch.start() == 0:\r
                 self.Index += IntRangeMatch.end()\r
+                Ret = self.INT\r
             else:\r
-                raise _ExprError('')\r
+                raise _ExprError(ST.ERR_EXPR_RANGE % self.Token)\r
+\r
+        return Ret\r
+\r
+## _ValidListExpressionParser\r
+#\r
+class _ValidListExpressionParser(_ExprBase):\r
+    VALID_LIST_PATTERN = '(0[xX][0-9a-fA-F]+|[0-9]+)([\t\s]*,[\t\s]*(0[xX][0-9a-fA-F]+|[0-9]+))*'\r
+    def __init__(self, Token):\r
+        _ExprBase.__init__(self, Token)\r
+        self.NUM = 1\r
         \r
-        if self.Token[self.Index:self.Index+1] == '_' or \\r
-            self.Token[self.Index:self.Index+1].isalnum():\r
-            raise _ExprError('')\r
+    def IsValidListExpression(self):\r
+        if self.Len == 0:\r
+            return False, ST.ERR_EXPR_LIST_EMPTY\r
+        try:\r
+            if self.ListExpression() not in [self.NUM]:\r
+                return False, ST.ERR_EXPR_LIST % self.Token\r
+        except _ExprError, XExcept:\r
+            return False, XExcept.Error\r
 \r
+        self.SkipWhitespace()\r
+        if self.Index != self.Len:\r
+            return False, (ST.ERR_EXPR_LIST % self.Token)\r
+\r
+        return True, ''\r
+        \r
+    def ListExpression(self):\r
+        Ret = -1\r
+        self.SkipWhitespace()\r
+        ListMatch = re.compile(self.VALID_LIST_PATTERN).match(self.Token[self.Index:])\r
+        if ListMatch and ListMatch.start() == 0:\r
+            self.Index += ListMatch.end()\r
+            Ret = self.NUM\r
+        else:\r
+            raise _ExprError(ST.ERR_EXPR_LIST % self.Token)\r
+\r
+        return Ret\r
+    \r
 ## _StringTestParser\r
 #\r
 class _StringTestParser(_ExprBase):\r
@@ -423,37 +493,38 @@ class _StringTestParser(_ExprBase):
         self.StringItem()\r
         if not self.IsCurrentOp(["==", "EQ", "!=", "NE"]):\r
             raise _ExprError(ST.ERR_EXPR_EQUALITY % \\r
-                             (self.Token, self.Token[self.Index:]))\r
+                             (self.Token[self.Index:], self.Token))\r
         self.StringItem()\r
         if self.Index != self.Len:\r
             raise _ExprError(ST.ERR_EXPR_BOOLEAN % \\r
                              (self.Token[self.Index:], self.Token))\r
 \r
 ##\r
-# Check syntax of logical expression\r
+# Check syntax of string test\r
 #\r
-# @param Token: expression token\r
+# @param Token: string test token\r
 #\r
-def IsValidLogicalExpr(Token, Flag=False):\r
+def IsValidStringTest(Token, Flag=False):\r
     #\r
     # Not do the check right now, keep the implementation for future enhancement.\r
     #\r
     if not Flag:\r
         return True, ""\r
-    return _LogicalExpressionParser(Token).IsValidLogicalExpression()\r
+    return _StringTestParser(Token).IsValidStringTest()\r
+\r
 \r
 ##\r
-# Check syntax of string test\r
+# Check syntax of logical expression\r
 #\r
-# @param Token: string test token\r
+# @param Token: expression token\r
 #\r
-def IsValidStringTest(Token, Flag=False):\r
+def IsValidLogicalExpr(Token, Flag=False):\r
     #\r
     # Not do the check right now, keep the implementation for future enhancement.\r
     #\r
     if not Flag:\r
         return True, ""\r
-    return _StringTestParser(Token).IsValidStringTest()\r
+    return _LogicalExpressionParser(Token).IsValidLogicalExpression()\r
 \r
 ##\r
 # Check syntax of range expression\r
@@ -463,6 +534,14 @@ def IsValidStringTest(Token, Flag=False):
 def IsValidRangeExpr(Token):\r
     return _ValidRangeExpressionParser(Token).IsValidRangeExpression()\r
 \r
+##\r
+# Check syntax of value list expression token\r
+#\r
+# @param Token: value list expression token \r
+#\r
+def IsValidListExpr(Token):\r
+    return _ValidListExpressionParser(Token).IsValidListExpression()\r
+\r
 ##\r
 # Check whether the feature flag expression is valid or not\r
 #\r
@@ -486,4 +565,8 @@ def IsValidFeatureFlagExp(Token, Flag=False):
         return True, ""\r
 \r
 if __name__ == '__main__':\r
-    print _LogicalExpressionParser('a ^ b > a + b').IsValidLogicalExpression()\r
+#    print IsValidRangeExpr('LT 9')\r
+    print _LogicalExpressionParser('gCrownBayTokenSpaceGuid.PcdPciDevice1BridgeAddressLE0').IsValidLogicalExpression()\r
+\r
+\r
+    \r
index e47e24a7148bce8726993a58513829b9a4db9d2a..d478983c23db9a5e0e28d3748ec1eccaa971e15e 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define common static strings and global data used by UPT\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -92,6 +92,17 @@ gUNPACK_DIR = None
 # Flag used to mark whether the INF file is Binary INF or not.\r
 #\r
 gIS_BINARY_INF = False\r
+\r
+#\r
+# Used by FileHook module.\r
+#\r
+gRECOVERMGR = None\r
+\r
+#\r
+# Used by PCD parser\r
+#\r
+gPackageDict = {}\r
+\r
 #\r
 # Used by Library instance parser\r
 # {FilePath: FileObj}\r
index 750805e32814a978b7b3fbb62436b44fdb312782..bc9e0e172bf748f56de2424f501859252013461f 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Common routines used by all tools\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -41,11 +41,15 @@ from Library import GlobalData
 from Library.DataType import SUP_MODULE_LIST\r
 from Library.DataType import END_OF_LINE\r
 from Library.DataType import TAB_SPLIT\r
-from Library.DataType import LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_EN\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_UNI_FILE_SUFFIXS\r
 from Library.String import GetSplitValueList\r
 from Library.ParserValidate import IsValidHexVersion\r
 from Library.ParserValidate import IsValidPath\r
 from Object.POM.CommonObject import TextObject\r
+from Core.FileHook import __FileHookOpen__\r
 \r
 ## Convert GUID string in xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx style to C \r
 # structure style\r
@@ -160,14 +164,14 @@ def SaveFileOnChange(File, Content, IsBinaryFile=True):
 \r
     if os.path.exists(File):\r
         try:\r
-            if Content == open(File, "rb").read():\r
+            if Content == __FileHookOpen__(File, "rb").read():\r
                 return False\r
         except BaseException:\r
             Logger.Error(None, ToolError.FILE_OPEN_FAILURE, ExtraData=File)\r
 \r
     CreateDirectory(os.path.dirname(File))\r
     try:\r
-        FileFd = open(File, "wb")\r
+        FileFd = __FileHookOpen__(File, "wb")\r
         FileFd.write(Content)\r
         FileFd.close()\r
     except BaseException:\r
@@ -188,6 +192,8 @@ def GetFiles(Root, SkipList=None, FullPath=True):
             for Item in SkipList:\r
                 if Item in Dirs:\r
                     Dirs.remove(Item)\r
+                if Item in Files:\r
+                    Files.remove(Item)\r
         for Dir in Dirs:\r
             if Dir.startswith('.'):\r
                 Dirs.remove(Dir)\r
@@ -566,39 +572,46 @@ class PathClass(object):
 \r
     Key = property(_GetFileKey)\r
 \r
-## Check environment variables\r
+## Get current workspace\r
 #\r
-#  Check environment variables that must be set for build. Currently they are\r
+#  get WORKSPACE from environment variable if present,if not use current working directory as WORKSPACE\r
 #\r
-#   WORKSPACE           The directory all packages/platforms start from\r
-#   EDK_TOOLS_PATH      The directory contains all tools needed by the build\r
-#   PATH                $(EDK_TOOLS_PATH)/Bin/<sys> must be set in PATH\r
-#\r
-#   If any of above environment variable is not set or has error, the build\r
-#   will be broken.\r
-#\r
-def CheckEnvVariable():\r
+def GetWorkspace():\r
     #\r
     # check WORKSPACE\r
     #\r
-    if "WORKSPACE" not in environ:\r
-        Logger.Error("UPT",\r
-                     ToolError.UPT_ENVIRON_MISSING_ERROR,\r
-                     ST.ERR_NOT_FOUND_ENVIRONMENT,\r
-                     ExtraData="WORKSPACE")\r
-\r
-    WorkspaceDir = os.path.normpath(environ["WORKSPACE"])\r
-    if not os.path.exists(WorkspaceDir):\r
-        Logger.Error("UPT",\r
-                     ToolError.UPT_ENVIRON_MISSING_ERROR,\r
-                     ST.ERR_WORKSPACE_NOTEXIST,\r
-                     ExtraData="%s" % WorkspaceDir)\r
-    elif ' ' in WorkspaceDir:\r
-        Logger.Error("UPT",\r
-                     ToolError.FORMAT_NOT_SUPPORTED,\r
-                     ST.ERR_SPACE_NOTALLOWED,\r
-                     ExtraData=WorkspaceDir)\r
+    if "WORKSPACE" in environ:\r
+        WorkspaceDir = os.path.normpath(environ["WORKSPACE"])\r
+        if not os.path.exists(WorkspaceDir):\r
+            Logger.Error("UPT",\r
+                         ToolError.UPT_ENVIRON_MISSING_ERROR,\r
+                         ST.ERR_WORKSPACE_NOTEXIST,\r
+                         ExtraData="%s" % WorkspaceDir)\r
+    else:\r
+        WorkspaceDir = os.getcwd()\r
 \r
+    if WorkspaceDir[-1] == ':':\r
+        WorkspaceDir += os.sep\r
+    return WorkspaceDir\r
+\r
+## Get relative path\r
+#\r
+#  use full path and workspace to get relative path\r
+#  the destination of this function is mainly to resolve the root path issue(like c: or c:\)  \r
+#\r
+#  @param Fullpath: a string of fullpath\r
+#  @param Workspace: a string of workspace\r
+#\r
+def GetRelativePath(Fullpath, Workspace):\r
+    \r
+    RelativePath = ''\r
+    if Workspace.endswith(os.sep):\r
+        RelativePath = Fullpath[Fullpath.upper().find(Workspace.upper())+len(Workspace):]\r
+    else:\r
+        RelativePath = Fullpath[Fullpath.upper().find(Workspace.upper())+len(Workspace)+1:]\r
+        \r
+    return RelativePath\r
+    \r
 ## Check whether all module types are in list\r
 #\r
 # check whether all module types (SUP_MODULE_LIST) are in list\r
@@ -644,7 +657,7 @@ class MergeCommentDict(dict):
 #\r
 def GenDummyHelpTextObj():\r
     HelpTxt = TextObject()\r
-    HelpTxt.SetLang(LANGUAGE_EN_US)\r
+    HelpTxt.SetLang(TAB_LANGUAGE_EN_US)\r
     HelpTxt.SetString(' ')\r
     return HelpTxt\r
 \r
@@ -972,3 +985,136 @@ def GetLibInstanceInfo(String, WorkSpace, LineNo):
             VerString = GetSplitValueList(VerString, '=', 1)[1]\r
 \r
         return FileGuidString, VerString\r
+\r
+## GetLocalValue\r
+#\r
+# Generate the local value for INF and DEC file. If Lang attribute not present, then use this value.\r
+# If present, and there is no element without the Lang attribute, and one of the elements has the rfc1766 code is \r
+# "en-x-tianocore", or "en-US" if "en-x-tianocore" was not found, or "en" if "en-US" was not found, or startswith 'en' \r
+# if 'en' was not found, then use this value.\r
+# If multiple entries of a tag exist which have the same language code, use the last entry.\r
+#\r
+# @param ValueList  A list need to be processed.\r
+# @param UseFirstValue: True to use the first value, False to use the last value \r
+#\r
+# @return LocalValue\r
+def GetLocalValue(ValueList, UseFirstValue=False):\r
+    Value1 = ''\r
+    Value2 = ''\r
+    Value3 = ''\r
+    Value4 = ''\r
+    Value5 = ''\r
+    for (Key, Value) in ValueList:\r
+        if Key == TAB_LANGUAGE_EN_X:\r
+            if UseFirstValue:\r
+                if not Value1:\r
+                    Value1 = Value\r
+            else:\r
+                Value1 = Value\r
+        if Key == TAB_LANGUAGE_EN_US:\r
+            if UseFirstValue:\r
+                if not Value2:\r
+                    Value2 = Value\r
+            else:\r
+                Value2 = Value\r
+        if Key == TAB_LANGUAGE_EN:\r
+            if UseFirstValue:\r
+                if not Value3:\r
+                    Value3 = Value\r
+            else:\r
+                Value3 = Value\r
+        if Key.startswith(TAB_LANGUAGE_EN):\r
+            if UseFirstValue:\r
+                if not Value4:\r
+                    Value4 = Value\r
+            else:\r
+                Value4 = Value\r
+        if Key == '':\r
+            if UseFirstValue:\r
+                if not Value5:\r
+                    Value5 = Value\r
+            else:\r
+                Value5 = Value\r
+            \r
+    if Value1:\r
+        return Value1\r
+    if Value2:\r
+        return Value2\r
+    if Value3:\r
+        return Value3\r
+    if Value4:\r
+        return Value4\r
+    if Value5:\r
+        return Value5\r
+    \r
+    return ''\r
+\r
+\r
+## GetCharIndexOutStr\r
+#\r
+# Get comment character index outside a string\r
+#\r
+# @param Line:              The string to be checked\r
+# @param CommentCharacter:  Comment char, used to ignore comment content\r
+#\r
+# @retval Index\r
+#\r
+def GetCharIndexOutStr(CommentCharacter, Line):\r
+    #\r
+    # remove whitespace\r
+    #\r
+    Line = Line.strip()\r
+\r
+    #\r
+    # Check whether comment character is in a string\r
+    #\r
+    InString = False\r
+    for Index in range(0, len(Line)):\r
+        if Line[Index] == '"':\r
+            InString = not InString\r
+        elif Line[Index] == CommentCharacter and InString :\r
+            pass\r
+        elif Line[Index] == CommentCharacter and (Index +1) < len(Line) and Line[Index+1] == CommentCharacter \\r
+            and not InString :\r
+            return Index\r
+    return -1\r
+\r
+## ValidateUNIFilePath\r
+#\r
+# Check the UNI file path\r
+#\r
+# @param FilePath: The UNI file path \r
+#\r
+def ValidateUNIFilePath(Path):\r
+    Suffix = Path[Path.rfind(TAB_SPLIT):]\r
+    \r
+    #\r
+    # Check if the suffix is one of the '.uni', '.UNI', '.Uni' \r
+    #\r
+    if Suffix not in TAB_UNI_FILE_SUFFIXS:\r
+        Logger.Error("Unicode File Parser", \r
+                        ToolError.FORMAT_INVALID, \r
+                        Message=ST.ERR_UNI_FILE_SUFFIX_WRONG, \r
+                        ExtraData=Path)    \r
+    \r
+    #\r
+    # Check if '..' in the file name(without suffixe)\r
+    #\r
+    if (TAB_SPLIT + TAB_SPLIT) in Path:\r
+        Logger.Error("Unicode File Parser", \r
+                        ToolError.FORMAT_INVALID, \r
+                        Message=ST.ERR_UNI_FILE_NAME_INVALID, \r
+                        ExtraData=Path)    \r
+    \r
+    #\r
+    # Check if the file name is valid according to the DEC and INF specification\r
+    #\r
+    Pattern = '[a-zA-Z0-9_][a-zA-Z0-9_\-\.]*'\r
+    FileName = Path.replace(Suffix, '')\r
+    InvalidCh = re.sub(Pattern, '', FileName)\r
+    if InvalidCh:\r
+        Logger.Error("Unicode File Parser", \r
+                        ToolError.FORMAT_INVALID, \r
+                        Message=ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID, \r
+                        ExtraData=Path)    \r
+\r
index 860fb4f1dcdfa3fa797809d729557be7b40d80d9..bfb4bc749fdf20c01616d220987654c49ab67857 100644 (file)
@@ -1,6 +1,7 @@
 ## @file ParserValidate.py\r
+# Functions for parser validation\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -566,7 +567,7 @@ def IsValidPcdValue(PcdValue):
     for Char in PcdValue:\r
         if Char == '\n' or Char == '\t' or Char == '\f':\r
             return False\r
-        \r
+    \r
     #\r
     # <Boolean>\r
     #\r
@@ -582,7 +583,7 @@ def IsValidPcdValue(PcdValue):
     if IsValidHex(PcdValue):\r
         return True\r
     \r
-    ReIsValidIntegerSingle = re.compile(r"^\s*[0-9]\s*$", re.DOTALL)   \r
+    ReIsValidIntegerSingle = re.compile(r"^\s*[0-9]\s*$", re.DOTALL)\r
     if ReIsValidIntegerSingle.match(PcdValue) != None:\r
         return True\r
     \r
@@ -590,7 +591,6 @@ def IsValidPcdValue(PcdValue):
     if ReIsValidIntegerMulti.match(PcdValue) != None:\r
         return True\r
     \r
-    \r
     #\r
     # <StringVal>              ::=  {<StringType>} {<Array>} {"$(" <MACRO> ")"}\r
     # <StringType>             ::=  {<UnicodeString>} {<CString>}\r
index 95c51406b22a1c2a7dfabeb48c95974103ad1cd3..db0fec3a73cc04eab10f3b52d5dddd6577a2c235 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define common parsing related functions used in parsing \r
 # INF/DEC/DSC process\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -42,6 +42,7 @@ from Logger import StringTable as ST
 import Logger.Log as Logger\r
 \r
 from Parser.DecParser import Dec\r
+import GlobalData\r
 \r
 gPKG_INFO_DICT = {}\r
 \r
@@ -53,7 +54,7 @@ gPKG_INFO_DICT = {}
 # @param String:  String with BuildOption statement\r
 # @param File:    The file which defines build option, used in error report\r
 #\r
-def GetBuildOption(String, File, LineNo=-1):\r
+def GetBuildOption(String, File, LineNo= -1):\r
     (Family, ToolChain, Flag) = ('', '', '')\r
     if String.find(DataType.TAB_EQUAL_SPLIT) < 0:\r
         RaiseParserError(String, 'BuildOptions', File, \\r
@@ -76,7 +77,7 @@ def GetBuildOption(String, File, LineNo=-1):
 # @param ContainerFile:  The file which describes the library class, used for \r
 #                        error report\r
 #\r
-def GetLibraryClass(Item, ContainerFile, WorkspaceDir, LineNo=-1):\r
+def GetLibraryClass(Item, ContainerFile, WorkspaceDir, LineNo= -1):\r
     List = GetSplitValueList(Item[0])\r
     SupMod = DataType.SUP_MODULE_LIST_STRING\r
     if len(List) != 2:\r
@@ -101,7 +102,7 @@ def GetLibraryClass(Item, ContainerFile, WorkspaceDir, LineNo=-1):
 # @param ContainerFile:  The file which describes the library class, used for \r
 #                        error report\r
 #\r
-def GetLibraryClassOfInf(Item, ContainerFile, WorkspaceDir, LineNo = -1):\r
+def GetLibraryClassOfInf(Item, ContainerFile, WorkspaceDir, LineNo= -1):\r
     ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\r
     SupMod = DataType.SUP_MODULE_LIST_STRING\r
 \r
@@ -131,7 +132,7 @@ def GetLibraryClassOfInf(Item, ContainerFile, WorkspaceDir, LineNo = -1):
 # @param Section:          Used for error report\r
 # @param File:             Used for error report\r
 #\r
-def CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo=-1):\r
+def CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo= -1):\r
     Format = '<TokenSpaceGuidCName>.<PcdCName>'\r
     if TokenInfoString != '' and TokenInfoString != None:\r
         TokenInfoList = GetSplitValueList(TokenInfoString, DataType.TAB_SPLIT)\r
@@ -151,7 +152,7 @@ def CheckPcdTokenInfo(TokenInfoString, Section, File, LineNo=-1):
 #                        report\r
 \r
 #\r
-def GetPcd(Item, Type, ContainerFile, LineNo=-1):\r
+def GetPcd(Item, Type, ContainerFile, LineNo= -1):\r
     TokenGuid, TokenName, Value, MaximumDatumSize, Token = '', '', '', '', ''\r
     List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)\r
 \r
@@ -178,7 +179,7 @@ def GetPcd(Item, Type, ContainerFile, LineNo=-1):
 # @param ContainerFile:  The file which describes the pcd, used for error \r
 #                        report\r
 #\r
-def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo=-1):\r
+def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo= -1):\r
     TokenGuid, TokenName, Value = '', '', ''\r
     List = GetSplitValueList(Item)\r
     if len(List) != 2:\r
@@ -202,7 +203,7 @@ def GetFeatureFlagPcd(Item, Type, ContainerFile, LineNo=-1):
 # @param ContainerFile:  The file which describes the pcd, used for error \r
 #                        report\r
 #\r
-def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo=-1):\r
+def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo= -1):\r
     TokenGuid, TokenName, Value, DatumTyp, MaxDatumSize = '', '', '', '', ''\r
     List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)\r
     if len(List) < 4 or len(List) > 8:\r
@@ -228,7 +229,7 @@ def GetDynamicDefaultPcd(Item, Type, ContainerFile, LineNo=-1):
 # @param ContainerFile:  The file which describes the pcd, used for error \r
 #                        report\r
 #\r
-def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo = -1):\r
+def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo= -1):\r
     TokenGuid, TokenName, List1, List2, List3, List4, List5 = \\r
     '', '', '', '', '', '', ''\r
     List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)\r
@@ -255,7 +256,7 @@ def GetDynamicHiiPcd(Item, Type, ContainerFile, LineNo = -1):
 # @param ContainerFile:  The file which describes the pcd, used for error \r
 #                        report\r
 #\r
-def GetDynamicVpdPcd(Item, Type, ContainerFile, LineNo=-1):\r
+def GetDynamicVpdPcd(Item, Type, ContainerFile, LineNo= -1):\r
     TokenGuid, TokenName, List1, List2 = '', '', '', ''\r
     List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
     if len(List) < 3 or len(List) > 4:\r
@@ -533,7 +534,7 @@ def GetComponents(Lines, KeyValues, CommentCharacter):
 # @param ContainerFile:  The file which describes the library class, used \r
 #                        for error report\r
 #\r
-def GetSource(Item, ContainerFile, FileRelativePath, LineNo=-1):\r
+def GetSource(Item, ContainerFile, FileRelativePath, LineNo= -1):\r
     ItemNew = Item + DataType.TAB_VALUE_SPLIT * 4\r
     List = GetSplitValueList(ItemNew)\r
     if len(List) < 5 or len(List) > 9:\r
@@ -558,7 +559,7 @@ def GetSource(Item, ContainerFile, FileRelativePath, LineNo=-1):
 # @param ContainerFile:  The file which describes the library class, \r
 #                        used for error report\r
 #\r
-def GetBinary(Item, ContainerFile, LineNo=-1):\r
+def GetBinary(Item, ContainerFile, LineNo= -1):\r
     ItemNew = Item + DataType.TAB_VALUE_SPLIT\r
     List = GetSplitValueList(ItemNew)\r
     if len(List) < 3 or len(List) > 5:\r
@@ -596,7 +597,7 @@ def GetGuidsProtocolsPpisOfInf(Item):
 # @param ContainerFile:  The file which describes the library class, \r
 # used for error report\r
 #\r
-def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo=-1):\r
+def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo= -1):\r
     List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)\r
     if len(List) != 2:\r
         RaiseParserError(Item, Type, ContainerFile, '<CName>=<GuidValue>', \\r
@@ -614,7 +615,7 @@ def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo=-1):
             RegisterFormatGuid = List[1]\r
         else:\r
             RaiseParserError(Item, Type, ContainerFile, \\r
-                             'CFormat or RegisterFormat', LineNo) \r
+                             'CFormat or RegisterFormat', LineNo)\r
 \r
     return (List[0], RegisterFormatGuid)\r
 \r
@@ -627,7 +628,7 @@ def GetGuidsProtocolsPpisOfDec(Item, Type, ContainerFile, LineNo=-1):
 # @param ContainerFile:  The file which describes the library class, \r
 #                        used for error report\r
 #\r
-def GetPackage(Item, ContainerFile, FileRelativePath, LineNo=-1):\r
+def GetPackage(Item, ContainerFile, FileRelativePath, LineNo= -1):\r
     ItemNew = Item + DataType.TAB_VALUE_SPLIT\r
     List = GetSplitValueList(ItemNew)\r
     CheckFileType(List[0], '.Dec', ContainerFile, 'package', List[0], LineNo)\r
@@ -683,7 +684,7 @@ def GetPcdOfInf(Item, Type, File, LineNo):
 # @param File:  Dec file\r
 # @param LineNo:  Line number\r
 #\r
-def GetPcdOfDec(Item, Type, File, LineNo=-1):\r
+def GetPcdOfDec(Item, Type, File, LineNo= -1):\r
     Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
     TokenGuid, TokenName, Value, DatumType, Token = '', '', '', '', ''\r
     List = GetSplitValueList(Item)\r
@@ -756,7 +757,7 @@ def InsertSectionItems(Model, SectionItemList, ArchList, \
             LineValue, StartLine, Comment = SectionItem[0], \\r
             SectionItem[1], SectionItem[2]\r
 \r
-            Logger.Debug(4, ST.MSG_PARSING %LineValue)\r
+            Logger.Debug(4, ST.MSG_PARSING % LineValue)\r
             #\r
             # And then parse DEFINE statement\r
             #\r
@@ -782,7 +783,7 @@ def GenMetaDatSectionItem(Key, Value, List):
         List[Key] = [Value]\r
     else:\r
         List[Key].append(Value)\r
-        \r
+\r
 ## GetPkgInfoFromDec\r
 #\r
 # get package name, guid, version info from dec files\r
@@ -793,17 +794,23 @@ def GetPkgInfoFromDec(Path):
     PkgName = None\r
     PkgGuid = None\r
     PkgVersion = None\r
-    \r
+\r
     Path = Path.replace('\\', '/')\r
-    \r
+\r
     if not os.path.exists(Path):\r
-        Logger.Error("\nUPT", FILE_NOT_FOUND, File = Path)  \r
+        Logger.Error("\nUPT", FILE_NOT_FOUND, File=Path)\r
 \r
     if Path in gPKG_INFO_DICT:\r
         return gPKG_INFO_DICT[Path]\r
 \r
     try:\r
-        DecParser = Dec(Path)\r
+        DecParser = None\r
+        if Path not in GlobalData.gPackageDict:\r
+            DecParser = Dec(Path)\r
+            GlobalData.gPackageDict[Path] = DecParser\r
+        else:\r
+            DecParser = GlobalData.gPackageDict[Path]\r
+\r
         PkgName = DecParser.GetPackageName()\r
         PkgGuid = DecParser.GetPackageGuid()\r
         PkgVersion = DecParser.GetPackageVersion()\r
@@ -819,7 +826,7 @@ def GetPkgInfoFromDec(Path):
 #\r
 def GetWorkspacePackage():\r
     DecFileList = []\r
-    WorkspaceDir = os.environ["WORKSPACE"]\r
+    WorkspaceDir = GlobalData.gWORKSPACE\r
     for Root, Dirs, Files in os.walk(WorkspaceDir):\r
         if 'CVS' in Dirs:\r
             Dirs.remove('CVS')\r
@@ -843,7 +850,7 @@ def GetWorkspacePackage():
         (PkgName, PkgGuid, PkgVersion) = GetPkgInfoFromDec(DecFile)\r
         if PkgName and PkgGuid and PkgVersion:\r
             PkgList.append((PkgName, PkgGuid, PkgVersion, DecFile))\r
-    \r
+\r
     return PkgList\r
 \r
 ## GetWorkspaceModule\r
@@ -852,7 +859,7 @@ def GetWorkspacePackage():
 #\r
 def GetWorkspaceModule():\r
     InfFileList = []\r
-    WorkspaceDir = os.environ["WORKSPACE"]\r
+    WorkspaceDir = GlobalData.gWORKSPACE\r
     for Root, Dirs, Files in os.walk(WorkspaceDir):\r
         if 'CVS' in Dirs:\r
             Dirs.remove('CVS')\r
@@ -870,7 +877,7 @@ def GetWorkspaceModule():
             if Ext.lower() in ['.inf']:\r
                 InfFileList.append\\r
                 (os.path.normpath(os.path.join(Root, FileSp)))\r
-    \r
+\r
     return InfFileList\r
 \r
 ## MacroParser used to parse macro definition\r
@@ -890,7 +897,7 @@ def MacroParser(Line, FileName, SectionType, FileLocalMacros):
         # Not 'DEFINE/EDK_GLOBAL' statement, call decorated method\r
         #\r
         return None, None\r
-    \r
+\r
     TokenList = GetSplitValueList(LineContent[Match.end(1):], \\r
                                   DataType.TAB_EQUAL_SPLIT, 1)\r
     #\r
@@ -910,16 +917,16 @@ def MacroParser(Line, FileName, SectionType, FileLocalMacros):
     #\r
     if SectionType == DataType.MODEL_META_DATA_HEADER:\r
         FileLocalMacros[Name] = Value\r
-    \r
+\r
     ReIsValidMacroName = re.compile(r"^[A-Z][A-Z0-9_]*$", re.DOTALL)\r
     if ReIsValidMacroName.match(Name) == None:\r
-        Logger.Error('Parser', \r
-                     FORMAT_INVALID, \r
-                     ST.ERR_MACRONAME_INVALID%(Name),\r
-                     ExtraData=LineContent, \r
-                     File=FileName, \r
+        Logger.Error('Parser',\r
+                     FORMAT_INVALID,\r
+                     ST.ERR_MACRONAME_INVALID % (Name),\r
+                     ExtraData=LineContent,\r
+                     File=FileName,\r
                      Line=LineNo)\r
-        \r
+\r
     # Validate MACRO Value\r
     #\r
     # <MacroDefinition> ::=  [<Comments>]{0,}\r
@@ -932,13 +939,13 @@ def MacroParser(Line, FileName, SectionType, FileLocalMacros):
     #\r
     ReIsValidMacroValue = re.compile(r"^[\x20-\x7e]*$", re.DOTALL)\r
     if ReIsValidMacroValue.match(Value) == None:\r
-        Logger.Error('Parser', \r
-                     FORMAT_INVALID, \r
-                     ST.ERR_MACROVALUE_INVALID%(Value),\r
-                     ExtraData=LineContent, \r
-                     File=FileName, \r
+        Logger.Error('Parser',\r
+                     FORMAT_INVALID,\r
+                     ST.ERR_MACROVALUE_INVALID % (Value),\r
+                     ExtraData=LineContent,\r
+                     File=FileName,\r
                      Line=LineNo)\r
-        \r
+\r
     return Name, Value\r
 \r
 ## GenSection \r
@@ -952,7 +959,7 @@ def MacroParser(Line, FileName, SectionType, FileLocalMacros):
 #                       seperated by space, \r
 #                       value is statement\r
 #\r
-def GenSection(SectionName, SectionDict, SplitArch=True):\r
+def GenSection(SectionName, SectionDict, SplitArch=True, NeedBlankLine=False):\r
     Content = ''\r
     for SectionAttrs in SectionDict:\r
         StatementList = SectionDict[SectionAttrs]\r
@@ -969,11 +976,29 @@ def GenSection(SectionName, SectionDict, SplitArch=True):
             Section = '[' + SectionName + '.' + (', ' + SectionName + '.').join(ArchList) + ']'\r
         else:\r
             Section = '[' + SectionName + ']'\r
-        Content += '\n\n' + Section + '\n'\r
+        Content += '\n' + Section + '\n'\r
         if StatementList != None:\r
             for Statement in StatementList:\r
-                Content += Statement + '\n'\r
+                LineList = Statement.split('\n')\r
+                NewStatement = ""\r
+                for Line in LineList:\r
+                    # ignore blank comment\r
+                    if not Line.replace("#", '').strip() and SectionName != 'Defines':\r
+                        continue\r
+                    # add two space before non-comments line except the comments in Defines section\r
+                    if Line.strip().startswith('#') and SectionName == 'Defines':\r
+                        NewStatement += "%s\n" % Line\r
+                        continue\r
+                    NewStatement += "  %s\n" % Line\r
+                if NeedBlankLine:\r
+                    Content += NewStatement + '\n'\r
+                else:\r
+                    Content += NewStatement\r
 \r
+        if NeedBlankLine:\r
+            Content = Content[:-1]\r
+    if not Content.replace('\\n', '').strip():\r
+        return ''\r
     return Content\r
 \r
 ## ConvertArchForInstall\r
@@ -984,10 +1009,10 @@ def GenSection(SectionName, SectionDict, SplitArch=True):
 # @return: the arch string that get converted\r
 #\r
 def ConvertArchForInstall(Arch):\r
-    if Arch.upper() in [DataType.TAB_ARCH_IA32, DataType.TAB_ARCH_X64, \r
+    if Arch.upper() in [DataType.TAB_ARCH_IA32, DataType.TAB_ARCH_X64,\r
                                    DataType.TAB_ARCH_IPF, DataType.TAB_ARCH_EBC]:\r
         Arch = Arch.upper()\r
     elif Arch.upper() == DataType.TAB_ARCH_COMMON:\r
         Arch = Arch.lower()\r
-    \r
+\r
     return Arch\r
index f709ff1bce098437679e5a803075ed18ece003f9..37ce1418ae1bc500dd5adac0656090b2c2f91366 100644 (file)
@@ -1,12 +1,12 @@
 ## @file\r
-# This file is used to define common string related functions used in parsing \r
+# This file is used to define common string related functions used in parsing\r
 # process\r
 #\r
 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
-# This program and the accompanying materials are licensed and made available \r
-# under the terms and conditions of the BSD License which accompanies this \r
-# distribution. The full text of the license may be found at \r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License which accompanies this\r
+# distribution. The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
@@ -43,7 +43,7 @@ gMACRO_PATTERN = re.compile("\$\(([_A-Z][_A-Z0-9]*)\)", re.UNICODE)
 # @param MaxSplit:  The max number of split values, default is -1\r
 #\r
 #\r
-def GetSplitValueList(String, SplitTag=DataType.TAB_VALUE_SPLIT, MaxSplit=-1):\r
+def GetSplitValueList(String, SplitTag=DataType.TAB_VALUE_SPLIT, MaxSplit= -1):\r
     return map(lambda l: l.strip(), String.split(SplitTag, MaxSplit))\r
 \r
 ## MergeArches\r
@@ -129,7 +129,7 @@ def GetDynamics(Lines, Key, KeyValues, CommentCharacter):
 ## SplitModuleType\r
 #\r
 # Split ModuleType out of section defien to get key\r
-# [LibraryClass.Arch.ModuleType|ModuleType|ModuleType] -> [ \r
+# [LibraryClass.Arch.ModuleType|ModuleType|ModuleType] -> [\r
 # 'LibraryClass.Arch', ['ModuleType', 'ModuleType', 'ModuleType'] ]\r
 #\r
 # @param Key:  String to be parsed\r
@@ -164,7 +164,7 @@ def SplitModuleType(Key):
 # @param Line:              The content contain line string and line number\r
 # @param FileName:        The meta-file file name\r
 #\r
-def ReplaceMacro(String, MacroDefinitions = None,  SelfReplacement = False, Line = None, FileName = None, Flag = False):\r
+def ReplaceMacro(String, MacroDefinitions=None, SelfReplacement=False, Line=None, FileName=None, Flag=False):\r
     LastString = String\r
     if MacroDefinitions == None:\r
         MacroDefinitions = {}\r
@@ -184,10 +184,10 @@ def ReplaceMacro(String, MacroDefinitions = None,  SelfReplacement = False, Line
                 Count += 1\r
                 if Count % 2 != 0:\r
                     MacroString += QuotedStringItem\r
-                \r
-                if Count == len(QuotedStringList) and Count%2 == 0:\r
+\r
+                if Count == len(QuotedStringList) and Count % 2 == 0:\r
                     MacroString += QuotedStringItem\r
-                    \r
+\r
             MacroUsed = gMACRO_PATTERN.findall(MacroString)\r
         #\r
         # no macro found in String, stop replacing\r
@@ -198,7 +198,7 @@ def ReplaceMacro(String, MacroDefinitions = None,  SelfReplacement = False, Line
             if Macro not in MacroDefinitions:\r
                 if SelfReplacement:\r
                     String = String.replace("$(%s)" % Macro, '')\r
-                    Logger.Debug(5, "Delete undefined MACROs in file %s line %d: %s!" %(FileName, Line[1], Line[0]))\r
+                    Logger.Debug(5, "Delete undefined MACROs in file %s line %d: %s!" % (FileName, Line[1], Line[0]))\r
                 continue\r
             if not HaveQuotedMacroFlag:\r
                 String = String.replace("$(%s)" % Macro, MacroDefinitions[Macro])\r
@@ -207,25 +207,25 @@ def ReplaceMacro(String, MacroDefinitions = None,  SelfReplacement = False, Line
                 for QuotedStringItem in QuotedStringList:\r
                     Count += 1\r
                     if Count % 2 != 0:\r
-                        QuotedStringList[Count-1] = QuotedStringList[Count-1].replace("$(%s)" % Macro, \r
+                        QuotedStringList[Count - 1] = QuotedStringList[Count - 1].replace("$(%s)" % Macro,\r
                                                                         MacroDefinitions[Macro])\r
-                    elif Count == len(QuotedStringList) and Count%2 == 0:\r
-                        QuotedStringList[Count-1] = QuotedStringList[Count-1].replace("$(%s)" % Macro,\r
+                    elif Count == len(QuotedStringList) and Count % 2 == 0:\r
+                        QuotedStringList[Count - 1] = QuotedStringList[Count - 1].replace("$(%s)" % Macro,\r
                                                                         MacroDefinitions[Macro])\r
-    \r
+\r
         RetString = ''\r
         if HaveQuotedMacroFlag:\r
             Count = 0\r
             for QuotedStringItem in QuotedStringList:\r
-                Count += 1            \r
+                Count += 1\r
                 if Count != len(QuotedStringList):\r
-                    RetString += QuotedStringList[Count-1] + "\""\r
+                    RetString += QuotedStringList[Count - 1] + "\""\r
                 else:\r
-                    RetString += QuotedStringList[Count-1]\r
-                \r
+                    RetString += QuotedStringList[Count - 1]\r
+\r
             String = RetString\r
-                          \r
-        #    \r
+\r
+        #\r
         # in case there's macro not defined\r
         #\r
         if String == LastString:\r
@@ -242,7 +242,7 @@ def ReplaceMacro(String, MacroDefinitions = None,  SelfReplacement = False, Line
 # @param Path:     The input value for Path to be converted\r
 # @param Defines:  A set for DEFINE statement\r
 #\r
-def NormPath(Path, Defines = None):\r
+def NormPath(Path, Defines=None):\r
     IsRelativePath = False\r
     if Defines == None:\r
         Defines = {}\r
@@ -269,7 +269,7 @@ def NormPath(Path, Defines = None):
 # Remove spaces\r
 #\r
 # @param Line:              The string to be cleaned\r
-# @param CommentCharacter:  Comment char, used to ignore comment content, \r
+# @param CommentCharacter:  Comment char, used to ignore comment content,\r
 #                           default is DataType.TAB_COMMENT_SPLIT\r
 #\r
 def CleanString(Line, CommentCharacter=DataType.TAB_COMMENT_SPLIT, AllowCppStyleComment=False):\r
@@ -305,7 +305,7 @@ def CleanString(Line, CommentCharacter=DataType.TAB_COMMENT_SPLIT, AllowCppStyle
 # Remove spaces\r
 #\r
 # @param Line:              The string to be cleaned\r
-# @param CommentCharacter:  Comment char, used to ignore comment content, \r
+# @param CommentCharacter:  Comment char, used to ignore comment content,\r
 #                           default is DataType.TAB_COMMENT_SPLIT\r
 #\r
 def CleanString2(Line, CommentCharacter=DataType.TAB_COMMENT_SPLIT, AllowCppStyleComment=False):\r
@@ -394,10 +394,10 @@ def GetDefineValue(String, Key, CommentCharacter):
 # @param CommentCharacter:     Comment char, be used to ignore comment content\r
 # @param KeySplitCharacter:    Key split char, between key name and key value.\r
 #                              Key1 = Value1, '=' is the key split char\r
-# @param ValueSplitFlag:       Value split flag, be used to decide if has \r
+# @param ValueSplitFlag:       Value split flag, be used to decide if has\r
 #                              multiple values\r
-# @param ValueSplitCharacter:  Value split char, be used to split multiple \r
-#                              values. Key1 = Value1|Value2, '|' is the value \r
+# @param ValueSplitCharacter:  Value split char, be used to split multiple\r
+#                              values. Key1 = Value1|Value2, '|' is the value\r
 #                              split char\r
 #\r
 def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCharacter, \\r
@@ -489,7 +489,7 @@ def PreCheck(FileName, FileContent, SupSectionTag):
         #\r
         if Line.find('$') > -1:\r
             if Line.find('$(') < 0 or Line.find(')') < 0:\r
-                Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError = Logger.IS_RAISE_ERROR)\r
+                Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR)\r
         #\r
         # Check []\r
         #\r
@@ -498,14 +498,14 @@ def PreCheck(FileName, FileContent, SupSectionTag):
             # Only get one '[' or one ']'\r
             #\r
             if not (Line.find('[') > -1 and Line.find(']') > -1):\r
-                Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError = Logger.IS_RAISE_ERROR)\r
+                Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR)\r
         #\r
         # Regenerate FileContent\r
         #\r
         NewFileContent = NewFileContent + Line + '\r\n'\r
 \r
     if IsFailed:\r
-        Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError = Logger.IS_RAISE_ERROR)\r
+        Logger.Error("Parser", FORMAT_INVALID, Line=LineNo, File=FileName, RaiseError=Logger.IS_RAISE_ERROR)\r
 \r
     return NewFileContent\r
 \r
@@ -523,7 +523,7 @@ def PreCheck(FileName, FileContent, SupSectionTag):
 # @param Line:               The line in container file which defines the file\r
 #                            to be checked\r
 #\r
-def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line, LineNo=-1):\r
+def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line, LineNo= -1):\r
     if CheckFilename != '' and CheckFilename != None:\r
         (Root, Ext) = os.path.splitext(CheckFilename)\r
         if Ext.upper() != ExtName.upper() and Root:\r
@@ -544,13 +544,13 @@ def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line,
 #\r
 # @param CheckFilename:      Name of the file to be checked\r
 # @param WorkspaceDir:       Current workspace dir\r
-# @param ContainerFilename:  The container file which describes the file to \r
+# @param ContainerFilename:  The container file which describes the file to\r
 #                            be checked, used for error report\r
 # @param SectionName:        Used for error report\r
-# @param Line:               The line in container file which defines the \r
+# @param Line:               The line in container file which defines the\r
 #                            file to be checked\r
 #\r
-def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName, Line, LineNo=-1):\r
+def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName, Line, LineNo= -1):\r
     CheckFile = ''\r
     if CheckFilename != '' and CheckFilename != None:\r
         CheckFile = WorkspaceFile(WorkspaceDir, CheckFilename)\r
@@ -560,7 +560,7 @@ def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName,
                 LineNo = GetLineNo(ContainerFile, Line)\r
             ErrorMsg = ST.ERR_CHECKFILE_NOTFOUND % (CheckFile, SectionName)\r
             Logger.Error("Parser", PARSER_ERROR, ErrorMsg,\r
-                            File=ContainerFilename, Line = LineNo, RaiseError=Logger.IS_RAISE_ERROR)\r
+                            File=ContainerFilename, Line=LineNo, RaiseError=Logger.IS_RAISE_ERROR)\r
     return CheckFile\r
 \r
 ## GetLineNo\r
@@ -593,7 +593,7 @@ def GetLineNo(FileContent, Line, IsIgnoreComment=True):
 # @param File:     File which has the string\r
 # @param Format:   Correct format\r
 #\r
-def RaiseParserError(Line, Section, File, Format='', LineNo=-1):\r
+def RaiseParserError(Line, Section, File, Format='', LineNo= -1):\r
     if LineNo == -1:\r
         LineNo = GetLineNo(open(os.path.normpath(File), 'r').read(), Line)\r
     ErrorMsg = ST.ERR_INVALID_NOTFOUND % (Line, Section)\r
@@ -650,7 +650,7 @@ def ConvertToSqlString2(String):
 # @param Lines: string list\r
 # @param Split: split character\r
 #\r
-def GetStringOfList(List, Split = ' '):\r
+def GetStringOfList(List, Split=' '):\r
     if type(List) != type([]):\r
         return List\r
     Str = ''\r
@@ -696,7 +696,7 @@ def StringArrayLength(String):
 # @param OptionString: the option string\r
 # @param Which: Which flag\r
 # @param Against: Against flag\r
-#    \r
+#\r
 def RemoveDupOption(OptionString, Which="/I", Against=None):\r
     OptionList = OptionString.split()\r
     ValueList = []\r
@@ -718,14 +718,14 @@ def RemoveDupOption(OptionString, Which="/I", Against=None):
 \r
 ## Check if the string is HexDgit\r
 #\r
-# Return true if all characters in the string are digits and there is at \r
-# least one character \r
+# Return true if all characters in the string are digits and there is at\r
+# least one character\r
 # or valid Hexs (started with 0x, following by hexdigit letters)\r
-# , false otherwise. \r
+# , false otherwise.\r
 # @param string: input string\r
 #\r
 def IsHexDigit(Str):\r
-    try: \r
+    try:\r
         int(Str, 10)\r
         return True\r
     except ValueError:\r
@@ -737,16 +737,16 @@ def IsHexDigit(Str):
                 return False\r
     return False\r
 \r
-## Check if the string is HexDgit and its integer value within limit of UINT32 \r
+## Check if the string is HexDgit and its interger value within limit of UINT32\r
 #\r
-# Return true if all characters in the string are digits and there is at \r
-# least one character \r
+# Return true if all characters in the string are digits and there is at\r
+# least one character\r
 # or valid Hexs (started with 0x, following by hexdigit letters)\r
-# , false otherwise. \r
+# , false otherwise.\r
 # @param string: input string\r
 #\r
 def IsHexDigitUINT32(Str):\r
-    try: \r
+    try:\r
         Value = int(Str, 10)\r
         if (Value <= 0xFFFFFFFF) and (Value >= 0):\r
             return True\r
@@ -761,11 +761,11 @@ def IsHexDigitUINT32(Str):
     return False\r
 \r
 ## CleanSpecialChar\r
-#  \r
-# The ASCII text files of type INF, DEC, INI are edited by developers, \r
+#\r
+# The ASCII text files of type INF, DEC, INI are edited by developers,\r
 # and may contain characters that cannot be directly translated to strings that\r
-# are conformant with the UDP XML Schema.  Any characters in this category \r
-# (0x00-0x08, TAB [0x09], 0x0B, 0x0C, 0x0E-0x1F, 0x80-0xFF) \r
+# are conformant with the UDP XML Schema.  Any characters in this category\r
+# (0x00-0x08, TAB [0x09], 0x0B, 0x0C, 0x0E-0x1F, 0x80-0xFF)\r
 # must be converted to a space character[0x20] as part of the parsing process.\r
 #\r
 def ConvertSpecialChar(Lines):\r
@@ -773,7 +773,7 @@ def ConvertSpecialChar(Lines):
     for line in Lines:\r
         ReMatchSpecialChar = re.compile(r"[\x00-\x08]|\x09|\x0b|\x0c|[\x0e-\x1f]|[\x7f-\xff]")\r
         RetLines.append(ReMatchSpecialChar.sub(' ', line))\r
-    \r
+\r
     return RetLines\r
 \r
 ## __GetTokenList\r
@@ -817,7 +817,7 @@ def __GetTokenList(Str):
             if TokenOP:\r
                 List.append(TokenOP)\r
                 TokenOP = ''\r
-        \r
+\r
         if PreChar == '\\' and Char == '\\':\r
             PreChar = ''\r
         else:\r
@@ -870,61 +870,55 @@ def ConvertNOTEQToNE(Expr):
     return ''.join(RetList)\r
 \r
 ## SplitPcdEntry\r
-# \r
+#\r
 # Split an PCD entry string to Token.CName and PCD value and FFE.\r
 # NOTE: PCD Value and FFE can contain "|" in it's expression. And in INF specification, have below rule.\r
-# When using the characters "|" or "||" in an expression, the expression must be encapsulated in \r
+# When using the characters "|" or "||" in an expression, the expression must be encapsulated in\r
 # open "(" and close ")" parenthesis.\r
-# \r
+#\r
 # @param String    An PCD entry string need to be split.\r
-# \r
-# @return List     [PcdTokenCName, Value, FFE] \r
+#\r
+# @return List     [PcdTokenCName, Value, FFE]\r
 #\r
 def SplitPcdEntry(String):\r
     if not String:\r
-        return ['', '',''], False\r
-    \r
+        return ['', '', ''], False\r
+\r
     PcdTokenCName = ''\r
     PcdValue = ''\r
     PcdFeatureFlagExp = ''\r
-    \r
+\r
     ValueList = GetSplitValueList(String, "|", 1)\r
-    \r
+\r
     #\r
     # Only contain TokenCName\r
     #\r
     if len(ValueList) == 1:\r
         return [ValueList[0]], True\r
-    \r
+\r
     NewValueList = []\r
-    \r
+\r
     if len(ValueList) == 2:\r
         PcdTokenCName = ValueList[0]\r
-        ValueList = GetSplitValueList(ValueList[1], "|")\r
-        \r
-        RemainCount = 0\r
-        for Item in ValueList:\r
-            ParenthesisCount = 0\r
-            for Char in Item:\r
-                if Char == "(":\r
-                    ParenthesisCount += 1\r
-                if Char == ")":\r
-                    ParenthesisCount -= 1\r
-                 \r
-            #\r
-            # An individual item\r
-            #\r
-            if RemainCount == 0 and ParenthesisCount >= 0:\r
-                NewValueList.append(Item)\r
-                RemainCount = ParenthesisCount\r
-            elif RemainCount > 0 and RemainCount + ParenthesisCount >= 0:\r
-                NewValueList[-1] = NewValueList[-1] + '|' + Item         \r
-                RemainCount = RemainCount + ParenthesisCount\r
-            elif RemainCount > 0 and RemainCount + ParenthesisCount < 0:\r
-                #\r
-                # ERROR, return\r
-                #\r
-                return ['', '', ''], False\r
+\r
+        InQuote = False\r
+        InParenthesis = False\r
+        StrItem = ''\r
+        for StrCh in ValueList[1]:\r
+            if StrCh == '"':\r
+                InQuote = not InQuote\r
+            elif StrCh == '(' or StrCh == ')':\r
+                InParenthesis = not InParenthesis\r
+\r
+            if StrCh == '|':\r
+                if not InQuote or not InParenthesis:\r
+                    NewValueList.append(StrItem.strip())\r
+                    StrItem = ' '\r
+                    continue\r
+\r
+            StrItem += StrCh\r
+\r
+        NewValueList.append(StrItem.strip())\r
 \r
         if len(NewValueList) == 1:\r
             PcdValue = NewValueList[0]\r
@@ -935,7 +929,7 @@ def SplitPcdEntry(String):
             return [PcdTokenCName, PcdValue, PcdFeatureFlagExp], True\r
         else:\r
             return ['', '', ''], False\r
-        \r
+\r
     return ['', '', ''], False\r
 \r
 ## Check if two arches matched?\r
diff --git a/BaseTools/Source/Python/UPT/Library/UniClassObject.py b/BaseTools/Source/Python/UPT/Library/UniClassObject.py
new file mode 100644 (file)
index 0000000..d542dc5
--- /dev/null
@@ -0,0 +1,1042 @@
+## @file\r
+# Collect all defined strings in multiple uni files.\r
+#\r
+# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+"""\r
+Collect all defined strings in multiple uni files\r
+"""\r
+\r
+##\r
+# Import Modules\r
+#\r
+import os, codecs, re\r
+import distutils.util\r
+from Logger import ToolError\r
+from Logger import Log as EdkLogger\r
+from Logger import StringTable as ST\r
+from Library.String import GetLineNo\r
+from Library.Misc import PathClass\r
+from Library.Misc import GetCharIndexOutStr\r
+from Library import DataType as DT\r
+\r
+##\r
+# Static definitions\r
+#\r
+UNICODE_WIDE_CHAR = u'\\wide'\r
+UNICODE_NARROW_CHAR = u'\\narrow'\r
+UNICODE_NON_BREAKING_CHAR = u'\\nbr'\r
+UNICODE_UNICODE_CR = '\r'\r
+UNICODE_UNICODE_LF = '\n'\r
+\r
+NARROW_CHAR = u'\uFFF0'\r
+WIDE_CHAR = u'\uFFF1'\r
+NON_BREAKING_CHAR = u'\uFFF2'\r
+CR = u'\u000D'\r
+LF = u'\u000A'\r
+NULL = u'\u0000'\r
+TAB = u'\t'\r
+BACK_SPLASH = u'\\'\r
+\r
+gINCLUDE_PATTERN = re.compile("^!include[\s]+([\S]+)[\s]*$", re.MULTILINE | re.UNICODE)\r
+\r
+gLANG_CONV_TABLE = {'eng':'en', 'fra':'fr', \\r
+                 'aar':'aa', 'abk':'ab', 'ave':'ae', 'afr':'af', 'aka':'ak', 'amh':'am', \\r
+                 'arg':'an', 'ara':'ar', 'asm':'as', 'ava':'av', 'aym':'ay', 'aze':'az', \\r
+                 'bak':'ba', 'bel':'be', 'bul':'bg', 'bih':'bh', 'bis':'bi', 'bam':'bm', \\r
+                 'ben':'bn', 'bod':'bo', 'bre':'br', 'bos':'bs', 'cat':'ca', 'che':'ce', \\r
+                 'cha':'ch', 'cos':'co', 'cre':'cr', 'ces':'cs', 'chu':'cu', 'chv':'cv', \\r
+                 'cym':'cy', 'dan':'da', 'deu':'de', 'div':'dv', 'dzo':'dz', 'ewe':'ee', \\r
+                 'ell':'el', 'epo':'eo', 'spa':'es', 'est':'et', 'eus':'eu', 'fas':'fa', \\r
+                 'ful':'ff', 'fin':'fi', 'fij':'fj', 'fao':'fo', 'fry':'fy', 'gle':'ga', \\r
+                 'gla':'gd', 'glg':'gl', 'grn':'gn', 'guj':'gu', 'glv':'gv', 'hau':'ha', \\r
+                 'heb':'he', 'hin':'hi', 'hmo':'ho', 'hrv':'hr', 'hat':'ht', 'hun':'hu', \\r
+                 'hye':'hy', 'her':'hz', 'ina':'ia', 'ind':'id', 'ile':'ie', 'ibo':'ig', \\r
+                 'iii':'ii', 'ipk':'ik', 'ido':'io', 'isl':'is', 'ita':'it', 'iku':'iu', \\r
+                 'jpn':'ja', 'jav':'jv', 'kat':'ka', 'kon':'kg', 'kik':'ki', 'kua':'kj', \\r
+                 'kaz':'kk', 'kal':'kl', 'khm':'km', 'kan':'kn', 'kor':'ko', 'kau':'kr', \\r
+                 'kas':'ks', 'kur':'ku', 'kom':'kv', 'cor':'kw', 'kir':'ky', 'lat':'la', \\r
+                 'ltz':'lb', 'lug':'lg', 'lim':'li', 'lin':'ln', 'lao':'lo', 'lit':'lt', \\r
+                 'lub':'lu', 'lav':'lv', 'mlg':'mg', 'mah':'mh', 'mri':'mi', 'mkd':'mk', \\r
+                 'mal':'ml', 'mon':'mn', 'mar':'mr', 'msa':'ms', 'mlt':'mt', 'mya':'my', \\r
+                 'nau':'na', 'nob':'nb', 'nde':'nd', 'nep':'ne', 'ndo':'ng', 'nld':'nl', \\r
+                 'nno':'nn', 'nor':'no', 'nbl':'nr', 'nav':'nv', 'nya':'ny', 'oci':'oc', \\r
+                 'oji':'oj', 'orm':'om', 'ori':'or', 'oss':'os', 'pan':'pa', 'pli':'pi', \\r
+                 'pol':'pl', 'pus':'ps', 'por':'pt', 'que':'qu', 'roh':'rm', 'run':'rn', \\r
+                 'ron':'ro', 'rus':'ru', 'kin':'rw', 'san':'sa', 'srd':'sc', 'snd':'sd', \\r
+                 'sme':'se', 'sag':'sg', 'sin':'si', 'slk':'sk', 'slv':'sl', 'smo':'sm', \\r
+                 'sna':'sn', 'som':'so', 'sqi':'sq', 'srp':'sr', 'ssw':'ss', 'sot':'st', \\r
+                 'sun':'su', 'swe':'sv', 'swa':'sw', 'tam':'ta', 'tel':'te', 'tgk':'tg', \\r
+                 'tha':'th', 'tir':'ti', 'tuk':'tk', 'tgl':'tl', 'tsn':'tn', 'ton':'to', \\r
+                 'tur':'tr', 'tso':'ts', 'tat':'tt', 'twi':'tw', 'tah':'ty', 'uig':'ug', \\r
+                 'ukr':'uk', 'urd':'ur', 'uzb':'uz', 'ven':'ve', 'vie':'vi', 'vol':'vo', \\r
+                 'wln':'wa', 'wol':'wo', 'xho':'xh', 'yid':'yi', 'yor':'yo', 'zha':'za', \\r
+                 'zho':'zh', 'zul':'zu'}\r
+\r
+## Convert a python unicode string to a normal string\r
+#\r
+# Convert a python unicode string to a normal string\r
+# UniToStr(u'I am a string') is 'I am a string'\r
+#\r
+# @param Uni:  The python unicode string\r
+#\r
+# @retval:     The formatted normal string\r
+#\r
+def UniToStr(Uni):\r
+    return repr(Uni)[2:-1]\r
+\r
+## Convert a unicode string to a Hex list\r
+#\r
+# Convert a unicode string to a Hex list\r
+# UniToHexList('ABC') is ['0x41', '0x00', '0x42', '0x00', '0x43', '0x00']\r
+#\r
+# @param Uni:    The python unicode string\r
+#\r
+# @retval List:  The formatted hex list\r
+#\r
+def UniToHexList(Uni):\r
+    List = []\r
+    for Item in Uni:\r
+        Temp = '%04X' % ord(Item)\r
+        List.append('0x' + Temp[2:4])\r
+        List.append('0x' + Temp[0:2])\r
+    return List\r
+\r
+## Convert special unicode characters\r
+#\r
+# Convert special characters to (c), (r) and (tm).\r
+#\r
+# @param Uni:    The python unicode string\r
+#\r
+# @retval NewUni:  The converted unicode string\r
+#\r
+def ConvertSpecialUnicodes(Uni):\r
+    NewUni = Uni\r
+    NewUni = NewUni.replace(u'\u00A9', '(c)')\r
+    NewUni = NewUni.replace(u'\u00AE', '(r)')\r
+    NewUni = NewUni.replace(u'\u2122', '(tm)')\r
+    return NewUni\r
+\r
+## GetLanguageCode1766\r
+#\r
+# Check the language code read from .UNI file and convert RFC 4646 codes to RFC 1766 codes\r
+# RFC 1766 language codes supported in compatiblity mode\r
+# RFC 4646 language codes supported in native mode\r
+#\r
+# @param LangName:   Language codes read from .UNI file\r
+#\r
+# @retval LangName:  Valid lanugage code in RFC 1766 format or None\r
+#\r
+def GetLanguageCode1766(LangName, File=None):\r
+    length = len(LangName)\r
+    if length == 2:\r
+        if LangName.isalpha():\r
+            for Key in gLANG_CONV_TABLE.keys():\r
+                if gLANG_CONV_TABLE.get(Key) == LangName.lower():\r
+                    return Key\r
+    elif length == 3:\r
+        if LangName.isalpha() and gLANG_CONV_TABLE.get(LangName.lower()):\r
+            return LangName\r
+        else:\r
+            EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FORMAT_INVALID,\r
+                             "Invalid RFC 1766 language code : %s" % LangName, \r
+                             File)\r
+    elif length == 5:\r
+        if LangName[0:2].isalpha() and LangName[2] == '-':\r
+            for Key in gLANG_CONV_TABLE.keys():\r
+                if gLANG_CONV_TABLE.get(Key) == LangName[0:2].lower():\r
+                    return Key\r
+    elif length >= 6:\r
+        if LangName[0:2].isalpha() and LangName[2] == '-':\r
+            for Key in gLANG_CONV_TABLE.keys():\r
+                if gLANG_CONV_TABLE.get(Key) == LangName[0:2].lower():\r
+                    return Key\r
+        if LangName[0:3].isalpha() and gLANG_CONV_TABLE.get(LangName.lower()) == None and LangName[3] == '-':\r
+            for Key in gLANG_CONV_TABLE.keys():\r
+                if Key == LangName[0:3].lower():\r
+                    return Key\r
+\r
+    EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FORMAT_INVALID,\r
+                             "Invalid RFC 4646 language code : %s" % LangName, \r
+                             File)\r
+    \r
+## GetLanguageCode\r
+#\r
+# Check the language code read from .UNI file and convert RFC 1766 codes to RFC 4646 codes if appropriate\r
+# RFC 1766 language codes supported in compatiblity mode\r
+# RFC 4646 language codes supported in native mode\r
+#\r
+# @param LangName:   Language codes read from .UNI file\r
+#\r
+# @retval LangName:  Valid lanugage code in RFC 4646 format or None\r
+#\r
+def GetLanguageCode(LangName, IsCompatibleMode, File):\r
+    length = len(LangName)\r
+    if IsCompatibleMode:\r
+        if length == 3 and LangName.isalpha():\r
+            TempLangName = gLANG_CONV_TABLE.get(LangName.lower())\r
+            if TempLangName != None:\r
+                return TempLangName\r
+            return LangName\r
+        else:\r
+            EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FORMAT_INVALID,\r
+                             "Invalid RFC 1766 language code : %s" % LangName, \r
+                             File)\r
+    if (LangName[0] == 'X' or LangName[0] == 'x') and LangName[1] == '-':\r
+        return LangName\r
+    if length == 2:\r
+        if LangName.isalpha():\r
+            return LangName\r
+    elif length == 3:\r
+        if LangName.isalpha() and gLANG_CONV_TABLE.get(LangName.lower()) == None:\r
+            return LangName\r
+    elif length == 5:\r
+        if LangName[0:2].isalpha() and LangName[2] == '-':\r
+            return LangName\r
+    elif length >= 6:\r
+        if LangName[0:2].isalpha() and LangName[2] == '-':\r
+            return LangName\r
+        if LangName[0:3].isalpha() and gLANG_CONV_TABLE.get(LangName.lower()) == None and LangName[3] == '-':\r
+            return LangName\r
+\r
+    EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FORMAT_INVALID,\r
+                             "Invalid RFC 4646 language code : %s" % LangName, \r
+                             File)\r
+\r
+## FormatUniEntry\r
+#\r
+# Formated the entry in Uni file.\r
+#\r
+# @param StrTokenName    StrTokenName.\r
+# @param TokenValueList  A list need to be processed.\r
+# @param ContainerFile   ContainerFile.\r
+#\r
+# @return formated entry\r
+def FormatUniEntry(StrTokenName, TokenValueList, ContainerFile):\r
+    SubContent = ''\r
+    PreFormatLength = 40\r
+    if len(StrTokenName) > PreFormatLength:\r
+        PreFormatLength = len(StrTokenName) + 1\r
+    for (Lang, Value) in TokenValueList: \r
+        if not Value or Lang == DT.TAB_LANGUAGE_EN_X:\r
+            continue\r
+        if Lang == '':\r
+            Lang = DT.TAB_LANGUAGE_EN_US\r
+        if Lang == 'eng':\r
+            Lang = DT.TAB_LANGUAGE_EN_US\r
+        elif len(Lang.split('-')[0]) == 3:\r
+            Lang = GetLanguageCode(Lang.split('-')[0], True, ContainerFile)\r
+        else:\r
+            Lang = GetLanguageCode(Lang, False, ContainerFile)\r
+        ValueList = Value.split('\n')\r
+        SubValueContent = ''\r
+        for SubValue in ValueList:\r
+            if SubValue.strip():\r
+                SubValueContent += \\r
+                ' ' * (PreFormatLength + len('#language en-US    ')) + '\"%s\\n\"' % SubValue.strip() + os.linesep\r
+        SubValueContent = SubValueContent[(PreFormatLength + len('#language en-US    ')):SubValueContent.rfind('\\n')] \\r
+        + '\"' + os.linesep\r
+        SubContent += ' '*PreFormatLength + '#language %-5s ' % Lang + SubValueContent\r
+    if SubContent:\r
+        SubContent = StrTokenName + ' '*(PreFormatLength - len(StrTokenName)) + SubContent[PreFormatLength:]\r
+    return SubContent\r
+\r
+\r
+## StringDefClassObject\r
+#\r
+# A structure for language definition\r
+#\r
+class StringDefClassObject(object):\r
+    def __init__(self, Name = None, Value = None, Referenced = False, Token = None, UseOtherLangDef = ''):\r
+        self.StringName = ''\r
+        self.StringNameByteList = []\r
+        self.StringValue = ''\r
+        self.StringValueByteList = ''\r
+        self.Token = 0\r
+        self.Referenced = Referenced\r
+        self.UseOtherLangDef = UseOtherLangDef\r
+        self.Length = 0\r
+\r
+        if Name != None:\r
+            self.StringName = Name\r
+            self.StringNameByteList = UniToHexList(Name)\r
+        if Value != None:\r
+            self.StringValue = Value\r
+            self.StringValueByteList = UniToHexList(self.StringValue)\r
+            self.Length = len(self.StringValueByteList)\r
+        if Token != None:\r
+            self.Token = Token\r
+\r
+    def __str__(self):\r
+        return repr(self.StringName) + ' ' + \\r
+               repr(self.Token) + ' ' + \\r
+               repr(self.Referenced) + ' ' + \\r
+               repr(self.StringValue) + ' ' + \\r
+               repr(self.UseOtherLangDef)\r
+\r
+    def UpdateValue(self, Value = None):\r
+        if Value != None:\r
+            if self.StringValue:\r
+                self.StringValue = self.StringValue  + os.linesep + Value\r
+            else:\r
+                self.StringValue = Value\r
+            self.StringValueByteList = UniToHexList(self.StringValue)\r
+            self.Length = len(self.StringValueByteList)\r
+\r
+## UniFileClassObject\r
+#\r
+# A structure for .uni file definition\r
+#\r
+class UniFileClassObject(object):\r
+    def __init__(self, FileList = None, IsCompatibleMode = False, IncludePathList = None):\r
+        self.FileList = FileList\r
+        self.File = None\r
+        self.IncFileList = FileList\r
+        self.UniFileHeader = ''\r
+        self.Token = 2\r
+        self.LanguageDef = []                   #[ [u'LanguageIdentifier', u'PrintableName'], ... ]\r
+        self.OrderedStringList = {}             #{ u'LanguageIdentifier' : [StringDefClassObject]  }\r
+        self.OrderedStringDict = {}             #{ u'LanguageIdentifier' : {StringName:(IndexInList)}  }\r
+        self.OrderedStringListByToken = {}      #{ u'LanguageIdentifier' : {Token: StringDefClassObject} }\r
+        self.IsCompatibleMode = IsCompatibleMode\r
+        if not IncludePathList:\r
+            self.IncludePathList = []\r
+        else:\r
+            self.IncludePathList = IncludePathList\r
+        if len(self.FileList) > 0:\r
+            self.LoadUniFiles(FileList)\r
+\r
+    #\r
+    # Get Language definition\r
+    #\r
+    def GetLangDef(self, File, Line):\r
+        Lang = distutils.util.split_quoted((Line.split(u"//")[0]))\r
+        if len(Lang) != 3:\r
+            try:\r
+                FileIn = codecs.open(File.Path, mode='rb', encoding='utf_16').read()\r
+            except UnicodeError, Xstr:\r
+                FileIn = codecs.open(File.Path, mode='rb', encoding='utf_16_le').read()\r
+            except:\r
+                EdkLogger.Error("Unicode File Parser", \r
+                                ToolError.FILE_OPEN_FAILURE, \r
+                                "File read failure: %s" % str(Xstr),\r
+                                ExtraData=File)\r
+            LineNo = GetLineNo(FileIn, Line, False)\r
+            EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.PARSER_ERROR,\r
+                             "Wrong language definition", \r
+                             ExtraData="""%s\n\t*Correct format is like '#langdef en-US "English"'""" % Line, \r
+                             File = File, Line = LineNo)\r
+        else:\r
+            LangName = GetLanguageCode(Lang[1], self.IsCompatibleMode, self.File)\r
+            LangPrintName = Lang[2]\r
+\r
+        IsLangInDef = False\r
+        for Item in self.LanguageDef:\r
+            if Item[0] == LangName:\r
+                IsLangInDef = True\r
+                break\r
+\r
+        if not IsLangInDef:\r
+            self.LanguageDef.append([LangName, LangPrintName])\r
+\r
+        #\r
+        # Add language string\r
+        #\r
+        self.AddStringToList(u'$LANGUAGE_NAME', LangName, LangName, 0, True, Index=0)\r
+        self.AddStringToList(u'$PRINTABLE_LANGUAGE_NAME', LangName, LangPrintName, 1, True, Index=1)\r
+\r
+        if not IsLangInDef:\r
+            #\r
+            # The found STRING tokens will be added into new language string list\r
+            # so that the unique STRING identifier is reserved for all languages in the package list. \r
+            #\r
+            FirstLangName = self.LanguageDef[0][0]\r
+            if LangName != FirstLangName:\r
+                for Index in range (2, len (self.OrderedStringList[FirstLangName])):\r
+                    Item = self.OrderedStringList[FirstLangName][Index]\r
+                    if Item.UseOtherLangDef != '':\r
+                        OtherLang = Item.UseOtherLangDef\r
+                    else:\r
+                        OtherLang = FirstLangName\r
+                    self.OrderedStringList[LangName].append (StringDefClassObject(Item.StringName, \r
+                                                                                  '', \r
+                                                                                  Item.Referenced, \r
+                                                                                  Item.Token, \r
+                                                                                  OtherLang))\r
+                    self.OrderedStringDict[LangName][Item.StringName] = len(self.OrderedStringList[LangName]) - 1\r
+        return True\r
+\r
+    #\r
+    # Get String name and value\r
+    #\r
+    def GetStringObject(self, Item):\r
+        Language = ''\r
+        Value = ''\r
+\r
+        Name = Item.split()[1]\r
+        # Check the string name is the upper character\r
+        if Name != '':\r
+            MatchString = re.match('[A-Z0-9_]+', Name, re.UNICODE)\r
+            if MatchString == None or MatchString.end(0) != len(Name):\r
+                EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FORMAT_INVALID,\r
+                             'The string token name %s in UNI file %s must be upper case character.' %(Name, self.File))\r
+        LanguageList = Item.split(u'#language ')\r
+        for IndexI in range(len(LanguageList)):\r
+            if IndexI == 0:\r
+                continue\r
+            else:\r
+                Language = LanguageList[IndexI].split()[0]\r
+                #.replace(u'\r\n', u'')\r
+                Value = \\r
+                LanguageList[IndexI][LanguageList[IndexI].find(u'\"') + len(u'\"') : LanguageList[IndexI].rfind(u'\"')] \r
+                Language = GetLanguageCode(Language, self.IsCompatibleMode, self.File)\r
+                self.AddStringToList(Name, Language, Value)\r
+\r
+    #\r
+    # Get include file list and load them\r
+    #\r
+    def GetIncludeFile(self, Item, Dir = None):\r
+        if Dir:\r
+            pass\r
+        FileName = Item[Item.find(u'!include ') + len(u'!include ') :Item.find(u' ', len(u'!include '))][1:-1]\r
+        self.LoadUniFile(FileName)\r
+\r
+    #\r
+    # Pre-process before parse .uni file\r
+    #\r
+    def PreProcess(self, File, IsIncludeFile=False):\r
+        if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
+            EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FILE_NOT_FOUND,\r
+                             ExtraData=File.Path)\r
+\r
+        try:\r
+            FileIn = codecs.open(File.Path, mode='rb', encoding='utf_16').readlines()\r
+        except UnicodeError:\r
+            FileIn = codecs.open(File.Path, mode='rb', encoding='utf_16_le').readlines()\r
+        except:\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FILE_OPEN_FAILURE, ExtraData=File.Path)\r
+        \r
+        \r
+        #\r
+        # get the file header\r
+        #\r
+        Lines = []\r
+        HeaderStart = False\r
+        HeaderEnd = False\r
+        if not self.UniFileHeader:\r
+            FirstGenHeader = True\r
+        else:\r
+            FirstGenHeader = False\r
+        for Line in FileIn:\r
+            Line = Line.strip()\r
+            if Line == u'':\r
+                continue\r
+            if Line.startswith(DT.TAB_COMMENT_EDK1_SPLIT) and (Line.find(DT.TAB_HEADER_COMMENT) > -1) \\r
+                and not HeaderEnd and not HeaderStart:\r
+                HeaderStart = True\r
+            if not Line.startswith(DT.TAB_COMMENT_EDK1_SPLIT) and HeaderStart and not HeaderEnd:\r
+                HeaderEnd = True\r
+            if Line.startswith(DT.TAB_COMMENT_EDK1_SPLIT) and HeaderStart and not HeaderEnd and FirstGenHeader:\r
+                self.UniFileHeader += Line + os.linesep\r
+                continue\r
+        \r
+        #\r
+        # Use unique identifier\r
+        #\r
+        FindFlag = -1\r
+        LineCount = 0\r
+        MultiLineFeedExits = False\r
+        #\r
+        # 0: initial value\r
+        # 1: signle String entry exist\r
+        # 2: line feed exist under the some signle String entry\r
+        #\r
+        StringEntryExistsFlag = 0\r
+        for Line in FileIn:\r
+            Line = FileIn[LineCount]\r
+            LineCount += 1\r
+            Line = Line.strip()\r
+            #\r
+            # Ignore comment line and empty line\r
+            #            \r
+            if Line == u'' or Line.startswith(u'//'):\r
+                #\r
+                # Change the single line String entry flag status\r
+                #\r
+                if StringEntryExistsFlag == 1:\r
+                    StringEntryExistsFlag = 2\r
+                #\r
+                # If the '#string' line and the '#language' line are not in the same line,\r
+                # there should be only one line feed character betwwen them\r
+                #\r
+                if MultiLineFeedExits:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                continue\r
+\r
+            MultiLineFeedExits = False\r
+            #\r
+            # Process comment embeded in string define lines\r
+            #\r
+            FindFlag = Line.find(u'//')\r
+            if FindFlag != -1 and Line.find(u'//') < Line.find(u'"'):\r
+                Line = Line.replace(Line[FindFlag:], u' ')\r
+                if FileIn[LineCount].strip().startswith('#language'):\r
+                    Line = Line + FileIn[LineCount]\r
+                    FileIn[LineCount-1] = Line\r
+                    FileIn[LineCount] = os.linesep\r
+                    LineCount -= 1\r
+                    for Index in xrange (LineCount + 1, len (FileIn) - 1):\r
+                        if (Index == len(FileIn) -1):\r
+                            FileIn[Index] = os.linesep\r
+                        else:\r
+                            FileIn[Index] = FileIn[Index + 1]\r
+                    continue\r
+            CommIndex = GetCharIndexOutStr(u'/', Line)\r
+            if CommIndex > -1:\r
+                if (len(Line) - 1) > CommIndex:\r
+                    if Line[CommIndex+1] == u'/':\r
+                        Line = Line[:CommIndex].strip()\r
+                    else:\r
+                        EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                else:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                    \r
+            Line = Line.replace(UNICODE_WIDE_CHAR, WIDE_CHAR)\r
+            Line = Line.replace(UNICODE_NARROW_CHAR, NARROW_CHAR)\r
+            Line = Line.replace(UNICODE_NON_BREAKING_CHAR, NON_BREAKING_CHAR)\r
+\r
+            Line = Line.replace(u'\\\\', u'\u0006')\r
+            Line = Line.replace(u'\\r\\n', CR + LF)\r
+            Line = Line.replace(u'\\n', CR + LF)\r
+            Line = Line.replace(u'\\r', CR)\r
+            Line = Line.replace(u'\\t', u'\t')\r
+            Line = Line.replace(u'''\"''', u'''"''')\r
+            Line = Line.replace(u'\t', u' ')\r
+            Line = Line.replace(u'\u0006', u'\\')\r
+\r
+            IncList = gINCLUDE_PATTERN.findall(Line)\r
+            if len(IncList) == 1:\r
+                for Dir in [File.Dir] + self.IncludePathList:\r
+                    IncFile = PathClass(str(IncList[0]), Dir)\r
+                    self.IncFileList.append(IncFile)\r
+                    if os.path.isfile(IncFile.Path):\r
+                        Lines.extend(self.PreProcess(IncFile, True))\r
+                        break\r
+                else:\r
+                    EdkLogger.Error("Unicode File Parser", \r
+                                    ToolError.FILE_NOT_FOUND, \r
+                                    Message="Cannot find include file", \r
+                                    ExtraData=str(IncList[0]))\r
+                continue\r
+            \r
+            #\r
+            # Between Name entry and Language entry can not contain line feed\r
+            #\r
+            if Line.startswith(u'#string') and Line.find(u'#language') == -1:\r
+                MultiLineFeedExits = True\r
+                \r
+            if Line.startswith(u'#string') and Line.find(u'#language') > 0 and Line.find(u'"') < 0:\r
+                MultiLineFeedExits = True\r
+            \r
+            #\r
+            # Between Language entry and String entry can not contain line feed\r
+            #\r
+            if Line.startswith(u'#language') and len(Line.split()) == 2:\r
+                MultiLineFeedExits = True\r
+            \r
+            #\r
+            # Between two String entry, can not contain line feed\r
+            #\r
+            if Line.startswith(u'"'):\r
+                if StringEntryExistsFlag == 2:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \r
+                                    Message=ST.ERR_UNIPARSE_LINEFEED_UP_EXIST % Line, ExtraData=File.Path)\r
+                     \r
+                StringEntryExistsFlag = 1\r
+                if not Line.endswith('"'):\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+            elif Line.startswith(u'#language'):\r
+                if StringEntryExistsFlag == 2:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \r
+                                    Message=ST.ERR_UNIPARSE_LINEFEED_UP_EXIST % Line, ExtraData=File.Path)\r
+                StringEntryExistsFlag = 0\r
+            else:\r
+                StringEntryExistsFlag = 0\r
+\r
+            Lines.append(Line)\r
+        \r
+        #\r
+        # Convert string def format as below\r
+        #\r
+        #     #string MY_STRING_1\r
+        #     #language eng\r
+        #     "My first English string line 1"\r
+        #     "My first English string line 2"\r
+        #     #string MY_STRING_1\r
+        #     #language spa\r
+        #     "Mi segunda secuencia 1"\r
+        #     "Mi segunda secuencia 2"\r
+        #\r
+        \r
+        if not IsIncludeFile and not Lines:\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                Message=ST.ERR_UNIPARSE_NO_SECTION_EXIST, \\r
+                ExtraData=File.Path) \r
+\r
+        NewLines = []\r
+        StrName = u''\r
+        ExistStrNameList = []\r
+        for Line in Lines:\r
+            if StrName and not StrName.split()[1].startswith(DT.TAB_STR_TOKENCNAME + DT.TAB_UNDERLINE_SPLIT):\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_STRNAME_FORMAT_ERROR % StrName.split()[1], \\r
+                                ExtraData=File.Path)\r
+                \r
+            if StrName and len(StrName.split()[1].split(DT.TAB_UNDERLINE_SPLIT)) == 4:\r
+                StringTokenList = StrName.split()[1].split(DT.TAB_UNDERLINE_SPLIT)\r
+                if (StringTokenList[3].upper() in [DT.TAB_STR_TOKENPROMPT, DT.TAB_STR_TOKENHELP] and \\r
+                    StringTokenList[3] not in [DT.TAB_STR_TOKENPROMPT, DT.TAB_STR_TOKENHELP]) or \\r
+                    (StringTokenList[2].upper() == DT.TAB_STR_TOKENERR and StringTokenList[2] != DT.TAB_STR_TOKENERR):\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_STRTOKEN_FORMAT_ERROR % StrName.split()[1], \\r
+                                ExtraData=File.Path)\r
+                    \r
+            if Line.count(u'#language') > 1:\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_SEP_LANGENTRY_LINE % Line, \\r
+                                ExtraData=File.Path) \r
+            \r
+            if Line.startswith(u'//'):\r
+                continue\r
+            elif Line.startswith(u'#langdef'):\r
+                if len(Line.split()) == 2:\r
+                    NewLines.append(Line)\r
+                    continue\r
+                elif len(Line.split()) > 2 and Line.find(u'"') > 0:                    \r
+                    NewLines.append(Line[:Line.find(u'"')].strip())\r
+                    NewLines.append(Line[Line.find(u'"'):])\r
+                else:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+            elif Line.startswith(u'#string'):\r
+                if len(Line.split()) == 2:\r
+                    StrName = Line\r
+                    if StrName:\r
+                        if StrName.split()[1] not in ExistStrNameList:\r
+                            ExistStrNameList.append(StrName.split()[1].strip())\r
+                        elif StrName.split()[1] in [DT.TAB_INF_ABSTRACT, DT.TAB_INF_DESCRIPTION, \\r
+                                                    DT.TAB_INF_BINARY_ABSTRACT, DT.TAB_INF_BINARY_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_PACKAGE_ABSTRACT, DT.TAB_DEC_PACKAGE_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_BINARY_ABSTRACT, DT.TAB_DEC_BINARY_DESCRIPTION]:\r
+                            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                            Message=ST.ERR_UNIPARSE_MULTI_ENTRY_EXIST % StrName.split()[1], \\r
+                                            ExtraData=File.Path)\r
+                    continue\r
+                elif len(Line.split()) == 4 and Line.find(u'#language') > 0:\r
+                    if Line[Line.find(u'#language')-1] != ' ' or \\r
+                       Line[Line.find(u'#language')+len(u'#language')] != u' ':\r
+                        EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                        \r
+                    if Line.find(u'"') > 0:\r
+                        EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                        \r
+                    StrName = Line.split()[0] + u' ' + Line.split()[1]\r
+                    if StrName:\r
+                        if StrName.split()[1] not in ExistStrNameList:\r
+                            ExistStrNameList.append(StrName.split()[1].strip())\r
+                        elif StrName.split()[1] in [DT.TAB_INF_ABSTRACT, DT.TAB_INF_DESCRIPTION, \\r
+                                                    DT.TAB_INF_BINARY_ABSTRACT, DT.TAB_INF_BINARY_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_PACKAGE_ABSTRACT, DT.TAB_DEC_PACKAGE_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_BINARY_ABSTRACT, DT.TAB_DEC_BINARY_DESCRIPTION]:\r
+                            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                            Message=ST.ERR_UNIPARSE_MULTI_ENTRY_EXIST % StrName.split()[1], \\r
+                                            ExtraData=File.Path)\r
+                    if IsIncludeFile:\r
+                        if StrName not in NewLines:\r
+                            NewLines.append((Line[:Line.find(u'#language')]).strip())\r
+                    else:\r
+                        NewLines.append((Line[:Line.find(u'#language')]).strip())\r
+                    NewLines.append((Line[Line.find(u'#language'):]).strip())\r
+                elif len(Line.split()) > 4 and Line.find(u'#language') > 0 and Line.find(u'"') > 0:\r
+                    if Line[Line.find(u'#language')-1] != u' ' or \\r
+                       Line[Line.find(u'#language')+len(u'#language')] != u' ':\r
+                        EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                    \r
+                    if Line[Line.find(u'"')-1] != u' ':\r
+                        EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)  \r
+                    \r
+                    StrName = Line.split()[0] + u' ' + Line.split()[1]     \r
+                    if StrName:\r
+                        if StrName.split()[1] not in ExistStrNameList:\r
+                            ExistStrNameList.append(StrName.split()[1].strip())\r
+                        elif StrName.split()[1] in [DT.TAB_INF_ABSTRACT, DT.TAB_INF_DESCRIPTION, \\r
+                                                    DT.TAB_INF_BINARY_ABSTRACT, DT.TAB_INF_BINARY_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_PACKAGE_ABSTRACT, DT.TAB_DEC_PACKAGE_DESCRIPTION, \\r
+                                                    DT.TAB_DEC_BINARY_ABSTRACT, DT.TAB_DEC_BINARY_DESCRIPTION]:\r
+                            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                            Message=ST.ERR_UNIPARSE_MULTI_ENTRY_EXIST % StrName.split()[1], \\r
+                                            ExtraData=File.Path)      \r
+                    if IsIncludeFile:\r
+                        if StrName not in NewLines:\r
+                            NewLines.append((Line[:Line.find(u'#language')]).strip())\r
+                    else:                \r
+                        NewLines.append((Line[:Line.find(u'#language')]).strip())\r
+                    NewLines.append((Line[Line.find(u'#language'):Line.find(u'"')]).strip())\r
+                    NewLines.append((Line[Line.find(u'"'):]).strip())\r
+                else:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+            elif Line.startswith(u'#language'):\r
+                if len(Line.split()) == 2:\r
+                    if IsIncludeFile:\r
+                        if StrName not in NewLines:\r
+                            NewLines.append(StrName)\r
+                    else:\r
+                        NewLines.append(StrName)\r
+                    NewLines.append(Line)\r
+                elif len(Line.split()) > 2 and Line.find(u'"') > 0:\r
+                    if IsIncludeFile:\r
+                        if StrName not in NewLines:\r
+                            NewLines.append(StrName)\r
+                    else:\r
+                        NewLines.append(StrName)\r
+                    NewLines.append((Line[:Line.find(u'"')]).strip())\r
+                    NewLines.append((Line[Line.find(u'"'):]).strip())\r
+                else:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+            elif Line.startswith(u'"'):\r
+                if u'#string' in Line  or u'#language' in Line:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                NewLines.append(Line)\r
+            else:\r
+                print Line\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, ExtraData=File.Path)\r
+                    \r
+        if StrName and not StrName.split()[1].startswith(u'STR_'):\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_STRNAME_FORMAT_ERROR % StrName.split()[1], \\r
+                                ExtraData=File.Path)    \r
+        \r
+        if StrName and not NewLines:\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                            Message=ST.ERR_UNI_MISS_LANGENTRY % StrName, \\r
+                            ExtraData=File.Path)\r
+        \r
+        #\r
+        # Check Abstract, Description, BinaryAbstract and BinaryDescription order,\r
+        # should be Abstract, Description, BinaryAbstract, BinaryDesctiption\r
+        AbstractPosition = -1\r
+        DescriptionPosition = -1\r
+        BinaryAbstractPosition = -1\r
+        BinaryDescriptionPosition = -1\r
+        for StrName in ExistStrNameList:\r
+            if DT.TAB_HEADER_ABSTRACT.upper() in StrName:\r
+                if 'BINARY' in StrName:\r
+                    BinaryAbstractPosition = ExistStrNameList.index(StrName)\r
+                else:\r
+                    AbstractPosition = ExistStrNameList.index(StrName)\r
+            if DT.TAB_HEADER_DESCRIPTION.upper() in StrName:\r
+                if 'BINARY' in StrName:\r
+                    BinaryDescriptionPosition = ExistStrNameList.index(StrName)\r
+                else:\r
+                    DescriptionPosition = ExistStrNameList.index(StrName)\r
+                    \r
+        OrderList = sorted([AbstractPosition, DescriptionPosition])\r
+        BinaryOrderList = sorted([BinaryAbstractPosition, BinaryDescriptionPosition])\r
+        Min = OrderList[0]\r
+        Max = OrderList[1]\r
+        BinaryMin = BinaryOrderList[0]\r
+        BinaryMax = BinaryOrderList[1]\r
+        if BinaryDescriptionPosition > -1:\r
+            if not(BinaryDescriptionPosition == BinaryMax and BinaryAbstractPosition == BinaryMin and \\r
+                   BinaryMax > Max):\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_ENTRY_ORDER_WRONG, \\r
+                                ExtraData=File.Path) \r
+        elif BinaryAbstractPosition > -1:\r
+            if not(BinaryAbstractPosition > Max):\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_ENTRY_ORDER_WRONG, \\r
+                                ExtraData=File.Path)  \r
+            \r
+        if  DescriptionPosition > -1:\r
+            if not(DescriptionPosition == Max and AbstractPosition == Min and \\r
+                   DescriptionPosition > AbstractPosition):\r
+                EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \\r
+                                Message=ST.ERR_UNIPARSE_ENTRY_ORDER_WRONG, \\r
+                                ExtraData=File.Path)  \r
+        \r
+        if not self.UniFileHeader:\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \r
+                            Message = ST.ERR_NO_SOURCE_HEADER,\r
+                            ExtraData=File.Path)\r
+        \r
+        return NewLines\r
+\r
+    #\r
+    # Load a .uni file\r
+    #\r
+    def LoadUniFile(self, File = None):\r
+        if File == None:\r
+            EdkLogger.Error("Unicode File Parser", \r
+                            ToolError.PARSER_ERROR, \r
+                            Message='No unicode file is given', \r
+                            ExtraData=File.Path)\r
+   \r
+        self.File = File\r
+        \r
+        #\r
+        # Process special char in file\r
+        #\r
+        Lines = self.PreProcess(File)\r
+\r
+        #\r
+        # Get Unicode Information\r
+        #\r
+        for IndexI in range(len(Lines)):\r
+            Line = Lines[IndexI]\r
+            if (IndexI + 1) < len(Lines):\r
+                SecondLine = Lines[IndexI + 1]\r
+            if (IndexI + 2) < len(Lines):\r
+                ThirdLine = Lines[IndexI + 2]\r
+\r
+            #\r
+            # Get Language def information\r
+            #\r
+            if Line.find(u'#langdef ') >= 0:\r
+                self.GetLangDef(File, Line + u' ' + SecondLine)\r
+                continue\r
+\r
+            Name = ''\r
+            Language = ''\r
+            Value = ''\r
+            CombineToken = False\r
+            #\r
+            # Get string def information format as below\r
+            #\r
+            #     #string MY_STRING_1\r
+            #     #language eng\r
+            #     "My first English string line 1"\r
+            #     "My first English string line 2"\r
+            #     #string MY_STRING_1\r
+            #     #language spa\r
+            #     "Mi segunda secuencia 1"\r
+            #     "Mi segunda secuencia 2"\r
+            #\r
+            if Line.find(u'#string ') >= 0 and Line.find(u'#language ') < 0 and \\r
+                SecondLine.find(u'#string ') < 0 and SecondLine.find(u'#language ') >= 0 and \\r
+                ThirdLine.find(u'#string ') < 0 and ThirdLine.find(u'#language ') < 0:\r
+                if Line.find('"') > 0 or SecondLine.find('"') > 0:\r
+                    EdkLogger.Error("Unicode File Parser", ToolError.FORMAT_INVALID, \r
+                                Message=ST.ERR_UNIPARSE_DBLQUOTE_UNMATCHED,\r
+                                ExtraData=File.Path)\r
+                    \r
+                Name = Line[Line.find(u'#string ') + len(u'#string ') : ].strip(' ')\r
+                Language = SecondLine[SecondLine.find(u'#language ') + len(u'#language ') : ].strip(' ')\r
+                for IndexJ in range(IndexI + 2, len(Lines)):\r
+                    if Lines[IndexJ].find(u'#string ') < 0 and Lines[IndexJ].find(u'#language ') < 0 and \\r
+                    Lines[IndexJ].strip().startswith(u'"') and Lines[IndexJ].strip().endswith(u'"'):\r
+                        if Lines[IndexJ][-2] == ' ':\r
+                            CombineToken = True\r
+                        if CombineToken:\r
+                            if Lines[IndexJ].strip()[1:-1].strip():\r
+                                Value = Value + Lines[IndexJ].strip()[1:-1].rstrip() + ' '\r
+                            else:\r
+                                Value = Value + Lines[IndexJ].strip()[1:-1]\r
+                            CombineToken = False\r
+                        else:\r
+                            Value = Value + Lines[IndexJ].strip()[1:-1] + os.linesep\r
+                    else:\r
+                        IndexI = IndexJ\r
+                        break\r
+                if Value.endswith(os.linesep):\r
+                    Value = Value[: Value.rfind(os.linesep)]\r
+                Language = GetLanguageCode(Language, self.IsCompatibleMode, self.File)\r
+                self.AddStringToList(Name, Language, Value)\r
+                continue\r
+\r
+    #\r
+    # Load multiple .uni files\r
+    #\r
+    def LoadUniFiles(self, FileList):\r
+        if len(FileList) > 0:\r
+            for File in FileList:\r
+                FilePath = File.Path.strip()\r
+                if FilePath.endswith('.uni') or FilePath.endswith('.UNI') or FilePath.endswith('.Uni'):\r
+                    self.LoadUniFile(File)\r
+\r
+    #\r
+    # Add a string to list\r
+    #\r
+    def AddStringToList(self, Name, Language, Value, Token = 0, Referenced = False, UseOtherLangDef = '', Index = -1):\r
+        for LangNameItem in self.LanguageDef:\r
+            if Language == LangNameItem[0]:\r
+                break\r
+            \r
+        if Language not in self.OrderedStringList:\r
+            self.OrderedStringList[Language] = []\r
+            self.OrderedStringDict[Language] = {}\r
+            \r
+        IsAdded = True\r
+        if Name in self.OrderedStringDict[Language]:\r
+            IsAdded = False\r
+            if Value != None:\r
+                ItemIndexInList = self.OrderedStringDict[Language][Name]\r
+                Item = self.OrderedStringList[Language][ItemIndexInList]\r
+                Item.UpdateValue(Value)\r
+                Item.UseOtherLangDef = ''   \r
+\r
+        if IsAdded:\r
+            Token = len(self.OrderedStringList[Language])\r
+            if Index == -1:\r
+                self.OrderedStringList[Language].append(StringDefClassObject(Name, \r
+                                                                             Value, \r
+                                                                             Referenced, \r
+                                                                             Token, \r
+                                                                             UseOtherLangDef))\r
+                self.OrderedStringDict[Language][Name] = Token\r
+                for LangName in self.LanguageDef:\r
+                    #\r
+                    # New STRING token will be added into all language string lists.\r
+                    # so that the unique STRING identifier is reserved for all languages in the package list. \r
+                    #\r
+                    if LangName[0] != Language:\r
+                        if UseOtherLangDef != '':\r
+                            OtherLangDef = UseOtherLangDef\r
+                        else:\r
+                            OtherLangDef = Language\r
+                        self.OrderedStringList[LangName[0]].append(StringDefClassObject(Name, \r
+                                                                                        '', \r
+                                                                                        Referenced, \r
+                                                                                        Token, \r
+                                                                                        OtherLangDef))\r
+                        self.OrderedStringDict[LangName[0]][Name] = len(self.OrderedStringList[LangName[0]]) - 1\r
+            else:\r
+                self.OrderedStringList[Language].insert(Index, StringDefClassObject(Name, \r
+                                                                                    Value, \r
+                                                                                    Referenced, \r
+                                                                                    Token, \r
+                                                                                    UseOtherLangDef))\r
+                self.OrderedStringDict[Language][Name] = Index\r
+\r
+    #\r
+    # Set the string as referenced\r
+    #\r
+    def SetStringReferenced(self, Name):\r
+        #\r
+        # String stoken are added in the same order in all language string lists.\r
+        # So, only update the status of string stoken in first language string list.\r
+        #\r
+        Lang = self.LanguageDef[0][0]\r
+        if Name in self.OrderedStringDict[Lang]:\r
+            ItemIndexInList = self.OrderedStringDict[Lang][Name]\r
+            Item = self.OrderedStringList[Lang][ItemIndexInList]\r
+            Item.Referenced = True\r
+\r
+    #\r
+    # Search the string in language definition by Name\r
+    #\r
+    def FindStringValue(self, Name, Lang):\r
+        if Name in self.OrderedStringDict[Lang]:\r
+            ItemIndexInList = self.OrderedStringDict[Lang][Name]\r
+            return self.OrderedStringList[Lang][ItemIndexInList]\r
+\r
+        return None\r
+\r
+    #\r
+    # Search the string in language definition by Token\r
+    #\r
+    def FindByToken(self, Token, Lang):\r
+        for Item in self.OrderedStringList[Lang]:\r
+            if Item.Token == Token:\r
+                return Item\r
+\r
+        return None\r
+\r
+    #\r
+    # Re-order strings and re-generate tokens\r
+    #\r
+    def ReToken(self):\r
+        if len(self.LanguageDef) == 0:\r
+            return None\r
+        #\r
+        # Retoken all language strings according to the status of string stoken in the first language string.\r
+        #\r
+        FirstLangName = self.LanguageDef[0][0]\r
+\r
+        # Convert the OrderedStringList to be OrderedStringListByToken in order to faciliate future search by token\r
+        for LangNameItem in self.LanguageDef:\r
+            self.OrderedStringListByToken[LangNameItem[0]] = {}\r
+\r
+        #\r
+        # Use small token for all referred string stoken.\r
+        #\r
+        RefToken = 0\r
+        for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+            FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+            if FirstLangItem.Referenced == True:\r
+                for LangNameItem in self.LanguageDef:\r
+                    LangName = LangNameItem[0]\r
+                    OtherLangItem = self.OrderedStringList[LangName][Index]\r
+                    OtherLangItem.Referenced = True\r
+                    OtherLangItem.Token = RefToken\r
+                    self.OrderedStringListByToken[LangName][OtherLangItem.Token] = OtherLangItem\r
+                RefToken = RefToken + 1\r
+\r
+        #\r
+        # Use big token for all unreferred string stoken.\r
+        #\r
+        UnRefToken = 0\r
+        for Index in range (0, len (self.OrderedStringList[FirstLangName])):\r
+            FirstLangItem = self.OrderedStringList[FirstLangName][Index]\r
+            if FirstLangItem.Referenced == False:\r
+                for LangNameItem in self.LanguageDef:\r
+                    LangName = LangNameItem[0]\r
+                    OtherLangItem = self.OrderedStringList[LangName][Index]\r
+                    OtherLangItem.Token = RefToken + UnRefToken\r
+                    self.OrderedStringListByToken[LangName][OtherLangItem.Token] = OtherLangItem\r
+                UnRefToken = UnRefToken + 1\r
+\r
+    #\r
+    # Show the instance itself\r
+    #\r
+    def ShowMe(self):\r
+        print self.LanguageDef\r
+        #print self.OrderedStringList\r
+        for Item in self.OrderedStringList:\r
+            print Item\r
+            for Member in self.OrderedStringList[Item]:\r
+                print str(Member)\r
+    \r
+    #\r
+    # Read content from '!include' UNI file \r
+    #\r
+    def ReadIncludeUNIfile(self, FilaPath):\r
+        if self.File:\r
+            pass\r
+        \r
+        if not os.path.exists(FilaPath) or not os.path.isfile(FilaPath):\r
+            EdkLogger.Error("Unicode File Parser", \r
+                             ToolError.FILE_NOT_FOUND,\r
+                             ExtraData=FilaPath)\r
+        try:\r
+            FileIn = codecs.open(FilaPath, mode='rb', encoding='utf_16').readlines()\r
+        except UnicodeError:\r
+            FileIn = codecs.open(FilaPath, mode='rb', encoding='utf_16_le').readlines()\r
+        except:\r
+            EdkLogger.Error("Unicode File Parser", ToolError.FILE_OPEN_FAILURE, ExtraData=FilaPath)\r
+        return FileIn\r
+\r
index 7029e59889726f88fd6a91e1c70b806f6348d345..d7614b884990248fd52cbf5e67f9fefbdf447425 100644 (file)
@@ -2,7 +2,7 @@
 # This is an XML API that uses a syntax similar to XPath, but it is written in\r
 # standard python so that no extra python packages are required to use it.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -22,6 +22,7 @@ XmlRoutines
 #\r
 import xml.dom.minidom\r
 import re\r
+import codecs\r
 from Logger.ToolError import PARSER_ERROR\r
 import Logger.Log as Logger\r
 \r
@@ -219,7 +220,7 @@ def XmlNodeName(Dom):
 #\r
 def XmlParseFile(FileName):\r
     try:\r
-        XmlFile = open(FileName)\r
+        XmlFile = codecs.open(FileName, 'rb')\r
         Dom = xml.dom.minidom.parse(XmlFile)\r
         XmlFile.close()\r
         return Dom\r
index 6275a3ef584cc12d705ffa5fa1385c66c5f47150..5b6973c9446007f373dbc488d1b4b1ae9c83ead5 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define strings used in the UPT tool\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -42,9 +42,9 @@ MSG_USAGE_STRING = _("\n"
 MSG_VERSION_NUMBER = _("1.0")\r
 MSG_VERSION = _("Intel(r) UEFI Packaging Tool (Intel(r) UEFIPT) - Revision " + \\r
                 MSG_VERSION_NUMBER)\r
-MSG_COPYRIGHT = _("Copyright (c) 2011 - 2013 Intel Corporation All Rights Reserved.")\r
+MSG_COPYRIGHT = _("Copyright (c) 2011 Intel Corporation All Rights Reserved.")\r
 MSG_VERSION_COPYRIGHT = _("\n  %s\n  %s" % (MSG_VERSION, MSG_COPYRIGHT))\r
-MSG_USAGE = _("%s [options]\n%s" % ("upt.exe", MSG_VERSION_COPYRIGHT))\r
+MSG_USAGE = _("%s [options]\n%s" % ("UPT", MSG_VERSION_COPYRIGHT))\r
 MSG_DESCRIPTION = _("The Intel(r) UEFIUPT is used to create, " + \\r
                     "install or remove a UEFI Distribution Package.")\r
 \r
@@ -64,21 +64,23 @@ ERR_INF_PARSER_BUILD_OPTION_FORMAT_INVALID = \
     _("Build Option format incorrect.")\r
 ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID = _(\r
      "The format of binary %s item is incorrect. "\r
-     "It should contain at least 2 elements.")\r
+     "It should contain at least %d elements.")\r
 ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX = _(\r
      "The format of binary %s item is invalid, "\r
-     "it should contain not more than %d elements.")    \r
+     "it should contain not more than %d elements.")\r
 ERR_INF_PARSER_BINARY_ITEM_INVALID_FILETYPE = _(\r
      "The Binary FileType is incorrect. It should in %s")\r
 ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST = _(\r
      "The Binary File: %s not exist.")\r
+ERR_INF_PARSER_BINARY_ITEM_FILENAME_NOT_EXIST = _(\r
+     "The Binary File Name item not exist")\r
 ERR_INF_PARSER_BINARY_VER_TYPE = _(\r
      "Only this type is allowed: \"%s\".")\r
 ERR_INF_PARSER_MULTI_DEFINE_SECTION = \\r
     _("Multiple define sections found. "\r
       "It must be corrected before continuing.")\r
 ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND = \\r
-    _("More then 1 %s is defined in DEFINES section. "\r
+    _("More than 1 %s is defined in DEFINES section. "\r
       "It must be corrected before continuing.")\r
 ERR_INF_PARSER_DEFINE_NAME_INVALID = \\r
     _("Incorrect name format for : %s")\r
@@ -88,8 +90,8 @@ ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID = _("Incorrect MODULE_TYPE: %s")
 ERR_INF_PARSER_DEFINE_FROMAT_INVALID = _("Incorrect format: %s")\r
 ERR_INF_PARSER_FILE_NOT_EXIST = _("This file does not exist: %s")\r
 ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID = \\r
-    _("The file does not exist or has an incorrect file name or not in "\r
-      "sub-directories of the directory containing the INF file: %s. "\r
+    _("The file does not exist or not in sub-directories "\r
+      "or has an incorrect file name of the directory containing the INF or DEC file: %s. "\r
       "It must be corrected before continuing")\r
 ERR_INF_PARSER_DEFINE_SHADOW_INVALID = \\r
    _("The SHADOW keyword is only valid for"\r
@@ -98,6 +100,8 @@ ERR_INF_PARSER_DEFINE_SECTION_HEADER_INVALID = \
     _("The format of the section header is incorrect")\r
 ERR_INF_PARSER_DEPEX_SECTION_INVALID = \\r
     _("A module can't have a Depex section when its module type is %s")\r
+ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS = \\r
+    _("A base type library class can't have a Depex section with module type not defined.")\r
 ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS = \\r
     _("A library class can't have a Depex section when its supported module type list is not defined.")\r
 ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_DRIVER = \\r
@@ -212,6 +216,8 @@ ERR_INF_NO_PKG_DEPENDENCY_INFO = _("There are no packages defined that use the A
 #\r
 # Item duplicate\r
 #\r
+ERR_INF_PARSER_ITEM_DUPLICATE_IN_DEC = \\r
+_('"%s" is redefined in its dependent DEC files')\r
 ERR_INF_PARSER_ITEM_DUPLICATE = _("%s define duplicated! " \r
                                   "It must be corrected before continuing.")\r
 ERR_INF_PARSER_ITEM_DUPLICATE_COMMON = _("%s define duplicated! Item listed" \r
@@ -246,7 +252,7 @@ ERR_BO_CONTATIN_ASBUILD_AND_COMMON = _("A binary INF file should contain either
 \r
 ERR_ASBUILD_PCD_SECTION_TYPE = _("The AsBuilt INF file contains a PCD section type that is not permitted: %s.")\r
 ERR_ASBUILD_PATCHPCD_FORMAT_INVALID = _("The AsBuilt PatchPcd entry must contain 3 elements: PcdName|Value|Offset")\r
-ERR_ASBUILD_PCDEX_FORMAT_INVALID = _("The AsBuilt PcdEx entry must contain 2 elements: PcdName|Value")\r
+ERR_ASBUILD_PCDEX_FORMAT_INVALID = _("The AsBuilt PcdEx entry must contain one element: PcdName")\r
 ERR_ASBUILD_PCD_VALUE_INVALID = \\r
     _("The AsBuilt PCD value %s is incorrect or not align with it's datum type %s. "\r
       "It must be corrected before continuing.")\r
@@ -349,7 +355,13 @@ MSG_NEW_FILE_NAME      = _(
 MSG_RELATIVE_PATH_ONLY = _("Please specify a relative path, full path is not allowed: %s")\r
 MSG_NEW_PKG_PATH  = _(\r
     "Select package location.  To quit with no input, press [Enter].")\r
-\r
+MSG_CHECK_DP_FOR_REPLACE = _("Verifying the dependency rule for replacement of distributions:\n %s replaces %s")\r
+MSG_CHECK_DP_FOR_INSTALL = _("Verifying the dependency rule for installation of distribution:\n %s")\r
+MSG_REPLACE_ALREADY_INSTALLED_DP = _("Distribution with the same GUID/Version is already installed, "\r
+                                     "replace would result in two instances, which is not allowed")\r
+MSG_RECOVER_START = _('An error was detected, recovery started ...')\r
+MSG_RECOVER_DONE = _('Recovery completed.')\r
+MSG_RECOVER_FAIL = _('Recovery failed.')\r
 #\r
 # Error related strings.\r
 #\r
@@ -378,6 +390,8 @@ ERR_PACKAGE_NOT_MATCH_DEPENDENCY = _(
     "This distribution package does not meet the dependency requirements")\r
 ERR_UNKNOWN_FATAL_INSTALL_ERR    = \\r
 _("Unknown unrecoverable error when installing: %s")\r
+ERR_UNKNOWN_FATAL_REPLACE_ERR    = \\r
+_("Unknown unrecoverable error during replacement of distributions: %s replaces %s")\r
 ERR_OPTION_NOT_FOUND             = _("Options not found")\r
 ERR_INVALID_PACKAGE_NAME         = _("Incorrect package name: %s. ")\r
 ERR_INVALID_PACKAGE_PATH         = \\r
@@ -393,6 +407,7 @@ ERR_PACKAGE_NOT_INSTALLED        = _(
 ERR_DISTRIBUTION_NOT_INSTALLED   = _(\r
     "The distribution package is not installed.")\r
 ERR_UNKNOWN_FATAL_REMOVING_ERR   = _("Unknown error when removing package")\r
+ERR_UNKNOWN_FATAL_INVENTORYWS_ERR   = _("Unknown error when inventorying WORKSPACE")\r
 ERR_NOT_CONFIGURE_WORKSPACE_ENV  = _(\r
     "The WORKSPACE environment variable must be configured.")\r
 ERR_NO_TEMPLATE_FILE             = _("This package information data file is not found: %s")\r
@@ -400,6 +415,10 @@ ERR_DEBUG_LEVEL                  = _(
     "Not supported debug level. Use default level instead.")\r
 ERR_REQUIRE_T_OPTION             = _(\r
     "Option -t is required during distribution creation.")\r
+ERR_REQUIRE_O_OPTION             = _(\r
+    "Option -o is required during distribution replacement.")\r
+ERR_REQUIRE_U_OPTION             = _(\r
+    "Option -u is required during distribution replacement.")\r
 ERR_REQUIRE_I_C_R_OPTION         = _(\r
     "Options -i, -c and -r are mutually exclusive.")\r
 ERR_I_C_EXCLUSIVE                = \\r
@@ -408,6 +427,11 @@ ERR_I_R_EXCLUSIVE                = \
 _("Option -i and -r are mutually exclusive.")\r
 ERR_C_R_EXCLUSIVE                = \\r
 _("Option -c and -r are mutually exclusive.")\r
+ERR_U_ICR_EXCLUSIVE                = \\r
+_("Option -u and -c/-i/-r are mutually exclusive.")\r
+\r
+ERR_L_OA_EXCLUSIVE                = \\r
+_("Option -l and -c/-i/-r/-u are mutually exclusive.")\r
 \r
 ERR_FAILED_LOAD                  = _("Failed to load %s\n\t%s")\r
 ERR_PLACEHOLDER_DIFFERENT_REPEAT = _(\r
@@ -551,32 +575,66 @@ ERR_INSTALL_FILE_DEC_FILE_ERROR = _("Could not obtain the TokenSpaceGuidCName an
 ERR_NOT_SUPPORTED_SA_MODULE = _("Stand-alone module distribution does not allow EDK 1 INF")\r
 ERR_INSTALL_DIST_NOT_FOUND               = \\r
 _("Distribution file to be installed is not found in current working directory or workspace: %s")\r
+ERR_REPLACE_DIST_NOT_FOUND               = \\r
+_("Distribution file for replace function was not found in the current working directory or workspace: %s")\r
+ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG               = \\r
+_("Only a distribution file name without a path is allowed for "\r
+  "the distribution to be replaced during replace. Current given: '%s'.")\r
+ERR_UNIPARSE_DBLQUOTE_UNMATCHED = \\r
+_("Only Language entry can contain a couple of matched quote in one line")\r
+ERR_UNIPARSE_NO_SECTION_EXIST = _("No PakcageDef or ModuleDef section exists in the UNI file.")\r
+ERR_UNIPARSE_STRNAME_FORMAT_ERROR = _("The String Token Name %s must start with \"STR_\"")\r
+ERR_UNIPARSE_SEP_LANGENTRY_LINE = _("Each <LangEntry> should be in a separate line :%s.")\r
+ERR_UNIPARSE_MULTI_ENTRY_EXIST = \\r
+_("There are same entries : %s in the UNI file, every kind of entry should be only one.")\r
+ERR_UNIPARSE_ENTRY_ORDER_WRONG = \\r
+_("The string entry order in UNI file should be <AbstractStrings>, <DescriptionStrings>, \\r
+<BinaryAbstractStrings>, <BinaryDescriptionStrings>.")\r
+ERR_UNIPARSE_STRTOKEN_FORMAT_ERROR = _("The String Token Type %s must be one of the '_PROMPT', '_HELP' and '_ERR_'.") \r
+ERR_UNIPARSE_LINEFEED_UNDER_EXIST = _("Line feed should not exist under this line: %s.")\r
+ERR_UNIPARSE_LINEFEED_UP_EXIST = _("Line feed should not exist up this line: %s.")\r
+ERR_UNI_MISS_LANGENTRY = _("Language entry missed in this Entry, %s.")\r
 ERR_BINARY_HEADER_ORDER           = _("Binary header must follow the file header.")\r
 ERR_NO_SOURCE_HEADER              = _("File header statement \"## @file\" must exist at the first place.")\r
+ERR_UNI_FILE_SUFFIX_WRONG = _("The UNI file must have an extension of '.uni', '.UNI' or '.Uni'")\r
+ERR_UNI_FILE_NAME_INVALID = _("The use of '..', '../' and './' in the UNI file is prohibited.")\r
+ERR_UNI_SUBGUID_VALUE_DEFINE_DEC_NOT_FOUND = _("There are no DEC file to define the GUID value for \\r
+this GUID CName: '%s'.")\r
 \r
 #\r
 # Expression error message\r
 #\r
 ERR_EXPR_RIGHT_PAREN            = \\r
-_('Expected ")" in feature flag expression [%s]. Found: [%s].')\r
+_('Missing ")" in expression "%s".')\r
 ERR_EXPR_FACTOR                 = \\r
-_('Expected HEX, integer, macro, quoted string or PcdName in '\r
-  'feature flag expression [%s]. Found: [%s].')\r
+_('"%s" is expected to be HEX, integer, macro, quoted string or PcdName in '\r
+  'expression "%s".')\r
 ERR_EXPR_STRING_ITEM            = \\r
-_('Expected quoted string, macro name or PcdName in feature flag '\r
-  'expression [%s]. Found: [%s].')\r
+_('"%s" is expected to be HEX, integer, macro, quoted string or PcdName in '\r
+  'expression [%s].')\r
 ERR_EXPR_EQUALITY               = \\r
-_('Expected ==, EQ, != or NE  in feature flag expression [%s]. Found: [%s].')\r
+_('"%s" is expected to be ==, EQ, != or NE  in expression "%s".')\r
 ERR_EXPR_BOOLEAN                = \\r
-_('The rest of string [%s] in feature flag ' \r
-  'expression [%s] cannot be evaluated.')\r
+_('The string "%s" in expression "%s" can not be recognized as a part of the logical expression.')\r
 ERR_EXPR_EMPTY                  = _('Boolean value cannot be empty.')\r
+ERR_EXPRESS_EMPTY               = _('Expression can not be empty.')\r
 ERR_EXPR_LOGICAL                = \\r
-_('The following cannot be evaluated as a logical expression: [%s].')\r
-ERR_EXPR_OR                     = _('The expression must be encapsulated in open "(" and close ")" '\r
+_('The following is not a valid logical expression: "%s".')\r
+ERR_EXPR_OR                     = _('The expression: "%s" must be encapsulated in open "(" and close ")" '\r
                                     'parenthesis when using | or ||.')\r
+ERR_EXPR_RANGE                  = \\r
+_('The following is not a valid range expression: "%s".')\r
+ERR_EXPR_RANGE_FACTOR           = \\r
+_('"%s" is expected to be HEX, integer in valid range expression "%s".')\r
+ERR_EXPR_RANGE_DOUBLE_PAREN_NESTED = \\r
+_('Double parentheses nested is not allowed in valid range expression: "%s".')\r
+ERR_EXPR_RANGE_EMPTY            = _('Valid range can not be empty.')\r
+ERR_EXPR_LIST_EMPTY             = _('Valid list can not be empty.')\r
+ERR_PAREN_NOT_USED              = _('Parenthesis must be used on both sides of "OR", "AND" in valid range : %s.')\r
+ERR_EXPR_LIST                   = \\r
+_('The following is not a valid list expression: "%s".')\r
+\r
 \r
-#\r
 # DEC parser error message\r
 #\r
 ERR_DECPARSE_STATEMENT_EMPTY        = \\r
@@ -632,6 +690,8 @@ ERR_DECPARSE_PCD_VOID               = \
 _("Incorrect  value [%s] of type [%s].  Value  must be printable and in the "\r
   "form of{...} for array, or ""..."" for string, or L""..."""\r
   "for unicode string.")\r
+ERR_DECPARSE_PCD_VALUE_EMPTY        = \\r
+_("Pcd value can not be empty.") \r
 ERR_DECPARSE_PCD_BOOL               = \\r
 _("Invalid value [%s] of type [%s]; must be expression, TRUE, FALSE, 0 or 1.")\r
 ERR_DECPARSE_PCD_INT                = _("Incorrect value [%s] of type [%s]."\\r
@@ -657,6 +717,7 @@ _("No GUID value specified, must be <CName> = <GuidValueInCFormat>.")
 ERR_DECPARSE_CGUID_GUIDFORMAT       = \\r
 _("Incorrect GUID value format, must be <GuidValueInCFormat:" \r
   "{8,4,4,{2,2,2,2,2,2,2,2}}>.")\r
+ERR_DECPARSE_CGUID_NOT_FOUND = _("Unable to find the GUID value of this GUID CName : '%s'.")\r
 ERR_DECPARSE_FILEOPEN               = _("Unable to open: [%s].")\r
 ERR_DECPARSE_SECTION_EMPTY          = _("Empty sections are not allowed.")\r
 ERR_DECPARSE_SECTION_UE             = _("Incorrect UserExtentions format. "\r
@@ -697,7 +758,13 @@ ERR_DECPARSE_REDEFINE               = _(
 ERR_DECPARSE_MACRO_RESOLVE          = _("Macro %s in %s cannot be resolved.")\r
 ERR_DECPARSE_UE_DUPLICATE           = \\r
     _("Duplicated UserExtensions header found.")\r
-\r
+ERR_DECPARSE_PCDERRORMSG_MISS_VALUE_SPLIT = \\r
+    _("Missing '|' between Pcd's error code and Pcd's error message.")\r
+ERR_DECPARSE_PCD_MISS_ERRORMSG = \\r
+    _("Missing Pcd's error message.")\r
+ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE = \\r
+    _("There is no error message matched with this Pcd error code : %s in both DEC and UNI file.")\r
+ERR_DECPARSE_PCD_NODEFINED = _("The PCD : %s used in the Expression is undefined.")\r
 #\r
 # Used to print the current line content which cause error raise.\r
 # Be attached to the end of every error message above.\r
@@ -718,8 +785,11 @@ WRN_DIST_PKG_INSTALLED    = _("This distribution package has been installed")
 WRN_DIST_NOT_FOUND         = _(\r
     "Distribution is not found at location %s")\r
 WRN_MULTI_PCD_RANGES      = _(\r
-    "A PCD can only have one each of @ValidRange, @ValidList, "\r
-    "and @Expression comment")\r
+    "A PCD can only have one type of @ValidRange, @ValidList, and @Expression comment")\r
+WRN_MULTI_PCD_VALIDVALUE  = _(\r
+    "A PCD can only have one of @ValidList comment")\r
+WRN_MULTI_PCD_PROMPT      = _(\r
+    "A PCD can only have one of @Prompt comment")\r
 WRN_MISSING_USAGE                = _("Missing usage")\r
 WRN_INVALID_GUID_TYPE            = _("This is and incorrect Guid type: %s")\r
 WRN_MISSING_GUID_TYPE            = _("Missing Guid Type")\r
@@ -742,6 +812,8 @@ WARN_SPECIAL_SECTION_LOCATION_WRONG = _("Warning. A special section should be "
                                         "at the end of a file or at the end of a section.")\r
 WARN_INSTALLED_PACKAGE_NOT_FOUND = \\r
     _("File not found. The DEC file for a package cannot be found in GUID/Version/Install path: %s %s %s")\r
+WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH = \\r
+    _("option selection of --custom-path will override the option --use-guided-paths")\r
 \r
 #\r
 # Help related strings.\r
@@ -766,11 +838,19 @@ HLP_SPECIFY_DEC_NAME_CREATE      = _(
     "Specify dec file names to create package")\r
 HLP_SPECIFY_INF_NAME_CREATE      = _(\r
     "Specify inf file names to create package")\r
+HLP_LIST_DIST_INSTALLED      = _(\r
+    "List the UEFI Distribution Packages that have been installed")\r
 HLP_NO_SUPPORT_GUI               = _(\r
     "Starting the tool in graphical mode is not supported in this version")\r
 HLP_DISABLE_PROMPT               = _(\r
-    "Disable all user prompts")\r
+    "Disable user prompts for removing modified files. Valid only when -r is present")\r
 HLP_CUSTOM_PATH_PROMPT           = _(\r
     "Enable user prompting for alternate installation directories")\r
 HLP_SKIP_LOCK_CHECK              = _(\r
     "Skip the check for multiple instances")\r
+HLP_SPECIFY_PACKAGE_NAME_REPLACE  = _(\r
+    "Specify the UEFI Distribution Package file name to replace the existing file name")\r
+HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED = _(\r
+    "Specify the UEFI Distribution Package file name to be replaced")\r
+HLP_USE_GUIDED_PATHS = _(\r
+    "Install packages to the following directory path by default: <PackageName>_<PACKAGE_GUID>_<PACKAGE_VERSION>")\r
index b8b78e4515504c1492db461db0ba940fd9e6712a..2eb84588bdc495521e557f4cae6cfddead6ab669 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Install distribution package.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -45,7 +45,6 @@ import Logger.Log as Logger
 from Xml.XmlParser import DistributionPackageXml\r
 from Xml.IniToXml import IniToXml\r
 \r
-from Library.Misc import CheckEnvVariable\r
 from Library import GlobalData\r
 from Library.ParserValidate import IsValidPath\r
 \r
@@ -78,7 +77,6 @@ def Main(Options = None):
     try:\r
         DataBase = GlobalData.gDB        \r
         ContentFileClosed = True\r
-        CheckEnvVariable()\r
         WorkspaceDir = GlobalData.gWORKSPACE\r
 \r
         #\r
index 1418a2f4bd86f49bee2f34b46656743da8cd64c3..ec8a8d44ce5c45aba19426a62336c3bc69b4dc3e 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define common items of class object\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -14,7 +14,7 @@
 '''\r
 Common Object\r
 '''\r
-from Library.DataType import LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
 \r
 ## HelpTextObject\r
 #\r
@@ -44,6 +44,20 @@ class HelpTextListObject(object):
     def GetHelpTextList(self):\r
         return self.HelpTextList\r
 \r
+## PromptListObject\r
+#\r
+# @param object:       Inherited from object class\r
+#\r
+class PromptListObject(object):\r
+    def __init__(self):\r
+        self.PromptList = []\r
+    \r
+    def SetPromptList(self, PromptList):\r
+        self.PromptList = PromptList\r
+    \r
+    def GetPromptList(self):\r
+        return self.PromptList\r
+    \r
 ## CommonPropertiesObject\r
 #\r
 # This class defined common attribution used in Module/Platform/Package files\r
@@ -60,6 +74,7 @@ class CommonPropertiesObject(HelpTextObject, HelpTextListObject):
         self.Usage = []\r
         self.FeatureFlag = ''\r
         self.SupArchList = []\r
+        self.GuidValue = ''\r
         HelpTextObject.__init__(self)\r
         HelpTextListObject.__init__(self)\r
         \r
@@ -80,6 +95,12 @@ class CommonPropertiesObject(HelpTextObject, HelpTextListObject):
 \r
     def GetSupArchList(self):\r
         return self.SupArchList\r
+    \r
+    def SetGuidValue(self, GuidValue):\r
+        self.GuidValue = GuidValue\r
+        \r
+    def GetGuidValue(self):\r
+        return self.GuidValue\r
 \r
 ## CommonHeaderObject\r
 #\r
@@ -89,35 +110,96 @@ class CommonPropertiesObject(HelpTextObject, HelpTextListObject):
 #\r
 class CommonHeaderObject(object):\r
     def __init__(self):\r
-        self.Abstract = ''\r
-        self.Description = ''\r
-        self.Copyright = ''\r
-        self.License = ''\r
+        self.AbstractList = []\r
+        self.DescriptionList = []\r
+        self.CopyrightList = []\r
+        self.LicenseList = []\r
 \r
     def SetAbstract(self, Abstract):\r
-        self.Abstract = Abstract\r
+        if isinstance(Abstract, list):\r
+            self.AbstractList = Abstract\r
+        else:\r
+            self.AbstractList.append(Abstract)\r
 \r
     def GetAbstract(self):\r
-        return self.Abstract\r
+        return self.AbstractList\r
 \r
     def SetDescription(self, Description):\r
-        self.Description = Description\r
+        if isinstance(Description, list):\r
+            self.DescriptionList = Description\r
+        else:\r
+            self.DescriptionList.append(Description)\r
 \r
     def GetDescription(self):\r
-        return self.Description\r
+        return self.DescriptionList\r
 \r
     def SetCopyright(self, Copyright):\r
-        self.Copyright = Copyright\r
+        if isinstance(Copyright, list):\r
+            self.CopyrightList = Copyright\r
+        else:\r
+            self.CopyrightList.append(Copyright)\r
 \r
     def GetCopyright(self):\r
-        return self.Copyright\r
+        return self.CopyrightList\r
 \r
     def SetLicense(self, License):\r
-        self.License = License\r
+        if isinstance(License, list):\r
+            self.LicenseList = License\r
+        else:\r
+            self.LicenseList.append(License)\r
 \r
     def GetLicense(self):\r
-        return self.License\r
+        return self.LicenseList\r
 \r
+## BinaryHeaderObject\r
+#\r
+# This class defined Binary header items used in Module/Platform/Package files\r
+#\r
+# @param object:          Inherited from object class\r
+#\r
+class BinaryHeaderObject(object):\r
+    def __init__(self):\r
+        self.BinaryHeaderAbstractList = []\r
+        self.BinaryHeaderDescriptionList = []\r
+        self.BinaryHeaderCopyrightList = []\r
+        self.BinaryHeaderLicenseList = []\r
+\r
+    def SetBinaryHeaderAbstract(self, Abstract):\r
+        if isinstance(Abstract, list) and Abstract:\r
+            self.BinaryHeaderAbstractList = Abstract\r
+        elif isinstance(Abstract, tuple) and Abstract[1]:\r
+            self.BinaryHeaderAbstractList.append(Abstract)\r
+\r
+    def GetBinaryHeaderAbstract(self):\r
+        return self.BinaryHeaderAbstractList\r
+\r
+    def SetBinaryHeaderDescription(self, Description):\r
+        if isinstance(Description, list) and Description:\r
+            self.BinaryHeaderDescriptionList = Description\r
+        elif isinstance(Description, tuple) and Description[1]:\r
+            self.BinaryHeaderDescriptionList.append(Description)\r
+\r
+    def GetBinaryHeaderDescription(self):\r
+        return self.BinaryHeaderDescriptionList\r
+\r
+    def SetBinaryHeaderCopyright(self, Copyright):\r
+        if isinstance(Copyright, list) and Copyright:\r
+            self.BinaryHeaderCopyrightList = Copyright\r
+        elif isinstance(Copyright, tuple) and Copyright[1]:\r
+            self.BinaryHeaderCopyrightList.append(Copyright)\r
+\r
+    def GetBinaryHeaderCopyright(self):\r
+        return self.BinaryHeaderCopyrightList\r
+\r
+    def SetBinaryHeaderLicense(self, License):\r
+        if isinstance(License, list) and License:\r
+            self.BinaryHeaderLicenseList = License\r
+        elif isinstance(License, tuple) and License[1]:\r
+            self.BinaryHeaderLicenseList.append(License)\r
+\r
+    def GetBinaryHeaderLicense(self):\r
+        return self.BinaryHeaderLicenseList\r
+    \r
 ## ClonedRecordObject\r
 #\r
 # This class defined ClonedRecord items used in Module/Platform/Package files\r
@@ -177,7 +259,7 @@ class ClonedRecordObject(object):
 #\r
 class TextObject(object):\r
     def __init__(self):\r
-        self.Lang = LANGUAGE_EN_US\r
+        self.Lang = TAB_LANGUAGE_EN_US\r
         self.String = ''\r
 \r
     def SetLang(self, Lang):\r
@@ -224,10 +306,10 @@ class FileNameObject(CommonPropertiesObject):
 #\r
 class FileObject(object):\r
     def __init__(self):\r
-        self.Executable = ''\r
+        self.Executable = '' \r
         self.Uri = ''\r
         self.OsType = ''\r
-\r
+        \r
     def SetExecutable(self, Executable):\r
         self.Executable = Executable\r
 \r
@@ -478,6 +560,11 @@ class UserExtensionObject(object):
     def __init__(self):\r
         self.UserID = ''\r
         self.Identifier = ''\r
+        self.BinaryAbstractList = []\r
+        self.BinaryDescriptionList = []\r
+        self.BinaryCopyrightList = []\r
+        self.BinaryLicenseList = []\r
+        self.UniLangDefsList = []\r
         #\r
         # { Statement : Arch , ... }    \r
         #\r
@@ -519,6 +606,60 @@ class UserExtensionObject(object):
     def GetIdentifier(self):\r
         return self.Identifier\r
     \r
+    def SetUniLangDefsList(self, UniLangDefsList):\r
+        self.UniLangDefsList = UniLangDefsList\r
+        \r
+    def GetUniLangDefsList(self):\r
+        return self.UniLangDefsList\r
+    \r
+    def SetBinaryAbstract(self, BinaryAbstractList):\r
+        self.BinaryAbstractList = BinaryAbstractList\r
+    \r
+    def GetBinaryAbstract(self, Lang=None):\r
+        if Lang:\r
+            for (Key, Value) in self.BinaryAbstractList:\r
+                if Key == Lang:\r
+                    return Value\r
+            return None\r
+        else:\r
+            return self.BinaryAbstractList\r
+    \r
+    def SetBinaryDescription(self, BinaryDescriptionList):\r
+        self.BinaryDescriptionList = BinaryDescriptionList\r
+    \r
+    def GetBinaryDescription(self, Lang=None):\r
+        if Lang:\r
+            for (Key, Value) in self.BinaryDescriptionList:\r
+                if Key == Lang:\r
+                    return Value\r
+            return None\r
+        else:\r
+            return self.BinaryDescriptionList\r
+    \r
+    def SetBinaryCopyright(self, BinaryCopyrightList):\r
+        self.BinaryCopyrightList = BinaryCopyrightList\r
+    \r
+    def GetBinaryCopyright(self, Lang=None):\r
+        if Lang:\r
+            for (Key, Value) in self.BinaryCopyrightList:\r
+                if Key == Lang:\r
+                    return Value\r
+            return None\r
+        else:\r
+            return self.BinaryCopyrightList\r
+    \r
+    def SetBinaryLicense(self, BinaryLicenseList):\r
+        self.BinaryLicenseList = BinaryLicenseList\r
+    \r
+    def GetBinaryLicense(self, Lang=None):\r
+        if Lang:\r
+            for (Key, Value) in self.BinaryLicenseList:\r
+                if Key == Lang:\r
+                    return Value\r
+            return None\r
+        else:\r
+            return self.BinaryLicenseList\r
+    \r
     def SetDefinesDict(self, DefinesDict):\r
         self.DefinesDict = DefinesDict\r
     \r
@@ -600,6 +741,10 @@ class PcdErrorObject(object):
         self.Expression = ''\r
         self.ErrorNumber = ''\r
         self.ErrorMessageList = []\r
+        self.TokenSpaceGuidCName = ''\r
+        self.CName = ''\r
+        self.FileLine = ''\r
+        self.LineNum = 0\r
 \r
     def SetValidValue(self, ValidValue):\r
         self.ValidValue = ValidValue\r
@@ -637,7 +782,31 @@ class PcdErrorObject(object):
     def GetErrorMessageList(self):\r
         return self.ErrorMessageList\r
     \r
-\r
+    def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):\r
+        self.TokenSpaceGuidCName = TokenSpaceGuidCName\r
+        \r
+    def GetTokenSpaceGuidCName(self):\r
+        return self.TokenSpaceGuidCName\r
+    \r
+    def SetCName(self, CName):\r
+        self.CName = CName\r
+        \r
+    def GetCName(self):\r
+        return self.CName\r
+    \r
+    def SetFileLine(self, FileLine):\r
+        self.FileLine = FileLine\r
+        \r
+    def GetFileLine(self):\r
+        return self.FileLine\r
+    \r
+    def SetLineNum(self, LineNum):\r
+        self.LineNum = LineNum\r
+        \r
+    def GetLineNum(self):\r
+        return self.LineNum\r
+    \r
+    \r
 ## IncludeObject\r
 #\r
 # This class defined Include item used in Module/Platform/Package files\r
@@ -692,7 +861,7 @@ class IncludeObject(CommonPropertiesObject):
 # @param SkuInfoList:          Input value for SkuInfoList, default is {}\r
 # @param SupModuleList:        Input value for SupModuleList, default is []\r
 #\r
-class PcdObject(CommonPropertiesObject, HelpTextListObject):\r
+class PcdObject(CommonPropertiesObject, HelpTextListObject, PromptListObject):\r
     def __init__(self):\r
         self.PcdCName = ''\r
         self.CName = ''\r
@@ -709,6 +878,7 @@ class PcdObject(CommonPropertiesObject, HelpTextListObject):
         self.SupModuleList = []        \r
         CommonPropertiesObject.__init__(self)\r
         HelpTextListObject.__init__(self)\r
+        PromptListObject.__init__(self)\r
     \r
     def SetPcdCName(self, PcdCName):\r
         self.PcdCName = PcdCName\r
index 620bbb411f0e406f74307401171930885a0bb941..e85b8fa010ab6c727d84e0048d4ea5c4b3f671c3 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define a class object to describe a module\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -21,6 +21,7 @@ ModuleObject
 from Object.POM.CommonObject import CommonPropertiesObject\r
 from Object.POM.CommonObject import IdentificationObject\r
 from Object.POM.CommonObject import CommonHeaderObject\r
+from Object.POM.CommonObject import BinaryHeaderObject\r
 from Object.POM.CommonObject import HelpTextListObject\r
 from Object.POM.CommonObject import GuidVersionObject\r
                          \r
@@ -94,7 +95,7 @@ class SpecObject(object):
 #\r
 # This class defined header items used in Module file\r
 # \r
-class ModuleHeaderObject(IdentificationObject, CommonHeaderObject):\r
+class ModuleHeaderObject(IdentificationObject, CommonHeaderObject, BinaryHeaderObject):\r
     def __init__(self):\r
         self.IsLibrary = False\r
         self.IsLibraryModList = []\r
@@ -103,6 +104,7 @@ class ModuleHeaderObject(IdentificationObject, CommonHeaderObject):
         self.PcdIsDriver = ''\r
         self.PiSpecificationVersion = ''\r
         self.UefiSpecificationVersion = ''\r
+        self.UNIFlag = False\r
         #\r
         # SpecObject\r
         #\r
@@ -126,6 +128,7 @@ class ModuleHeaderObject(IdentificationObject, CommonHeaderObject):
         self.SupArchList = []\r
         IdentificationObject.__init__(self)\r
         CommonHeaderObject.__init__(self)\r
+        BinaryHeaderObject.__init__(self)\r
     \r
     def SetIsLibrary(self, IsLibrary):\r
         self.IsLibrary = IsLibrary\r
@@ -277,6 +280,7 @@ class AsBuildLibraryClassObject(object):
     def __init__(self):\r
         self.LibGuid = ''\r
         self.LibVersion = ''\r
+        self.SupArchList = []\r
     \r
     def SetLibGuid(self, LibGuid):\r
         self.LibGuid = LibGuid\r
@@ -288,6 +292,11 @@ class AsBuildLibraryClassObject(object):
     def GetLibVersion(self):\r
         return self.LibVersion\r
 \r
+    def SetSupArchList(self, SupArchList):\r
+        self.SupArchList = SupArchList\r
+    def GetSupArchList(self):\r
+        return self.SupArchList\r
+\r
 ##\r
 # AsBuiltObject\r
 #\r
@@ -308,7 +317,7 @@ class AsBuiltObject(object):
         #\r
         # List of BinaryBuildFlag object\r
         #\r
-        self.BinaryBuildFlagList = ''\r
+        self.BinaryBuildFlagList = []\r
 \r
     def SetPatchPcdList(self, PatchPcdList):\r
         self.PatchPcdList = PatchPcdList\r
index 098954d4edca1a123b63217a1da52122030bb201..57bdcf96a3525b3d6a751ce80ae1c667638892cb 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define a class object to describe a package\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -21,6 +21,7 @@ PackageObject
 from Object.POM.CommonObject import CommonPropertiesObject\r
 from Object.POM.CommonObject import IdentificationObject\r
 from Object.POM.CommonObject import CommonHeaderObject\r
+from Object.POM.CommonObject import BinaryHeaderObject\r
 from Library.Misc import Sdict\r
 \r
 ## StandardIncludeFileObject\r
@@ -44,10 +45,11 @@ class PackageIncludeFileObject(StandardIncludeFileObject):
 ##\r
 # PackageObject\r
 #\r
-class PackageObject(IdentificationObject, CommonHeaderObject):\r
+class PackageObject(IdentificationObject, CommonHeaderObject, BinaryHeaderObject):\r
     def __init__(self):\r
         IdentificationObject.__init__(self)\r
         CommonHeaderObject.__init__(self)\r
+        BinaryHeaderObject.__init__(self)\r
         #\r
         # LibraryClassObject\r
         #\r
@@ -85,8 +87,12 @@ class PackageObject(IdentificationObject, CommonHeaderObject):
         #\r
         self.PcdList = [] \r
         #\r
-        # UserExtensionObject\r
+        # {(PcdTokenSpaceGuidCName, PcdErrroNumber): PcdErrorMessageList}\r
+        #\r
+        self.PcdErrorCommentDict = {}\r
         #\r
+        # UserExtensionObject\r
+        #        \r
         self.UserExtensionList = [] \r
         #\r
         # MiscFileObject\r
@@ -104,6 +110,8 @@ class PackageObject(IdentificationObject, CommonHeaderObject):
         \r
         self.PcdChecks = []\r
         \r
+        self.UNIFlag = False\r
+        \r
     def SetLibraryClassList(self, LibraryClassList):\r
         self.LibraryClassList = LibraryClassList\r
     \r
index 3685fedd5c19f6ba3cfdc86ce86d106358872ede..f968beee6081ee601e67ebb5084a385fb060aab6 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of INF file [Binaries] section. \r
 # It will consumed by InfParser. \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -99,6 +99,7 @@ class InfBianryCommonItem(InfBianryItem, CurrentLine):
         self.CommonType = ''\r
         self.TagName = ''\r
         self.Family = ''\r
+        self.GuidValue = ''\r
         InfBianryItem.__init__(self)\r
         CurrentLine.__init__(self)\r
 \r
@@ -116,6 +117,11 @@ class InfBianryCommonItem(InfBianryItem, CurrentLine):
         self.Family = Family\r
     def GetFamily(self):\r
         return self.Family\r
+    \r
+    def SetGuidValue(self, GuidValue):\r
+        self.GuidValue = GuidValue\r
+    def GetGuidValue(self):\r
+        return self.GuidValue\r
 \r
 ##\r
 #\r
@@ -150,7 +156,7 @@ class InfBinariesObject(InfSectionCommonDef):
             if len(VerContent) < 2:\r
                 Logger.Error("InfParser",\r
                              ToolError.FORMAT_INVALID,\r
-                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (VerContent[0]),\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (VerContent[0], 2),\r
                              File=VerCurrentLine.GetFileName(),\r
                              Line=VerCurrentLine.GetLineNo(),\r
                              ExtraData=VerCurrentLine.GetLineString())\r
@@ -291,18 +297,29 @@ class InfBinariesObject(InfSectionCommonDef):
             CurrentLineOfItem = Item[2]\r
             GlobalData.gINF_CURRENT_LINE = CurrentLineOfItem\r
             InfBianryCommonItemObj = None\r
-            if len(ItemContent) < 2:\r
-                Logger.Error("InfParser",\r
-                             ToolError.FORMAT_INVALID,\r
-                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (ItemContent[0]),\r
-                             File=CurrentLineOfItem.GetFileName(),\r
-                             Line=CurrentLineOfItem.GetLineNo(),\r
-                             ExtraData=CurrentLineOfItem.GetLineString())\r
-                return False\r
-            if len(ItemContent) > 6:\r
+            if ItemContent[0] == 'SUBTYPE_GUID':\r
+                if len(ItemContent) < 3:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (ItemContent[0], 3),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                    return False\r
+            else:\r
+                if len(ItemContent) < 2:\r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (ItemContent[0], 2),\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                    return False\r
+                \r
+            if len(ItemContent) > 7:\r
                 Logger.Error("InfParser",\r
                              ToolError.FORMAT_INVALID,\r
-                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX % (ItemContent[0], 6),\r
+                             ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID_MAX % (ItemContent[0], 7),\r
                              File=CurrentLineOfItem.GetFileName(),\r
                              Line=CurrentLineOfItem.GetLineNo(),\r
                              ExtraData=CurrentLineOfItem.GetLineString())\r
@@ -318,7 +335,7 @@ class InfBinariesObject(InfSectionCommonDef):
                 BinaryFileType = ItemContent[0].strip()\r
                 if BinaryFileType == 'RAW' or BinaryFileType == 'ACPI' or BinaryFileType == 'ASL':\r
                     BinaryFileType = 'BIN'\r
-\r
+                    \r
                 if BinaryFileType not in DT.BINARY_FILE_TYPE_LIST:\r
                     Logger.Error("InfParser",\r
                                  ToolError.FORMAT_INVALID,\r
@@ -342,44 +359,64 @@ class InfBinariesObject(InfSectionCommonDef):
 \r
                 InfBianryCommonItemObj.SetType(BinaryFileType)\r
                 InfBianryCommonItemObj.SetCommonType(ItemContent[0])\r
+                FileName = ''\r
+                if BinaryFileType == 'FREEFORM':\r
+                    InfBianryCommonItemObj.SetGuidValue(ItemContent[1])\r
+                    if len(ItemContent) >= 3:\r
+                        FileName = ItemContent[2]\r
+                    else:\r
+                        Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FILENAME_NOT_EXIST,\r
+                                 File=CurrentLineOfItem.GetFileName(),\r
+                                 Line=CurrentLineOfItem.GetLineNo(),\r
+                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                else:\r
+                    FileName = ItemContent[1]\r
                 #\r
                 # Verify File exist or not\r
                 #\r
                 FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gINF_MODULE_DIR,\r
-                                                                              ItemContent[1])))\r
-                if not (ValidFile(FullFileName) or ValidFile(ItemContent[1])):\r
+                                                                              FileName)))\r
+                if not (ValidFile(FullFileName) or ValidFile(FileName)):\r
                     Logger.Error("InfParser",\r
                                  ToolError.FORMAT_INVALID,\r
-                                 ST.ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST % (ItemContent[1]),\r
+                                 ST.ERR_INF_PARSER_BINARY_ITEM_FILE_NOT_EXIST % (FileName),\r
                                  File=CurrentLineOfItem.GetFileName(),\r
                                  Line=CurrentLineOfItem.GetLineNo(),\r
                                  ExtraData=CurrentLineOfItem.GetLineString())\r
                 #\r
                 # Validate file exist/format.\r
                 #\r
-                if IsValidPath(ItemContent[1], GlobalData.gINF_MODULE_DIR):\r
+                if IsValidPath(FileName, GlobalData.gINF_MODULE_DIR):\r
                     IsValidFileFlag = True\r
                 else:\r
                     Logger.Error("InfParser",\r
                                 ToolError.FORMAT_INVALID,\r
-                                ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (ItemContent[1]),\r
+                                ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID % (FileName),\r
                                 File=CurrentLineOfItem.GetFileName(),\r
                                 Line=CurrentLineOfItem.GetLineNo(),\r
                                 ExtraData=CurrentLineOfItem.GetLineString())\r
                     return False\r
                 if IsValidFileFlag:\r
                     ItemContent[0] = ConvPathFromAbsToRel(ItemContent[0], GlobalData.gINF_MODULE_DIR)\r
-                    InfBianryCommonItemObj.SetFileName(ItemContent[1])\r
+                    InfBianryCommonItemObj.SetFileName(FileName)\r
             if len(ItemContent) >= 3:\r
                 #\r
                 # Add Target information\r
                 #\r
-                InfBianryCommonItemObj.SetTarget(ItemContent[2])\r
+                if BinaryFileType != 'FREEFORM':\r
+                    InfBianryCommonItemObj.SetTarget(ItemContent[2])\r
+                    \r
             if len(ItemContent) >= 4:\r
                 #\r
                 # Add Family information\r
                 #\r
-                InfBianryCommonItemObj.SetFamily(ItemContent[3])\r
+                if BinaryFileType != 'FREEFORM':\r
+                    InfBianryCommonItemObj.SetFamily(ItemContent[3])\r
+                else:\r
+                    InfBianryCommonItemObj.SetTarget(ItemContent[3])\r
+                    \r
             if len(ItemContent) >= 5:\r
                 #\r
                 # TagName entries are build system specific. If there \r
@@ -388,28 +425,62 @@ class InfBinariesObject(InfSectionCommonDef):
                 # system specific content cannot be distributed using \r
                 # the UDP\r
                 #\r
-                if ItemContent[4].strip() != '':\r
-                    Logger.Error("InfParser",\r
-                                 ToolError.FORMAT_INVALID,\r
-                                 ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED % (ItemContent[4]),\r
-                                 File=CurrentLineOfItem.GetFileName(),\r
-                                 Line=CurrentLineOfItem.GetLineNo(),\r
-                                 ExtraData=CurrentLineOfItem.GetLineString())\r
-            if len(ItemContent) == 6:\r
+                if BinaryFileType != 'FREEFORM':\r
+                    if ItemContent[4].strip() != '':\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED % (ItemContent[4]),\r
+                                     File=CurrentLineOfItem.GetFileName(),\r
+                                     Line=CurrentLineOfItem.GetLineNo(),\r
+                                     ExtraData=CurrentLineOfItem.GetLineString())\r
+                else:\r
+                    InfBianryCommonItemObj.SetFamily(ItemContent[4])\r
+                    \r
+            if len(ItemContent) >= 6:\r
                 #\r
                 # Add FeatureFlagExp\r
                 #\r
-                if ItemContent[5].strip() == '':\r
+                if BinaryFileType != 'FREEFORM':\r
+                    if ItemContent[5].strip() == '':\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
+                                     File=CurrentLineOfItem.GetFileName(),\r
+                                     Line=CurrentLineOfItem.GetLineNo(),\r
+                                     ExtraData=CurrentLineOfItem.GetLineString())\r
+                    #\r
+                    # Validate Feature Flag Express   \r
+                    #\r
+                    FeatureFlagRtv = IsValidFeatureFlagExp(ItemContent[5].strip())\r
+                    if not FeatureFlagRtv[0]:\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                     File=CurrentLineOfItem.GetFileName(),\r
+                                     Line=CurrentLineOfItem.GetLineNo(),\r
+                                     ExtraData=CurrentLineOfItem.GetLineString())\r
+                    InfBianryCommonItemObj.SetFeatureFlagExp(ItemContent[5])\r
+                else:\r
+                    if ItemContent[5].strip() != '':\r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_TAGNAME_NOT_PERMITTED % (ItemContent[5]),\r
+                                     File=CurrentLineOfItem.GetFileName(),\r
+                                     Line=CurrentLineOfItem.GetLineNo(),\r
+                                     ExtraData=CurrentLineOfItem.GetLineString())\r
+                        \r
+            if len(ItemContent) == 7:\r
+                if ItemContent[6].strip() == '':\r
                     Logger.Error("InfParser",\r
-                                 ToolError.FORMAT_INVALID,\r
-                                 ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
-                                 File=CurrentLineOfItem.GetFileName(),\r
-                                 Line=CurrentLineOfItem.GetLineNo(),\r
-                                 ExtraData=CurrentLineOfItem.GetLineString())\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
+                                     File=CurrentLineOfItem.GetFileName(),\r
+                                     Line=CurrentLineOfItem.GetLineNo(),\r
+                                     ExtraData=CurrentLineOfItem.GetLineString())\r
                 #\r
                 # Validate Feature Flag Express   \r
                 #\r
-                FeatureFlagRtv = IsValidFeatureFlagExp(ItemContent[5].strip())\r
+                FeatureFlagRtv = IsValidFeatureFlagExp(ItemContent[6].strip())\r
                 if not FeatureFlagRtv[0]:\r
                     Logger.Error("InfParser",\r
                                  ToolError.FORMAT_INVALID,\r
@@ -417,7 +488,7 @@ class InfBinariesObject(InfSectionCommonDef):
                                  File=CurrentLineOfItem.GetFileName(),\r
                                  Line=CurrentLineOfItem.GetLineNo(),\r
                                  ExtraData=CurrentLineOfItem.GetLineString())\r
-                InfBianryCommonItemObj.SetFeatureFlagExp(ItemContent[5])\r
+                InfBianryCommonItemObj.SetFeatureFlagExp(ItemContent[6])\r
 \r
             InfBianryCommonItemObj.SetSupArchList(__SupArchList)\r
 \r
@@ -489,7 +560,7 @@ class InfBinariesObject(InfSectionCommonDef):
                     if len(UiContent) < 2:\r
                         Logger.Error("InfParser",\r
                                      ToolError.FORMAT_INVALID,\r
-                                     ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (UiContent[0]),\r
+                                     ST.ERR_INF_PARSER_BINARY_ITEM_FORMAT_INVALID % (UiContent[0], 2),\r
                                      File=UiCurrentLine.GetFileName(),\r
                                      Line=UiCurrentLine.GetLineNo(),\r
                                      ExtraData=UiCurrentLine.GetLineString())\r
index 5549525a6c77a9a53f8498504c7e636207ff597a..391669fe64cb86c5b95961ef07e1d56b5be317a0 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of INF file [BuildOptions] section. \r
 # It will consumed by InfParser. \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -84,8 +84,8 @@ class InfBuildOptionsObject(InfSectionCommonDef):
             if len(BuildOptCont) >= 1:\r
                 InfBuildOptionItemObj = InfBuildOptionItem()\r
                 InfBuildOptionItemObj.SetAsBuildList(BuildOptCont)\r
+                InfBuildOptionItemObj.SetSupArchList(ArchList)\r
                 self.BuildOptions.append(InfBuildOptionItemObj)\r
-                \r
                \r
         return True\r
  \r
index c7883e6980451c95c624d8649e647526c5f40ac6..be9a0e196e39e7f861eb46e15c204c5577399800 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of [Defines] section for INF file. \r
 # It will consumed by InfParser\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -27,6 +27,7 @@ from Library.String import GetSplitValueList
 from Library.Misc import CheckGuidRegFormat\r
 from Library.Misc import Sdict\r
 from Library.Misc import ConvPathFromAbsToRel\r
+from Library.Misc import ValidateUNIFilePath\r
 from Library.ExpressionValidate import IsValidFeatureFlagExp \r
 from Library.ParserValidate import IsValidWord\r
 from Library.ParserValidate import IsValidInfMoudleType  \r
@@ -185,6 +186,7 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         self.BaseName                   = None\r
         self.FileGuid                   = None\r
         self.ModuleType                 = None\r
+        self.ModuleUniFileName          = None\r
         self.InfVersion                 = None\r
         self.EdkReleaseVersion          = None\r
         self.UefiSpecificationVersion   = None\r
@@ -216,8 +218,7 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         if self.BaseName != None:    \r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_BASE_NAME),\r
                        LineInfo=self.CurrentLine)\r
-            return False   \r
-                \r
+            return False     \r
         if not (BaseName == '' or BaseName == None):\r
             if IsValidWord(BaseName) and not BaseName.startswith("_"):\r
                 self.BaseName = InfDefMember()\r
@@ -301,6 +302,23 @@ class InfDefSection(InfDefSectionOptionRomInfo):
     def GetModuleType(self):\r
         return self.ModuleType\r
     \r
+    ## SetModuleUniFileName\r
+    #\r
+    # @param ModuleUniFileName: ModuleUniFileName\r
+    #     \r
+    def SetModuleUniFileName(self, ModuleUniFileName, Comments):\r
+        if Comments:\r
+            pass\r
+        if self.ModuleUniFileName != None:\r
+            ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND%(DT.TAB_INF_DEFINES_MODULE_UNI_FILE),\r
+                       LineInfo=self.CurrentLine)\r
+        self.ModuleUniFileName = ModuleUniFileName\r
+\r
+    ## GetModuleType\r
+    #                       \r
+    def GetModuleUniFileName(self):\r
+        return self.ModuleUniFileName\r
+    \r
     ## SetInfVersion\r
     #\r
     # @param InfVersion: InfVersion\r
@@ -520,10 +538,8 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         # It can be a list\r
         #\r
         ValueList = []\r
-        \r
         TokenList = GetSplitValueList(EntryPoint, DT.TAB_VALUE_SPLIT)\r
         ValueList[0:len(TokenList)] = TokenList        \r
-        \r
         InfDefineEntryPointItemObj = InfDefineEntryPointItem()\r
         if not IsValidCVariableName(ValueList[0]):\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%\\r
@@ -542,13 +558,11 @@ class InfDefSection(InfDefSectionOptionRomInfo):
             if not FeatureFlagRtv[0]:\r
                 ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%\\r
                            (FeatureFlagRtv[1]),\r
-                           LineInfo=self.CurrentLine)\r
-                              \r
+                           LineInfo=self.CurrentLine)       \r
             InfDefineEntryPointItemObj.SetFeatureFlagExp(ValueList[1])     \r
         if len(ValueList) > 2:\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(EntryPoint),\r
                        LineInfo=self.CurrentLine)\r
-            \r
         InfDefineEntryPointItemObj.Comments = Comments             \r
         self.EntryPoint.append(InfDefineEntryPointItemObj)       \r
         \r
@@ -563,10 +577,8 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         # It can be a list\r
         #\r
         ValueList = []\r
-        \r
         TokenList = GetSplitValueList(UnloadImages, DT.TAB_VALUE_SPLIT)\r
         ValueList[0:len(TokenList)] = TokenList        \r
-        \r
         InfDefineUnloadImageItemObj = InfDefineUnloadImageItem()\r
         if not IsValidCVariableName(ValueList[0]):\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
@@ -588,7 +600,6 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         if len(ValueList) > 2:\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(UnloadImages),\r
                        LineInfo=self.CurrentLine)\r
-            \r
         InfDefineUnloadImageItemObj.Comments = Comments\r
         self.UnloadImages.append(InfDefineUnloadImageItemObj)\r
         \r
@@ -603,10 +614,8 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         # It can be a list\r
         #\r
         ValueList = []\r
-        \r
         TokenList = GetSplitValueList(Constructor, DT.TAB_VALUE_SPLIT)\r
         ValueList[0:len(TokenList)] = TokenList        \r
-        \r
         InfDefineConstructorItemObj = InfDefineConstructorItem()\r
         if not IsValidCVariableName(ValueList[0]):\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
@@ -638,7 +647,6 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         if len(ValueList) > 3:\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Constructor),\r
                        LineInfo=self.CurrentLine)\r
-            \r
         InfDefineConstructorItemObj.Comments = Comments    \r
         self.Constructor.append(InfDefineConstructorItemObj)     \r
            \r
@@ -653,10 +661,8 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         # It can be a list and only 1 set to TRUE\r
         #        \r
         ValueList = []\r
-        \r
         TokenList = GetSplitValueList(Destructor, DT.TAB_VALUE_SPLIT)\r
         ValueList[0:len(TokenList)] = TokenList        \r
-        \r
         InfDefineDestructorItemObj = InfDefineDestructorItem()\r
         if not IsValidCVariableName(ValueList[0]):\r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ValueList[0]),\r
@@ -715,8 +721,6 @@ class InfDefSection(InfDefSectionOptionRomInfo):
     def GetShadow(self):\r
         return self.Shadow\r
 \r
-\r
-\r
     #\r
     # <Family>               ::=  {"MSFT"} {"GCC"}\r
     # <CustomMake>           ::=  [<Family> "|"] <Filename>\r
@@ -788,8 +792,7 @@ class InfDefSection(InfDefSectionOptionRomInfo):
         else:                  \r
             ErrorInInf(ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(Name),\r
                        LineInfo=self.CurrentLine)\r
-            return False\r
-                  \r
+            return False    \r
         return True\r
 \r
     def GetSpecification(self):\r
@@ -860,6 +863,7 @@ gFUNCTION_MAPPING_FOR_DEFINE_SECTION = {
     #\r
     # Optional Fields\r
     #        \r
+    DT.TAB_INF_DEFINES_MODULE_UNI_FILE             : InfDefSection.SetModuleUniFileName,\r
     DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION         : InfDefSection.SetEdkReleaseVersion,\r
     DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION  : InfDefSection.SetUefiSpecificationVersion,\r
     DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION    : InfDefSection.SetPiSpecificationVersion,\r
@@ -891,7 +895,6 @@ class InfDefMember():
         self.Name  = Name\r
         self.Value = Value\r
         self.CurrentLine = CurrentLine()\r
-        \r
     def GetName(self):\r
         return self.Name\r
     def SetName(self, Name):\r
@@ -914,8 +917,7 @@ class InfDefObject(InfSectionCommonDef):
         #\r
         HasFoundInfVersionFalg = False\r
         LineInfo = ['', -1, '']\r
-        ArchListString = ' '.join(Arch)\r
-     \r
+        ArchListString = ' '.join(Arch)  \r
         #\r
         # Parse Define items.\r
         #\r
@@ -923,6 +925,15 @@ class InfDefObject(InfSectionCommonDef):
             ProcessFunc = None\r
             Name = InfDefMemberObj.GetName()\r
             Value = InfDefMemberObj.GetValue()\r
+            if Name == DT.TAB_INF_DEFINES_MODULE_UNI_FILE:\r
+                ValidateUNIFilePath(Value)\r
+                Value = os.path.join(os.path.dirname(InfDefMemberObj.CurrentLine.FileName), Value)\r
+                if not os.path.isfile(Value) or not os.path.exists(Value):\r
+                    LineInfo[0] = InfDefMemberObj.CurrentLine.GetFileName()\r
+                    LineInfo[1] = InfDefMemberObj.CurrentLine.GetLineNo()\r
+                    LineInfo[2] = InfDefMemberObj.CurrentLine.GetLineString()\r
+                    ErrorInInf(ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Name),\r
+                                   LineInfo=LineInfo)\r
             InfLineCommentObj = InfLineCommentObject()\r
             InfLineCommentObj.SetHeaderComments(InfDefMemberObj.Comments.GetHeaderComments())\r
             InfLineCommentObj.SetTailComments(InfDefMemberObj.Comments.GetTailComments())\r
@@ -932,7 +943,6 @@ class InfDefObject(InfSectionCommonDef):
                            RaiseError=True)\r
             if Name == DT.TAB_INF_DEFINES_INF_VERSION:\r
                 HasFoundInfVersionFalg = True  \r
-            \r
             if not (Name == '' or Name == None):\r
                 #\r
                 # Process "SPEC" Keyword definition.\r
@@ -953,8 +963,7 @@ class InfDefObject(InfSectionCommonDef):
                     #\r
                     if Name not in gFUNCTION_MAPPING_FOR_DEFINE_SECTION.keys():\r
                         ErrorInInf(ST.ERR_INF_PARSER_DEFINE_SECTION_KEYWORD_INVALID%(Name),\r
-                                   LineInfo=LineInfo)   \r
-                                                 \r
+                                   LineInfo=LineInfo)                           \r
                     else:\r
                         ProcessFunc = gFUNCTION_MAPPING_FOR_DEFINE_SECTION[Name]\r
                     if (ProcessFunc != None):\r
@@ -980,7 +989,6 @@ class InfDefObject(InfSectionCommonDef):
                     if (ProcessFunc != None):\r
                         ProcessFunc(DefineList, Value, InfLineCommentObj)\r
                     self.Defines[ArchListString] = DefineList\r
-        \r
         #\r
         # After set, check whether INF_VERSION defined.\r
         #\r
index 4f1a3f4e81aab5e20a6fbc87c74b3d10df894598..23125552e06d025ab0270ac1550913192e506b63 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of INF file [Guids] section. \r
 # It will consumed by InfParser. \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -156,7 +156,6 @@ def ParseGuidComment(CommentsList, InfGuidItemObj):
             #   \r
             if CommentItemUsage == CommentItemGuidType == PreUsage == PreGuidType == DT.ITEM_UNDEFINED:\r
                 CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r
-                \r
                 PreHelpText = CommentItemHelpText\r
                 \r
             if BlockFlag == 4:     \r
@@ -164,6 +163,8 @@ def ParseGuidComment(CommentsList, InfGuidItemObj):
                 CommentItemIns.SetUsageItem(CommentItemUsage)\r
                 CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r
                 CommentItemIns.SetVariableNameItem(CommentItemVarString)\r
+                if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE):\r
+                    CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE)\r
                 CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
                 CommentInsList.append(CommentItemIns)\r
                 \r
@@ -180,7 +181,7 @@ def ParseGuidComment(CommentsList, InfGuidItemObj):
                 CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
                 CommentItemIns.SetGuidTypeItem(DT.ITEM_UNDEFINED)\r
                 if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r
-                    PreHelpText += DT.END_OF_LINE\r
+                    PreHelpText = PreHelpText.strip(DT.END_OF_LINE)\r
                 CommentItemIns.SetHelpStringItem(PreHelpText)\r
                 CommentInsList.append(CommentItemIns)\r
                 #\r
@@ -190,6 +191,8 @@ def ParseGuidComment(CommentsList, InfGuidItemObj):
                 CommentItemIns.SetUsageItem(CommentItemUsage)\r
                 CommentItemIns.SetGuidTypeItem(CommentItemGuidType)\r
                 CommentItemIns.SetVariableNameItem(CommentItemVarString)\r
+                if CommentItemHelpText == '' or CommentItemHelpText.endswith(DT.END_OF_LINE):\r
+                    CommentItemHelpText = CommentItemHelpText.strip(DT.END_OF_LINE)\r
                 CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
                 CommentInsList.append(CommentItemIns)\r
                 \r
index a37692ee23380da26d71e890f1bb284c6412785f..b18c4c381bc0d763d2dc01d9820e708e6a720c03 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of INF file [LibraryClasses] section. \r
 # It will consumed by InfParser. \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -236,6 +236,7 @@ class InfLibraryClassObject():
                 #\r
                 LibItemObj.SetFileGuid(LibItem[0])\r
                 LibItemObj.SetVersion(LibItem[1])\r
+                LibItemObj.SetSupArchList(__SupArchList)\r
 \r
             if self.LibraryClasses.has_key((LibItemObj)):\r
                 LibraryList = self.LibraryClasses[LibItemObj]\r
index fc5227451aa772037fafe5d5775fbae9de4fe836..7b07036f91c207e72b4f880a5bbb532245980c54 100644 (file)
@@ -2,7 +2,7 @@
 # This file is used to define class objects of INF file [Pcds] section. \r
 # It will consumed by InfParser. \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -21,12 +21,12 @@ import re
 from Logger import StringTable as ST\r
 from Logger import ToolError\r
 import Logger.Log as Logger\r
-from Library import GlobalData \r
+from Library import GlobalData\r
 from Library import DataType as DT\r
 \r
 from Library.Misc import Sdict\r
 from Library.Misc import GetHelpStringByRemoveHashKey\r
-from Library.ParserValidate import IsValidPcdType \r
+from Library.ParserValidate import IsValidPcdType\r
 from Library.ParserValidate import IsValidCVariableName\r
 from Library.ParserValidate import IsValidPcdValue\r
 from Library.ParserValidate import IsValidArch\r
@@ -45,21 +45,21 @@ def ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList):
     #            \r
     if (ArchItem == '' or ArchItem == None):\r
         ArchItem = 'COMMON'\r
-    \r
+\r
     if PcdTypeItem1.upper != DT.TAB_INF_FEATURE_PCD.upper():\r
         ArchList = GetSplitValueList(ArchItem, ' ')\r
         for ArchItemNew in ArchList:\r
             if not IsValidArch(ArchItemNew):\r
-                Logger.Error("InfParser", \r
+                Logger.Error("InfParser",\r
                              ToolError.FORMAT_INVALID,\r
-                             ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID%(ArchItemNew), \r
+                             ST.ERR_INF_PARSER_DEFINE_FROMAT_INVALID % (ArchItemNew),\r
                              File=GlobalData.gINF_MODULE_NAME,\r
-                             Line=LineNo, \r
+                             Line=LineNo,\r
                              ExtraData=ArchItemNew)\r
-        SupArchDict[PcdTypeItem1] = ArchList            \r
+        SupArchDict[PcdTypeItem1] = ArchList\r
     else:\r
         SupArchList.append(ArchItem)\r
-        \r
+\r
     return SupArchList, SupArchDict\r
 \r
 def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):\r
@@ -68,47 +68,47 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
     PreHelpText = ''\r
     BlockFlag = -1\r
     FFEHelpText = ''\r
-    CommentItemHelpText = '' \r
-    Count = 0   \r
+    CommentItemHelpText = ''\r
+    Count = 0\r
     for CommentItem in CommentList:\r
         Count = Count + 1\r
-        CommentItemUsage, CommentType, CommentString, CommentItemHelpText =  ParseComment(CommentItem, \r
-                                                                             DT.ALL_USAGE_TOKENS, \r
-                                                                             {}, \r
+        CommentItemUsage, CommentType, CommentString, CommentItemHelpText = ParseComment(CommentItem,\r
+                                                                             DT.ALL_USAGE_TOKENS,\r
+                                                                             {},\r
                                                                              [],\r
                                                                              False)\r
         if CommentType and CommentString:\r
-            pass                      \r
-                     \r
+            pass\r
+\r
         if PcdTypeItem == 'FeaturePcd':\r
             CommentItemUsage = DT.USAGE_ITEM_CONSUMES\r
             if CommentItemHelpText == None:\r
                 CommentItemHelpText = ''\r
-            \r
+\r
             if Count == 1:\r
                 FFEHelpText = CommentItemHelpText\r
             else:\r
                 FFEHelpText = FFEHelpText + DT.END_OF_LINE + CommentItemHelpText\r
-            \r
+\r
             if Count == len(CommentList):\r
                 CommentItemHelpText = FFEHelpText\r
                 BlockFlag = 4\r
             else:\r
                 continue\r
-                            \r
+\r
         if CommentItemHelpText == None:\r
             CommentItemHelpText = ''\r
             if Count == len(CommentList) and CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 CommentItemHelpText = DT.END_OF_LINE\r
-                \r
+\r
         if Count == len(CommentList) and (BlockFlag == 1 or BlockFlag == 2):\r
             if CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 BlockFlag = 4\r
             else:\r
                 BlockFlag = 3\r
         elif BlockFlag == -1 and Count == len(CommentList):\r
-            BlockFlag = 4  \r
-            \r
+            BlockFlag = 4\r
+\r
         if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2:\r
             if CommentItemUsage == DT.ITEM_UNDEFINED:\r
                 if BlockFlag == -1:\r
@@ -125,19 +125,19 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
         #   \r
         if CommentItemUsage == PreUsage == DT.ITEM_UNDEFINED:\r
             CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r
-            \r
+\r
             PreHelpText = CommentItemHelpText\r
-            \r
-        if BlockFlag == 4:     \r
+\r
+        if BlockFlag == 4:\r
             CommentItemIns = InfPcdItemCommentContent()\r
             CommentItemIns.SetUsageItem(CommentItemUsage)\r
             CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
             CommentInsList.append(CommentItemIns)\r
-            \r
+\r
             BlockFlag = -1\r
             PreUsage = None\r
             PreHelpText = ''\r
-            \r
+\r
         elif BlockFlag == 3:\r
             #\r
             # Add previous help string\r
@@ -145,7 +145,7 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
             CommentItemIns = InfPcdItemCommentContent()\r
             CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
             if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r
-                PreHelpText += DT.END_OF_LINE            \r
+                PreHelpText += DT.END_OF_LINE\r
             CommentItemIns.SetHelpStringItem(PreHelpText)\r
             CommentInsList.append(CommentItemIns)\r
             #\r
@@ -155,18 +155,18 @@ def ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj):
             CommentItemIns.SetUsageItem(CommentItemUsage)\r
             CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r
             CommentInsList.append(CommentItemIns)\r
-            \r
+\r
             BlockFlag = -1\r
             PreUsage = None\r
-            PreHelpText = ''    \r
-                                                                            \r
+            PreHelpText = ''\r
+\r
         else:\r
             PreUsage = CommentItemUsage\r
             PreHelpText = CommentItemHelpText\r
-           \r
+\r
     PcdItemObj.SetHelpStringList(CommentInsList)\r
-    \r
-    return PcdItemObj               \r
+\r
+    return PcdItemObj\r
 \r
 class InfPcdItemCommentContent():\r
     def __init__(self):\r
@@ -178,17 +178,17 @@ class InfPcdItemCommentContent():
         # Help String\r
         #\r
         self.HelpStringItem = ''\r
-        \r
+\r
     def SetUsageItem(self, UsageItem):\r
         self.UsageItem = UsageItem\r
     def GetUsageItem(self):\r
         return self.UsageItem\r
-      \r
+\r
     def SetHelpStringItem(self, HelpStringItem):\r
         self.HelpStringItem = HelpStringItem\r
     def GetHelpStringItem(self):\r
         return self.HelpStringItem\r
-    \r
+\r
 ## InfPcdItem\r
 #\r
 # This class defined Pcd item used in Module files\r
@@ -211,88 +211,94 @@ class InfPcdItem():
         self.Token = ''\r
         self.TokenSpaceGuidCName = ''\r
         self.TokenSpaceGuidValue = ''\r
-        self.DatumType      = ''\r
-        self.MaxDatumSize   = ''\r
-        self.DefaultValue   = ''\r
-        self.Offset         = ''\r
-        self.ValidUsage     = ''\r
-        self.ItemType       = '' \r
-        self.SupModuleList  = []\r
+        self.DatumType = ''\r
+        self.MaxDatumSize = ''\r
+        self.DefaultValue = ''\r
+        self.Offset = ''\r
+        self.ValidUsage = ''\r
+        self.ItemType = ''\r
+        self.SupModuleList = []\r
         self.HelpStringList = []\r
         self.FeatureFlagExp = ''\r
-        self.SupArchList    = []\r
+        self.SupArchList = []\r
         self.PcdErrorsList = []\r
-        \r
+\r
     def SetCName(self, CName):\r
-        self.CName = CName    \r
+        self.CName = CName\r
     def GetCName(self):\r
         return self.CName\r
-    \r
+\r
     def SetToken(self, Token):\r
-        self.Token = Token    \r
+        self.Token = Token\r
     def GetToken(self):\r
         return self.Token\r
-    \r
+\r
     def SetTokenSpaceGuidCName(self, TokenSpaceGuidCName):\r
-        self.TokenSpaceGuidCName = TokenSpaceGuidCName    \r
+        self.TokenSpaceGuidCName = TokenSpaceGuidCName\r
     def GetTokenSpaceGuidCName(self):\r
         return self.TokenSpaceGuidCName\r
-    \r
+\r
     def SetTokenSpaceGuidValue(self, TokenSpaceGuidValue):\r
-        self.TokenSpaceGuidValue = TokenSpaceGuidValue    \r
+        self.TokenSpaceGuidValue = TokenSpaceGuidValue\r
     def GetTokenSpaceGuidValue(self):\r
         return self.TokenSpaceGuidValue\r
-    \r
+\r
     def SetDatumType(self, DatumType):\r
-        self.DatumType = DatumType        \r
+        self.DatumType = DatumType\r
     def GetDatumType(self):\r
         return self.DatumType\r
-    \r
+\r
     def SetMaxDatumSize(self, MaxDatumSize):\r
-        self.MaxDatumSize = MaxDatumSize    \r
+        self.MaxDatumSize = MaxDatumSize\r
     def GetMaxDatumSize(self):\r
         return self.MaxDatumSize\r
 \r
     def SetDefaultValue(self, DefaultValue):\r
-        self.DefaultValue = DefaultValue        \r
+        self.DefaultValue = DefaultValue\r
     def GetDefaultValue(self):\r
         return self.DefaultValue\r
-    \r
+\r
     def SetPcdErrorsList(self, PcdErrorsList):\r
-        self.PcdErrorsList = PcdErrorsList    \r
+        self.PcdErrorsList = PcdErrorsList\r
     def GetPcdErrorsList(self):\r
         return self.PcdErrorsList\r
 \r
     def SetItemType(self, ItemType):\r
-        self.ItemType = ItemType        \r
+        self.ItemType = ItemType\r
     def GetItemType(self):\r
         return self.ItemType\r
 \r
     def SetSupModuleList(self, SupModuleList):\r
-        self.SupModuleList = SupModuleList      \r
+        self.SupModuleList = SupModuleList\r
     def GetSupModuleList(self):\r
         return self.SupModuleList\r
-    \r
+\r
     def SetHelpStringList(self, HelpStringList):\r
         self.HelpStringList = HelpStringList\r
     def GetHelpStringList(self):\r
         return self.HelpStringList\r
-    \r
+\r
     def SetFeatureFlagExp(self, FeatureFlagExp):\r
         self.FeatureFlagExp = FeatureFlagExp\r
     def GetFeatureFlagExp(self):\r
         return self.FeatureFlagExp\r
-    \r
+\r
     def SetSupportArchList(self, ArchList):\r
         self.SupArchList = ArchList\r
     def GetSupportArchList(self):\r
         return self.SupArchList\r
-    \r
+\r
     def SetOffset(self, Offset):\r
         self.Offset = Offset\r
     def GetOffset(self):\r
         return self.Offset\r
 \r
+    def SetValidUsage(self, ValidUsage):\r
+        self.ValidUsage = ValidUsage\r
+\r
+    def GetValidUsage(self):\r
+        return self.ValidUsage\r
+\r
 ##\r
 #\r
 #\r
@@ -301,13 +307,13 @@ class InfPcdObject():
     def __init__(self, FileName):\r
         self.Pcds = Sdict()\r
         self.FileName = FileName\r
-        \r
-    def SetPcds(self, PcdContent, KeysList = None, PackageInfo = None):\r
-        \r
+\r
+    def SetPcds(self, PcdContent, KeysList=None, PackageInfo=None):\r
+\r
         if GlobalData.gIS_BINARY_INF:\r
             self.SetAsBuildPcds(PcdContent, KeysList, PackageInfo)\r
             return True\r
-        \r
+\r
         #\r
         # Validate Arch\r
         #\r
@@ -316,7 +322,7 @@ class InfPcdObject():
         PcdTypeItem = ''\r
         for (PcdTypeItem1, ArchItem, LineNo) in KeysList:\r
             SupArchList, SupArchDict = ValidateArch(ArchItem, PcdTypeItem1, LineNo, SupArchDict, SupArchList)\r
-             \r
+\r
             #\r
             # Validate PcdType\r
             #\r
@@ -324,32 +330,32 @@ class InfPcdObject():
                 return False\r
             else:\r
                 if not IsValidPcdType(PcdTypeItem1):\r
-                    Logger.Error("InfParser", \r
-                                 ToolError.FORMAT_INVALID, \r
-                                 ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR%(DT.PCD_USAGE_TYPE_LIST_OF_MODULE),\r
-                                 File=GlobalData.gINF_MODULE_NAME, \r
-                                 Line=LineNo, \r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_PCD_SECTION_TYPE_ERROR % (DT.PCD_USAGE_TYPE_LIST_OF_MODULE),\r
+                                 File=GlobalData.gINF_MODULE_NAME,\r
+                                 Line=LineNo,\r
                                  ExtraData=PcdTypeItem1)\r
                     return False\r
-            \r
+\r
             PcdTypeItem = PcdTypeItem1\r
-            \r
+\r
             for PcdItem in PcdContent:\r
                 PcdItemObj = InfPcdItem()\r
                 CommentList = PcdItem[1]\r
                 CurrentLineOfPcdItem = PcdItem[2]\r
                 PcdItem = PcdItem[0]\r
-                \r
+\r
                 if CommentList != None and len(CommentList) != 0:\r
                     PcdItemObj = ParsePcdComment(CommentList, PcdTypeItem, PcdItemObj)\r
                 else:\r
                     CommentItemIns = InfPcdItemCommentContent()\r
                     CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r
                     PcdItemObj.SetHelpStringList([CommentItemIns])\r
-                \r
+\r
                 if len(PcdItem) >= 1 and len(PcdItem) <= 3:\r
                     PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)\r
-                    \r
+\r
                 if len(PcdItem) >= 2 and len(PcdItem) <= 3:\r
                     #\r
                     # Contain PcdName and Value, validate value.\r
@@ -357,13 +363,13 @@ class InfPcdObject():
                     if IsValidPcdValue(PcdItem[1]) or PcdItem[1].strip() == "":\r
                         PcdItemObj.SetDefaultValue(PcdItem[1])\r
                     else:\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
                                      ST.ERR_INF_PARSER_PCD_VALUE_INVALID,\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=PcdItem[1])\r
-                \r
+\r
                 if len(PcdItem) == 3:\r
                     #\r
                     # Contain PcdName, value, and FeatureFlag express\r
@@ -372,40 +378,40 @@ class InfPcdObject():
                     # Validate Feature Flag Express\r
                     #\r
                     if PcdItem[2].strip() == '':\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
                                      ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=CurrentLineOfPcdItem[0])\r
                     #\r
                     # Validate FFE    \r
                     #\r
                     FeatureFlagRtv = IsValidFeatureFlagExp(PcdItem[2].strip())\r
                     if not FeatureFlagRtv[0]:\r
-                        Logger.Error("InfParser", \r
-                                     ToolError.FORMAT_INVALID, \r
-                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r
-                                     File=CurrentLineOfPcdItem[2], \r
-                                     Line=CurrentLineOfPcdItem[1], \r
+                        Logger.Error("InfParser",\r
+                                     ToolError.FORMAT_INVALID,\r
+                                     ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID % (FeatureFlagRtv[1]),\r
+                                     File=CurrentLineOfPcdItem[2],\r
+                                     Line=CurrentLineOfPcdItem[1],\r
                                      ExtraData=CurrentLineOfPcdItem[0])\r
                     PcdItemObj.SetFeatureFlagExp(PcdItem[2])\r
-                \r
+\r
                 if len(PcdItem) < 1 or len(PcdItem) > 3:\r
-                    Logger.Error("InfParser", \r
-                                 ToolError.FORMAT_INVALID, \r
+                    Logger.Error("InfParser",\r
+                                 ToolError.FORMAT_INVALID,\r
                                  ST.ERR_INF_PARSER_PCD_SECTION_CONTENT_ERROR,\r
-                                 File=CurrentLineOfPcdItem[2], \r
-                                 Line=CurrentLineOfPcdItem[1], \r
+                                 File=CurrentLineOfPcdItem[2],\r
+                                 Line=CurrentLineOfPcdItem[1],\r
                                  ExtraData=CurrentLineOfPcdItem[0])\r
-                    return False       \r
-                \r
+                    return False\r
+\r
                 if PcdTypeItem.upper != DT.TAB_INF_FEATURE_PCD.upper():\r
                     PcdItemObj.SetSupportArchList(SupArchDict[PcdTypeItem])\r
                 else:\r
                     PcdItemObj.SetSupportArchList(SupArchList)\r
-                \r
-                if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):           \r
+\r
+                if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):\r
                     PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]\r
                     PcdsList.append(PcdItemObj)\r
                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
@@ -413,56 +419,64 @@ class InfPcdObject():
                     PcdsList = []\r
                     PcdsList.append(PcdItemObj)\r
                     self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
-            \r
+\r
         return True\r
-    \r
-    def SetAsBuildPcds(self, PcdContent, KeysList = None, PackageInfo = None):\r
+\r
+    def SetAsBuildPcds(self, PcdContent, KeysList=None, PackageInfo=None):\r
         for PcdItem in PcdContent:\r
             PcdItemObj = InfPcdItem()\r
             CommentList = PcdItem[1]\r
             CurrentLineOfPcdItem = PcdItem[2]\r
             PcdItem = PcdItem[0]\r
             CommentString = ''\r
-            for CommmentLine in CommentList:\r
-                CommentString += GetHelpStringByRemoveHashKey(CommmentLine)\r
-            \r
-            PcdItemObj.SetHelpStringList(CommentString)\r
+\r
+            for CommentLine in CommentList:\r
+                CommentString = GetHelpStringByRemoveHashKey(CommentLine)\r
+                CommentItemIns = InfPcdItemCommentContent()\r
+                CommentItemIns.SetHelpStringItem(CommentString)\r
+                CommentItemIns.SetUsageItem(CommentString)\r
+                PcdItemObj.SetHelpStringList(PcdItemObj.GetHelpStringList() + [CommentItemIns])\r
+                if PcdItemObj.GetValidUsage():\r
+                    PcdItemObj.SetValidUsage(PcdItemObj.GetValidUsage() + DT.TAB_VALUE_SPLIT + CommentString)\r
+                else:\r
+                    PcdItemObj.SetValidUsage(CommentString)\r
+\r
             PcdItemObj.SetItemType(KeysList[0][0])\r
             #\r
             # Set PcdTokenSpaceCName and CName\r
             #\r
-            PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)           \r
+            PcdItemObj = SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj)\r
             #\r
-            # Set Value/DatumType/MaxDatumSize/Token\r
+            # Set Value/DatumType/OffSet/Token\r
             #\r
-            PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem, \r
-                                                      CurrentLineOfPcdItem, \r
+            PcdItemObj = SetValueDatumTypeMaxSizeToken(PcdItem,\r
+                                                      CurrentLineOfPcdItem,\r
                                                       PcdItemObj,\r
                                                       KeysList[0][1],\r
                                                       PackageInfo)\r
-        \r
+\r
             PcdTypeItem = KeysList[0][0]\r
-            if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):           \r
+            if self.Pcds.has_key((PcdTypeItem, PcdItemObj)):\r
                 PcdsList = self.Pcds[PcdTypeItem, PcdItemObj]\r
                 PcdsList.append(PcdItemObj)\r
                 self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
             else:\r
                 PcdsList = []\r
                 PcdsList.append(PcdItemObj)\r
-                self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList            \r
-  \r
+                self.Pcds[PcdTypeItem, PcdItemObj] = PcdsList\r
+\r
     def GetPcds(self):\r
         return self.Pcds\r
 \r
 def ParserPcdInfoInDec(String):\r
     ValueList = GetSplitValueList(String, DT.TAB_VALUE_SPLIT, 3)\r
-    \r
+\r
     #\r
     # DatumType, Token\r
     #\r
     return ValueList[2], ValueList[3]\r
 \r
-def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo = None):\r
+def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arch, PackageInfo=None):\r
     #\r
     # Package information not been generated currently, we need to parser INF file to get information. \r
     #\r
@@ -484,8 +498,14 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
         # Open DEC file to get information\r
         #\r
         FullFileName = os.path.normpath(os.path.realpath(os.path.join(GlobalData.gWORKSPACE, PackageName)))\r
-        \r
-        DecParser = Dec(FullFileName)\r
+\r
+        DecParser = None\r
+        if FullFileName not in GlobalData.gPackageDict:\r
+            DecParser = Dec(FullFileName)\r
+            GlobalData.gPackageDict[FullFileName] = DecParser\r
+        else:\r
+            DecParser = GlobalData.gPackageDict[FullFileName]\r
+\r
         #\r
         # Find PCD information.               \r
         #\r
@@ -499,7 +519,8 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                         PcdItemObj.SetToken(PcdInDec.TokenValue)\r
                         PcdItemObj.SetDatumType(PcdInDec.DatumType)\r
                         PcdItemObj.SetSupportArchList([Arch])\r
-                        \r
+                        PcdItemObj.SetDefaultValue(PcdInDec.DefaultValue)\r
+\r
             if (Key[0] == 'PCDSPATCHABLEINMODULE' and PcdItemObj.GetItemType() == 'PatchPcd') and \\r
            (Key[1] == 'COMMON' or Key[1] == Arch):\r
                 for PcdInDec in DecPcdsDict[Key]:\r
@@ -507,11 +528,12 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                        PcdInDec.TokenSpaceGuidCName == PcdItemObj.TokenSpaceGuidCName:\r
                         PcdItemObj.SetToken(PcdInDec.TokenValue)\r
                         PcdItemObj.SetDatumType(PcdInDec.DatumType)\r
-                        PcdItemObj.SetSupportArchList([Arch]) \r
-        \r
+                        PcdItemObj.SetSupportArchList([Arch])\r
+\r
         if PcdItemObj.GetDatumType() == 'VOID*':\r
-            PcdItemObj.SetMaxDatumSize('%s'%(len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))\r
-                                                                     \r
+            if len(PcdItem) > 1:\r
+                PcdItemObj.SetMaxDatumSize('%s' % (len(GetSplitValueList(PcdItem[1], DT.TAB_COMMA_SPLIT))))\r
+\r
         DecGuidsDict = DecParser.GetGuidSectionObject().ValueDict\r
         for Key in DecGuidsDict.keys():\r
             if Key == 'COMMON' or Key == Arch:\r
@@ -519,51 +541,64 @@ def SetValueDatumTypeMaxSizeToken(PcdItem, CurrentLineOfPcdItem, PcdItemObj, Arc
                     if GuidInDec.GuidCName == PcdItemObj.TokenSpaceGuidCName:\r
                         PcdItemObj.SetTokenSpaceGuidValue(GuidInDec.GuidString)\r
 \r
-    #\r
-    # Validate Value.\r
-    #\r
-    if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):         \r
-        PcdItemObj.SetDefaultValue(PcdItem[1])\r
-    else:\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
-                     ST.ERR_ASBUILD_PCD_VALUE_INVALID%("\"" + PcdItem[1] + "\"", "\"" + \r
-                                                       PcdItemObj.GetDatumType() + "\""),\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
-                     ExtraData=CurrentLineOfPcdItem[0])                \r
-    #\r
-    # validate offset\r
-    #\r
     if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():\r
-        if not IsHexDigitUINT32(PcdItem[2]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
-                         ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID%("\"" + PcdItem[2] + "\""),\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
-                         ExtraData=CurrentLineOfPcdItem[0])            \r
-        PcdItemObj.SetOffset(PcdItem[2])\r
-        \r
+        #\r
+        # Validate Value.\r
+        #\r
+        # convert the value from a decimal 0 to a formatted hex value.\r
+        if PcdItem[1] == "0":\r
+            DatumType = PcdItemObj.GetDatumType()\r
+            if DatumType == "UINT8":\r
+                PcdItem[1] = "0x00"\r
+            if DatumType == "UINT16":\r
+                PcdItem[1] = "0x0000"\r
+            if DatumType == "UINT32":\r
+                PcdItem[1] = "0x00000000"\r
+            if DatumType == "UINT64":\r
+                PcdItem[1] = "0x0000000000000000"\r
+\r
+        if ValidatePcdValueOnDatumType(PcdItem[1], PcdItemObj.GetDatumType()):\r
+            PcdItemObj.SetDefaultValue(PcdItem[1])\r
+        else:\r
+            Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
+                     ST.ERR_ASBUILD_PCD_VALUE_INVALID % ("\"" + PcdItem[1] + "\"", "\"" +\r
+                                                       PcdItemObj.GetDatumType() + "\""),\r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
+                     ExtraData=CurrentLineOfPcdItem[0])\r
+        #\r
+        # validate offset\r
+        #\r
+        if PcdItemObj.GetItemType().upper() == DT.TAB_INF_PATCH_PCD.upper():\r
+            if not IsHexDigitUINT32(PcdItem[2]):\r
+                Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
+                         ST.ERR_ASBUILD_PCD_OFFSET_FORMAT_INVALID % ("\"" + PcdItem[2] + "\""),\r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
+                         ExtraData=CurrentLineOfPcdItem[0])\r
+            PcdItemObj.SetOffset(PcdItem[2])\r
+\r
     if PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '':\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
-                     ST.ERR_ASBUILD_PCD_DECLARITION_MISS%("\"" + PcdItem[0] + "\""),\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
+        Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
+                     ST.ERR_ASBUILD_PCD_DECLARITION_MISS % ("\"" + PcdItem[0] + "\""),\r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
                      ExtraData=CurrentLineOfPcdItem[0])\r
-        \r
+\r
     return PcdItemObj\r
 \r
 def ValidatePcdValueOnDatumType(Value, Type):\r
-    \r
+\r
     Value = Value.strip()\r
     #\r
     # Boolean type only allow 0x00 or 0x01 as value per INF spec\r
     #\r
     if Type == 'BOOLEAN':\r
         if not (Value == '0x00' or Value == '0x01'):\r
-            return False    \r
+            return False\r
     elif Type == 'VOID*':\r
         if not Value.startswith("{"):\r
             return False\r
@@ -572,23 +607,23 @@ def ValidatePcdValueOnDatumType(Value, Type):
         #\r
         # Strip "{" at head and "}" at tail.\r
         #\r
-        Value = Value[1:-1] \r
+        Value = Value[1:-1]\r
         ValueList = GetSplitValueList(Value, DT.TAB_COMMA_SPLIT)\r
-        \r
+\r
         ReIsValidHexByte = re.compile("^0x[0-9a-f]{1,2}$", re.IGNORECASE)\r
         for ValueItem in ValueList:\r
             if not ReIsValidHexByte.match(ValueItem):\r
                 return False\r
-        \r
+\r
     elif Type == 'UINT8' or Type == 'UINT16' or Type == 'UINT32' or Type == 'UINT64':\r
-        \r
+\r
         ReIsValidUint8z = re.compile('^0[x|X][a-fA-F0-9]{2}$')\r
         ReIsValidUint16z = re.compile('^0[x|X][a-fA-F0-9]{4}$')\r
         ReIsValidUint32z = re.compile('^0[x|X][a-fA-F0-9]{8}$')\r
         ReIsValidUint64z = re.compile('^0[x|X][a-fA-F0-9]{16}$')\r
-        \r
+\r
         if not ReIsValidUint8z.match(Value) and Type == 'UINT8':\r
-            return False  \r
+            return False\r
         elif not ReIsValidUint16z.match(Value) and  Type == 'UINT16':\r
             return False\r
         elif not ReIsValidUint32z.match(Value) and  Type == 'UINT32':\r
@@ -600,41 +635,41 @@ def ValidatePcdValueOnDatumType(Value, Type):
         # Since we assume the DEC file always correct, should never go to here.\r
         #\r
         pass\r
-    \r
-    return True    \r
\r
+\r
+    return True\r
+\r
 def SetPcdName(PcdItem, CurrentLineOfPcdItem, PcdItemObj):\r
     #\r
     # Only PCD Name specified \r
     # <PcdName> ::= <TokenSpaceGuidCName> "." <TokenCName>\r
     #\r
     PcdId = GetSplitValueList(PcdItem[0], DT.TAB_SPLIT)\r
-    if len(PcdId) != 2:                       \r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID, \r
+    if len(PcdId) != 2:\r
+        Logger.Error("InfParser",\r
+                     ToolError.FORMAT_INVALID,\r
                      ST.ERR_INF_PARSER_PCD_NAME_FORMAT_ERROR,\r
-                     File=CurrentLineOfPcdItem[2], \r
-                     Line=CurrentLineOfPcdItem[1], \r
+                     File=CurrentLineOfPcdItem[2],\r
+                     Line=CurrentLineOfPcdItem[1],\r
                      ExtraData=CurrentLineOfPcdItem[0])\r
     else:\r
         #\r
         # Validate PcdTokenSpaceGuidCName\r
         #\r
         if not IsValidCVariableName(PcdId[0]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
+            Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_PCD_CVAR_GUID,\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
                          ExtraData=PcdId[0])\r
         if not IsValidCVariableName(PcdId[1]):\r
-            Logger.Error("InfParser", \r
-                         ToolError.FORMAT_INVALID, \r
+            Logger.Error("InfParser",\r
+                         ToolError.FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_PCD_CVAR_PCDCNAME,\r
-                         File=CurrentLineOfPcdItem[2], \r
-                         Line=CurrentLineOfPcdItem[1], \r
+                         File=CurrentLineOfPcdItem[2],\r
+                         Line=CurrentLineOfPcdItem[1],\r
                          ExtraData=PcdId[1])\r
         PcdItemObj.SetTokenSpaceGuidCName(PcdId[0])\r
         PcdItemObj.SetCName(PcdId[1])\r
-    \r
-    return PcdItemObj      
\ No newline at end of file
+\r
+    return PcdItemObj\r
index 060b9274f3c3e638b2bbfce453f8e06e80c2fcc8..25407f9a2d505b975bd8b99e51af92c41b258dd2 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse DEC file. It will consumed by DecParser\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -60,6 +60,7 @@ from Library.String import ReplaceMacro
 from Library.String import GetSplitValueList\r
 from Library.String import gMACRO_PATTERN\r
 from Library.String import ConvertSpecialChar\r
+from Library.CommentParsing import ParsePcdErrorCode\r
 \r
 ##\r
 # _DecBase class for parsing\r
@@ -77,6 +78,9 @@ class _DecBase:
     def GetDataObject(self):\r
         return self.ItemObject\r
     \r
+    def GetLocalMacro(self):\r
+        return self._LocalMacro\r
+    \r
     ## BlockStart\r
     #\r
     # Called if a new section starts\r
@@ -184,7 +188,7 @@ class _DecBase:
             self._LocalMacro[TokenList[0]] = ''\r
         else:\r
             self._LocalMacro[TokenList[0]] = self._ReplaceMacro(TokenList[1])\r
-    \r
+\r
     ## _ParseItem\r
     #\r
     # Parse specified item, this function must be derived by subclass\r
@@ -395,6 +399,7 @@ class _DecDefine(_DecBase):
             DT.TAB_DEC_DEFINES_PACKAGE_NAME        :   self._SetPackageName,\r
             DT.TAB_DEC_DEFINES_PACKAGE_GUID        :   self._SetPackageGuid,\r
             DT.TAB_DEC_DEFINES_PACKAGE_VERSION     :   self._SetPackageVersion,\r
+            DT.TAB_DEC_DEFINES_PKG_UNI_FILE        :   self._SetPackageUni,\r
         }\r
     \r
     def BlockStart(self):\r
@@ -429,7 +434,7 @@ class _DecDefine(_DecBase):
         Line = self._RawData.CurrentLine\r
         TokenList = GetSplitValueList(Line, DT.TAB_EQUAL_SPLIT, 1)\r
         if TokenList[0] == DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
-            pass\r
+            self.DefineValidation[TokenList[0]](TokenList[1])\r
         elif len(TokenList) < 2:\r
             self._LoggerError(ST.ERR_DECPARSE_DEFINE_FORMAT)\r
         elif TokenList[0] not in self.DefineValidation:\r
@@ -438,10 +443,9 @@ class _DecDefine(_DecBase):
             self.DefineValidation[TokenList[0]](TokenList[1])\r
         \r
         DefineItem = DecDefineItemObject()\r
-        if TokenList[0] != DT.TAB_DEC_DEFINES_PKG_UNI_FILE:\r
-            DefineItem.Key   = TokenList[0]\r
-            DefineItem.Value = TokenList[1]\r
-            self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
+        DefineItem.Key   = TokenList[0]\r
+        DefineItem.Value = TokenList[1]\r
+        self.ItemObject.AddItem(DefineItem, self._RawData.CurrentScope)\r
         return DefineItem\r
     \r
     def _SetDecSpecification(self, Token):\r
@@ -473,7 +477,12 @@ class _DecDefine(_DecBase):
         else:\r
             if not DT.TAB_SPLIT in Token:\r
                 Token = Token + '.0'\r
-            self.ItemObject._PkgVersion = Token\r
+            self.ItemObject.SetPackageVersion(Token)\r
+            \r
+    def _SetPackageUni(self, Token):\r
+        if self.ItemObject.GetPackageUniFile():\r
+            self._LoggerError(ST.ERR_DECPARSE_DEFINE_DEFINED % DT.TAB_DEC_DEFINES_PKG_UNI_FILE)\r
+        self.ItemObject.SetPackageUniFile(Token)\r
 \r
 ## _DecInclude\r
 #\r
@@ -727,7 +736,7 @@ class _DecUserExtension(_DecBase):
 class Dec(_DecBase, _DecComments):    \r
     def __init__(self, DecFile, Parse = True):        \r
         try:\r
-            Content   = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
+            Content = ConvertSpecialChar(open(DecFile, 'rb').readlines())\r
         except BaseException:\r
             Logger.Error(TOOL_NAME, FILE_OPEN_FAILURE, File=DecFile,\r
                          ExtraData=ST.ERR_DECPARSE_FILEOPEN % DecFile)\r
@@ -736,7 +745,9 @@ class Dec(_DecBase, _DecComments):
         _DecComments.__init__(self)\r
         _DecBase.__init__(self, RawData)\r
         \r
-        self.BinaryHeadComment = []        \r
+        self.BinaryHeadComment = []\r
+        self.PcdErrorCommentDict = {}\r
+        \r
         self._Define    = _DecDefine(RawData)\r
         self._Include   = _DecInclude(RawData)\r
         self._Guid      = _DecGuid(RawData)\r
@@ -775,7 +786,7 @@ class Dec(_DecBase, _DecComments):
             if not SectionParser.CheckRequiredFields():\r
                 return False\r
         return True\r
-    \r
+\r
     ##\r
     # Parse DEC file\r
     #\r
@@ -784,9 +795,47 @@ class Dec(_DecBase, _DecComments):
         IsBinaryHeader = False\r
         FileHeaderLineIndex = -1\r
         BinaryHeaderLineIndex = -1\r
+        TokenSpaceGuidCName = ''\r
+        \r
+        #\r
+        # Parse PCD error comment section\r
+        #\r
         while not self._RawData.IsEndOfFile():\r
-            Line, Comment = CleanString(self._RawData.GetNextLine())\r
+            self._RawData.CurrentLine = self._RawData.GetNextLine()\r
+            if self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT) and \\r
+                DT.TAB_SECTION_START in self._RawData.CurrentLine and \\r
+                DT.TAB_SECTION_END in self._RawData.CurrentLine:\r
+                self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
 \r
+                if self._RawData.CurrentLine[0] == DT.TAB_SECTION_START and \\r
+                    self._RawData.CurrentLine[-1] == DT.TAB_SECTION_END:\r
+                    RawSection = self._RawData.CurrentLine[1:-1].strip()\r
+                    if RawSection.upper().startswith(DT.TAB_PCD_ERROR.upper()+'.'):\r
+                        TokenSpaceGuidCName = RawSection.split(DT.TAB_PCD_ERROR+'.')[1].strip()\r
+                        continue\r
+\r
+            if TokenSpaceGuidCName and self._RawData.CurrentLine.startswith(DT.TAB_COMMENT_SPLIT):\r
+                self._RawData.CurrentLine = self._RawData.CurrentLine.replace(DT.TAB_COMMENT_SPLIT, '').strip()\r
+                if self._RawData.CurrentLine != '':\r
+                    if DT.TAB_VALUE_SPLIT not in self._RawData.CurrentLine:\r
+                        self._LoggerError(ST.ERR_DECPARSE_PCDERRORMSG_MISS_VALUE_SPLIT)   \r
+                          \r
+                    PcdErrorNumber, PcdErrorMsg = GetSplitValueList(self._RawData.CurrentLine, DT.TAB_VALUE_SPLIT, 1)\r
+                    PcdErrorNumber = ParsePcdErrorCode(PcdErrorNumber, self._RawData.Filename, self._RawData.LineIndex)\r
+                    if not PcdErrorMsg.strip():\r
+                        self._LoggerError(ST.ERR_DECPARSE_PCD_MISS_ERRORMSG)\r
+                        \r
+                    self.PcdErrorCommentDict[(TokenSpaceGuidCName, PcdErrorNumber)] = PcdErrorMsg.strip()\r
+            else:\r
+                TokenSpaceGuidCName = ''\r
+\r
+        self._RawData.LineIndex = 0\r
+        self._RawData.CurrentLine = ''\r
+        self._RawData.NextLine = ''\r
+\r
+        while not self._RawData.IsEndOfFile():\r
+            Line, Comment = CleanString(self._RawData.GetNextLine())\r
+            \r
             #\r
             # Header must be pure comment\r
             #\r
@@ -840,9 +889,10 @@ class Dec(_DecBase, _DecComments):
             self._LoggerError(ST.ERR_BINARY_HEADER_ORDER)\r
             \r
         if FileHeaderLineIndex == -1:\r
+#            self._LoggerError(ST.ERR_NO_SOURCE_HEADER)\r
             Logger.Error(TOOL_NAME, FORMAT_INVALID, \r
                          ST.ERR_NO_SOURCE_HEADER,\r
-                         File=self._RawData.Filename)        \r
+                         File=self._RawData.Filename)\r
         return\r
     \r
     def _StopCurrentParsing(self, Line):\r
@@ -852,19 +902,15 @@ class Dec(_DecBase, _DecComments):
         self._SectionHeaderParser()\r
         if len(self._RawData.CurrentScope) == 0:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_EMPTY)\r
-\r
         SectionObj = self._SectionParser[self._RawData.CurrentScope[0][0]]\r
-\r
         SectionObj.BlockStart()\r
         SectionObj.Parse()\r
-        \r
         return SectionObj.GetDataObject()\r
 \r
     def _UserExtentionSectionParser(self):\r
         self._RawData.CurrentScope = []\r
         ArchList = set()\r
         Section = self._RawData.CurrentLine[1:-1]\r
-        \r
         Par = ParserHelper(Section, self._RawData.Filename)\r
         while not Par.End():\r
             #\r
@@ -874,8 +920,8 @@ class Dec(_DecBase, _DecComments):
             if Token.upper() != DT.TAB_USER_EXTENSIONS.upper():\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE)\r
             UserExtension = Token.upper()\r
-\r
-            Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
+            Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)     \r
+            \r
             #\r
             # UserID\r
             #\r
@@ -883,7 +929,6 @@ class Dec(_DecBase, _DecComments):
             if not IsValidUserId(Token):\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_USERID)\r
             UserId = Token\r
-            \r
             Par.AssertChar(DT.TAB_SPLIT, ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
             #\r
             # IdString\r
@@ -892,7 +937,6 @@ class Dec(_DecBase, _DecComments):
             if not IsValidIdString(Token):\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UE_IDSTRING)\r
             IdString = Token\r
-            \r
             Arch = 'COMMON'\r
             if Par.Expect(DT.TAB_SPLIT):\r
                 Token = Par.GetToken()\r
@@ -900,20 +944,16 @@ class Dec(_DecBase, _DecComments):
                 if not IsValidArch(Arch):\r
                     self._LoggerError(ST.ERR_DECPARSE_ARCH)\r
             ArchList.add(Arch)\r
-            \r
             if [UserExtension, UserId, IdString, Arch] not in \\r
                 self._RawData.CurrentScope:\r
                 self._RawData.CurrentScope.append(\r
                     [UserExtension, UserId, IdString, Arch]\r
                 )\r
-            \r
             if not Par.Expect(DT.TAB_COMMA_SPLIT):\r
                 break\r
             elif Par.End():\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMA)\r
-        \r
         Par.AssertEnd(ST.ERR_DECPARSE_SECTION_UE, self._RawData.LineIndex)\r
-        \r
         if 'COMMON' in ArchList and len(ArchList) > 1:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
  \r
@@ -928,7 +968,6 @@ class Dec(_DecBase, _DecComments):
             self._LoggerError(ST.ERR_DECPARSE_SECTION_IDENTIFY)\r
         \r
         RawSection = self._RawData.CurrentLine[1:-1].strip().upper()\r
-        \r
         #\r
         # Check defines section which is only allowed to occur once and\r
         # no arch can be followed\r
@@ -936,13 +975,11 @@ class Dec(_DecBase, _DecComments):
         if RawSection.startswith(DT.TAB_DEC_DEFINES.upper()):\r
             if RawSection != DT.TAB_DEC_DEFINES.upper():\r
                 self._LoggerError(ST.ERR_DECPARSE_DEFINE_SECNAME)\r
-        \r
         #\r
         # Check user extension section\r
         #\r
         if RawSection.startswith(DT.TAB_USER_EXTENSIONS.upper()):\r
             return self._UserExtentionSectionParser()\r
-        \r
         self._RawData.CurrentScope = []\r
         SectionNames = []\r
         ArchList = set()\r
@@ -951,17 +988,14 @@ class Dec(_DecBase, _DecComments):
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
 \r
             ItemList = GetSplitValueList(Item, DT.TAB_SPLIT)\r
-\r
             #\r
             # different types of PCD are permissible in one section\r
             #\r
             SectionName = ItemList[0]\r
             if SectionName not in self._SectionParser:\r
                 self._LoggerError(ST.ERR_DECPARSE_SECTION_UNKNOW % SectionName)\r
-            \r
             if SectionName not in SectionNames:\r
                 SectionNames.append(SectionName)\r
-            \r
             #\r
             # In DEC specification, all section headers have at most two part:\r
             # SectionName.Arch except UserExtention\r
@@ -989,7 +1023,6 @@ class Dec(_DecBase, _DecComments):
         #\r
         if 'COMMON' in ArchList and len(ArchList) > 1:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_COMMON)\r
-        \r
         if len(SectionNames) == 0:\r
             self._LoggerError(ST.ERR_DECPARSE_SECTION_SUBEMPTY % self._RawData.CurrentLine)\r
         if len(SectionNames) != 1:\r
@@ -997,41 +1030,31 @@ class Dec(_DecBase, _DecComments):
                 if not Sec.startswith(DT.TAB_PCDS.upper()):\r
                     self._LoggerError(ST.ERR_DECPARSE_SECTION_NAME % str(SectionNames))\r
     \r
+    def GetDefineSectionMacro(self):\r
+        return self._Define.GetLocalMacro()\r
     def GetDefineSectionObject(self):\r
         return self._Define.GetDataObject()\r
-    \r
     def GetIncludeSectionObject(self):\r
         return self._Include.GetDataObject()\r
-    \r
     def GetGuidSectionObject(self):\r
         return self._Guid.GetGuidObject()\r
-    \r
     def GetProtocolSectionObject(self):\r
         return self._Guid.GetProtocolObject()\r
-    \r
     def GetPpiSectionObject(self):\r
         return self._Guid.GetPpiObject()\r
-    \r
     def GetLibraryClassSectionObject(self):\r
         return self._LibClass.GetDataObject()\r
-    \r
     def GetPcdSectionObject(self):\r
         return self._Pcd.GetDataObject()\r
-    \r
     def GetUserExtensionSectionObject(self):\r
         return self._UserEx.GetDataObject()\r
-    \r
     def GetPackageSpecification(self):\r
-        return self._Define.GetDataObject().GetPackageSpecification()\r
-    \r
+        return self._Define.GetDataObject().GetPackageSpecification()   \r
     def GetPackageName(self):\r
-        return self._Define.GetDataObject().GetPackageName()\r
-    \r
+        return self._Define.GetDataObject().GetPackageName()   \r
     def GetPackageGuid(self):\r
-        return self._Define.GetDataObject().GetPackageGuid()\r
-    \r
+        return self._Define.GetDataObject().GetPackageGuid()    \r
     def GetPackageVersion(self):\r
         return self._Define.GetDataObject().GetPackageVersion()\r
-    \r
     def GetPackageUniFile(self):\r
         return self._Define.GetDataObject().GetPackageUniFile()\r
index 8d289793930bb9ce1f22dc8b8e787c153a153900..22a50680fb8f09e9ce65d7a2d8b4cfe2b3147304 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define helper class and function for DEC parser\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -25,6 +25,7 @@ from Library.DataType import TAB_COMMENT_SPLIT
 from Library.DataType import TAB_COMMENT_EDK1_SPLIT\r
 from Library.ExpressionValidate import IsValidBareCString\r
 from Library.ParserValidate import IsValidCFormatGuid\r
+from Library.ExpressionValidate import IsValidFeatureFlagExp\r
 from Library.ExpressionValidate import IsValidLogicalExpr\r
 from Library.ExpressionValidate import IsValidStringTest\r
 from Library.Misc import CheckGuidRegFormat\r
@@ -134,26 +135,38 @@ def CleanString(Line, CommentCharacter=TAB_COMMENT_SPLIT, \
     return Line, Comment\r
 \r
 \r
-## IsValidHexByte\r
+## IsValidNumValUint8\r
 #\r
-# Check if Token is HexByte: <HexByte> ::= 0x <HexDigit>{1,2}\r
+# Check if Token is NumValUint8: <NumValUint8> ::= {<ShortNum>} {<UINT8>} {<Expression>}\r
 #\r
 # @param Token: Token to be checked\r
 #\r
-def IsValidHexByte(Token):\r
+def IsValidNumValUint8(Token):\r
+    Valid = True\r
+    Cause = ""\r
+    TokenValue = None\r
     Token = Token.strip()\r
-    if not Token.lower().startswith('0x') or not (len(Token) < 5 and len(Token) > 2):\r
-        return False\r
+    if Token.lower().startswith('0x'):\r
+        Base = 16\r
+    else:\r
+        Base = 10\r
     try:\r
-        Token = long(Token, 0)\r
+        TokenValue = long(Token, Base)\r
     except BaseException:\r
+        Valid, Cause = IsValidLogicalExpr(Token, True)\r
+        if Cause:\r
+            pass\r
+    if not Valid:\r
         return False\r
-    return True\r
+    if TokenValue and (TokenValue < 0 or TokenValue > 0xFF):\r
+        return False\r
+    else:\r
+        return True\r
 \r
 ## IsValidNList\r
 #\r
-# Check if Value has the format of <HexByte> ["," <HexByte>]{0,}\r
-# <HexByte> ::= "0x" <HexDigit>{1,2}\r
+# Check if Value has the format of <NumValUint8> ["," <NumValUint8>]{0,}\r
+# <NumValUint8> ::= {<ShortNum>} {<UINT8>} {<Expression>}\r
 #\r
 # @param Value: Value to be checked\r
 #\r
@@ -162,8 +175,8 @@ def IsValidNList(Value):
     if Par.End():\r
         return False\r
     while not Par.End():\r
-        Token = Par.GetToken(',\t ')\r
-        if not IsValidHexByte(Token):\r
+        Token = Par.GetToken(',')\r
+        if not IsValidNumValUint8(Token):\r
             return False\r
         if Par.Expect(','):\r
             if Par.End():\r
@@ -186,11 +199,11 @@ def IsValidCArray(Array):
     if Par.End():\r
         return False\r
     while not Par.End():\r
-        Token = Par.GetToken(',}\t ')\r
+        Token = Par.GetToken(',}')\r
         #\r
-        # 0xa, 0xaa\r
+        # ShortNum, UINT8, Expression\r
         #\r
-        if not IsValidHexByte(Token):\r
+        if not IsValidNumValUint8(Token):\r
             return False\r
         if Par.Expect(','):\r
             if Par.End():\r
@@ -213,6 +226,10 @@ def IsValidCArray(Array):
 # @param Value:    The pcd Value\r
 #\r
 def IsValidPcdDatum(Type, Value):\r
+    if not Value:\r
+        return False, ST.ERR_DECPARSE_PCD_VALUE_EMPTY\r
+    Valid = True\r
+    Cause = ""\r
     if Type not in ["UINT8", "UINT16", "UINT32", "UINT64", "VOID*", "BOOLEAN"]:\r
         return False, ST.ERR_DECPARSE_PCD_TYPE\r
     if Type == "VOID*":\r
@@ -230,9 +247,9 @@ def IsValidPcdDatum(Type, Value):
         if Value in ['TRUE', 'FALSE', 'true', 'false', 'True', 'False',\r
                      '0x1', '0x01', '1', '0x0', '0x00', '0']:\r
             return True, ""\r
-        Valid, Cause = IsValidStringTest(Value)\r
+        Valid, Cause = IsValidStringTest(Value, True)\r
         if not Valid:\r
-            Valid, Cause = IsValidLogicalExpr(Value)\r
+            Valid, Cause = IsValidFeatureFlagExp(Value, True)\r
         if not Valid:\r
             return False, Cause\r
     else:\r
@@ -271,8 +288,10 @@ def IsValidPcdDatum(Type, Value):
             if TypeLenMap[Type] < len(HexStr) - 3:\r
                 return False, ST.ERR_DECPARSE_PCD_INT_EXCEED % (StrVal, Type)\r
         except BaseException:\r
-            return False, ST.ERR_DECPARSE_PCD_INT % (Value, Type)\r
-\r
+            Valid, Cause = IsValidLogicalExpr(Value, True)\r
+        if not Valid:\r
+            return False, Cause\r
+        \r
     return True, ""\r
 \r
 ## ParserHelper\r
index 6bf070be41912bea10397da20f7820333b236cfd..498f2d7634a5492832beafc96f63f244e7593db6 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to provide method for process AsBuilt INF file. It will consumed by InfParser\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -19,7 +19,6 @@ InfAsBuiltProcess
 import os\r
 import re\r
 from Library import GlobalData\r
-\r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Logger import ToolError\r
@@ -74,7 +73,7 @@ def GetLibInstanceInfo(String, WorkSpace, LineNo, CurrentInfFileName):
         if VersionMatchedObj:\r
             Guid = GuidMatchedObj.group().strip()\r
             Version = VersionMatchedObj.group().strip()\r
-            return GetGuidVerFormLibInstance(Guid, Version, WorkSpace, CurrentInfFileName)\r
+            return Guid, Version\r
 \r
     #\r
     # To deal with library instance specified by file name\r
@@ -106,47 +105,47 @@ def GetLibInstanceInfo(String, WorkSpace, LineNo, CurrentInfFileName):
 # @param WorkSpace. The WorkSpace directory used to combined with INF file path.\r
 #\r
 # @return GUID, Version\r
-def GetPackageListInfo(FileNameString, WorkSpace, LineNo): \r
+def GetPackageListInfo(FileNameString, WorkSpace, LineNo):\r
     PackageInfoList = []\r
     DefineSectionMacros = {}\r
     PackageSectionMacros = {}\r
-    \r
+\r
     FileLinesList = GetFileLineContent(FileNameString, WorkSpace, LineNo, '')\r
-    \r
+\r
     RePackageHeader = re.compile('^\s*\[Packages.*\].*$')\r
     ReDefineHeader = re.compile('^\s*\[Defines].*$')\r
-    \r
+\r
     PackageHederFlag = False\r
     DefineHeaderFlag = False\r
     LineNo = -1\r
     for Line in FileLinesList:\r
         LineNo += 1\r
         Line = Line.strip()\r
-        \r
+\r
         if Line.startswith('['):\r
             PackageHederFlag = False\r
-            DefineHeaderFlag = False            \r
-        \r
+            DefineHeaderFlag = False\r
+\r
         if Line.startswith("#"):\r
             continue\r
-        \r
+\r
         if not Line:\r
-            continue        \r
-        \r
+            continue\r
+\r
         #\r
         # Found [Packages] section \r
         #\r
         if RePackageHeader.match(Line):\r
             PackageHederFlag = True\r
             continue\r
-        \r
+\r
         #\r
         # Found [Define] section\r
         #\r
         if ReDefineHeader.match(Line):\r
             DefineHeaderFlag = True\r
             continue\r
-        \r
+\r
         if DefineHeaderFlag:\r
             #\r
             # Find Macro\r
@@ -154,12 +153,12 @@ def GetPackageListInfo(FileNameString, WorkSpace, LineNo):
             Name, Value = MacroParser((Line, LineNo),\r
                                       FileNameString,\r
                                       DT.MODEL_META_DATA_HEADER,\r
-                                      DefineSectionMacros) \r
-                       \r
+                                      DefineSectionMacros)\r
+\r
             if Name != None:\r
-                DefineSectionMacros[Name] = Value               \r
+                DefineSectionMacros[Name] = Value\r
                 continue\r
-            \r
+\r
         if PackageHederFlag:\r
 \r
             #\r
@@ -170,22 +169,22 @@ def GetPackageListInfo(FileNameString, WorkSpace, LineNo):
                                       DT.MODEL_META_DATA_PACKAGE,\r
                                       DefineSectionMacros)\r
             if Name != None:\r
-                PackageSectionMacros[Name] = Value               \r
+                PackageSectionMacros[Name] = Value\r
                 continue\r
-            \r
+\r
             #\r
             # Replace with Local section Macro and [Defines] section Macro.\r
             #            \r
             Line = InfExpandMacro(Line, (FileNameString, Line, LineNo), DefineSectionMacros, PackageSectionMacros, True)\r
-            \r
+\r
             Line = GetSplitValueList(Line, "#", 1)[0]\r
             Line = GetSplitValueList(Line, "|", 1)[0]\r
             PackageInfoList.append(Line)\r
-     \r
-    return PackageInfoList    \r
-    \r
+\r
+    return PackageInfoList\r
+\r
 def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):\r
-    \r
+\r
     if not LineNo:\r
         LineNo = -1\r
 \r
@@ -194,26 +193,16 @@ def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):
     #\r
     FullFileName = os.path.normpath(os.path.realpath(os.path.join(WorkSpace, FileName)))\r
     if not (ValidFile(FullFileName)):\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID,\r
-                     ST.ERR_FILELIST_EXIST%(FileName),\r
-                     File=GlobalData.gINF_MODULE_NAME,\r
-                     Line=LineNo, \r
-                     ExtraData=OriginalString)\r
-    \r
+        return []\r
+\r
     #\r
     # Validate file exist/format.\r
     #\r
     if not IsValidPath(FileName, WorkSpace):\r
-        Logger.Error("InfParser", \r
-                     ToolError.FORMAT_INVALID,\r
-                     ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(FileName),\r
-                     File=GlobalData.gINF_MODULE_NAME, \r
-                     Line=LineNo, \r
-                     ExtraData=OriginalString)\r
-    \r
+        return []\r
+\r
     FileLinesList = []\r
-    \r
+\r
     try:\r
         FullFileName = FullFileName.replace('\\', '/')\r
         Inputfile = open(FullFileName, "rb", 0)\r
@@ -228,9 +217,9 @@ def GetFileLineContent(FileName, WorkSpace, LineNo, OriginalString):
                      ToolError.FILE_READ_FAILURE,\r
                      ST.ERR_FILE_OPEN_FAILURE,\r
                      File=FullFileName)\r
-    \r
+\r
     FileLinesList = ProcessLineExtender(FileLinesList)\r
-    \r
+\r
     return FileLinesList\r
 \r
 ##\r
index 36142cf84a02e19f5bfa3aeddf43aa11a830f087..f1d6943cbfff72c9892beab55de13e9d1a596f2b 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the parser for [Binaries] sections in INF file \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -178,9 +178,15 @@ class InfBinarySectionParser(InfParserSectionRoot):
                                           CurrentLineObj))\r
             else:\r
                 if len(ValueList) == 2:\r
-                    TokenList = GetSplitValueList(ValueList[1], \r
-                                                  DT.TAB_VALUE_SPLIT, \r
-                                                  4)\r
+                    if ValueList[0].strip() == 'SUBTYPE_GUID':\r
+                        TokenList = GetSplitValueList(ValueList[1], \r
+                                                      DT.TAB_VALUE_SPLIT, \r
+                                                      5)\r
+                    else:\r
+                        TokenList = GetSplitValueList(ValueList[1], \r
+                              DT.TAB_VALUE_SPLIT, \r
+                              4)\r
+                        \r
                     NewValueList = []\r
                     NewValueList.append(ValueList[0])\r
                     for Item in TokenList:\r
@@ -188,6 +194,15 @@ class InfBinarySectionParser(InfParserSectionRoot):
                     ComBinaryList.append((NewValueList, \r
                                           LineComment, \r
                                           CurrentLineObj))\r
+                elif len(ValueList) == 1:\r
+                    NewValueList = []\r
+                    NewValueList.append(ValueList[0])\r
+                    ComBinaryList.append((NewValueList, \r
+                                          LineComment, \r
+                                          CurrentLineObj))\r
+                    \r
+                    \r
+                \r
             \r
             ValueList = []\r
             LineComment = None\r
index 4540fe2754dba12451c609f3c2252477f9a3c00f..210f973f1a4d30a5b57c0cf1aa394da4e7a79d99 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the parser for [Libraries] sections in INF file \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -44,21 +44,21 @@ class InfLibrarySectionParser(InfParserSectionRoot):
             # Macro defined in this section \r
             #\r
             SectionMacros = {}\r
-            ValueList     = []\r
-            LibraryList   = []\r
-            LibStillCommentFalg  = False\r
-            LibHeaderComments    = []\r
-            LibLineComment       = None              \r
+            ValueList = []\r
+            LibraryList = []\r
+            LibStillCommentFalg = False\r
+            LibHeaderComments = []\r
+            LibLineComment = None\r
             #\r
             # Parse section content\r
             #\r
             for Line in SectionString:\r
                 LibLineContent = Line[0]\r
-                LibLineNo      = Line[1]\r
-                \r
+                LibLineNo = Line[1]\r
+\r
                 if LibLineContent.strip() == '':\r
                     continue\r
-                \r
+\r
                 #\r
                 # Found Header Comments \r
                 #\r
@@ -82,14 +82,14 @@ class InfLibrarySectionParser(InfParserSectionRoot):
                         continue\r
                 else:\r
                     LibStillCommentFalg = False\r
-                              \r
+\r
                 if len(LibHeaderComments) >= 1:\r
                     LibLineComment = InfLineCommentObject()\r
                     LineCommentContent = ''\r
                     for Item in LibHeaderComments:\r
                         LineCommentContent += Item[0] + DT.END_OF_LINE\r
                     LibLineComment.SetHeaderComments(LineCommentContent)\r
-                \r
+\r
                 #\r
                 # Find Tail comment.\r
                 #\r
@@ -98,8 +98,8 @@ class InfLibrarySectionParser(InfParserSectionRoot):
                     LibLineContent = LibLineContent[:LibLineContent.find(DT.TAB_COMMENT_SPLIT)]\r
                     if LibLineComment == None:\r
                         LibLineComment = InfLineCommentObject()\r
-                    LibLineComment.SetTailComments(LibTailComments)            \r
-                \r
+                    LibLineComment.SetTailComments(LibTailComments)\r
+\r
                 #\r
                 # Find Macro\r
                 #\r
@@ -110,28 +110,28 @@ class InfLibrarySectionParser(InfParserSectionRoot):
                 if Name != None:\r
                     SectionMacros[Name] = Value\r
                     LibLineComment = None\r
-                    LibHeaderComments = []                \r
+                    LibHeaderComments = []\r
                     continue\r
-                \r
+\r
                 TokenList = GetSplitValueList(LibLineContent, DT.TAB_VALUE_SPLIT, 1)\r
                 ValueList[0:len(TokenList)] = TokenList\r
-    \r
+\r
                 #\r
                 # Replace with Local section Macro and [Defines] section Macro.\r
                 #            \r
-                ValueList = [InfExpandMacro(Value, (FileName, LibLineContent, LibLineNo), \r
+                ValueList = [InfExpandMacro(Value, (FileName, LibLineContent, LibLineNo),\r
                                             self.FileLocalMacros, SectionMacros, True)\r
                                             for Value in ValueList]\r
-    \r
-                LibraryList.append((ValueList, LibLineComment, \r
+\r
+                LibraryList.append((ValueList, LibLineComment,\r
                                     (LibLineContent, LibLineNo, FileName)))\r
                 ValueList = []\r
                 LibLineComment = None\r
                 LibTailComments = ''\r
                 LibHeaderComments = []\r
-                \r
+\r
                 continue\r
-    \r
+\r
             #\r
             # Current section archs\r
             #    \r
@@ -139,36 +139,36 @@ class InfLibrarySectionParser(InfParserSectionRoot):
             for Item in self.LastSectionHeaderContent:\r
                 if (Item[1], Item[2]) not in KeyList:\r
                     KeyList.append((Item[1], Item[2]))\r
-                                   \r
-            if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList = KeyList):\r
-                Logger.Error('InfParser', \r
+\r
+            if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList=KeyList):\r
+                Logger.Error('InfParser',\r
                              FORMAT_INVALID,\r
                              ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Library]"),\r
-                             File=FileName, \r
+                             File=FileName,\r
                              Line=Item[3])\r
         #\r
         # For Binary INF\r
         #\r
         else:\r
             self.InfAsBuiltLibraryParser(SectionString, InfSectionObject, FileName)\r
-                \r
+\r
     def InfAsBuiltLibraryParser(self, SectionString, InfSectionObject, FileName):\r
         LibraryList = []\r
         LibInsFlag = False\r
         for Line in SectionString:\r
             LineContent = Line[0]\r
-            LineNo      = Line[1]\r
-            \r
+            LineNo = Line[1]\r
+\r
             if LineContent.strip() == '':\r
                 LibInsFlag = False\r
                 continue\r
-            \r
+\r
             if not LineContent.strip().startswith("#"):\r
-                Logger.Error('InfParser', \r
+                Logger.Error('InfParser',\r
                             FORMAT_INVALID,\r
-                            ST.ERR_LIB_CONTATIN_ASBUILD_AND_COMMON, \r
-                            File=FileName, \r
-                            Line=LineNo, \r
+                            ST.ERR_LIB_CONTATIN_ASBUILD_AND_COMMON,\r
+                            File=FileName,\r
+                            Line=LineNo,\r
                             ExtraData=LineContent)\r
 \r
             if IsLibInstanceInfo(LineContent):\r
@@ -185,13 +185,6 @@ class InfLibrarySectionParser(InfParserSectionRoot):
                 if LibGuid != '':\r
                     if (LibGuid, LibVer) not in LibraryList:\r
                         LibraryList.append((LibGuid, LibVer))\r
-                else:\r
-                    Logger.Error('InfParser',\r
-                            FORMAT_INVALID,\r
-                            ST.ERR_LIB_INSTANCE_MISS_GUID,\r
-                            File=FileName,\r
-                            Line=LineNo,\r
-                            ExtraData=LineContent)\r
 \r
         #\r
         # Current section archs\r
@@ -201,10 +194,10 @@ class InfLibrarySectionParser(InfParserSectionRoot):
         for Item in self.LastSectionHeaderContent:\r
             if (Item[1], Item[2]) not in KeyList:\r
                 KeyList.append((Item[1], Item[2]))\r
-                \r
-        if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList = KeyList):\r
-            Logger.Error('InfParser', \r
+\r
+        if not InfSectionObject.SetLibraryClasses(LibraryList, KeyList=KeyList):\r
+            Logger.Error('InfParser',\r
                          FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_MODULE_SECTION_TYPE_ERROR % ("[Library]"),\r
-                         File=FileName, \r
-                         Line=Item[3])           
\ No newline at end of file
+                         File=FileName,\r
+                         Line=Item[3])\r
index 8a41eca0a71dc0b8ba31be343768aa05cf3e5e0e..e7bef2e35e0fea430aefb135d2f39ccb7af214fc 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the parser for INF file\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -210,7 +210,7 @@ class InfParser(InfSectionParser):
                 SectionLines.append((Line, LineNo))\r
                 HeaderCommentStart = True\r
                 continue        \r
-            \r
+\r
             #\r
             # Collect Header content.\r
             #\r
@@ -227,18 +227,18 @@ class InfParser(InfSectionParser):
                 HeaderCommentEnd = True\r
                 BinaryHeaderCommentStart = False \r
                 BinaryHeaderCommentEnd   = False\r
-                HeaderCommentStart = False\r
+                HeaderCommentStart = False      \r
                 if Line.find(DT.TAB_BINARY_HEADER_COMMENT) > -1:\r
                     self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName) \r
                     SectionLines = []\r
                 else:\r
                     SectionLines.append((Line, LineNo))\r
-                #\r
-                # Call Header comment parser.\r
-                #\r
-                self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName)\r
-                SectionLines = []\r
-                continue\r
+                    #\r
+                    # Call Header comment parser.\r
+                    #\r
+                    self.InfHeaderParser(SectionLines, self.InfHeader, self.FileName)\r
+                    SectionLines = []\r
+                    continue\r
 \r
             #\r
             # check whether binary header comment section started\r
@@ -254,9 +254,9 @@ class InfParser(InfSectionParser):
                 BinaryHeaderStarLineNo = LineNo\r
                 SectionLines.append((Line, LineNo))\r
                 BinaryHeaderCommentStart = True\r
-                HeaderCommentEnd = True               \r
-                continue                   \r
\r
+                HeaderCommentEnd = True\r
+                continue   \r
+            \r
             #\r
             # check whether there are more than one binary header exist\r
             #\r
@@ -302,12 +302,12 @@ class InfParser(InfSectionParser):
                 SectionLines.append((Line, LineNo))\r
                 if not LastSectionFalg:\r
                     continue\r
-                        \r
+\r
             #\r
             # Encountered a section. start with '[' and end with ']'\r
             #\r
             if (Line.startswith(DT.TAB_SECTION_START) and \\r
-               Line.find(DT.TAB_SECTION_END) > -1) or LastSectionFalg:                  \r
+               Line.find(DT.TAB_SECTION_END) > -1) or LastSectionFalg:   \r
                 \r
                 HeaderCommentEnd = True        \r
                 BinaryHeaderCommentEnd = True       \r
@@ -324,13 +324,13 @@ class InfParser(InfSectionParser):
                                      File=self.FullPath,\r
                                      Line=LineNo, \r
                                      ExtraData=Line)                        \r
-                        \r
+\r
                     #\r
                     # Keep last time section header content for section parser\r
                     # usage.\r
                     #\r
                     self.LastSectionHeaderContent = deepcopy(self.SectionHeaderContent)\r
-                \r
+\r
                     #\r
                     # TailComments in section define.\r
                     #\r
@@ -357,11 +357,11 @@ class InfParser(InfSectionParser):
                     # Compare the new section name with current\r
                     #\r
                     self.SectionHeaderParser(Line, self.FileName, LineNo)\r
-                    \r
+\r
                     self._CheckSectionHeaders(Line, LineNo)\r
 \r
                     SectionType = _ConvertSecNameToType(self.SectionHeaderContent[0][0])\r
-                \r
+\r
                 if not FirstSectionStartFlag:\r
                     CurrentSection = SectionType\r
                     FirstSectionStartFlag = True\r
@@ -370,10 +370,10 @@ class InfParser(InfSectionParser):
             else:\r
                 SectionLines.append((Line, LineNo))\r
                 continue\r
-                                                        \r
+\r
             if LastSectionFalg:\r
                 SectionLines, CurrentSection = self._ProcessLastSection(SectionLines, Line, LineNo, CurrentSection)\r
-                         \r
+\r
             #\r
             # End of section content collect.\r
             # Parser the section content collected previously.\r
@@ -393,9 +393,9 @@ class InfParser(InfSectionParser):
         \r
         if HeaderStarLineNo == -1:\r
             Logger.Error("InfParser", \r
-                         FORMAT_INVALID, \r
-                         ST.ERR_NO_SOURCE_HEADER, \r
-                         File=self.FullPath)\r
+                        FORMAT_INVALID,\r
+                        ST.ERR_NO_SOURCE_HEADER,\r
+                        File=self.FullPath) \r
         if BinaryHeaderStarLineNo > -1 and HeaderStarLineNo > -1  and HeaderStarLineNo > BinaryHeaderStarLineNo:\r
             Logger.Error("InfParser", \r
                         FORMAT_INVALID,\r
index 7058e69da1c1a08e5e5cb1d8e78169f1b70fc4f9..a416897d27ae014179fa12e98b37c7693b7474d5 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the miscellaneous functions for INF parser \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -82,6 +82,10 @@ def InfExpandMacro(Content, LineInfo, GlobalMacros=None, SectionMacros=None, Fla
     LineContent = LineInfo[1]\r
     LineNo = LineInfo[2]\r
     \r
+    # Don't expand macros in comments\r
+    if LineContent.strip().startswith("#"):\r
+        return Content\r
+\r
     NewLineInfo = (FileName, LineNo, LineContent)\r
     \r
     #\r
index 1011559450f8316806da0063f9bfccae85b8dcc3..f4324cc2ff1be69ad03848e8f9ab3236a49c8e83 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the parser for [Pcds] sections in INF file \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -160,13 +160,13 @@ class InfPcdSectionParser(InfParserSectionRoot):
                                      ExtraData=LineContent)\r
                 #                    \r
                 elif KeysList[0][0].upper() == DT.TAB_INF_PCD_EX.upper():\r
-                    if len(TokenList) != 2:\r
+                    if len(TokenList) != 1:\r
                         Logger.Error('InfParser', \r
                                      FORMAT_INVALID, \r
                                      ST.ERR_ASBUILD_PCDEX_FORMAT_INVALID,\r
                                      File=FileName,\r
                                      Line=LineNo,\r
-                                     ExtraData=LineContent)                                         \r
+                                     ExtraData=LineContent)\r
                 ValueList[0:len(TokenList)] = TokenList\r
                 if len(ValueList) >= 1:                \r
                     PcdList.append((ValueList, CommentsList, (LineContent, LineNo, FileName)))                  \r
index 879f924c45760073fd9f586ff7fee056becc5a8b..727164c2c244954eac5f55f484d6c45f0ed5dc7c 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contained the parser for sections in INF file \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -239,6 +239,7 @@ class InfSectionParser(InfDefinSectionParser,
         self.InfSmmDepexSection = InfDepexObject()\r
         self.InfBinariesSection = InfBinariesObject()\r
         self.InfHeader = InfHeaderObject()\r
+        self.InfBinaryHeader = InfHeaderObject()\r
         self.InfSpecialCommentSection = InfSpecialCommentObject()\r
 \r
         #\r
@@ -253,8 +254,16 @@ class InfSectionParser(InfDefinSectionParser,
     #\r
     # File Header content parser\r
     #    \r
-    def InfHeaderParser(self, Content, InfHeaderObject2, FileName):\r
-        (Abstract, Description, Copyright, License) = ParseHeaderCommentSection(Content, FileName)\r
+    def InfHeaderParser(self, Content, InfHeaderObject2, FileName, IsBinaryHeader = False):\r
+        if IsBinaryHeader:\r
+            (Abstract, Description, Copyright, License) = ParseHeaderCommentSection(Content, FileName, True)\r
+            if not Abstract or not Description or not Copyright or not License:\r
+                Logger.Error('Parser',\r
+                             FORMAT_INVALID,\r
+                             ST.ERR_INVALID_BINARYHEADER_FORMAT,\r
+                             File=FileName)\r
+        else:\r
+            (Abstract, Description, Copyright, License) = ParseHeaderCommentSection(Content, FileName)\r
         #\r
         # Not process file name now, for later usage.\r
         #\r
index cb8aa187881bbc1ef1e59bb794e346cdc99ca9e2..11b0359176c60bc284d6f37b1efa15f60a4da973 100644 (file)
@@ -1,7 +1,7 @@
 ## @file DecPomAlignment.py\r
 # This file contained the adapter for convert INF parser object to POM Object\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -23,9 +23,11 @@ import os.path
 from os import sep\r
 import platform\r
 \r
+import re\r
 import Logger.Log as Logger\r
 from Logger import StringTable as ST\r
 from Logger.ToolError import UPT_MUL_DEC_ERROR\r
+from Logger.ToolError import FORMAT_INVALID\r
 \r
 from Library.Parsing import NormPath\r
 from Library.DataType import ARCH_LIST\r
@@ -36,10 +38,9 @@ from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID\r
 from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION\r
 from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION\r
+from Library.DataType import TAB_DEC_DEFINES_PKG_UNI_FILE\r
 from Library.DataType import TAB_ARCH_COMMON\r
-from Library.CommentParsing import ParseHeaderCommentSection\r
 from Library.DataType import TAB_INCLUDES\r
-from Library.CommentParsing import ParseGenericComment\r
 from Library.DataType import TAB_LIBRARY_CLASSES\r
 from Library.DataType import TAB_PCDS\r
 from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL\r
@@ -49,12 +50,33 @@ from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL
 from Library.DataType import TAB_PCDS_DYNAMIC_NULL\r
 from Library.DataType import TAB_PTR_TYPE_PCD\r
 from Library.DataType import ITEM_UNDEFINED\r
+from Library.DataType import TAB_DEC_BINARY_ABSTRACT\r
+from Library.DataType import TAB_DEC_BINARY_DESCRIPTION\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
+from Library.DataType import TAB_BINARY_HEADER_IDENTIFIER\r
+from Library.DataType import TAB_BINARY_HEADER_USERID\r
+from Library.DataType import TAB_LANGUAGE_EN_X\r
+from Library.DataType import TAB_LANGUAGE_EN\r
+from Library.DataType import TAB_STR_TOKENCNAME\r
+from Library.DataType import TAB_STR_TOKENPROMPT\r
+from Library.DataType import TAB_STR_TOKENHELP\r
+from Library.DataType import TAB_STR_TOKENERR\r
+from Library.DataType import TAB_HEX_START\r
+from Library.DataType import TAB_SPLIT\r
+from Library.CommentParsing import ParseHeaderCommentSection\r
+from Library.CommentParsing import ParseGenericComment\r
 from Library.CommentParsing import ParseDecPcdGenericComment\r
 from Library.CommentParsing import ParseDecPcdTailComment\r
 from Library.Misc import GetFiles\r
 from Library.Misc import Sdict\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import PathClass\r
+from Library.Misc import ValidateUNIFilePath\r
+from Library.UniClassObject import UniFileClassObject\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
+from Library.ParserValidate import IsValidPath\r
 from Parser.DecParser import Dec\r
-\r
 from Object.POM.PackageObject import PackageObject\r
 from Object.POM.CommonObject import UserExtensionObject\r
 from Object.POM.CommonObject import IncludeObject\r
@@ -64,6 +86,8 @@ from Object.POM.CommonObject import PpiObject
 from Object.POM.CommonObject import LibraryClassObject\r
 from Object.POM.CommonObject import PcdObject\r
 from Object.POM.CommonObject import TextObject\r
+from Object.POM.CommonObject import MiscFileObject\r
+from Object.POM.CommonObject import FileObject\r
 \r
 \r
 ## DecPomAlignment\r
@@ -78,6 +102,8 @@ class DecPomAlignment(PackageObject):
         self.SupArchList = ARCH_LIST\r
         self.CheckMulDec = CheckMulDec\r
         self.DecParser = None\r
+        self.UniFileClassObject = None\r
+        self.PcdDefaultValueDict = {}\r
         \r
         #\r
         # Load Dec file\r
@@ -104,8 +130,8 @@ class DecPomAlignment(PackageObject):
         self.SetFullPath(Filename)\r
         self.SetRelaPath(Path)\r
         self.SetFileName(Name)\r
-        self.SetPackagePath(Path[Path.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
-        self.SetCombinePath(Filename[Filename.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])\r
+        self.SetPackagePath(GetRelativePath(Path, self.WorkspaceDir))   \r
+        self.SetCombinePath(GetRelativePath(Filename, self.WorkspaceDir))\r
         \r
         self.DecParser = Dec(Filename)\r
     \r
@@ -164,8 +190,8 @@ class DecPomAlignment(PackageObject):
         # Generate user extensions\r
         #\r
         self.GenUserExtensions()\r
-    \r
-    ## Generate user extention\r
+        \r
+    ## Generate user extension\r
     #\r
     #\r
     def GenUserExtensions(self):\r
@@ -182,6 +208,11 @@ class DecPomAlignment(PackageObject):
             Identifier = Item.IdString\r
             if Identifier.startswith('"') and Identifier.endswith('"'):\r
                 Identifier = Identifier[1:-1]\r
+            #\r
+            # Generate miscellaneous files of DEC file\r
+            #\r
+            if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
+                self.GenMiscFiles(Item.UserString)\r
             UserExtension.SetIdentifier(Identifier)\r
             UserExtension.SetStatement(Item.UserString)\r
             UserExtension.SetSupArchList(\r
@@ -190,7 +221,31 @@ class DecPomAlignment(PackageObject):
             self.SetUserExtensionList(\r
                 self.GetUserExtensionList() + [UserExtension]\r
             )\r
-    \r
+            \r
+    ## Generate miscellaneous files on DEC file\r
+    #\r
+    #\r
+    def GenMiscFiles(self, Content):\r
+        MiscFileObj = MiscFileObject()\r
+        for Line in Content.splitlines():\r
+            FileName = ''\r
+            if '#' in Line:\r
+                FileName = Line[:Line.find('#')]\r
+            else:\r
+                FileName = Line\r
+            if FileName:\r
+                if IsValidPath(FileName, self.GetRelaPath()):\r
+                    FileObj = FileObject()\r
+                    FileObj.SetURI(FileName)\r
+                    MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
+                else:\r
+                    Logger.Error("InfParser", \r
+                                 FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
+                                 File=self.GetFileName(),\r
+                                 ExtraData=Line)   \r
+        self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
+        \r
     ## Generate Package Header\r
     #\r
     # Gen Package Header of Dec as <Key> = <Value>\r
@@ -210,7 +265,8 @@ class DecPomAlignment(PackageObject):
             # put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION\r
             #\r
             SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \\r
-                TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, TAB_DEC_DEFINES_DEC_SPECIFICATION]\r
+                TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, \\r
+                TAB_DEC_DEFINES_DEC_SPECIFICATION, TAB_DEC_DEFINES_PKG_UNI_FILE]\r
             if Item.Key in SkipItemList:\r
                 continue\r
             DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON\r
@@ -221,6 +277,12 @@ class DecPomAlignment(PackageObject):
 #                     DefObj.GetPackageVersion())\r
         self.SetName(os.path.splitext(self.GetFileName())[0])\r
         self.SetGuid(DefObj.GetPackageGuid())\r
+        if DefObj.GetPackageUniFile():\r
+            ValidateUNIFilePath(DefObj.GetPackageUniFile())\r
+            self.UniFileClassObject = \\r
+            UniFileClassObject([PathClass(os.path.join(DefObj.GetPackagePath(), DefObj.GetPackageUniFile()))])\r
+        else:\r
+            self.UniFileClassObject = None\r
      \r
         if DefinesDict:\r
             UserExtension = UserExtensionObject()\r
@@ -232,16 +294,80 @@ class DecPomAlignment(PackageObject):
             )\r
 \r
         #\r
-        # Get All header comment section information\r
+        # Get File header information\r
         #\r
+        if self.UniFileClassObject:\r
+            Lang = TAB_LANGUAGE_EN_X\r
+        else:\r
+            Lang = TAB_LANGUAGE_EN_US\r
         Abstract, Description, Copyright, License = \\r
             ParseHeaderCommentSection(self.DecParser.GetHeadComment(),\r
                                       ContainerFile)\r
-        self.SetAbstract(Abstract)\r
-        self.SetDescription(Description)\r
-        self.SetCopyright(Copyright)\r
-        self.SetLicense(License)\r
+        if Abstract:\r
+            self.SetAbstract((Lang, Abstract))\r
+        if Description:\r
+            self.SetDescription((Lang, Description))\r
+        if Copyright:\r
+            self.SetCopyright(('', Copyright))\r
+        if License:\r
+            self.SetLicense(('', License))\r
     \r
+        #\r
+        # Get Binary header information\r
+        #\r
+        if self.DecParser.BinaryHeadComment:\r
+            Abstract, Description, Copyright, License = \\r
+                ParseHeaderCommentSection(self.DecParser.BinaryHeadComment,\r
+                                      ContainerFile, True)\r
+                \r
+            if not Abstract  or not Description or not Copyright or not License:\r
+                Logger.Error('MkPkg',\r
+                             FORMAT_INVALID,\r
+                             ST.ERR_INVALID_BINARYHEADER_FORMAT,\r
+                             ContainerFile)\r
+            else:\r
+                self.SetBinaryHeaderAbstract((Lang, Abstract))\r
+                self.SetBinaryHeaderDescription((Lang, Description))\r
+                self.SetBinaryHeaderCopyright(('', Copyright))\r
+                self.SetBinaryHeaderLicense(('', License))\r
+\r
+        BinaryAbstractList = []\r
+        BinaryDescriptionList = []\r
+        \r
+        #Get Binary header from UNI file\r
+        # Initialize the UniStrDict dictionary, top keys are language codes\r
+        UniStrDict = {}\r
+        if self.UniFileClassObject:\r
+            UniStrDict = self.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    Lang = GetLanguageCode1766(Lang)\r
+                    if StringDefClassObject.StringName == TAB_DEC_BINARY_ABSTRACT:\r
+                        if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+                        not in self.GetBinaryHeaderAbstract():\r
+                            BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+                    if StringDefClassObject.StringName == TAB_DEC_BINARY_DESCRIPTION:\r
+                        if (Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)) \\r
+                        not in self.GetBinaryHeaderDescription():\r
+                            BinaryDescriptionList.append((Lang, \r
+                                                          ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+        #Combine Binary header from DEC file and UNI file\r
+        BinaryAbstractList = self.GetBinaryHeaderAbstract() + BinaryAbstractList\r
+        BinaryDescriptionList = self.GetBinaryHeaderDescription() + BinaryDescriptionList\r
+        BinaryCopyrightList = self.GetBinaryHeaderCopyright()\r
+        BinaryLicenseList = self.GetBinaryHeaderLicense()\r
+        #Generate the UserExtensionObject for TianoCore."BinaryHeader"\r
+        if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
+            BinaryUserExtension = UserExtensionObject()\r
+            BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
+            BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
+            BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
+            BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
+            BinaryUserExtension.SetIdentifier(TAB_BINARY_HEADER_IDENTIFIER)\r
+            BinaryUserExtension.SetUserID(TAB_BINARY_HEADER_USERID)\r
+            self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
+            \r
+            \r
     ## GenIncludes\r
     #\r
     # Gen Includes of Dec\r
@@ -257,7 +383,7 @@ class DecPomAlignment(PackageObject):
         IncObj = self.DecParser.GetIncludeSectionObject()\r
         for Item in IncObj.GetAllIncludes():\r
             IncludePath = os.path.normpath(Item.File)\r
-            if platform.system() != 'Windows':\r
+            if platform.system() != 'Windows' and platform.system() != 'Microsoft':\r
                 IncludePath = IncludePath.replace('\\', '/')\r
             if IncludePath in IncludesDict:\r
                 if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:\r
@@ -401,6 +527,8 @@ class DecPomAlignment(PackageObject):
             ListObject.SetGuid(Value)\r
             ListObject.SetSupArchList(Item.GetArchList())\r
             if HelpTxt:\r
+                if self.UniFileClassObject:\r
+                    HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
                 ListObject.SetHelpTextList([HelpTxt])\r
             \r
             DeclarationsList.append(ListObject)\r
@@ -437,6 +565,8 @@ class DecPomAlignment(PackageObject):
             HelpTxt = ParseGenericComment(Item.GetHeadComment() + \\r
                                           Item.GetTailComment(), None, '@libraryclass')\r
             if HelpTxt:\r
+                if self.UniFileClassObject:\r
+                    HelpTxt.SetLang(TAB_LANGUAGE_EN_X)\r
                 LibraryClass.SetHelpTextList([HelpTxt])\r
             LibraryClassDeclarations.append(LibraryClass)\r
         \r
@@ -452,7 +582,6 @@ class DecPomAlignment(PackageObject):
     #\r
     def GenPcds(self, ContainerFile):\r
         Logger.Debug(2, "Generate %s ..." % TAB_PCDS)\r
-        \r
         PcdObj = self.DecParser.GetPcdSectionObject()\r
         #\r
         # Get all Pcds\r
@@ -464,6 +593,37 @@ class DecPomAlignment(PackageObject):
             (TAB_PCDS_FEATURE_FLAG_NULL,        'FeaturePcd'),\r
             (TAB_PCDS_DYNAMIC_EX_NULL,          'PcdEx'), \r
             (TAB_PCDS_DYNAMIC_NULL,             'Pcd')]\r
+        \r
+        PromptStrList = []\r
+        HelpStrList = []\r
+        PcdErrStrList = []\r
+        # Initialize UniStrDict dictionary, top keys are language codes\r
+        UniStrDict = {}\r
+        StrList = []\r
+        \r
+        Language = ''\r
+        if self.UniFileClassObject:\r
+            Language = TAB_LANGUAGE_EN_X\r
+        else:\r
+            Language = TAB_LANGUAGE_EN_US\r
+            \r
+        if self.UniFileClassObject:\r
+            UniStrDict = self.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    StrList = StringDefClassObject.StringName.split('_')\r
+                    # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_PROMPT\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENPROMPT:\r
+                        PromptStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                              StringDefClassObject.StringValue))\r
+                    # StringName format is STR_<TOKENSPACECNAME>_<PCDCNAME>_HELP\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[3] == TAB_STR_TOKENHELP:\r
+                        HelpStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                            StringDefClassObject.StringValue))\r
+                    # StringName format is STR_<TOKENSPACECNAME>_ERR_##\r
+                    if len(StrList) == 4 and StrList[0] == TAB_STR_TOKENCNAME and StrList[2] == TAB_STR_TOKENERR:\r
+                        PcdErrStrList.append((GetLanguageCode1766(Lang), StringDefClassObject.StringName, \\r
+                                              StringDefClassObject.StringValue))\r
         #\r
         # For each PCD type\r
         #\r
@@ -478,15 +638,234 @@ class DecPomAlignment(PackageObject):
                         ContainerFile,\r
                         (Item.TokenSpaceGuidCName, Item.TokenCName,\r
                         Item.DefaultValue, Item.DatumType, Item.TokenValue,\r
-                        Type, Item.GetHeadComment(), Item.GetTailComment(),\r
-                        '')\r
-                    )\r
+                        Type, Item.GetHeadComment(), Item.GetTailComment(),''),\r
+                        Language,\r
+                        self.DecParser.GetDefineSectionMacro()\r
+                        )\r
                 PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))\r
+                \r
+                #\r
+                # Get PCD error message from PCD error comment section in DEC file\r
+                #\r
+                for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                    if (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber()) \\r
+                        in self.DecParser.PcdErrorCommentDict:\r
+                        Key = (PcdDeclaration.GetTokenSpaceGuidCName(), PcdErr.GetErrorNumber())\r
+                        PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+                                                      [(Language, self.DecParser.PcdErrorCommentDict[Key])])\r
+                \r
+                for Index in range(0, len(PromptStrList)):\r
+                    StrNameList = PromptStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                    StrNameList[2].lower() == Item.TokenCName.lower():\r
+                        TxtObj = TextObject()\r
+                        TxtObj.SetLang(PromptStrList[Index][0])\r
+                        TxtObj.SetString(PromptStrList[Index][2])\r
+                        for Prompt in PcdDeclaration.GetPromptList():\r
+                            if Prompt.GetLang() == TxtObj.GetLang() and \\r
+                                Prompt.GetString() == TxtObj.GetString():\r
+                                break\r
+                        else:\r
+                            PcdDeclaration.SetPromptList(PcdDeclaration.GetPromptList() + [TxtObj])\r
+                        \r
+                for Index in range(0, len(HelpStrList)):\r
+                    StrNameList = HelpStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                    StrNameList[2].lower() == Item.TokenCName.lower():\r
+                        TxtObj = TextObject()\r
+                        TxtObj.SetLang(HelpStrList[Index][0])\r
+                        TxtObj.SetString(HelpStrList[Index][2])\r
+                        for HelpStrObj in PcdDeclaration.GetHelpTextList():\r
+                            if HelpStrObj.GetLang() == TxtObj.GetLang() and \\r
+                                HelpStrObj.GetString() == TxtObj.GetString():\r
+                                break\r
+                        else:\r
+                            PcdDeclaration.SetHelpTextList(PcdDeclaration.GetHelpTextList() + [TxtObj])\r
+\r
+                #\r
+                # Get PCD error message from UNI file\r
+                #\r
+                for Index in range(0, len(PcdErrStrList)):\r
+                    StrNameList = PcdErrStrList[Index][1].split('_')\r
+                    if StrNameList[1].lower() == Item.TokenSpaceGuidCName.lower() and \\r
+                        StrNameList[2].lower() == TAB_STR_TOKENERR.lower():\r
+                        for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                            if PcdErr.GetErrorNumber().lower() == (TAB_HEX_START + StrNameList[3]).lower() and \\r
+                                (PcdErrStrList[Index][0], PcdErrStrList[Index][2]) not in PcdErr.GetErrorMessageList():\r
+                                PcdErr.SetErrorMessageList(PcdErr.GetErrorMessageList() + \\r
+                                                            [(PcdErrStrList[Index][0], PcdErrStrList[Index][2])])\r
+                              \r
+                #\r
+                # Check to prevent missing error message if a Pcd has the error code.\r
+                #\r
+                for PcdErr in PcdDeclaration.GetPcdErrorsList():\r
+                    if PcdErr.GetErrorNumber().strip():\r
+                        if not PcdErr.GetErrorMessageList():\r
+                            Logger.Error('UPT',\r
+                                         FORMAT_INVALID,\r
+                                         ST.ERR_DECPARSE_PCD_UNMATCHED_ERRORCODE % PcdErr.GetErrorNumber(),\r
+                                         ContainerFile,\r
+                                         PcdErr.GetLineNum(),\r
+                                         PcdErr.GetFileLine())                        \r
+                    \r
                 PcdDeclarations.append(PcdDeclaration)\r
-  \r
         self.SetPcdList(self.GetPcdList() + PcdDeclarations)\r
+        self.CheckPcdValue()\r
+        \r
+    ##\r
+    # Get error message via language\r
+    # @param ErrorMessageList: Error message tuple list the language and its message\r
+    # @param Lang: the language of setting\r
+    # @return: the error message described in the related UNI file\r
+    def GetEnErrorMessage(self, ErrorMessageList):\r
+        if self.FullPath:\r
+            pass\r
+        Lang = TAB_LANGUAGE_EN_US\r
+        for (Language, Message) in ErrorMessageList:\r
+            if Language == Lang:\r
+                return Message\r
+        for (Language, Message) in ErrorMessageList:\r
+            if Language.find(TAB_LANGUAGE_EN) >= 0:\r
+                return Message\r
+        else:\r
+            try:\r
+                return ErrorMessageList[0][1]\r
+            except IndexError:\r
+                return ''\r
+        return ''    \r
+        \r
+    ##\r
+    # Replace the strings for Python eval function.\r
+    # @param ReplaceValue: The string that needs to be replaced. \r
+    # @return: The string was replaced, then eval function is always making out it.     \r
+    def ReplaceForEval(self, ReplaceValue, IsRange=False, IsExpr=False):\r
+        if self.FullPath:\r
+            pass\r
+        #\r
+        # deal with "NOT EQ", "NOT LT", "NOT GT", "NOT LE", "NOT GE", "NOT NOT" \r
+        #\r
+        NOTNOT_Pattern = '[\t\s]*NOT[\t\s]+NOT[\t\s]*'\r
+        NOTGE_Pattern = '[\t\s]*NOT[\t\s]+GE[\t\s]*'\r
+        NOTLE_Pattern = '[\t\s]*NOT[\t\s]+LE[\t\s]*'\r
+        NOTGT_Pattern = '[\t\s]*NOT[\t\s]+GT[\t\s]*'\r
+        NOTLT_Pattern = '[\t\s]*NOT[\t\s]+LT[\t\s]*'\r
+        NOTEQ_Pattern = '[\t\s]*NOT[\t\s]+EQ[\t\s]*'\r
+        ReplaceValue = re.compile(NOTNOT_Pattern).sub('', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTLT_Pattern).sub('x >= ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTGT_Pattern).sub('x <= ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTLE_Pattern).sub('x > ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTGE_Pattern).sub('x < ', ReplaceValue)\r
+        ReplaceValue = re.compile(NOTEQ_Pattern).sub('x != ', ReplaceValue)\r
+        \r
+        if IsRange:\r
+            ReplaceValue = ReplaceValue.replace('EQ', 'x ==')\r
+            ReplaceValue = ReplaceValue.replace('LT', 'x <')\r
+            ReplaceValue = ReplaceValue.replace('LE', 'x <=')\r
+            ReplaceValue = ReplaceValue.replace('GT', 'x >')\r
+            ReplaceValue = ReplaceValue.replace('GE', 'x >=')\r
+            ReplaceValue = ReplaceValue.replace('XOR', 'x ^')\r
+        elif IsExpr:\r
+            ReplaceValue = ReplaceValue.replace('EQ', '==')\r
+            ReplaceValue = ReplaceValue.replace('NE', '!=')\r
+            ReplaceValue = ReplaceValue.replace('LT', '<')\r
+            ReplaceValue = ReplaceValue.replace('LE', '<=')\r
+            ReplaceValue = ReplaceValue.replace('GT', '>')\r
+            ReplaceValue = ReplaceValue.replace('GE', '>=')  \r
+            ReplaceValue = ReplaceValue.replace('XOR', '^')  \r
+            \r
+        ReplaceValue = ReplaceValue.replace('AND', 'and')\r
+        ReplaceValue = ReplaceValue.replace('&&', ' and ')\r
+        ReplaceValue = ReplaceValue.replace('xor', '^')\r
+        ReplaceValue = ReplaceValue.replace('OR', 'or')\r
+        ReplaceValue = ReplaceValue.replace('||', ' or ')\r
+        ReplaceValue = ReplaceValue.replace('NOT', 'not')\r
+        if ReplaceValue.find('!') >= 0 and ReplaceValue[ReplaceValue.index('!') + 1] != '=':\r
+            ReplaceValue = ReplaceValue.replace('!', ' not ')        \r
+        if '.' in ReplaceValue:\r
+            Pattern = '[a-zA-Z0-9]{1,}\.[a-zA-Z0-9]{1,}'\r
+            MatchedList = re.findall(Pattern, ReplaceValue)\r
+            for MatchedItem in MatchedList:\r
+                if MatchedItem not in self.PcdDefaultValueDict:\r
+                    Logger.Error("Dec File Parser", FORMAT_INVALID, Message=ST.ERR_DECPARSE_PCD_NODEFINED % MatchedItem,\r
+                                     File=self.FullPath)\r
+                    \r
+                ReplaceValue = ReplaceValue.replace(MatchedItem, self.PcdDefaultValueDict[MatchedItem])\r
+\r
+        return ReplaceValue\r
+\r
+    ##\r
+    # Check pcd's default value according to the pcd's description\r
+    #\r
+    def CheckPcdValue(self):\r
+        for Pcd in self.GetPcdList():\r
+            self.PcdDefaultValueDict[TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName())).strip()] = \\r
+            Pcd.GetDefaultValue()\r
+        \r
+        for Pcd in self.GetPcdList():\r
+            ValidationExpressions = []\r
+            PcdGuidName = TAB_SPLIT.join((Pcd.GetTokenSpaceGuidCName(), Pcd.GetCName()))\r
+            Valids = Pcd.GetPcdErrorsList()\r
+            for Valid in Valids:\r
+                Expression = Valid.GetExpression()\r
+                if Expression:\r
+                    #\r
+                    # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+                    #\r
+                    QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+                    QuotedMatchedObj = re.search(QUOTED_PATTERN, Expression)\r
+                    if QuotedMatchedObj:\r
+                        MatchedStr = QuotedMatchedObj.group().strip()\r
+                        if MatchedStr.startswith('L'):\r
+                            Expression = Expression.replace(MatchedStr, MatchedStr[1:].strip())  \r
+\r
+                    Expression = self.ReplaceForEval(Expression, IsExpr=True)\r
+                    Expression = Expression.replace(PcdGuidName, 'x')\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((Expression, Message))                   \r
+                \r
+                ValidList = Valid.GetValidValue()\r
+                if ValidList:\r
+                    ValidValue = 'x in %s' % [eval(v) for v in ValidList.split(' ') if v]\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((ValidValue, Message))\r
+                    \r
+                ValidValueRange = Valid.GetValidValueRange()                \r
+                if ValidValueRange:\r
+                    ValidValueRange = self.ReplaceForEval(ValidValueRange, IsRange=True)\r
+                    if ValidValueRange.find('-') >= 0:\r
+                        ValidValueRange = ValidValueRange.replace('-', '<= x <=')\r
+                    elif not ValidValueRange.startswith('x ') and not ValidValueRange.startswith('not ') \\r
+                        and not ValidValueRange.startswith('not(') and not ValidValueRange.startswith('('):\r
+                        ValidValueRange = 'x %s' % ValidValueRange\r
+                    Message = self.GetEnErrorMessage(Valid.GetErrorMessageList())\r
+                    ValidationExpressions.append((ValidValueRange, Message))\r
+                    \r
+            DefaultValue = self.PcdDefaultValueDict[PcdGuidName.strip()]\r
+            #\r
+            # Delete the 'L' prefix of a quoted string, this operation is for eval()\r
+            #\r
+            QUOTED_PATTERN = '[\t\s]*L?"[^"]*"'\r
+            QuotedMatchedObj = re.search(QUOTED_PATTERN, DefaultValue)\r
+            if QuotedMatchedObj:\r
+                MatchedStr = QuotedMatchedObj.group().strip()\r
+                if MatchedStr.startswith('L'):\r
+                    DefaultValue = DefaultValue.replace(MatchedStr, MatchedStr[1:].strip())\r
+                    \r
+            try:\r
+                DefaultValue = eval(DefaultValue.replace('TRUE', 'True').replace('true', 'True')\r
+                                        .replace('FALSE', 'False').replace('false', 'False'))\r
+            except BaseException:\r
+                pass\r
+\r
+            for (Expression, Msg) in ValidationExpressions:\r
+                try:\r
+                    if not eval(Expression, {'x':DefaultValue}):\r
+                        Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData='%s, value = %s' %\\r
+                                     (PcdGuidName, DefaultValue), Message=Msg, File=self.FullPath)\r
+                except TypeError:\r
+                    Logger.Error("Dec File Parser", FORMAT_INVALID, ExtraData=PcdGuidName, \\r
+                                    Message=Msg, File=self.FullPath)\r
 \r
-    \r
     ## GenModuleFileList\r
     #\r
     def GenModuleFileList(self, ContainerFile):        \r
@@ -562,9 +941,11 @@ class DecPomAlignment(PackageObject):
 # @param PcdInfo:         Pcd information, of format (TokenGuidCName, \r
 #                         TokenName, Value, DatumType, Token, Type, \r
 #                         GenericComment, TailComment, Arch)\r
+# @param Language: The language of HelpText, Prompt \r
 # \r
-def GenPcdDeclaration(ContainerFile, PcdInfo):\r
+def GenPcdDeclaration(ContainerFile, PcdInfo, Language, MacroReplaceDict):\r
     HelpStr = ''\r
+    PromptStr = ''\r
     TailHelpStr = ''\r
     TokenGuidCName, TokenName, Value, DatumType, Token, Type, \\r
         GenericComment, TailComment, Arch = PcdInfo\r
@@ -585,10 +966,13 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
     Pcd.SetSupArchList(SupArchList)\r
     \r
     if GenericComment:\r
-        HelpStr, PcdErr = ParseDecPcdGenericComment(GenericComment, \r
-                                                    ContainerFile)\r
-        if PcdErr:\r
-            Pcd.SetPcdErrorsList([PcdErr])\r
+        HelpStr, PcdErrList, PromptStr = ParseDecPcdGenericComment(GenericComment, \r
+                                                                   ContainerFile, \r
+                                                                   TokenGuidCName, \r
+                                                                   TokenName,\r
+                                                                   MacroReplaceDict)\r
+        if PcdErrList:\r
+            Pcd.SetPcdErrorsList(PcdErrList)\r
 \r
     if TailComment:\r
         SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment, \r
@@ -600,8 +984,14 @@ def GenPcdDeclaration(ContainerFile, PcdInfo):
         HelpStr += '\n'\r
     HelpStr += TailHelpStr\r
     if HelpStr:\r
-        HelpTxtObj = TextObject()   \r
+        HelpTxtObj = TextObject()\r
+        HelpTxtObj.SetLang(Language)   \r
         HelpTxtObj.SetString(HelpStr)\r
         Pcd.SetHelpTextList([HelpTxtObj])\r
+    if PromptStr:\r
+        TxtObj = TextObject()\r
+        TxtObj.SetLang(Language)\r
+        TxtObj.SetString(PromptStr)\r
+        Pcd.SetPromptList([TxtObj])\r
 \r
     return Pcd\r
index a4a3107366ea9dd17519bd0c46919a4eb9b75291..fa5f5af0e2126e74bc795f2dd5425e63564900e9 100644 (file)
@@ -1,7 +1,7 @@
 ## @file InfPomAlignment.py\r
 # This file contained the adapter for convert INF parser object to POM Object\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -18,10 +18,8 @@ InfPomAlignment
 # Import modules\r
 #\r
 import os.path\r
-\r
 from Logger import StringTable as ST\r
 import Logger.Log as Logger\r
-\r
 from Library.String import FORMAT_INVALID\r
 from Library.String import PARSER_ERROR\r
 from Library.String import NormPath\r
@@ -29,10 +27,15 @@ from Library.String import GetSplitValueList
 from Library.Misc import ConvertVersionToDecimal\r
 from Library.Misc import GetHelpStringByRemoveHashKey\r
 from Library.Misc import ConvertArchList\r
+from Library.Misc import GetRelativePath\r
+from Library.Misc import PathClass\r
 from Library.Parsing import GetPkgInfoFromDec\r
+from Library.UniClassObject import UniFileClassObject\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
 from Library import DataType as DT\r
 from Library import GlobalData\r
-\r
+from Library.ParserValidate import IsValidPath\r
 from Object.POM import CommonObject\r
 from Object.POM.ModuleObject import ModuleObject\r
 from Object.POM.ModuleObject import ExternObject\r
@@ -47,7 +50,7 @@ from Object.POM.ModuleObject import AsBuiltObject
 from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt\r
 from PomAdapter.InfPomAlignmentMisc import GenBinaryData\r
 from Parser import InfParser\r
-\r
+from PomAdapter.DecPomAlignment import DecPomAlignment\r
 \r
 \r
 ## InfPomAlignment\r
@@ -62,7 +65,6 @@ class InfPomAlignment(ModuleObject):
     #\r
     def __init__(self, FileName, WorkSpace=None, PackagePath='', Skip=False):\r
         ModuleObject.__init__(self)\r
-\r
         self.Parser = None\r
         self.FileName = FileName\r
         self.WorkSpace = WorkSpace\r
@@ -72,7 +74,7 @@ class InfPomAlignment(ModuleObject):
         self.ModulePath = ''\r
         self.WorkspaceDir = " "\r
         self.CustomMakefile = []\r
-\r
+        self.UniFileClassObject = None\r
         self.SetPackagePath(PackagePath)\r
         #\r
         # Call GenInfPomObjects function to fill POM object.\r
@@ -80,8 +82,10 @@ class InfPomAlignment(ModuleObject):
         if Skip:\r
             OrigConfig = Logger.SUPRESS_ERROR\r
             Logger.SUPRESS_ERROR = True\r
-            self._GenInfPomObjects(Skip)\r
-            Logger.SUPRESS_ERROR = OrigConfig\r
+            try:\r
+                self._GenInfPomObjects(Skip)\r
+            finally:\r
+                Logger.SUPRESS_ERROR = OrigConfig\r
         else:\r
             self._GenInfPomObjects(Skip)\r
 \r
@@ -111,7 +115,6 @@ class InfPomAlignment(ModuleObject):
         self._GenGuidProtocolPpis(DT.TAB_PROTOCOLS)\r
         self._GenGuidProtocolPpis(DT.TAB_PPIS)\r
         self._GenDepexes()\r
-        self._GenMiscFiles(self.FullPath, Skip)\r
 \r
     ## Convert [Defines] section content to InfDefObject\r
     #\r
@@ -134,7 +137,6 @@ class InfPomAlignment(ModuleObject):
         ArchList = GetSplitValueList(ArchString, ' ')\r
         ArchList = ConvertArchList(ArchList)\r
         HasCalledFlag = False\r
-\r
         #\r
         # Get data from Sdict()\r
         #\r
@@ -147,26 +149,21 @@ class InfPomAlignment(ModuleObject):
         # ModuleSurfaceArea.Header.Name element\r
         #\r
         self.SetName(os.path.splitext(os.path.basename(self.FileName))[0])\r
-\r
         self.WorkspaceDir = " "\r
         #\r
         # CombinePath and ModulePath\r
         #\r
-        PathCount = self.FullPath.upper().find(self.WorkSpace.upper()) + len(self.WorkSpace) + 1\r
-        CombinePath = self.FullPath[PathCount:]\r
+        CombinePath = GetRelativePath(self.FullPath, self.WorkSpace)\r
         self.SetCombinePath(CombinePath)\r
-\r
         ModulePath = os.path.split(CombinePath)[0]\r
         ModuleRelativePath = ModulePath\r
         if self.GetPackagePath() != '':\r
-            ModuleRelativePath = ModulePath[ModulePath.find(self.GetPackagePath()) + len(self.GetPackagePath()) + 1:]\r
+            ModuleRelativePath = GetRelativePath(ModulePath, self.GetPackagePath())\r
         self.SetModulePath(ModuleRelativePath)\r
-\r
         #\r
         # For Define Seciton Items.\r
         #\r
         DefineObj = ValueList\r
-\r
         #\r
         # Convert UEFI/PI version to decimal number\r
         #\r
@@ -179,7 +176,6 @@ class InfPomAlignment(ModuleObject):
             __PiVersion = ConvertVersionToDecimal(__PiVersion)\r
 \r
             self.SetPiSpecificationVersion(str(__PiVersion))\r
-\r
         SpecList = DefineObj.GetSpecification()\r
         NewSpecList = []\r
         for SpecItem in SpecList:\r
@@ -214,6 +210,10 @@ class InfPomAlignment(ModuleObject):
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("BASE_NAME"), File=self.FullPath)\r
         else:\r
             self.SetBaseName(DefineObj.GetBaseName().GetValue())\r
+        if DefineObj.GetModuleUniFileName():\r
+            self.UniFileClassObject = UniFileClassObject([PathClass(DefineObj.GetModuleUniFileName())])\r
+        else:\r
+            self.UniFileClassObject = None\r
         if DefineObj.GetInfVersion() == None:\r
             Logger.Error("InfParser", FORMAT_INVALID,\r
                          ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath)\r
@@ -247,7 +247,6 @@ class InfPomAlignment(ModuleObject):
                 #\r
                 Logger.Error("Parser", PARSER_ERROR, ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, ExtraData=self.FullPath,\r
                              RaiseError=Logger.IS_RAISE_ERROR)\r
-\r
         #\r
         # if there is Shadow, Should judge the MODULE_TYPE in \r
         # SEC, PEI_CORE and PEIM\r
@@ -259,12 +258,10 @@ class InfPomAlignment(ModuleObject):
 \r
         if DefineObj.GetPcdIsDriver() != None:\r
             self.SetPcdIsDriver(DefineObj.GetPcdIsDriver().GetValue())\r
-\r
         #\r
         # LIBRARY_CLASS\r
         #\r
         self._GenModuleHeaderLibClass(DefineObj, ArchList)\r
-\r
         #\r
         # CUSTOM_MAKEFILE\r
         #\r
@@ -276,7 +273,6 @@ class InfPomAlignment(ModuleObject):
         if not HasCalledFlag:\r
             self._GenModuleHeaderExterns(DefineObj)\r
             HasCalledFlag = True\r
-\r
         #\r
         # each module has only one module header\r
         #\r
@@ -289,28 +285,45 @@ class InfPomAlignment(ModuleObject):
         # put all define statement into user-extension sections\r
         #     \r
         DefinesDictNew = GenModuleHeaderUserExt(DefineObj, ArchString)\r
-\r
         if DefinesDictNew:\r
             UserExtension = CommonObject.UserExtensionObject()\r
             UserExtension.SetDefinesDict(DefinesDictNew)\r
             UserExtension.SetIdentifier('DefineModifiers')\r
             UserExtension.SetUserID('EDK2')\r
             self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
-\r
         #\r
         # Get all meta-file header information\r
         # the record is list of items formated: \r
         # [LineValue, Arch, StartLine, ID, Third]\r
         #\r
-\r
         InfHeaderObj = self.Parser.InfHeader\r
         #\r
         # Put header information into POM object\r
         #\r
-        self.SetAbstract(InfHeaderObj.GetAbstract())\r
-        self.SetDescription(InfHeaderObj.GetDescription())\r
-        self.SetCopyright(InfHeaderObj.GetCopyright())\r
-        self.SetLicense(InfHeaderObj.GetLicense())\r
+        if self.UniFileClassObject:\r
+            Lang = DT.TAB_LANGUAGE_EN_X\r
+        else:\r
+            Lang = DT.TAB_LANGUAGE_EN_US\r
+        if InfHeaderObj.GetAbstract():\r
+            self.SetAbstract((Lang, InfHeaderObj.GetAbstract()))\r
+        if InfHeaderObj.GetDescription():\r
+            self.SetDescription((Lang, InfHeaderObj.GetDescription()))\r
+        if InfHeaderObj.GetCopyright():\r
+            self.SetCopyright(('', InfHeaderObj.GetCopyright()))\r
+        if InfHeaderObj.GetLicense():\r
+            self.SetLicense(('', InfHeaderObj.GetLicense()))\r
+        #\r
+        # Put Binary header information into POM object\r
+        #\r
+        InfBinaryHeaderObj = self.Parser.InfBinaryHeader\r
+        if InfBinaryHeaderObj.GetAbstract():\r
+            self.SetBinaryHeaderAbstract((Lang, InfBinaryHeaderObj.GetAbstract()))\r
+        if InfBinaryHeaderObj.GetDescription():\r
+            self.SetBinaryHeaderDescription((Lang, InfBinaryHeaderObj.GetDescription()))\r
+        if InfBinaryHeaderObj.GetCopyright():\r
+            self.SetBinaryHeaderCopyright(('', InfBinaryHeaderObj.GetCopyright()))\r
+        if InfBinaryHeaderObj.GetLicense():\r
+            self.SetBinaryHeaderLicense(('', InfBinaryHeaderObj.GetLicense()))\r
 \r
     ## GenModuleHeaderLibClass\r
     #\r
@@ -390,6 +403,8 @@ class InfPomAlignment(ModuleObject):
                     Hob.SetSupArchList(Item.GetSupArchList())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         Hob.SetHelpTextList([HelpTextObj])\r
                     HobList.append(Hob)\r
@@ -402,6 +417,8 @@ class InfPomAlignment(ModuleObject):
                     Event.SetUsage(Item.GetUsage())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         Event.SetHelpTextList([HelpTextObj])\r
                     EventList.append(Event)\r
@@ -414,6 +431,8 @@ class InfPomAlignment(ModuleObject):
                     BootMode.SetUsage(Item.GetUsage())\r
                     if Item.GetHelpString():\r
                         HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextObj.SetString(Item.GetHelpString())\r
                         BootMode.SetHelpTextList([HelpTextObj])\r
                     BootModeList.append(BootMode)\r
@@ -433,18 +452,14 @@ class InfPomAlignment(ModuleObject):
         BuildOptionsList = self.Parser.InfBuildOptionSection.GetBuildOptions()\r
         if not GlobalData.gIS_BINARY_INF:\r
             BuildOptionDict = {}\r
-\r
             for BuildOptionObj in BuildOptionsList:\r
                 ArchList = BuildOptionObj.GetSupArchList()\r
                 ArchList = ConvertArchList(ArchList)\r
                 BuildOptionsContent = BuildOptionObj.GetContent()\r
                 ArchString = ' '.join(ArchList)\r
-\r
                 if not BuildOptionsContent:\r
                     continue\r
-\r
                 BuildOptionDict[ArchString] = BuildOptionsContent\r
-\r
             if not BuildOptionDict:\r
                 return\r
             UserExtension = CommonObject.UserExtensionObject()\r
@@ -473,7 +488,6 @@ class InfPomAlignment(ModuleObject):
             #\r
             LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses\r
             Keys = LibClassObj.keys()\r
-\r
             for Key in Keys:\r
                 LibraryClassData = LibClassObj[Key]\r
                 for Item in LibraryClassData:\r
@@ -485,14 +499,14 @@ class InfPomAlignment(ModuleObject):
                     LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
                     LibraryClass.SetSupModuleList(Item.GetSupModuleList())\r
                     HelpStringObj = Item.GetHelpString()\r
-\r
                     if HelpStringObj != None:\r
                         CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments +\r
                                                                      HelpStringObj.TailComments)\r
                         HelpTextHeaderObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextHeaderObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                         HelpTextHeaderObj.SetString(CommentString)\r
                         LibraryClass.SetHelpTextList([HelpTextHeaderObj])\r
-\r
                     self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass])\r
 \r
     ## GenPackages\r
@@ -508,7 +522,6 @@ class InfPomAlignment(ModuleObject):
         # Get all Packages\r
         #\r
         PackageObj = self.Parser.InfPackageSection.Packages\r
-\r
         #\r
         # Go through each arch\r
         #\r
@@ -546,13 +559,11 @@ class InfPomAlignment(ModuleObject):
     def _GenPcds(self):\r
         if not GlobalData.gIS_BINARY_INF:\r
             Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS)\r
-\r
             #\r
             # Get all Pcds\r
             #\r
             PcdObj = self.Parser.InfPcdSection.Pcds\r
             KeysList = PcdObj.keys()\r
-\r
             #\r
             # Go through each arch\r
             #\r
@@ -571,6 +582,8 @@ class InfPomAlignment(ModuleObject):
                             Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                             Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
                             HelpTextObj = CommonObject.TextObject()\r
+                            if self.UniFileClassObject:\r
+                                HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                             HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
                             Pcd.SetHelpTextList([HelpTextObj])\r
                             PcdList = self.GetPcdList()\r
@@ -636,11 +649,47 @@ class InfPomAlignment(ModuleObject):
                 Identifier = UserExtensionDataObj.GetIdString()\r
                 if Identifier.startswith('"') and Identifier.endswith('"'):\r
                     Identifier = Identifier[1:-1]\r
+                #\r
+                # Generate miscellaneous files on INF file\r
+                #\r
+                if UserId == 'TianoCore' and Identifier == 'ExtraFiles':\r
+                    self._GenMiscFiles(UserExtensionDataObj.GetContent())\r
                 UserExtension.SetIdentifier(Identifier)\r
                 UserExtension.SetStatement(UserExtensionDataObj.GetContent())\r
                 UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList()))\r
                 self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])\r
-\r
+                \r
+        #\r
+        #  Gen UserExtensions of TianoCore."BinaryHeader"\r
+        #\r
+        \r
+        #Get Binary header from INF file\r
+        BinaryAbstractList = self.BinaryHeaderAbstractList\r
+        BinaryDescriptionList = self.BinaryHeaderDescriptionList\r
+        BinaryCopyrightList = self.BinaryHeaderCopyrightList\r
+        BinaryLicenseList = self.BinaryHeaderLicenseList\r
+        #Get Binary header from UNI file\r
+        # Initialize UniStrDict, the top keys are language codes\r
+        UniStrDict = {}\r
+        if self.UniFileClassObject:\r
+            UniStrDict = self.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    Lang = GetLanguageCode1766(Lang)\r
+                    if StringDefClassObject.StringName == DT.TAB_INF_BINARY_ABSTRACT:\r
+                        BinaryAbstractList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+                    if StringDefClassObject.StringName == DT.TAB_INF_BINARY_DESCRIPTION:\r
+                        BinaryDescriptionList.append((Lang, ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+        if BinaryAbstractList or BinaryDescriptionList or BinaryCopyrightList or BinaryLicenseList:\r
+            BinaryUserExtension = CommonObject.UserExtensionObject()\r
+            BinaryUserExtension.SetBinaryAbstract(BinaryAbstractList)\r
+            BinaryUserExtension.SetBinaryDescription(BinaryDescriptionList)\r
+            BinaryUserExtension.SetBinaryCopyright(BinaryCopyrightList)\r
+            BinaryUserExtension.SetBinaryLicense(BinaryLicenseList)\r
+            BinaryUserExtension.SetIdentifier(DT.TAB_BINARY_HEADER_IDENTIFIER)\r
+            BinaryUserExtension.SetUserID(DT.TAB_BINARY_HEADER_USERID)\r
+            self.SetUserExtensionList(self.GetUserExtensionList() + [BinaryUserExtension])\r
+            \r
     def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList):\r
         if SmmDepexList:\r
             self.SetSmmDepex(SmmDepexList)\r
@@ -675,10 +724,14 @@ class InfPomAlignment(ModuleObject):
             ModuleType = Depex.GetModuleType()\r
             ModuleTypeList = []\r
             if IsLibraryClass:\r
-                if not self.GetIsLibraryModList():\r
+                if self.GetModuleType() == 'BASE' and not ModuleType:\r
+                    Logger.Error("\nMkPkg", PARSER_ERROR,\r
+                                 ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_BASE_LIBRARY_CLASS,\r
+                                 self.GetFullPath(), RaiseError=True)\r
+                if self.GetModuleType() != 'BASE' and not self.GetIsLibraryModList():\r
                     Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS,\r
                                  self.GetFullPath(), RaiseError=True)\r
-                if ModuleType and ModuleType not in self.GetIsLibraryModList():\r
+                if self.GetModuleType() != 'BASE' and ModuleType and ModuleType not in self.GetIsLibraryModList():\r
                     Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,\r
                                  self.GetFullPath(), RaiseError=True)\r
                 if ModuleType:\r
@@ -713,6 +766,8 @@ class InfPomAlignment(ModuleObject):
                 DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp())\r
                 if Depex.HelpString:\r
                     HelpIns = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpIns.SetLang(DT.TAB_LANGUAGE_EN_X)\r
                     HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString))\r
                     DepexIns.SetHelpText(HelpIns)\r
 \r
@@ -771,6 +826,7 @@ class InfPomAlignment(ModuleObject):
             AsBuildLibIns = AsBuildLibraryClassObject()\r
             AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid())\r
             AsBuildLibIns.SetLibVersion(LibItem.GetVersion())\r
+            AsBuildLibIns.SetSupArchList(LibItem.GetSupArchList())\r
             AsBuildLibraryClassList.append(AsBuildLibIns)\r
         AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList)\r
 \r
@@ -778,7 +834,7 @@ class InfPomAlignment(ModuleObject):
         # BuildOption AsBuild Info\r
         #            \r
         for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions():\r
-            AsBuildBuildOptionList += BuildOptionItem.GetAsBuildList()\r
+            AsBuildBuildOptionList.append(BuildOptionItem)\r
         AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList)\r
 \r
         #\r
@@ -786,13 +842,34 @@ class InfPomAlignment(ModuleObject):
         #\r
         AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns)\r
 \r
+        #\r
+        # Parse the DEC file that contains the GUID value of the GUID CName which is used by\r
+        # SUBTYPE_GUID type binary file in the Binaries section in the INF file\r
+        #\r
+        DecObjList = []\r
+        if not self.PackagePath:\r
+            WorkSpace = os.path.normpath(self.WorkSpace)\r
+            TempPath = ModulePath = os.path.normpath(self.ModulePath)\r
+            while ModulePath:\r
+                TempPath = ModulePath\r
+                ModulePath = os.path.dirname(ModulePath)\r
+            PackageName = TempPath\r
+            DecFilePath = os.path.normpath(os.path.join(WorkSpace, PackageName))  \r
+            if DecFilePath:\r
+                for File in os.listdir(DecFilePath):\r
+                    if File.upper().endswith('.DEC'):\r
+                        DecFileFullPath = os.path.normpath(os.path.join(DecFilePath, File))\r
+                        DecObjList.append(DecPomAlignment(DecFileFullPath, self.WorkSpace))\r
+                        \r
+        \r
         BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj,\r
                                                                        BinariesDict,\r
                                                                        AsBuildIns,\r
                                                                        BinaryFileObjectList,\r
                                                                        self.GetSupArchList(),\r
-                                                                       self.BinaryModule)\r
-\r
+                                                                       self.BinaryModule,\r
+                                                                       DecObjList)\r
+                \r
         BinariesDict2 = {}\r
         for Key in BinariesDict:\r
             ValueList = BinariesDict[Key]\r
@@ -855,9 +932,13 @@ class InfPomAlignment(ModuleObject):
                 Pcd.SetItemType(PcdItem[0])\r
                 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
-                HelpTextObj = CommonObject.TextObject()\r
-                HelpTextObj.SetString(PcdItemObj.GetHelpStringList())\r
-                Pcd.SetHelpTextList([HelpTextObj])\r
+                Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
+                for CommentItem in PcdItemObj.GetHelpStringList():\r
+                    HelpTextObj = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                    HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
+                    Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
                 AsBuildPatchPcdList.append(Pcd)\r
             else:\r
                 PcdItemObj = PcdItem[1]\r
@@ -870,9 +951,13 @@ class InfPomAlignment(ModuleObject):
                 Pcd.SetItemType(PcdItem[0])\r
                 Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())\r
                 Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))\r
-                HelpTextObj = CommonObject.TextObject()\r
-                HelpTextObj.SetString(PcdItemObj.GetHelpStringList())\r
-                Pcd.SetHelpTextList([HelpTextObj])\r
+                Pcd.SetValidUsage(PcdItemObj.GetValidUsage())\r
+                for CommentItem in PcdItemObj.GetHelpStringList():\r
+                    HelpTextObj = CommonObject.TextObject()\r
+                    if self.UniFileClassObject:\r
+                        HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                    HelpTextObj.SetString(CommentItem.GetHelpStringItem())\r
+                    Pcd.SetHelpTextList(Pcd.GetHelpTextList() + [HelpTextObj])\r
                 AsBuildPcdExList.append(Pcd)\r
         AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList)\r
         AsBuildIns.SetPcdExList(AsBuildPcdExList)\r
@@ -914,11 +999,13 @@ class InfPomAlignment(ModuleObject):
                         ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))\r
                         ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                         HelpString = GuidComentItem.GetHelpStringItem()\r
-                        HelpTxtTailObj = CommonObject.TextObject()\r
-                        HelpTxtTailObj.SetString(HelpString)\r
-\r
-                        ListObject.SetHelpTextList([HelpTxtTailObj])\r
-\r
+                        if HelpString.strip():\r
+                            HelpTxtTailObj = CommonObject.TextObject()\r
+                            if self.UniFileClassObject:\r
+                                HelpTxtTailObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                            HelpTxtTailObj.SetString(HelpString)\r
+                            ListObject.SetHelpTextList([HelpTxtTailObj])\r
+                            \r
                         GuidProtocolPpiList.append(ListObject)\r
         elif Type == DT.TAB_PROTOCOLS:\r
             ProtocolData = ProtocolObj.keys()\r
@@ -931,10 +1018,13 @@ class InfPomAlignment(ModuleObject):
                     ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                     ListObject.SetNotify(CommentItem.GetNotify())\r
                     ListObject.SetUsage(CommentItem.GetUsageItem())\r
-                    HelpTxtObj = CommonObject.TextObject()\r
                     HelpString = CommentItem.GetHelpStringItem()\r
-                    HelpTxtObj.SetString(HelpString)\r
-                    ListObject.SetHelpTextList([HelpTxtObj])\r
+                    if HelpString.strip():\r
+                        HelpTxtObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTxtObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                        HelpTxtObj.SetString(HelpString)\r
+                        ListObject.SetHelpTextList([HelpTxtObj])\r
                     GuidProtocolPpiList.append(ListObject)\r
         elif Type == DT.TAB_PPIS:\r
             PpiData = PpisObj.keys()\r
@@ -947,10 +1037,13 @@ class InfPomAlignment(ModuleObject):
                     ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())\r
                     ListObject.SetNotify(CommentItem.GetNotify())\r
                     ListObject.SetUsage(CommentItem.GetUsage())\r
-                    HelpTextObj = CommonObject.TextObject()\r
                     HelpString = CommentItem.GetHelpStringItem()\r
-                    HelpTextObj.SetString(HelpString)\r
-                    ListObject.SetHelpTextList([HelpTextObj])\r
+                    if HelpString.strip():\r
+                        HelpTextObj = CommonObject.TextObject()\r
+                        if self.UniFileClassObject:\r
+                            HelpTextObj.SetLang(DT.TAB_LANGUAGE_EN_X)\r
+                        HelpTextObj.SetString(HelpString)\r
+                        ListObject.SetHelpTextList([HelpTextObj])\r
                     GuidProtocolPpiList.append(ListObject)\r
 \r
         if Type == DT.TAB_GUIDS:\r
@@ -966,6 +1059,24 @@ class InfPomAlignment(ModuleObject):
     #\r
     # @param ContainerFile: The Inf file full path\r
     #\r
-    def _GenMiscFiles(self, ContainerFile, Skip):\r
-        pass\r
-\r
+    def _GenMiscFiles(self, Content):\r
+        MiscFileObj = CommonObject.MiscFileObject()\r
+        for Line in Content.splitlines():\r
+            FileName = ''\r
+            if '#' in Line:\r
+                FileName = Line[:Line.find('#')]\r
+            else:\r
+                FileName = Line\r
+            if FileName:\r
+                if IsValidPath(FileName, GlobalData.gINF_MODULE_DIR):\r
+                    FileObj = CommonObject.FileObject()\r
+                    FileObj.SetURI(FileName)\r
+                    MiscFileObj.SetFileList(MiscFileObj.GetFileList()+[FileObj])\r
+                else:\r
+                    Logger.Error("InfParser", \r
+                                 FORMAT_INVALID,\r
+                                 ST.ERR_INF_PARSER_FILE_NOT_EXIST_OR_NAME_INVALID%(Line),\r
+                                 File=GlobalData.gINF_MODULE_NAME,\r
+                                 ExtraData=Line)   \r
+        self.SetMiscFileList(self.GetMiscFileList()+[MiscFileObj]) \r
+        \r
index 7369d64672fbf188ec1bdfb768f36717472c1f8a..042d4784c84cc4666502cc1b56797829201c363b 100644 (file)
@@ -1,7 +1,7 @@
 ## @file InfPomAlignmentMisc.py\r
 # This file contained the routines for InfPomAlignment\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -24,6 +24,10 @@ from Library import DataType as DT
 from Library.Misc import ConvertArchList\r
 from Object.POM.ModuleObject import BinaryFileObject\r
 from Object.POM import CommonObject\r
+from Library.String import FORMAT_INVALID\r
+from Library.Misc import CheckGuidRegFormat\r
+from Logger import StringTable as ST\r
+\r
 \r
 ## GenModuleHeaderUserExt\r
 #\r
@@ -167,7 +171,8 @@ def _GenInfDefineStateMent(HeaderComment, Name, Value, TailComment):
 ## GenBinaryData\r
 #\r
 #\r
-def GenBinaryData(BinaryData, BinaryObj, BinariesDict, AsBuildIns, BinaryFileObjectList, SupArchList, BinaryModule):\r
+def GenBinaryData(BinaryData, BinaryObj, BinariesDict, AsBuildIns, BinaryFileObjectList, \\r
+                  SupArchList, BinaryModule, DecObjList=None):\r
     if BinaryModule:\r
         pass\r
     OriSupArchList = SupArchList\r
@@ -179,6 +184,7 @@ def GenBinaryData(BinaryData, BinaryObj, BinariesDict, AsBuildIns, BinaryFileObj
         else:\r
             TagName = ''\r
             Family = ''\r
+        \r
         FFE = ItemObj.GetFeatureFlagExp()\r
 \r
         #\r
@@ -200,6 +206,41 @@ def GenBinaryData(BinaryData, BinaryObj, BinariesDict, AsBuildIns, BinaryFileObj
         FileNameObj.SetFileType(ItemObj.GetType())\r
         FileNameObj.SetFilename(ItemObj.GetFileName())\r
         FileNameObj.SetFeatureFlag(FFE)\r
+        #\r
+        # Get GUID value of the GUID CName in the DEC file\r
+        #\r
+        if ItemObj.GetType() == DT.SUBTYPE_GUID_BINARY_FILE_TYPE:                \r
+            if not CheckGuidRegFormat(ItemObj.GetGuidValue()):\r
+                if not DecObjList:\r
+                    if DT.TAB_HORIZON_LINE_SPLIT in ItemObj.GetGuidValue() or \\r
+                        DT.TAB_COMMA_SPLIT in ItemObj.GetGuidValue():\r
+                        Logger.Error("\nMkPkg",\r
+                                 FORMAT_INVALID,\r
+                                 ST.ERR_DECPARSE_DEFINE_PKGGUID,\r
+                                 ExtraData=ItemObj.GetGuidValue(),\r
+                                 RaiseError=True)\r
+                    else:\r
+                        Logger.Error("\nMkPkg",\r
+                                     FORMAT_INVALID,\r
+                                     ST.ERR_UNI_SUBGUID_VALUE_DEFINE_DEC_NOT_FOUND % \\r
+                                     (ItemObj.GetGuidValue()),\r
+                                     RaiseError=True)\r
+                else:\r
+                    for DecObj in DecObjList:\r
+                        for GuidObj in DecObj.GetGuidList():\r
+                            if GuidObj.GetCName() == ItemObj.GetGuidValue():\r
+                                FileNameObj.SetGuidValue(GuidObj.GetGuid())\r
+                                break\r
+\r
+                    if not FileNameObj.GetGuidValue():                        \r
+                        Logger.Error("\nMkPkg",\r
+                                         FORMAT_INVALID,\r
+                                         ST.ERR_DECPARSE_CGUID_NOT_FOUND % \\r
+                                         (ItemObj.GetGuidValue()),\r
+                                         RaiseError=True)  \r
+            else:\r
+                FileNameObj.SetGuidValue(ItemObj.GetGuidValue().strip())\r
+\r
         FileNameObj.SetSupArchList(SupArchList)\r
         FileNameList = [FileNameObj]\r
 \r
diff --git a/BaseTools/Source/Python/UPT/ReplacePkg.py b/BaseTools/Source/Python/UPT/ReplacePkg.py
new file mode 100644 (file)
index 0000000..9f231f9
--- /dev/null
@@ -0,0 +1,148 @@
+## @file\r
+# Replace distribution package.\r
+#\r
+# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available \r
+# under the terms and conditions of the BSD License which accompanies this \r
+# distribution. The full text of the license may be found at \r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+"""\r
+Replace a distribution package\r
+"""\r
+##\r
+# Import Modules\r
+#\r
+from shutil import rmtree\r
+from traceback import format_exc\r
+from platform import python_version\r
+from sys import platform\r
+from Logger import StringTable as ST\r
+from Logger.ToolError import UNKNOWN_ERROR\r
+from Logger.ToolError import FatalError\r
+from Logger.ToolError import ABORT_ERROR\r
+from Logger.ToolError import CODE_ERROR\r
+from Logger.ToolError import UPT_ALREADY_INSTALLED_ERROR\r
+import Logger.Log as Logger\r
+\r
+from Core.DependencyRules import DependencyRules\r
+from Library import GlobalData\r
+from InstallPkg import UnZipDp\r
+from InstallPkg import InstallDp\r
+from RmPkg import GetInstalledDpInfo\r
+from RmPkg import RemoveDist\r
+\r
+## Tool entrance method\r
+#\r
+# This method mainly dispatch specific methods per the command line options.\r
+# If no error found, return zero value so the caller of this tool can know\r
+# if it's executed successfully or not.\r
+#\r
+# @param  Options: command Options\r
+#\r
+def Main(Options = None):\r
+    ContentZipFile, DistFile = None, None\r
+    try:\r
+        DataBase = GlobalData.gDB\r
+        WorkspaceDir = GlobalData.gWORKSPACE\r
+        Dep = DependencyRules(DataBase)\r
+        DistPkg, ContentZipFile, DpPkgFileName, DistFile = UnZipDp(WorkspaceDir, Options.PackFileToReplace)\r
+        \r
+        StoredDistFile, OrigDpGuid, OrigDpVersion = GetInstalledDpInfo(Options.PackFileToBeReplaced, \\r
+                                                                       Dep, DataBase, WorkspaceDir)\r
+        \r
+        #\r
+        # check dependency\r
+        #\r
+        CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion)\r
+        \r
+        #\r
+        # Remove the old distribution\r
+        #\r
+        RemoveDist(OrigDpGuid, OrigDpVersion, StoredDistFile, DataBase, WorkspaceDir, Options.Yes)\r
+        \r
+        #\r
+        # Install the new distribution\r
+        #\r
+        InstallDp(DistPkg, DpPkgFileName, ContentZipFile, Options, Dep, WorkspaceDir, DataBase)\r
+        ReturnCode = 0\r
+        \r
+    except FatalError, XExcept:\r
+        ReturnCode = XExcept.args[0]\r
+        if Logger.GetLevel() <= Logger.DEBUG_9:\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
+                platform) + format_exc())\r
+    except KeyboardInterrupt:\r
+        ReturnCode = ABORT_ERROR\r
+        if Logger.GetLevel() <= Logger.DEBUG_9:\r
+            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
+                platform) + format_exc())\r
+    except:\r
+        ReturnCode = CODE_ERROR\r
+        Logger.Error(\r
+                    "\nReplacePkg",\r
+                    CODE_ERROR,\r
+                    ST.ERR_UNKNOWN_FATAL_REPLACE_ERR % (Options.PackFileToReplace, Options.PackFileToBeReplaced),\r
+                    ExtraData=ST.MSG_SEARCH_FOR_HELP,\r
+                    RaiseError=False\r
+                    )\r
+        Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),\r
+            platform) + format_exc())\r
+\r
+    finally:\r
+        Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_STARTED)\r
+        if DistFile:\r
+            DistFile.Close()\r
+        if ContentZipFile:\r
+            ContentZipFile.Close()\r
+        if GlobalData.gUNPACK_DIR:\r
+            rmtree(GlobalData.gUNPACK_DIR)\r
+            GlobalData.gUNPACK_DIR = None\r
+        Logger.Quiet(ST.MSG_REMOVE_TEMP_FILE_DONE)        \r
+\r
+    if ReturnCode == 0:\r
+        Logger.Quiet(ST.MSG_FINISH)\r
+    \r
+    return ReturnCode\r
+\r
+def CheckReplaceDpx(Dep, DistPkg, OrigDpGuid, OrigDpVersion):\r
+    NewDpPkgList = []\r
+    for PkgInfo in DistPkg.PackageSurfaceArea:\r
+        Guid, Version = PkgInfo[0], PkgInfo[1]\r
+        NewDpPkgList.append((Guid, Version))\r
+\r
+    NewDpInfo = "%s %s" % (DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion())\r
+    OrigDpInfo = "%s %s" % (OrigDpGuid, OrigDpVersion)\r
+\r
+    #\r
+    # check whether new distribution is already installed and not replacing itself\r
+    #\r
+    if (NewDpInfo != OrigDpInfo):\r
+        if Dep.CheckDpExists(DistPkg.Header.GetGuid(), DistPkg.Header.GetVersion()):\r
+            Logger.Error("\nReplacePkg", UPT_ALREADY_INSTALLED_ERROR,\r
+                ST.WRN_DIST_PKG_INSTALLED,\r
+                ExtraData=ST.MSG_REPLACE_ALREADY_INSTALLED_DP)    \r
+\r
+    #\r
+    # check whether the original distribution could be replaced by new distribution\r
+    #    \r
+    Logger.Verbose(ST.MSG_CHECK_DP_FOR_REPLACE%(NewDpInfo, OrigDpInfo))\r
+    DepInfoResult = Dep.CheckDpDepexForReplace(OrigDpGuid, OrigDpVersion, NewDpPkgList)\r
+    Replaceable = DepInfoResult[0]\r
+    if not Replaceable:\r
+        Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
+            ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY)\r
+    \r
+    #\r
+    # check whether new distribution could be installed by dependency rule\r
+    #\r
+    Logger.Verbose(ST.MSG_CHECK_DP_FOR_INSTALL%str(NewDpInfo))\r
+    if not Dep.ReplaceCheckNewDpDepex(DistPkg, OrigDpGuid, OrigDpVersion):\r
+        Logger.Error("\nReplacePkg", UNKNOWN_ERROR,\r
+            ST.ERR_PACKAGE_NOT_MATCH_DEPENDENCY,\r
+            ExtraData=DistPkg.Header.Name)\r
+\r
index 3817812168af08d71eccfae49e7946669548e85f..ea842c11859fd7dcc606ea47bc7d023053e375f3 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Install distribution package.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -28,7 +28,6 @@ from sys import stdin
 from sys import platform\r
 \r
 from Core.DependencyRules import DependencyRules\r
-from Library.Misc import CheckEnvVariable\r
 from Library import GlobalData\r
 from Logger import StringTable as ST\r
 import Logger.Log as Logger\r
@@ -133,89 +132,27 @@ def Main(Options = None):
             Logger.Error("RmPkg", \r
                          OPTION_MISSING, \r
                          ExtraData=ST.ERR_SPECIFY_PACKAGE)\r
-        CheckEnvVariable()\r
         WorkspaceDir = GlobalData.gWORKSPACE\r
         #\r
         # Prepare check dependency\r
         #\r
         Dep = DependencyRules(DataBase)\r
         \r
-        if Options.DistributionFile:\r
-            (Guid, Version, NewDpFileName) = \\r
-            DataBase.GetDpByName(os.path.split(Options.DistributionFile)[1])\r
-            if not Guid:\r
-                Logger.Error("RmPkg", UNKNOWN_ERROR, ST.ERR_PACKAGE_NOT_INSTALLED % Options.DistributionFile)\r
-        else:\r
-            Guid = Options.PackageGuid\r
-            Version = Options.PackageVersion\r
-        #\r
-        # Check Dp existing\r
-        #\r
-        if not Dep.CheckDpExists(Guid, Version):\r
-            Logger.Error("RmPkg", UNKNOWN_ERROR, ST.ERR_DISTRIBUTION_NOT_INSTALLED)\r
         #\r
-        # Check for Distribution files existence in /conf/upt, if not exist, \r
-        # Warn user and go on.\r
+        # Get the Dp information\r
         #\r
-        StoredDistFile = os.path.normpath(os.path.join(WorkspaceDir, GlobalData.gUPT_DIR, NewDpFileName))\r
-        if not os.path.isfile(StoredDistFile):\r
-            Logger.Warn("RmPkg", ST.WRN_DIST_NOT_FOUND%StoredDistFile)\r
-            StoredDistFile = None\r
-            \r
+        StoredDistFile, Guid, Version = GetInstalledDpInfo(Options.DistributionFile, Dep, DataBase, WorkspaceDir)\r
+\r
         # \r
         # Check Dp depex\r
         #\r
         CheckDpDepex(Dep, Guid, Version, WorkspaceDir)\r
 \r
+        # \r
+        # remove distribution\r
         #\r
-        # Get Current File List\r
-        #\r
-        NewFileList = GetCurrentFileList(DataBase, Guid, Version, WorkspaceDir)\r
-\r
-        #\r
-        # Remove all files\r
-        #\r
-        MissingFileList = []\r
-        for (Path, Md5Sum) in DataBase.GetDpFileList(Guid, Version):\r
-            if os.path.isfile(Path):\r
-                if Path in NewFileList:\r
-                    NewFileList.remove(Path)\r
-                if not Options.Yes:\r
-                    #\r
-                    # check whether modified by users\r
-                    #\r
-                    Md5Sigature = md5.new(open(str(Path), 'rb').read())\r
-                    if Md5Sum != Md5Sigature.hexdigest():\r
-                        Logger.Info(ST.MSG_CONFIRM_REMOVE2 % Path)\r
-                        Input = stdin.readline()\r
-                        Input = Input.replace('\r', '').replace('\n', '')\r
-                        if Input.upper() != 'Y':\r
-                            continue\r
-                RemovePath(Path)\r
-            else:\r
-                MissingFileList.append(Path)\r
-        \r
-        for Path in NewFileList:\r
-            if os.path.isfile(Path):\r
-                if (not Options.Yes) and (not os.path.split(Path)[1].startswith('.')):\r
-                    Logger.Info(ST.MSG_CONFIRM_REMOVE3 % Path)\r
-                    Input = stdin.readline()\r
-                    Input = Input.replace('\r', '').replace('\n', '')\r
-                    if Input.upper() != 'Y':\r
-                        continue\r
-                RemovePath(Path)\r
-\r
-        #\r
-        # Remove distribution files in /Conf/.upt\r
-        #\r
-        if StoredDistFile is not None:\r
-            os.remove(StoredDistFile)\r
+        RemoveDist(Guid, Version, StoredDistFile, DataBase, WorkspaceDir, Options.Yes)\r
 \r
-        #\r
-        # update database\r
-        #\r
-        Logger.Quiet(ST.MSG_UPDATE_PACKAGE_DATABASE)\r
-        DataBase.RemoveDpObj(Guid, Version)\r
         Logger.Quiet(ST.MSG_FINISH)\r
         \r
         ReturnCode = 0\r
@@ -242,5 +179,98 @@ def Main(Options = None):
                      format_exc())\r
         ReturnCode = CODE_ERROR\r
     return ReturnCode\r
-        \r
 \r
+## GetInstalledDpInfo method\r
+#\r
+# Get the installed distribution information\r
+#\r
+# @param  DistributionFile: the name of the distribution\r
+# @param  Dep: the instance of DependencyRules\r
+# @param  DataBase: the internal database\r
+# @param  WorkspaceDir: work space directory\r
+# @retval StoredDistFile: the distribution file that backed up\r
+# @retval Guid: the Guid of the distribution\r
+# @retval Version: the Version of distribution\r
+#\r
+def GetInstalledDpInfo(DistributionFile, Dep, DataBase, WorkspaceDir):\r
+    (Guid, Version, NewDpFileName) = DataBase.GetDpByName(os.path.split(DistributionFile)[1])\r
+    if not Guid:\r
+        Logger.Error("RmPkg", UNKNOWN_ERROR, ST.ERR_PACKAGE_NOT_INSTALLED % DistributionFile)\r
+\r
+    #\r
+    # Check Dp existing\r
+    #\r
+    if not Dep.CheckDpExists(Guid, Version):\r
+        Logger.Error("RmPkg", UNKNOWN_ERROR, ST.ERR_DISTRIBUTION_NOT_INSTALLED)\r
+    #\r
+    # Check for Distribution files existence in /conf/upt, if not exist, \r
+    # Warn user and go on.\r
+    #\r
+    StoredDistFile = os.path.normpath(os.path.join(WorkspaceDir, GlobalData.gUPT_DIR, NewDpFileName))\r
+    if not os.path.isfile(StoredDistFile):\r
+        Logger.Warn("RmPkg", ST.WRN_DIST_NOT_FOUND%StoredDistFile)\r
+        StoredDistFile = None\r
+\r
+    return StoredDistFile, Guid, Version\r
+\r
+## RemoveDist method\r
+#\r
+# remove a distribution\r
+#\r
+# @param  Guid: the Guid of the distribution\r
+# @param  Version: the Version of distribution\r
+# @param  StoredDistFile: the distribution file that backed up\r
+# @param  DataBase: the internal database\r
+# @param  WorkspaceDir: work space directory\r
+# @param  ForceRemove: whether user want to remove file even it is modified\r
+#\r
+def RemoveDist(Guid, Version, StoredDistFile, DataBase, WorkspaceDir, ForceRemove):\r
+    #\r
+    # Get Current File List\r
+    #\r
+    NewFileList = GetCurrentFileList(DataBase, Guid, Version, WorkspaceDir)\r
+\r
+    #\r
+    # Remove all files\r
+    #\r
+    MissingFileList = []\r
+    for (Path, Md5Sum) in DataBase.GetDpFileList(Guid, Version):\r
+        if os.path.isfile(Path):\r
+            if Path in NewFileList:\r
+                NewFileList.remove(Path)\r
+            if not ForceRemove:\r
+                #\r
+                # check whether modified by users\r
+                #\r
+                Md5Sigature = md5.new(open(str(Path), 'rb').read())\r
+                if Md5Sum != Md5Sigature.hexdigest():\r
+                    Logger.Info(ST.MSG_CONFIRM_REMOVE2 % Path)\r
+                    Input = stdin.readline()\r
+                    Input = Input.replace('\r', '').replace('\n', '')\r
+                    if Input.upper() != 'Y':\r
+                        continue\r
+            RemovePath(Path)\r
+        else:\r
+            MissingFileList.append(Path)\r
+    \r
+    for Path in NewFileList:\r
+        if os.path.isfile(Path):\r
+            if (not ForceRemove) and (not os.path.split(Path)[1].startswith('.')):\r
+                Logger.Info(ST.MSG_CONFIRM_REMOVE3 % Path)\r
+                Input = stdin.readline()\r
+                Input = Input.replace('\r', '').replace('\n', '')\r
+                if Input.upper() != 'Y':\r
+                    continue\r
+            RemovePath(Path)\r
+\r
+    #\r
+    # Remove distribution files in /Conf/.upt\r
+    #\r
+    if StoredDistFile is not None:\r
+        os.remove(StoredDistFile)\r
+\r
+    #\r
+    # update database\r
+    #\r
+    Logger.Quiet(ST.MSG_UPDATE_PACKAGE_DATABASE)\r
+    DataBase.RemoveDpObj(Guid, Version)\r
index b168a51daacc2e5b3f770f0981f04076076c9a81..8ad0f2638fd936c3ab01a101018eea19036cfe16 100644 (file)
@@ -2,7 +2,7 @@
 #\r
 # This file is the main entry for UPT \r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -19,10 +19,11 @@ UPT
 \r
 ## import modules\r
 #\r
+from Core import FileHook\r
 import sys\r
 import os.path\r
-from os import environ\r
 from sys import platform\r
+import platform as pf\r
 from optparse import OptionParser\r
 from traceback import format_exc\r
 from platform import python_version\r
@@ -37,10 +38,13 @@ from Logger.ToolError import OPTION_MISSING
 from Logger.ToolError import FILE_TYPE_MISMATCH\r
 from Logger.ToolError import OPTION_CONFLICT\r
 from Logger.ToolError import FatalError\r
+\r
 import MkPkg\r
 import InstallPkg\r
 import RmPkg\r
-from Library.Misc import CheckEnvVariable\r
+import InventoryWs\r
+import ReplacePkg\r
+from Library.Misc import GetWorkspace\r
 from Library import GlobalData\r
 from Core.IpiDb import IpiDatabase\r
 from BuildVersion import gBUILD_VERSION\r
@@ -57,7 +61,12 @@ from BuildVersion import gBUILD_VERSION
 # CheckConflictOption\r
 #\r
 def CheckConflictOption(Opt):\r
-    if (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
+    if (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove or Opt.PackFileToReplace) \\r
+    and Opt.InventoryWs:\r
+        Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_L_OA_EXCLUSIVE)\r
+    elif Opt.PackFileToReplace and (Opt.PackFileToCreate or Opt.PackFileToInstall or Opt.PackFileToRemove):\r
+        Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_U_ICR_EXCLUSIVE)\r
+    elif (Opt.PackFileToCreate and Opt.PackFileToInstall and Opt.PackFileToRemove):\r
         Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_REQUIRE_I_C_R_OPTION)\r
     elif Opt.PackFileToCreate and Opt.PackFileToInstall:\r
         Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_I_C_EXCLUSIVE)\r
@@ -66,6 +75,10 @@ def CheckConflictOption(Opt):
     elif Opt.PackFileToCreate and  Opt.PackFileToRemove:\r
         Logger.Error("UPT", OPTION_CONFLICT, ExtraData=ST.ERR_C_R_EXCLUSIVE)\r
 \r
+    if Opt.CustomPath and Opt.UseGuidedPkgPath:\r
+        Logger.Warn("UPT", ST.WARN_CUSTOMPATH_OVERRIDE_USEGUIDEDPATH)\r
+        Opt.UseGuidedPkgPath = False\r
+\r
 ## SetLogLevel\r
 #\r
 def SetLogLevel(Opt):\r
@@ -121,12 +134,23 @@ def Main():
     Parser.add_option("-m", "--inf-filename", action="append", type="string", dest="EDK2_INF_Filename",\r
                       help=ST.HLP_SPECIFY_INF_NAME_CREATE)\r
 \r
+    Parser.add_option("-l", "--list", action="store_true", dest="List_Dist_Installed",\r
+                      help=ST.HLP_LIST_DIST_INSTALLED)\r
+\r
     Parser.add_option("-f", "--force", action="store_true", dest="Yes", help=ST.HLP_DISABLE_PROMPT)\r
 \r
     Parser.add_option("-n", "--custom-path", action="store_true", dest="CustomPath", help=ST.HLP_CUSTOM_PATH_PROMPT)\r
 \r
     Parser.add_option("-x", "--free-lock", action="store_true", dest="SkipLock", help=ST.HLP_SKIP_LOCK_CHECK)\r
 \r
+    Parser.add_option("-u", "--replace", action="store", type="string", dest="Replace_Distribution_Package_File",\r
+                      help=ST.HLP_SPECIFY_PACKAGE_NAME_REPLACE)\r
+\r
+    Parser.add_option("-o", "--original", action="store", type="string", dest="Original_Distribution_Package_File",\r
+                      help=ST.HLP_SPECIFY_PACKAGE_NAME_TO_BE_REPLACED)\r
+\r
+    Parser.add_option("--use-guided-paths", action="store_true", dest="Use_Guided_Paths", help=ST.HLP_USE_GUIDED_PATHS)\r
+\r
     Opt = Parser.parse_args()[0]\r
 \r
     Var2Var = [\r
@@ -135,24 +159,42 @@ def Main():
         ("PackFileToCreate", Opt.Create_Distribution_Package_File),\r
         ("PackFileToRemove", Opt.Remove_Distribution_Package_File),\r
         ("PackageFileList", Opt.EDK2_DEC_Filename),\r
-        ("ModuleFileList", Opt.EDK2_INF_Filename)\r
+        ("ModuleFileList", Opt.EDK2_INF_Filename),\r
+        ("InventoryWs", Opt.List_Dist_Installed),\r
+        ("PackFileToReplace", Opt.Replace_Distribution_Package_File),\r
+        ("PackFileToBeReplaced", Opt.Original_Distribution_Package_File),\r
+        ("UseGuidedPkgPath", Opt.Use_Guided_Paths),\r
     ]\r
+\r
     for Var in Var2Var:\r
         setattr(Opt, Var[0], Var[1])\r
 \r
     try:\r
-        CheckEnvVariable()\r
+        GlobalData.gWORKSPACE = GetWorkspace()\r
     except FatalError, XExcept:\r
         if Logger.GetLevel() <= Logger.DEBUG_9:\r
             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())\r
         return XExcept.args[0]\r
 \r
-    GlobalData.gWORKSPACE = os.path.normpath(environ["WORKSPACE"])\r
+    # Start *********************************************\r
+    # Support WORKSPACE is a long path\r
+    # Only work well on windows\r
+    # Linux Solution TBD\r
+    if pf.system() == 'Windows':\r
+        os.system('@echo off\nsubst b: /D')\r
+        os.system('subst b: "%s"' % GlobalData.gWORKSPACE)\r
+        GlobalData.gWORKSPACE = 'B:\\'\r
+    # End ***********************************************\r
+\r
     WorkspaceDir = GlobalData.gWORKSPACE\r
 \r
     SetLogLevel(Opt)\r
 \r
-    GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, "Conf/DistributionPackageDatabase.db")))\r
+    Mgr = FileHook.RecoverMgr(WorkspaceDir)\r
+    FileHook.SetRecoverMgr(Mgr)\r
+\r
+    GlobalData.gDB = IpiDatabase(os.path.normpath(os.path.join(WorkspaceDir, \\r
+                                                               "Conf/DistributionPackageDatabase.db")), WorkspaceDir)\r
     GlobalData.gDB.InitDatabase(Opt.SkipLock)\r
 \r
     #\r
@@ -179,27 +221,12 @@ def Main():
         elif Opt.PackFileToInstall:\r
             if not Opt.PackFileToInstall.endswith('.dist'):\r
                 Logger.Error("InstallPkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToInstall)\r
-            \r
-            #\r
-            # check file existence, if not absolute path, then try current working directory, then $(WORKSPACE) \r
-            #\r
-            Existed = True\r
-            if os.path.isabs(Opt.PackFileToInstall):\r
-                if not (os.path.exists(Opt.PackFileToInstall) and os.path.isfile(Opt.PackFileToInstall)):\r
-                    Existed = False\r
-            else:\r
-                AbsPath = os.path.normpath(os.path.join(os.getcwd(), Opt.PackFileToInstall))\r
-                if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
-                    AbsPath = os.path.normpath(os.path.join(WorkspaceDir, Opt.PackFileToInstall))\r
-                    if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
-                        Existed = False\r
-                \r
-                if Existed:\r
-                    Opt.PackFileToInstall = AbsPath\r
-            \r
-            if not Existed:\r
+\r
+            AbsPath = GetFullPathDist(Opt.PackFileToInstall, WorkspaceDir)\r
+            if not AbsPath:\r
                 Logger.Error("InstallPkg", FILE_NOT_FOUND, ST.ERR_INSTALL_DIST_NOT_FOUND % Opt.PackFileToInstall)\r
 \r
+            Opt.PackFileToInstall = AbsPath\r
             setattr(Opt, 'PackageFile', Opt.PackFileToInstall)\r
             RunModule = InstallPkg.Main\r
 \r
@@ -214,6 +241,35 @@ def Main():
 \r
             setattr(Opt, 'DistributionFile', Opt.PackFileToRemove)\r
             RunModule = RmPkg.Main\r
+        elif Opt.InventoryWs:\r
+            RunModule = InventoryWs.Main\r
+\r
+        elif Opt.PackFileToBeReplaced and not Opt.PackFileToReplace:\r
+            Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_U_OPTION)\r
+\r
+        elif Opt.PackFileToReplace:\r
+            if not Opt.PackFileToReplace.endswith('.dist'):\r
+                Logger.Error("ReplacePkg", FILE_TYPE_MISMATCH, ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToReplace)\r
+            if not Opt.PackFileToBeReplaced:\r
+                Logger.Error("ReplacePkg", OPTION_MISSING, ExtraData=ST.ERR_REQUIRE_O_OPTION)\r
+            if not Opt.PackFileToBeReplaced.endswith('.dist'):\r
+                Logger.Error("ReplacePkg",\r
+                             FILE_TYPE_MISMATCH,\r
+                             ExtraData=ST.ERR_DIST_EXT_ERROR % Opt.PackFileToBeReplaced)\r
+\r
+            head, tail = os.path.split(Opt.PackFileToBeReplaced)\r
+            if head or not tail:\r
+                Logger.Error("ReplacePkg",\r
+                             FILE_TYPE_MISMATCH,\r
+                             ExtraData=ST.ERR_DIST_FILENAME_ONLY_FOR_REPLACE_ORIG % Opt.PackFileToBeReplaced)\r
+\r
+            AbsPath = GetFullPathDist(Opt.PackFileToReplace, WorkspaceDir)\r
+            if not AbsPath:\r
+                Logger.Error("ReplacePkg", FILE_NOT_FOUND, ST.ERR_REPLACE_DIST_NOT_FOUND % Opt.PackFileToReplace)\r
+\r
+            Opt.PackFileToReplace = AbsPath\r
+            RunModule = ReplacePkg.Main\r
+\r
         else:\r
             Parser.print_usage()\r
             return OPTION_MISSING\r
@@ -225,10 +281,47 @@ def Main():
             Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + \\r
                          format_exc())\r
     finally:\r
+        try:\r
+            if ReturnCode != 0:\r
+                Logger.Quiet(ST.MSG_RECOVER_START)\r
+                GlobalData.gDB.RollBack()\r
+                Mgr.rollback()\r
+                Logger.Quiet(ST.MSG_RECOVER_DONE)\r
+            else:\r
+                GlobalData.gDB.Commit()\r
+                Mgr.commit()\r
+        except StandardError:\r
+            Logger.Quiet(ST.MSG_RECOVER_FAIL)\r
         GlobalData.gDB.CloseDb()\r
+        if pf.system() == 'Windows':\r
+            os.system('subst b: /D')\r
 \r
     return ReturnCode\r
 \r
+## GetFullPathDist\r
+#\r
+#  This function will check DistFile existence, if not absolute path, then try current working directory,\r
+#  then $(WORKSPACE),and return the AbsPath. If file doesn't find, then return None\r
+#\r
+# @param DistFile:       The distribution file in either relative path or absolute path\r
+# @param WorkspaceDir:   Workspace Directory\r
+# @return AbsPath:       The Absolute path of the distribution file if existed, None else\r
+#\r
+def GetFullPathDist(DistFile, WorkspaceDir):\r
+    if os.path.isabs(DistFile):\r
+        if not (os.path.exists(DistFile) and os.path.isfile(DistFile)):\r
+            return None\r
+        else:\r
+            return DistFile\r
+    else:\r
+        AbsPath = os.path.normpath(os.path.join(os.getcwd(), DistFile))\r
+        if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
+            AbsPath = os.path.normpath(os.path.join(WorkspaceDir, DistFile))\r
+            if not (os.path.exists(AbsPath) and os.path.isfile(AbsPath)):\r
+                return None\r
+\r
+        return AbsPath\r
+\r
 if __name__ == '__main__':\r
     RETVAL = Main()\r
     #\r
index 72a909db0e9749dff2ac2236ea3bbe80f5ac4c7b..42a2ba3a6b3014c93892818c8d58f51e74d0d56d 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contain unit test for CommentParsing\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -30,7 +30,8 @@ from Object.POM.ModuleObject import HobObject
                                \r
 from Library.String import GetSplitValueList\r
 from Library.DataType import TAB_SPACE_SPLIT\r
-from Library.DataType import LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_ENG\r
 from Library.DataType import ITEM_UNDEFINED\r
 from Library.DataType import TAB_INF_FEATURE_PCD\r
 from Library import GlobalData\r
@@ -52,7 +53,7 @@ class _GetHelpStrTest(unittest.TestCase):
     def testNormalCase1(self):\r
         HelpStr = 'Hello world'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang(LANGUAGE_EN_US)\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)\r
         HelpTextObj.SetString(HelpStr)\r
         \r
         HelpTextList = [HelpTextObj]\r
@@ -65,14 +66,14 @@ class _GetHelpStrTest(unittest.TestCase):
     def testNormalCase2(self):\r
         HelpStr = 'Hello world'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang('eng')\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)\r
         HelpTextObj.SetString(HelpStr)\r
         \r
         HelpTextList = [HelpTextObj]\r
 \r
         ExpectedStr = 'Hello world1'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang(LANGUAGE_EN_US)\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)\r
         HelpTextObj.SetString(ExpectedStr)        \r
         \r
         HelpTextList.append(HelpTextObj)\r
@@ -93,7 +94,7 @@ class _GetHelpStrTest(unittest.TestCase):
 \r
         ExpectedStr = 'Hello world1'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang('eng')\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)\r
         HelpTextObj.SetString(ExpectedStr)        \r
         \r
         HelpTextList.append(HelpTextObj)\r
@@ -108,7 +109,7 @@ class _GetHelpStrTest(unittest.TestCase):
 \r
         ExpectedStr = 'Hello world1'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang('eng')\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_ENG)\r
         HelpTextObj.SetString(ExpectedStr)        \r
         HelpTextList = [HelpTextObj]\r
       \r
@@ -128,7 +129,7 @@ class _GetHelpStrTest(unittest.TestCase):
 \r
         ExpectedStr = 'Hello world1'\r
         HelpTextObj = TextObject()\r
-        HelpTextObj.SetLang(LANGUAGE_EN_US)\r
+        HelpTextObj.SetLang(TAB_LANGUAGE_EN_US)\r
         HelpTextObj.SetString(ExpectedStr)        \r
         HelpTextList = [HelpTextObj]\r
       \r
index 3ed3345c6da2d7bddef94b679fd85a33877908d6..a114ff22a739dc52aca3eac5d42ce6a9da17381e 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file contain unit test for CommentParsing\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -21,7 +21,7 @@ from Library.CommentParsing import ParseHeaderCommentSection, \
 from Library.CommentParsing import _IsCopyrightLine\r
 from Library.String import GetSplitValueList\r
 from Library.DataType import TAB_SPACE_SPLIT\r
-from Library.DataType import LANGUAGE_EN_US\r
+from Library.DataType import TAB_LANGUAGE_EN_US\r
 \r
 #\r
 # Test ParseHeaderCommentSection\r
@@ -467,7 +467,7 @@ class ParseGenericCommentTest(unittest.TestCase):
         HelptxtObj = ParseGenericComment(TestCommentLinesList, 'testNormalCase1')\r
         self.failIf(not HelptxtObj)\r
         self.assertEqual(HelptxtObj.GetString(), 'hello world')\r
-        self.assertEqual(HelptxtObj.GetLang(), LANGUAGE_EN_US)\r
+        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)\r
 \r
     #\r
     # Normal case2: multiple lines of comment\r
@@ -488,7 +488,7 @@ class ParseGenericCommentTest(unittest.TestCase):
         self.failIf(not HelptxtObj)\r
         self.assertEqual(HelptxtObj.GetString(), \r
                          'hello world\n' + 'second line')\r
-        self.assertEqual(HelptxtObj.GetLang(), LANGUAGE_EN_US)\r
+        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)\r
 \r
     #\r
     # Normal case3: multiple lines of comment, non comment lines will be skipped\r
@@ -509,7 +509,7 @@ class ParseGenericCommentTest(unittest.TestCase):
         self.failIf(not HelptxtObj)\r
         self.assertEqual(HelptxtObj.GetString(), \r
                          'hello world\n\n')\r
-        self.assertEqual(HelptxtObj.GetLang(), LANGUAGE_EN_US)\r
+        self.assertEqual(HelptxtObj.GetLang(), TAB_LANGUAGE_EN_US)\r
 \r
 #\r
 # Test ParseDecPcdGenericComment\r
index 0369bfba4cd7add5fdb04bce9e4f68e0976f016d..e28aec5b9b058f7c99e255e87629853f508ba66a 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse a PCD file of .PKG file\r
 #\r
-# Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -31,6 +31,8 @@ from Library.Xml.XmlRoutines import XmlAttribute
 from Library.Xml.XmlRoutines import XmlNode\r
 from Library.Xml.XmlRoutines import XmlList\r
 from Library.Xml.XmlRoutines import CreateXmlElement\r
+from Library.UniClassObject import ConvertSpecialUnicodes\r
+from Library.UniClassObject import GetLanguageCode1766\r
 from Object.POM.CommonObject import FileObject\r
 from Object.POM.CommonObject import MiscFileObject\r
 from Object.POM.CommonObject import UserExtensionObject\r
@@ -40,7 +42,6 @@ from Object.POM.CommonObject import FileNameObject
 from Object.POM.ModuleObject import ModuleObject\r
 from Xml.XmlParserMisc import IsRequiredItemListNull\r
 from Xml.XmlParserMisc import GetHelpTextList\r
-\r
 import Library.DataType as DataType\r
 \r
 ##\r
@@ -54,14 +55,11 @@ class ClonedFromXml(object):
     def FromXml(self, Item, Key):\r
         self.GUID = XmlElement(Item, '%s/GUID' % Key)\r
         self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
-\r
         if self.GUID == '' and self.Version == '':\r
             return None\r
-\r
         ClonedFrom = ClonedRecordObject()\r
         ClonedFrom.SetPackageGuid(self.GUID)\r
         ClonedFrom.SetPackageVersion(self.Version)\r
-\r
         return ClonedFrom\r
 \r
     def ToXml(self, ClonedFrom, Key):\r
@@ -72,7 +70,6 @@ class ClonedFromXml(object):
         AttributeList = []\r
         NodeList = [Element1]\r
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
-\r
         return Root\r
 \r
     def __str__(self):\r
@@ -99,7 +96,6 @@ class CommonDefinesXml(object):
         [Mod for Mod in GetSplitValueList(XmlAttribute(Item, 'SupModList'), DataType.TAB_SPACE_SPLIT) if Mod]\r
         self.FeatureFlag = ConvertNOTEQToNE(XmlAttribute(Item, 'FeatureFlag'))\r
 \r
-\r
     def ToXml(self):\r
         pass\r
 \r
@@ -107,7 +103,27 @@ class CommonDefinesXml(object):
         return "Usage = %s SupArchList = %s SupModList = %s FeatureFlag = %s" \\r
                 % (self.Usage, self.SupArchList, self.SupModList, self.FeatureFlag)\r
 \r
+##\r
+# PromptXml\r
+#\r
+class PromptXml(object):\r
+    def __init__(self):\r
+        self.Prompt = ''\r
+        self.Lang = ''\r
 \r
+    def FromXml(self, Item, Key):\r
+        if Key:\r
+            pass\r
+        self.Prompt = XmlElement2(Item, 'Prompt')\r
+        self.Lang = XmlAttribute(Item, 'Lang')\r
+\r
+    def ToXml(self, Prompt, Key='Prompt'):\r
+        if self.Prompt:\r
+            pass\r
+        return CreateXmlElement('%s' % Key, Prompt.GetString(), [], [['Lang', Prompt.GetLang()]])\r
+    def __str__(self):\r
+        return "Prompt = %s Lang = %s" % (self.Prompt, self.Lang)\r
+        \r
 ##\r
 # HelpTextXml\r
 #\r
@@ -138,10 +154,10 @@ class HeaderXml(object):
         self.BaseName = ''\r
         self.GUID = ''\r
         self.Version = ''\r
-        self.Copyright = ''\r
-        self.License = ''\r
-        self.Abstract = ''\r
-        self.Description = ''\r
+        self.CopyrightList = []\r
+        self.LicenseList = []\r
+        self.AbstractList = []\r
+        self.DescriptionList = []\r
 \r
     def FromXml(self, Item, Key, IsRequiredCheck=False, IsStandAlongModule=False):\r
         if not Item and IsRequiredCheck:\r
@@ -156,21 +172,28 @@ class HeaderXml(object):
         self.BaseName = XmlAttribute(XmlNode(Item, '%s/Name' % Key), 'BaseName')\r
         self.GUID = XmlElement(Item, '%s/GUID' % Key)\r
         self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version')\r
-        self.Copyright = XmlElement(Item, '%s/Copyright' % Key)\r
-        self.License = XmlElement(Item, '%s/License' % Key)\r
-        self.Abstract = XmlElement(Item, '%s/Abstract' % Key)\r
-        self.Description = XmlElement(Item, '%s/Description' % Key)\r
 \r
+        for SubItem in XmlList(Item, '%s/Abstract' % Key):\r
+            HeaderAbstractLang = XmlAttribute(SubItem, 'Lang')\r
+            self.AbstractList.append((HeaderAbstractLang, XmlElement(SubItem, '%s/Abstract' % Key)))\r
+        for SubItem in XmlList(Item, '%s/Description' % Key):\r
+            HeaderDescriptionLang = XmlAttribute(SubItem, 'Lang')\r
+            self.DescriptionList.append((HeaderDescriptionLang, XmlElement(SubItem, '%s/Description' % Key)))\r
+        for SubItem in XmlList(Item, '%s/Copyright' % Key):\r
+            HeaderCopyrightLang = XmlAttribute(SubItem, 'Lang')\r
+            self.CopyrightList.append((HeaderCopyrightLang, XmlElement(SubItem, '%s/Copyright' % Key)))\r
+        for SubItem in XmlList(Item, '%s/License' % Key):\r
+            HeaderLicenseLang = XmlAttribute(SubItem, 'Lang')\r
+            self.LicenseList.append((HeaderLicenseLang, XmlElement(SubItem, '%s/License' % Key)))    \r
         ModuleHeader = ModuleObject()\r
         ModuleHeader.SetName(self.Name)\r
         ModuleHeader.SetBaseName(self.BaseName)\r
         ModuleHeader.SetGuid(self.GUID)\r
         ModuleHeader.SetVersion(self.Version)\r
-        ModuleHeader.SetCopyright(self.Copyright)\r
-        ModuleHeader.SetLicense(self.License)\r
-        ModuleHeader.SetAbstract(self.Abstract)\r
-        ModuleHeader.SetDescription(self.Description)\r
-\r
+        ModuleHeader.SetCopyright(self.CopyrightList)\r
+        ModuleHeader.SetLicense(self.LicenseList)\r
+        ModuleHeader.SetAbstract(self.AbstractList)\r
+        ModuleHeader.SetDescription(self.DescriptionList)\r
         return ModuleHeader\r
 \r
     def ToXml(self, Header, Key):\r
@@ -178,23 +201,51 @@ class HeaderXml(object):
             pass\r
         Element1 = CreateXmlElement('Name', Header.GetName(), [], [['BaseName', Header.GetBaseName()]])\r
         Element2 = CreateXmlElement('GUID', Header.GetGuid(), [], [['Version', Header.GetVersion()]])\r
-        AttributeList = []\r
         NodeList = [Element1,\r
                     Element2,\r
-                    ['Copyright', Header.GetCopyright()],\r
-                    ['License', Header.GetLicense()],\r
-                    ['Abstract', Header.GetAbstract()],\r
-                    ['Description', Header.GetDescription()],\r
                     ]\r
-        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
 \r
+        UNIInfAbstractList = []\r
+        UNIInfDescriptionList = []\r
+        # Get Abstract and Description from Uni File\r
+        # if the Uni File exists\r
+        if Header.UniFileClassObject is not None:\r
+            UniStrDict = Header.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    if not StringDefClassObject.StringValue:\r
+                        continue\r
+                    if StringDefClassObject.StringName == DataType.TAB_INF_ABSTRACT:\r
+                        UNIInfAbstractList.append((GetLanguageCode1766(Lang),\r
+                                                   ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+\r
+                    if StringDefClassObject.StringName == DataType.TAB_INF_DESCRIPTION:\r
+                        UNIInfDescriptionList.append((GetLanguageCode1766(Lang),\r
+                                                      ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+\r
+        # Get Abstract and Description from INF File Header\r
+        for (Lang, Value) in Header.GetCopyright():\r
+            if Value:\r
+                NodeList.append(CreateXmlElement('Copyright', Value, [], []))\r
+        for (Lang, Value) in Header.GetLicense():\r
+            if Value:\r
+                NodeList.append(CreateXmlElement('License', Value, [], []))\r
+        for (Lang, Value) in Header.GetAbstract() + UNIInfAbstractList:\r
+            if Value:\r
+                NodeList.append(CreateXmlElement('Abstract', Value, [], [['Lang', Lang]]))\r
+        for (Lang, Value) in Header.GetDescription() + UNIInfDescriptionList:\r
+            if Value:\r
+                NodeList.append(CreateXmlElement('Description', Value, [], [['Lang', Lang]]))\r
+\r
+        AttributeList = []\r
+        Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
         return Root\r
 \r
     def __str__(self):\r
         return "Name = %s BaseName = %s GUID = %s Version = %s Copyright = %s \\r
         License = %s Abstract = %s Description = %s" % \\r
-        (self.Name, self.BaseName, self.GUID, self.Version, self.Copyright, \\r
-         self.License, self.Abstract, self.Description)\r
+        (self.Name, self.BaseName, self.GUID, self.Version, self.CopyrightList, \\r
+         self.LicenseList, self.AbstractList, self.DescriptionList)\r
 ##\r
 # DistributionPackageHeaderXml\r
 #\r
@@ -218,13 +269,11 @@ class DistributionPackageHeaderXml(object):
         self.Signature = XmlElement(Item, '%s/Signature' % Key)\r
         self.XmlSpecification = XmlElement(Item, '%s/XmlSpecification' % Key)\r
         self.Header.FromXml(Item, Key)\r
-\r
         DistributionPackageHeader = DistributionPackageHeaderObject()\r
         if self.ReadOnly.upper() == 'TRUE':\r
             DistributionPackageHeader.ReadOnly = True\r
         elif self.ReadOnly.upper() == 'FALSE':\r
             DistributionPackageHeader.ReadOnly = False\r
-\r
         if self.RePackage.upper() == 'TRUE':\r
             DistributionPackageHeader.RePackage = True\r
         elif self.RePackage.upper() == 'FALSE':\r
@@ -233,16 +282,14 @@ class DistributionPackageHeaderXml(object):
         DistributionPackageHeader.Date = self.Date\r
         DistributionPackageHeader.Signature = self.Signature\r
         DistributionPackageHeader.XmlSpecification = self.XmlSpecification\r
-\r
         DistributionPackageHeader.SetName(self.Header.Name)\r
         DistributionPackageHeader.SetBaseName(self.Header.BaseName)\r
         DistributionPackageHeader.SetGuid(self.Header.GUID)\r
         DistributionPackageHeader.SetVersion(self.Header.Version)\r
-        DistributionPackageHeader.SetCopyright(self.Header.Copyright)\r
-        DistributionPackageHeader.SetLicense(self.Header.License)\r
-        DistributionPackageHeader.SetAbstract(self.Header.Abstract)\r
-        DistributionPackageHeader.SetDescription(self.Header.Description)\r
-\r
+        DistributionPackageHeader.SetCopyright(self.Header.CopyrightList)\r
+        DistributionPackageHeader.SetLicense(self.Header.LicenseList)\r
+        DistributionPackageHeader.SetAbstract(self.Header.AbstractList)\r
+        DistributionPackageHeader.SetDescription(self.Header.DescriptionList)\r
         return DistributionPackageHeader\r
 \r
     def ToXml(self, DistributionPackageHeader, Key):\r
@@ -261,22 +308,35 @@ class DistributionPackageHeaderXml(object):
             AttributeList.append(['ReadOnly', str(DistributionPackageHeader.ReadOnly).lower()])\r
         if DistributionPackageHeader.RePackage != '':\r
             AttributeList.append(['RePackage', str(DistributionPackageHeader.RePackage).lower()])\r
-\r
+        if DistributionPackageHeader.GetAbstract():\r
+            DPAbstract = DistributionPackageHeader.GetAbstract()[0][1]\r
+        else:\r
+            DPAbstract = ''\r
+        if DistributionPackageHeader.GetDescription():\r
+            DPDescription = DistributionPackageHeader.GetDescription()[0][1]\r
+        else:\r
+            DPDescription = ''\r
+        if DistributionPackageHeader.GetCopyright():\r
+            DPCopyright = DistributionPackageHeader.GetCopyright()[0][1]\r
+        else:\r
+            DPCopyright = ''\r
+        if DistributionPackageHeader.GetLicense():\r
+            DPLicense = DistributionPackageHeader.GetLicense()[0][1]\r
+        else:\r
+            DPLicense = ''\r
         NodeList = [Element1,\r
                     Element2,\r
                     ['Vendor', DistributionPackageHeader.Vendor],\r
                     ['Date', DistributionPackageHeader.Date],\r
-                    ['Copyright', DistributionPackageHeader.GetCopyright()],\r
-                    ['License', DistributionPackageHeader.GetLicense()],\r
-                    ['Abstract', DistributionPackageHeader.GetAbstract()],\r
-                    ['Description', \\r
-                     DistributionPackageHeader.GetDescription()],\r
+                    ['Copyright', DPCopyright],\r
+                    ['License', DPLicense],\r
+                    ['Abstract', DPAbstract],\r
+                    ['Description', DPDescription],\r
                     ['Signature', DistributionPackageHeader.Signature],\r
                     ['XmlSpecification', \\r
                      DistributionPackageHeader.XmlSpecification],\r
                     ]\r
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
-\r
         return Root\r
 \r
     def __str__(self):\r
@@ -299,36 +359,63 @@ class PackageHeaderXml(object):
             IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
         self.PackagePath = XmlElement(Item, '%s/PackagePath' % Key)\r
         self.Header.FromXml(Item, Key)\r
-\r
         PackageObject2.SetName(self.Header.Name)\r
         PackageObject2.SetBaseName(self.Header.BaseName)\r
         PackageObject2.SetGuid(self.Header.GUID)\r
         PackageObject2.SetVersion(self.Header.Version)\r
-        PackageObject2.SetCopyright(self.Header.Copyright)\r
-        PackageObject2.SetLicense(self.Header.License)\r
-        PackageObject2.SetAbstract(self.Header.Abstract)\r
-        PackageObject2.SetDescription(self.Header.Description)\r
+        PackageObject2.SetCopyright(self.Header.CopyrightList)\r
+        PackageObject2.SetLicense(self.Header.LicenseList)\r
+        PackageObject2.SetAbstract(self.Header.AbstractList)\r
+        PackageObject2.SetDescription(self.Header.DescriptionList)\r
         PackageObject2.SetPackagePath(self.PackagePath)\r
 \r
     def ToXml(self, PackageObject2, Key):\r
         if self.PackagePath:\r
             pass\r
-        Element1 = \\r
-        CreateXmlElement('Name', PackageObject2.GetName(), [], \\r
+        Element1 = CreateXmlElement('Name', PackageObject2.GetName(), [], \\r
                          [['BaseName', PackageObject2.GetBaseName()]])\r
         Element2 = CreateXmlElement('GUID', PackageObject2.GetGuid(), [], \\r
                                     [['Version', PackageObject2.GetVersion()]])\r
-        AttributeList = []\r
         NodeList = [Element1,\r
-                    Element2,\r
-                    ['Copyright', PackageObject2.GetCopyright()],\r
-                    ['License', PackageObject2.GetLicense()],\r
-                    ['Abstract', PackageObject2.GetAbstract()],\r
-                    ['Description', PackageObject2.GetDescription()],\r
-                    ['PackagePath', PackageObject2.GetPackagePath()],\r
+                    Element2\r
                     ]\r
+        \r
+        UNIPackageAbrstractList = []\r
+        UNIPackageDescriptionList = []\r
+        # Get Abstract and Description from Uni File\r
+        # if the Uni File exists\r
+        if PackageObject2.UniFileClassObject is not None:\r
+            UniStrDict = PackageObject2.UniFileClassObject.OrderedStringList\r
+            for Lang in UniStrDict:\r
+                for StringDefClassObject in UniStrDict[Lang]:\r
+                    if not StringDefClassObject.StringValue:\r
+                        continue\r
+                    if StringDefClassObject.StringName == DataType.TAB_DEC_PACKAGE_ABSTRACT:\r
+                        UNIPackageAbrstractList.append((GetLanguageCode1766(Lang), \r
+                                                        ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+\r
+                    if StringDefClassObject.StringName == DataType.TAB_DEC_PACKAGE_DESCRIPTION:\r
+                        UNIPackageDescriptionList.append((GetLanguageCode1766(Lang), \r
+                                                          ConvertSpecialUnicodes(StringDefClassObject.StringValue)))\r
+\r
+        # Get Abstract and Description from DEC File Header\r
+        for (Lang, Value) in PackageObject2.GetCopyright():\r
+            if Value:\r
+                NodeList.append(CreateXmlElement(DataType.TAB_HEADER_COPYRIGHT, Value, [], []))\r
+        for (Lang, Value) in PackageObject2.GetLicense():\r
+            if Value:\r
+                NodeList.append(CreateXmlElement(DataType.TAB_HEADER_LICENSE, Value, [], []))\r
+        for (Lang, Value) in PackageObject2.GetAbstract() + UNIPackageAbrstractList:\r
+            if Value:\r
+                NodeList.append(CreateXmlElement(DataType.TAB_HEADER_ABSTRACT, Value, [], [['Lang', Lang]]))\r
+        for (Lang, Value) in PackageObject2.GetDescription() + UNIPackageDescriptionList:\r
+            if Value:\r
+                NodeList.append(CreateXmlElement(DataType.TAB_HEADER_DESCRIPTION, Value, [], [['Lang', Lang]]))\r
+        \r
+\r
+        NodeList.append(['PackagePath', PackageObject2.GetPackagePath()])\r
+        AttributeList = []\r
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
-\r
         return Root\r
 \r
     def __str__(self):\r
@@ -351,7 +438,6 @@ class MiscellaneousFileXml(object):
         self.Header.FromXml(Item, Key)\r
         NewItem = XmlNode(Item, '%s/Header' % Key)\r
         self.Header.FromXml(NewItem, 'Header')\r
-\r
         for SubItem in XmlList(Item, '%s/Filename' % Key):\r
             Filename = XmlElement(SubItem, '%s/Filename' % Key)\r
             Executable = XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'Executable')\r
@@ -362,12 +448,11 @@ class MiscellaneousFileXml(object):
             else:\r
                 Executable = ''\r
             self.Files.append([Filename, Executable])\r
-\r
         MiscFile = MiscFileObject()\r
-        MiscFile.SetCopyright(self.Header.Copyright)\r
-        MiscFile.SetLicense(self.Header.License)\r
-        MiscFile.SetAbstract(self.Header.Abstract)\r
-        MiscFile.SetDescription(self.Header.Description)\r
+        MiscFile.SetCopyright(self.Header.CopyrightList)\r
+        MiscFile.SetLicense(self.Header.LicenseList)\r
+        MiscFile.SetAbstract(self.Header.AbstractList)\r
+        MiscFile.SetDescription(self.Header.DescriptionList)\r
         MiscFileList = []\r
         for File in self.Files:\r
             FileObj = FileObject()\r
@@ -375,7 +460,6 @@ class MiscellaneousFileXml(object):
             FileObj.SetExecutable(File[1])\r
             MiscFileList.append(FileObj)\r
         MiscFile.SetFileList(MiscFileList)\r
-\r
         return MiscFile\r
     ##\r
     # This API is used for DistP's tool section\r
@@ -383,10 +467,8 @@ class MiscellaneousFileXml(object):
     def FromXml2(self, Item, Key):\r
         if Item is None:\r
             return None\r
-\r
         NewItem = XmlNode(Item, '%s/Header' % Key)\r
         self.Header.FromXml(NewItem, 'Header')\r
-\r
         for SubItem in XmlList(Item, '%s/Filename' % Key):\r
             Filename = XmlElement(SubItem, '%s/Filename' % Key)\r
             Executable = \\r
@@ -399,13 +481,12 @@ class MiscellaneousFileXml(object):
             else:\r
                 Executable = ''\r
             self.Files.append([Filename, Executable, OsType])\r
-\r
         MiscFile = MiscFileObject()\r
         MiscFile.SetName(self.Header.Name)\r
-        MiscFile.SetCopyright(self.Header.Copyright)\r
-        MiscFile.SetLicense(self.Header.License)\r
-        MiscFile.SetAbstract(self.Header.Abstract)\r
-        MiscFile.SetDescription(self.Header.Description)\r
+        MiscFile.SetCopyright(self.Header.CopyrightList)\r
+        MiscFile.SetLicense(self.Header.LicenseList)\r
+        MiscFile.SetAbstract(self.Header.AbstractList)\r
+        MiscFile.SetDescription(self.Header.DescriptionList)\r
         MiscFileList = []\r
         for File in self.Files:\r
             FileObj = FileObject()\r
@@ -414,7 +495,6 @@ class MiscellaneousFileXml(object):
             FileObj.SetOS(File[2])\r
             MiscFileList.append(FileObj)\r
         MiscFile.SetFileList(MiscFileList)\r
-\r
         return MiscFile\r
 \r
     ##\r
@@ -424,19 +504,33 @@ class MiscellaneousFileXml(object):
         if self.Header:\r
             pass\r
         if MiscFile:\r
-            NodeList = [['Copyright', MiscFile.GetCopyright()],\r
-                        ['License', MiscFile.GetLicense()],\r
-                        ['Abstract', MiscFile.GetAbstract()],\r
-                        ['Description', MiscFile.GetDescription()],\r
+            if MiscFile.GetAbstract():\r
+                DPAbstract = MiscFile.GetAbstract()[0][1]\r
+            else:\r
+                DPAbstract = ''\r
+            if MiscFile.GetDescription():\r
+                DPDescription = MiscFile.GetDescription()[0][1]\r
+            else:\r
+                DPDescription = ''\r
+            if MiscFile.GetCopyright():\r
+                DPCopyright = MiscFile.GetCopyright()[0][1]\r
+            else:\r
+                DPCopyright = ''\r
+            if MiscFile.GetLicense():\r
+                DPLicense = MiscFile.GetLicense()[0][1]\r
+            else:\r
+                DPLicense = ''\r
+            NodeList = [['Copyright', DPCopyright],\r
+                        ['License', DPLicense],\r
+                        ['Abstract', DPAbstract],\r
+                        ['Description', DPDescription],\r
                        ]\r
-\r
             for File in MiscFile.GetFileList():\r
                 NodeList.append\\r
                 (CreateXmlElement\\r
                  ('Filename', File.GetURI(), [], \\r
                   [['Executable', str(File.GetExecutable()).lower()]]))\r
             Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
-\r
             return Root\r
     ##\r
     # This API is used for DistP's tool section\r
@@ -445,15 +539,30 @@ class MiscellaneousFileXml(object):
         if self.Header:\r
             pass\r
         if MiscFile:\r
+            if MiscFile.GetAbstract():\r
+                DPAbstract = MiscFile.GetAbstract()[0][1]\r
+            else:\r
+                DPAbstract = ''\r
+            if MiscFile.GetDescription():\r
+                DPDescription = MiscFile.GetDescription()[0][1]\r
+            else:\r
+                DPDescription = ''\r
+            if MiscFile.GetCopyright():\r
+                DPCopyright = MiscFile.GetCopyright()[0][1]\r
+            else:\r
+                DPCopyright = ''\r
+            if MiscFile.GetLicense():\r
+                DPLicense = MiscFile.GetLicense()[0][1]\r
+            else:\r
+                DPLicense = ''\r
             NodeList = [['Name', MiscFile.GetName()],\r
-                        ['Copyright', MiscFile.GetCopyright()],\r
-                        ['License', MiscFile.GetLicense()],\r
-                        ['Abstract', MiscFile.GetAbstract()],\r
-                        ['Description', MiscFile.GetDescription()],\r
+                        ['Copyright', DPCopyright],\r
+                        ['License', DPLicense],\r
+                        ['Abstract', DPAbstract],\r
+                        ['Description', DPDescription],\r
                        ]\r
             HeaderNode = CreateXmlElement('Header', '', NodeList, [])\r
             NodeList = [HeaderNode]\r
-\r
             for File in MiscFile.GetFileList():\r
                 NodeList.append\\r
                 (CreateXmlElement\\r
@@ -461,7 +570,6 @@ class MiscellaneousFileXml(object):
                   [['Executable', str(File.GetExecutable()).lower()], \\r
                    ['OS', File.GetOS()]]))\r
             Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
-\r
             return Root\r
 \r
     def __str__(self):\r
@@ -476,6 +584,11 @@ class UserExtensionsXml(object):
     def __init__(self):\r
         self.UserId = ''\r
         self.Identifier = ''\r
+        self.BinaryAbstractList = []\r
+        self.BinaryDescriptionList = []\r
+        self.BinaryCopyrightList = []\r
+        self.BinaryLicenseList = []\r
+        self.LangDefsList = []\r
         self.DefineDict = {}\r
         self.BuildOptionDict = {}\r
         self.IncludesDict = {}\r
@@ -489,51 +602,64 @@ class UserExtensionsXml(object):
     def FromXml2(self, Item, Key):\r
         self.UserId = XmlAttribute(XmlNode(Item, '%s' % Key), 'UserId')\r
         self.Identifier = XmlAttribute(XmlNode(Item, '%s' % Key), 'Identifier')\r
-\r
         UserExtension = UserExtensionObject()\r
         UserExtension.SetUserID(self.UserId)\r
         UserExtension.SetIdentifier(self.Identifier)\r
-\r
         return UserExtension\r
 \r
     def FromXml(self, Item, Key):\r
         self.UserId = XmlAttribute(XmlNode(Item, '%s' % Key), 'UserId')\r
         self.Identifier = XmlAttribute(XmlNode(Item, '%s' % Key), 'Identifier')\r
+        if self.UserId == DataType.TAB_BINARY_HEADER_USERID \\r
+        and self.Identifier == DataType.TAB_BINARY_HEADER_IDENTIFIER:\r
+            for SubItem in XmlList(Item, '%s/BinaryAbstract' % Key):\r
+                BinaryAbstractLang = XmlAttribute(SubItem, 'Lang')\r
+                self.BinaryAbstractList.append((BinaryAbstractLang, XmlElement(SubItem, '%s/BinaryAbstract' % Key)))\r
+            for SubItem in XmlList(Item, '%s/BinaryDescription' % Key):\r
+                BinaryDescriptionLang = XmlAttribute(SubItem, 'Lang')\r
+                self.BinaryDescriptionList.append((BinaryDescriptionLang, \r
+                                                       XmlElement(SubItem, '%s/BinaryDescription' % Key)))\r
+            for SubItem in XmlList(Item, '%s/BinaryCopyright' % Key):\r
+                BinaryCopyrightLang = XmlAttribute(SubItem, 'Lang')\r
+                self.BinaryCopyrightList.append((BinaryCopyrightLang, \r
+                                                     XmlElement(SubItem, '%s/BinaryCopyright' % Key)))\r
+            for SubItem in XmlList(Item, '%s/BinaryLicense' % Key):\r
+                BinaryLicenseLang = XmlAttribute(SubItem, 'Lang')\r
+                self.BinaryLicenseList.append((BinaryLicenseLang, \r
+                                                   XmlElement(SubItem, '%s/BinaryLicense' % Key)))   \r
 \r
         DefineItem = XmlNode(Item, '%s/Define' % Key)\r
         for SubItem in XmlList(DefineItem, 'Define/Statement'):\r
             Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
             self.DefineDict[Statement] = ""\r
-\r
         BuildOptionItem = XmlNode(Item, '%s/BuildOption' % Key)\r
         for SubItem in XmlList(BuildOptionItem, 'BuildOption/Statement'):\r
             Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
             Arch = XmlAttribute(XmlNode(SubItem, '%s/Statement' % Key), 'SupArchList')\r
             self.BuildOptionDict[Arch] = Statement\r
-\r
         IncludesItem = XmlNode(Item, '%s/Includes' % Key)\r
         for SubItem in XmlList(IncludesItem, 'Includes/Statement'):\r
             Statement = XmlElement(SubItem, '%s/Statement' % Key)\r
             Arch = XmlAttribute(XmlNode(SubItem, '%s/Statement' % Key), 'SupArchList')\r
             self.IncludesDict[Statement] = Arch\r
-\r
         SourcesItem = XmlNode(Item, '%s/Sources' % Key)\r
         Tmp = UserExtensionSourceXml()\r
         SourceDict = Tmp.FromXml(SourcesItem, 'Sources')\r
         self.SourcesDict = SourceDict\r
-\r
         BinariesItem = XmlNode(Item, '%s/Binaries' % Key)\r
         Tmp = UserExtensionBinaryXml()\r
         BinariesDict = Tmp.FromXml(BinariesItem, 'Binaries')\r
         self.BinariesDict = BinariesDict\r
-\r
         self.Statement = XmlElement(Item, 'UserExtensions')\r
         SupArch = XmlAttribute(XmlNode(Item, '%s' % Key), 'SupArchList')\r
         self.SupArchList = [Arch for Arch in GetSplitValueList(SupArch, DataType.TAB_SPACE_SPLIT) if Arch]\r
-\r
         UserExtension = UserExtensionObject()\r
         UserExtension.SetUserID(self.UserId)\r
         UserExtension.SetIdentifier(self.Identifier)\r
+        UserExtension.SetBinaryAbstract(self.BinaryAbstractList)\r
+        UserExtension.SetBinaryDescription(self.BinaryDescriptionList)\r
+        UserExtension.SetBinaryCopyright(self.BinaryCopyrightList)\r
+        UserExtension.SetBinaryLicense(self.BinaryLicenseList)\r
         UserExtension.SetStatement(self.Statement)\r
         UserExtension.SetSupArchList(self.SupArchList)\r
         UserExtension.SetDefinesDict(self.DefineDict)\r
@@ -541,22 +667,37 @@ class UserExtensionsXml(object):
         UserExtension.SetIncludesDict(self.IncludesDict)\r
         UserExtension.SetSourcesDict(self.SourcesDict)\r
         UserExtension.SetBinariesDict(self.BinariesDict)\r
-\r
         return UserExtension\r
 \r
     def ToXml(self, UserExtension, Key):\r
         if self.UserId:\r
             pass\r
-\r
         AttributeList = [['UserId', str(UserExtension.GetUserID())],\r
                          ['Identifier', str(UserExtension.GetIdentifier())],\r
                          ['SupArchList', \\r
                           GetStringOfList(UserExtension.GetSupArchList())],\r
                         ]\r
-\r
         Root = CreateXmlElement('%s' % Key, UserExtension.GetStatement(), [], \\r
-                                AttributeList)\r
-\r
+                                    AttributeList)\r
+        if UserExtension.GetIdentifier() == DataType.TAB_BINARY_HEADER_IDENTIFIER and \\r
+        UserExtension.GetUserID() == DataType.TAB_BINARY_HEADER_USERID:\r
+            for (Lang, Value) in UserExtension.GetBinaryAbstract():\r
+                if Value:\r
+                    ChildElement = CreateXmlElement('BinaryAbstract', Value, [], [['Lang', Lang]])\r
+                    Root.appendChild(ChildElement)\r
+            for (Lang, Value) in UserExtension.GetBinaryDescription():\r
+                if Value:\r
+                    ChildElement = CreateXmlElement('BinaryDescription', Value, [], [['Lang', Lang]])\r
+                    Root.appendChild(ChildElement)\r
+            for (Lang, Value) in UserExtension.GetBinaryCopyright():\r
+                if Value:\r
+                    ChildElement = CreateXmlElement('BinaryCopyright', Value, [], [])\r
+                    Root.appendChild(ChildElement)\r
+            for (Lang, Value) in UserExtension.GetBinaryLicense():\r
+                if Value:\r
+                    ChildElement = CreateXmlElement('BinaryLicense', Value, [], [])\r
+                    Root.appendChild(ChildElement)\r
+                    \r
         NodeList = []\r
         DefineDict = UserExtension.GetDefinesDict()\r
         if DefineDict:\r
@@ -565,7 +706,6 @@ class UserExtensionsXml(object):
                                 ('Statement', Item, [], []))\r
             DefineElement = CreateXmlElement('Define', '', NodeList, [])\r
             Root.appendChild(DefineElement)\r
-\r
         NodeList = []\r
         BuildOptionDict = UserExtension.GetBuildOptionDict()\r
         if BuildOptionDict:\r
@@ -576,7 +716,6 @@ class UserExtensionsXml(object):
             BuildOptionElement = \\r
             CreateXmlElement('BuildOption', '', NodeList, [])\r
             Root.appendChild(BuildOptionElement)\r
-\r
         NodeList = []\r
         IncludesDict = UserExtension.GetIncludesDict()\r
         if IncludesDict:\r
@@ -586,19 +725,16 @@ class UserExtensionsXml(object):
                                  [['SupArchList', IncludesDict[Item]]]))\r
             IncludesElement = CreateXmlElement('Includes', '', NodeList, [])\r
             Root.appendChild(IncludesElement)\r
-\r
         NodeList = []\r
         SourcesDict = UserExtension.GetSourcesDict()\r
         if SourcesDict:\r
             Tmp = UserExtensionSourceXml()\r
             Root.appendChild(Tmp.ToXml(SourcesDict, 'Sources'))\r
-\r
         NodeList = []\r
         BinariesDict = UserExtension.GetBinariesDict()\r
         if BinariesDict:\r
             Tmp = UserExtensionBinaryXml()\r
             Root.appendChild(Tmp.ToXml(BinariesDict, 'Binaries'))\r
-\r
         return Root\r
 \r
     def __str__(self):\r
@@ -620,7 +756,6 @@ class UserExtensionSourceXml(object):
         if self.UserExtensionSource:\r
             pass\r
         Dict = {}\r
-\r
         #SourcesItem = XmlNode(Item, '%s/Sources' % Key)\r
         for SubItem in XmlList(Item, 'Sources/SourceFile'):\r
             FileName = XmlElement(SubItem, 'SourceFile/FileName')\r
@@ -628,7 +763,6 @@ class UserExtensionSourceXml(object):
             FeatureFlag = XmlElement(SubItem, 'SourceFile/FeatureFlag')\r
             SupArchStr = XmlElement(SubItem, 'SourceFile/SupArchList')\r
             DictKey = (FileName, Family, FeatureFlag, SupArchStr)\r
-\r
             ValueList = []\r
             for ValueNodeItem in XmlList(SubItem, \\r
                                          'SourceFile/SourceFileOtherAttr'):\r
@@ -643,9 +777,7 @@ class UserExtensionSourceXml(object):
                     ToolCode = ''\r
                     Comment = ''\r
                 ValueList.append((TagName, ToolCode, Comment))\r
-\r
             Dict[DictKey] = ValueList\r
-\r
         return Dict\r
 \r
     def ToXml(self, Dict, Key):\r
@@ -690,16 +822,13 @@ class UserExtensionBinaryXml(object):
             pass\r
         if self.UserExtensionBinary:\r
             pass\r
-\r
         Dict = {}\r
-\r
         for SubItem in XmlList(Item, 'Binaries/Binary'):\r
             FileName = XmlElement(SubItem, 'Binary/FileName')\r
             FileType = XmlElement(SubItem, 'Binary/FileType')\r
             FFE = XmlElement(SubItem, 'Binary/FeatureFlag')\r
             SupArch = XmlElement(SubItem, 'Binary/SupArchList')\r
             DictKey = (FileName, FileType, ConvertNOTEQToNE(FFE), SupArch)\r
-\r
             ValueList = []\r
             for ValueNodeItem in XmlList(SubItem, \\r
                                          'Binary/BinaryFileOtherAttr'):\r
@@ -719,9 +848,7 @@ class UserExtensionBinaryXml(object):
                     Comment = ''\r
 \r
                 ValueList.append((Target, Family, TagName, Comment))\r
-\r
             Dict[DictKey] = ValueList\r
-\r
         return Dict\r
 \r
     def ToXml(self, Dict, Key):\r
@@ -777,7 +904,6 @@ class LibraryClassXml(object):
             HelpTextObj = HelpTextXml()\r
             HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
             self.HelpText.append(HelpTextObj)\r
-\r
         LibraryClass = LibraryClassObject()\r
         LibraryClass.SetLibraryClass(self.Keyword)\r
         LibraryClass.SetIncludeHeader(self.HeaderFile)\r
@@ -787,7 +913,6 @@ class LibraryClassXml(object):
         LibraryClass.SetSupModuleList(self.CommonDefines.SupModList)\r
         LibraryClass.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
         LibraryClass.SetHelpTextList(GetHelpTextList(self.HelpText))\r
-\r
         return LibraryClass\r
 \r
     def ToXml(self, LibraryClass, Key):\r
@@ -802,17 +927,13 @@ class LibraryClassXml(object):
         for Item in LibraryClass.GetHelpTextList():\r
             Tmp = HelpTextXml()\r
             NodeList.append(Tmp.ToXml(Item))\r
-\r
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
-\r
         return Root\r
 \r
     def ToXml2(self, LibraryClass, Key):\r
         if self.HeaderFile:\r
             pass\r
-\r
         FeatureFlag = ConvertNEToNOTEQ(LibraryClass.GetFeatureFlag())\r
-\r
         AttributeList = \\r
         [['Usage', LibraryClass.GetUsage()], \\r
          ['SupArchList', GetStringOfList(LibraryClass.GetSupArchList())], \\r
@@ -823,9 +944,7 @@ class LibraryClassXml(object):
         for Item in LibraryClass.GetHelpTextList():\r
             Tmp = HelpTextXml()\r
             NodeList.append(Tmp.ToXml(Item))\r
-\r
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
-\r
         return Root\r
 \r
     def __str__(self):\r
@@ -847,18 +966,18 @@ class FilenameXml(object):
 \r
     def FromXml(self, Item, Key):\r
         self.FileType = XmlAttribute(Item, 'FileType')\r
+        Guid = XmlAttribute(Item, 'GUID')\r
         self.Filename = XmlElement(Item, 'Filename')\r
         self.CommonDefines.FromXml(Item, Key)\r
-\r
         FeatureFlag = ConvertNOTEQToNE(self.CommonDefines.FeatureFlag)\r
-\r
         Filename = FileNameObject()\r
         #\r
         # Convert File Type\r
         #\r
         if self.FileType == 'UEFI_IMAGE':\r
             self.FileType = 'PE32'\r
-\r
+        \r
+        Filename.SetGuidValue(Guid)\r
         Filename.SetFileType(self.FileType)\r
         Filename.SetFilename(self.Filename)\r
         Filename.SetSupArchList(self.CommonDefines.SupArchList)\r
@@ -873,6 +992,7 @@ class FilenameXml(object):
                           GetStringOfList(Filename.GetSupArchList())],\r
                          ['FileType', Filename.GetFileType()],\r
                          ['FeatureFlag', ConvertNEToNOTEQ(Filename.GetFeatureFlag())],\r
+                         ['GUID', Filename.GetGuidValue()]\r
                         ]\r
         Root = CreateXmlElement('%s' % Key, Filename.GetFilename(), [], AttributeList)\r
 \r
index 4be20d00cacd6e472dfe7b5314fcc490a8600728..037471056d81fc40b8053c91e3325e4fddb71d2e 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is for converting package information data file to xml file.\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -32,6 +32,7 @@ from Library.DataType import TAB_SECTION_END
 from Logger import StringTable as ST\r
 from Library.String import ConvertSpecialChar\r
 from Library.ParserValidate import IsValidPath\r
+from Library import GlobalData\r
 \r
 ## log error:\r
 #\r
@@ -58,9 +59,7 @@ def __ValidatePath(Path, Root):
 # @param Filename: File to be checked\r
 #\r
 def ValidateMiscFile(Filename):\r
-    Root = ''\r
-    if 'WORKSPACE' in os.environ:\r
-        Root = os.environ['WORKSPACE']\r
+    Root = GlobalData.gWORKSPACE\r
     return __ValidatePath(Filename, Root)\r
 \r
 ## ValidateToolsFile\r
@@ -71,8 +70,8 @@ def ValidateToolsFile(Filename):
     Valid, Cause = False, ''\r
     if not Valid and 'EDK_TOOLS_PATH' in os.environ:\r
         Valid, Cause = __ValidatePath(Filename, os.environ['EDK_TOOLS_PATH'])\r
-    if not Valid and 'WORKSPACE' in os.environ:\r
-        Valid, Cause = __ValidatePath(Filename, os.environ['WORKSPACE'])\r
+    if not Valid:\r
+        Valid, Cause = __ValidatePath(Filename, GlobalData.gWORKSPACE)\r
     return Valid, Cause\r
 \r
 ## ParseFileList\r
@@ -332,7 +331,7 @@ def IniToXml(IniFile):
     for Index in range(0, len(FileContent)):\r
         LastIndex = Index\r
         Line = FileContent[Index].strip()\r
-        if Line == '':\r
+        if Line == '' or Line.startswith(';'):\r
             continue\r
         if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END:\r
             CurrentKey = ''\r
index 9e141cabb4c4b1b4c53d949d492d22bd29336d30..d117468a17d868106c7cbc1ced7d144bc113777f 100644 (file)
@@ -3,9 +3,9 @@
 #\r
 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
-# This program and the accompanying materials are licensed and made available \r
-# under the terms and conditions of the BSD License which accompanies this \r
-# distribution. The full text of the license may be found at \r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License which accompanies this\r
+# distribution. The full text of the license may be found at\r
 # http://opensource.org/licenses/bsd-license.php\r
 #\r
 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
@@ -67,7 +67,7 @@ from Library.Misc import GetSplitValueList
 #    </Filename> {1,}\r
 #    <AsBuilt> ... </AsBuilt> {0,}\r
 #    </BinaryFile> {1,}\r
-#    \r
+#\r
 class BinaryFileXml(object):\r
     def __init__(self):\r
         self.FileNames = []\r
@@ -82,11 +82,16 @@ class BinaryFileXml(object):
             pass\r
         BinaryFile = BinaryFileObject()\r
         FilenameList = []\r
+        SupArchList = ['COMMON']\r
         for SubItem in XmlList(Item, '%s/Filename' % Key):\r
             Axml = FilenameXml()\r
             Bxml = Axml.FromXml(SubItem, 'Filename')\r
             FilenameList.append(Bxml)\r
         BinaryFile.SetFileNameList(FilenameList)\r
+        for FileName in FilenameList:\r
+            if FileName.GetSupArchList():\r
+                SupArchList = FileName.GetSupArchList()\r
+        BinaryFile.SetSupArchList(SupArchList)\r
         if GlobalData.gIS_BINARY_INF:\r
             AsBuiltList = []\r
             for AsBuiltItem in XmlList(Item, '%s/AsBuilt' % Key):\r
@@ -135,42 +140,44 @@ class BinaryFileXml(object):
             NodeList.append(Tmp.ToXml(Filename, 'Filename'))\r
             SupportArch = Filename.SupArchList\r
 \r
-        if GlobalData.gIS_BINARY_INF:\r
-            AsBuildList = BinaryFile.GetAsBuiltList()\r
-            PatchPcdValueList = AsBuildList.GetPatchPcdList()\r
-            PcdExList = AsBuildList.GetPcdExList()\r
-            LibGuidVerList = AsBuildList.GetLibraryInstancesList()\r
-            BuildFlagList = AsBuildList.GetBuildFlagsList()\r
-\r
-            AsBuiltNodeList = []\r
-\r
-            for Pcd in PatchPcdValueList:\r
-                if IsMatchArch(Pcd.SupArchList, SupportArch):\r
-                    Tmp = PcdEntryXml()\r
-                    AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))\r
-\r
-            for Pcd in PcdExList:\r
-                if IsMatchArch(Pcd.SupArchList, SupportArch):\r
-                    Tmp = PcdEntryXml()\r
-                    AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))\r
-\r
-            GuiVerElemList = []\r
-            for LibGuidVer in LibGuidVerList:\r
+        AsBuildList = BinaryFile.GetAsBuiltList()\r
+        PatchPcdValueList = AsBuildList.GetPatchPcdList()\r
+        PcdExList = AsBuildList.GetPcdExList()\r
+        LibGuidVerList = AsBuildList.GetLibraryInstancesList()\r
+        BuildFlagList = AsBuildList.GetBuildFlagsList()\r
+\r
+        AsBuiltNodeList = []\r
+\r
+        for Pcd in PatchPcdValueList:\r
+            if IsMatchArch(Pcd.SupArchList, SupportArch):\r
+                Tmp = PcdEntryXml()\r
+                AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PatchPcdValue'))\r
+\r
+        for Pcd in PcdExList:\r
+            if IsMatchArch(Pcd.SupArchList, SupportArch):\r
+                Tmp = PcdEntryXml()\r
+                AsBuiltNodeList.append(Tmp.ToXml4(Pcd, 'PcdExValue'))\r
+\r
+        GuiVerElemList = []\r
+        for LibGuidVer in LibGuidVerList:\r
+            if IsMatchArch(LibGuidVer.GetSupArchList(), SupportArch):\r
                 GuiVerElem = \\r
                 CreateXmlElement('GUID', LibGuidVer.GetLibGuid(), [], [['Version', LibGuidVer.GetLibVersion()]])\r
                 GuiVerElemList.append(GuiVerElem)\r
-            if len(GuiVerElemList) > 0:\r
-                LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])\r
-                AsBuiltNodeList.append(LibGuidVerElem)\r
+        if len(GuiVerElemList) > 0:\r
+            LibGuidVerElem = CreateXmlElement('LibraryInstances', '', GuiVerElemList, [])\r
+            AsBuiltNodeList.append(LibGuidVerElem)\r
 \r
-            for BuildFlag in BuildFlagList:\r
-                Tmp = BuildFlagXml()\r
-                Elem = CreateXmlElement('BuildFlags', ''.join(BuildFlag), [], [])\r
-                AsBuiltNodeList.append(Elem)\r
+        for BuildFlag in BuildFlagList:\r
+            if IsMatchArch(BuildFlag.GetSupArchList(), SupportArch):\r
+                for Item in BuildFlag.GetAsBuildList():\r
+                    Tmp = BuildFlagXml()\r
+                    Elem = CreateXmlElement('BuildFlags', ''.join(Item), [], [])\r
+                    AsBuiltNodeList.append(Elem)\r
 \r
-            if len(AsBuiltNodeList) > 0:\r
-                Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])\r
-                NodeList.append(Element)\r
+        if len(AsBuiltNodeList) > 0:\r
+            Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, [])\r
+            NodeList.append(Element)\r
 \r
         Root = CreateXmlElement('%s' % Key, '', NodeList, [])\r
 \r
@@ -286,7 +293,7 @@ class ExternXml(object):
         for Item in self.HelpText:\r
             Str = Str + '\n\t' + str(Item)\r
         return Str\r
-##    \r
+##\r
 # DepexXml\r
 #\r
 class DepexXml(object):\r
@@ -654,7 +661,7 @@ class ModuleSurfaceAreaXml(object):
         else:\r
             Module.SetMiscFileList([])\r
 \r
-        #           \r
+        #\r
         # UserExtensions\r
         #\r
         for Item in XmlList(Item, '/ModuleSurfaceArea/UserExtensions'):\r
@@ -740,7 +747,7 @@ class ModuleSurfaceAreaXml(object):
            not XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'):\r
             Module.SetPackageDependencyList([None])\r
 \r
-        # \r
+        #\r
         # Guid\r
         #\r
         for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'):\r
index 85062ac8838b26439569afb4761de560f040d0c3..d6ed8c5e3b41443497816580bcb52e85c1f102be 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse a Package file of .PKG file\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -254,6 +254,16 @@ class PackageSurfaceAreaXml(object):
             Tmp = PcdEntryXml()\r
             PcdEntry = Tmp.FromXml2(SubItem, 'PcdEntry')\r
             Package.SetPcdList(Package.GetPcdList() + [PcdEntry])\r
+            \r
+            #\r
+            # Get PcdErrorCommentDict from PcdError in PcdEntry Node\r
+            #\r
+            for PcdErrorObj in PcdEntry.GetPcdErrorsList():\r
+                PcdErrorMessageList = PcdErrorObj.GetErrorMessageList()\r
+                if PcdErrorMessageList:\r
+                    Package.PcdErrorCommentDict[(PcdEntry.GetTokenSpaceGuidCName(), PcdErrorObj.GetErrorNumber())] = \\r
+                    PcdErrorMessageList\r
+                    \r
 \r
         if XmlList(Item, '/PackageSurfaceArea/PcdDeclarations') and not \\r
            XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'):\r
index d1f1332726fc9823c85fe7c73cc74f43c4aae041..4603918babcbf5bfe2404070b7861b39a7017245 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse a PCD file of .PKG file\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -32,8 +32,11 @@ from Library import GlobalData
 from Object.POM.CommonObject import PcdObject\r
 from Object.POM.CommonObject import PcdErrorObject\r
 from Xml.CommonXml import HelpTextXml\r
+from Xml.CommonXml import PromptXml\r
 from Xml.CommonXml import CommonDefinesXml\r
 from Xml.XmlParserMisc import GetHelpTextList\r
+from Xml.XmlParserMisc import GetPromptList\r
+import re\r
 \r
 ##\r
 # PcdErrorXml\r
@@ -51,7 +54,7 @@ class PcdErrorXml(object):
         self.ValidValueList = XmlElement(Item, '%s/ValidValueList' % Key)\r
         self.ValidValueListLang = \\r
         XmlAttribute(XmlNode(Item, '%s/ValidValueList' % Key), 'Lang')\r
-        self.ValidValueRange = XmlElement(Item, '%s/ValidValueRange' % Key)\r
+        self.ValidValueRange = self.TransferValidEpxr2ValidRange(XmlElement(Item, '%s/ValidValueRange' % Key))\r
         self.Expression = XmlElement(Item, '%s/Expression' % Key)\r
         self.ErrorNumber = XmlElement(Item, '%s/ErrorNumber' % Key)\r
         for ErrMsg in XmlList(Item, '%s/ErrorMessage' % Key):\r
@@ -81,9 +84,12 @@ class PcdErrorXml(object):
                              [['Lang', PcdError.GetValidValueLang()]])\r
             NodeList.append(Element1)\r
         if PcdError.GetValidValueRange():\r
+            TansferedRangeStr = self.TransferValidRange2Expr(PcdError.GetTokenSpaceGuidCName(),\r
+                                                             PcdError.GetCName(),\r
+                                                             PcdError.GetValidValueRange())\r
             Element1 = \\r
             CreateXmlElement('ValidValueRange', \\r
-                             PcdError.GetValidValueRange(), [], [])\r
+                             TansferedRangeStr, [], [])\r
             NodeList.append(Element1)\r
         if PcdError.GetExpression():\r
             NodeList.append(['Expression', PcdError.GetExpression()])\r
@@ -96,6 +102,147 @@ class PcdErrorXml(object):
         Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList)\r
         \r
         return Root\r
+    \r
+    def TransferValidRange2Expr(self, TokenSpaceGuidCName, CName, ValidRange):\r
+        if self.Expression:\r
+            pass\r
+        INT_RANGE_PATTERN1 = '[\t\s]*[0-9]+[\t\s]*-[\t\s]*[0-9]+'\r
+        INT_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'\r
+        HEX_RANGE_PATTERN1 = \\r
+            '[\t\s]*0[xX][a-fA-F0-9]+[\t\s]*-[\t\s]*0[xX][a-fA-F0-9]+'\r
+        HEX_RANGE_PATTERN2 = '[\t\s]*(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][a-fA-F0-9]+[\t\s]*'\r
+        IntMatch1 = re.compile(INT_RANGE_PATTERN1)\r
+        IntMatch2 = re.compile(INT_RANGE_PATTERN2)\r
+        HexMatch1 = re.compile(HEX_RANGE_PATTERN1)\r
+        HexMatch2 = re.compile(HEX_RANGE_PATTERN2)\r
+        PcdName = '.'.join([TokenSpaceGuidCName, CName])\r
+        HexMatchedList = []\r
+        IntMatchedList = []\r
+        #\r
+        # Convert HEX2 format range\r
+        #\r
+        if HexMatch2:\r
+            for MatchObj in HexMatch2.finditer(ValidRange):\r
+                MatchStr = MatchObj.group()\r
+                TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])\r
+                ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+        #\r
+        # Convert INT2 format range\r
+        #\r
+        if IntMatch2:\r
+            for MatchObj in IntMatch2.finditer(ValidRange):\r
+                MatchStr = MatchObj.group()\r
+                TransferedRangeStr = ' '.join(['', PcdName, MatchStr.strip()])\r
+                ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr)     \r
+        #\r
+        # Convert HEX1 format range\r
+        #\r
+        if HexMatch1:\r
+            HexMatchedList += HexMatch1.findall(ValidRange)\r
+            \r
+        for MatchStr in HexMatchedList:\r
+            RangeItemList = MatchStr.strip().split('-')\r
+            TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \\r
+                (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())\r
+            ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+        #\r
+        # Convert INT1 format range\r
+        #\r
+        if IntMatch1:\r
+            IntMatchedList += IntMatch1.findall(ValidRange)\r
+            \r
+        for MatchStr in IntMatchedList:\r
+            RangeItemList = MatchStr.strip().split('-')\r
+            TransferedRangeStr = '(%s GE %s) AND (%s LE %s)' % \\r
+                (PcdName, RangeItemList[0].strip(), PcdName, RangeItemList[1].strip())\r
+            ValidRange = ValidRange.replace(MatchStr, TransferedRangeStr) \r
+            \r
+        return ValidRange\r
+    \r
+    def TransferValidEpxr2ValidRange(self, ValidRangeExpr):\r
+        if self.Expression:\r
+            pass\r
+        \r
+        PCD_PATTERN = \\r
+        '[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*\.[\t\s]*[_a-zA-Z][a-zA-Z0-9_]*[\t\s]*'\r
+        IntPattern1 = \\r
+        '[\t\s]*\([\t\s]*'+PCD_PATTERN+'[\t\s]+GE[\t\s]+\d+[\t\s]*\)[\t\s]+AND[\t\s]+\([\t\s]*'+\\r
+        PCD_PATTERN+'[\t\s]+LE[\t\s]+\d+[\t\s]*\)'\r
+        IntPattern1 = IntPattern1.replace(' ', '')\r
+        IntPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+\d+[\t\s]*'\r
+        \r
+        HexPattern1 = \\r
+        '[\t\s]*\([\t\s]*'+PCD_PATTERN+'[\t\s]+GE[\t\s]+0[xX][0-9a-fA-F]+[\t\s]*\)[\t\s]+AND[\t\s]+\([\t\s]*'+\\r
+        PCD_PATTERN+'[\t\s]+LE[\t\s]+0[xX][0-9a-fA-F]+[\t\s]*\)'\r
+        HexPattern1 = HexPattern1.replace(' ', '')\r
+        HexPattern2 = '[\t\s]*'+PCD_PATTERN+'[\t\s]+(LT|GT|LE|GE|XOR|EQ)[\t\s]+0[xX][0-9a-zA-Z]+[\t\s]*'\r
+        \r
+        #\r
+        # Do the Hex1 conversion\r
+        # \r
+        HexMatchedList = re.compile(HexPattern1).findall(ValidRangeExpr)\r
+        HexRangeDict = {}\r
+        for HexMatchedItem in HexMatchedList:\r
+            #\r
+            # To match items on both sides of '-'\r
+            #\r
+            RangeItemList = re.compile('[\t\s]*0[xX][0-9a-fA-F]+[\t\s]*').findall(HexMatchedItem)\r
+            if RangeItemList and len(RangeItemList) == 2:\r
+                HexRangeDict[HexMatchedItem] = RangeItemList            \r
+        \r
+        for Key in HexRangeDict.keys():\r
+            MaxItem = MixItem = ''\r
+            if int(HexRangeDict[Key][0], 16) > int(HexRangeDict[Key][1], 16):\r
+                MaxItem = HexRangeDict[Key][0]\r
+                MixItem = HexRangeDict[Key][1]\r
+            else:\r
+                MaxItem = HexRangeDict[Key][1]\r
+                MixItem = HexRangeDict[Key][0]\r
+            \r
+            Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())\r
+            ValidRangeExpr = ValidRangeExpr.replace(Key, Range)\r
+        #\r
+        # Do the INT1 conversion\r
+        #\r
+        IntRangeDict = {}\r
+        IntMatchList = re.compile(IntPattern1).findall(ValidRangeExpr)\r
+        for MatchedItem in IntMatchList:\r
+            #\r
+            # To match items on both sides of '-'\r
+            #\r
+            RangeItemList = re.compile('[\t\s]*\d+[\t\s]*').findall(MatchedItem)\r
+            if RangeItemList and len(RangeItemList) == 2:  \r
+                IntRangeDict[MatchedItem] = RangeItemList\r
+                    \r
+        for Key in IntRangeDict.keys():\r
+            MaxItem = MixItem = ''\r
+            if int(IntRangeDict[Key][0]) > int(IntRangeDict[Key][1]):\r
+                MaxItem = IntRangeDict[Key][0]\r
+                MixItem = IntRangeDict[Key][1]\r
+            else:\r
+                MaxItem = IntRangeDict[Key][1]\r
+                MixItem = IntRangeDict[Key][0]\r
+            \r
+            Range = ' %s - %s' % (MixItem.strip(), MaxItem.strip())\r
+            ValidRangeExpr = ValidRangeExpr.replace(Key, Range)\r
+        #\r
+        # Do the HEX2 conversion        \r
+        #\r
+        for MatchObj in re.compile(HexPattern2).finditer(ValidRangeExpr):\r
+            MatchStr = MatchObj.group()\r
+            Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)\r
+            ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)\r
+        #\r
+        # Do the INT2 conversion\r
+        #\r
+        for MatchObj in re.compile(IntPattern2).finditer(ValidRangeExpr):\r
+            MatchStr = MatchObj.group()\r
+            Range = re.compile(PCD_PATTERN).sub(' ', MatchStr)\r
+            ValidRangeExpr = ValidRangeExpr.replace(MatchStr, Range)\r
+\r
+        return ValidRangeExpr\r
+            \r
+        \r
 \r
     def __str__(self):\r
         return "ValidValueList = %s ValidValueListLang = %s ValidValueRange \\r
@@ -122,6 +269,7 @@ class PcdEntryXml(object):
         self.Value = ''\r
         self.Offset = ''\r
         self.CommonDefines = CommonDefinesXml()\r
+        self.Prompt = []\r
         self.HelpText = []\r
         self.PcdError = []\r
 \r
@@ -149,6 +297,7 @@ class PcdEntryXml(object):
         self.Value = XmlElement(Item, '%s/Value' % Key)\r
         self.Offset = XmlElement(Item, '%s/Offset' % Key)\r
         self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
+        \r
         for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
             HelpTextObj = HelpTextXml()\r
             HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
@@ -192,6 +341,10 @@ class PcdEntryXml(object):
         self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key)\r
         self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key)\r
         self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key)\r
+        for PromptItem in XmlList(Item, '%s/Prompt' % Key):\r
+            PromptObj = PromptXml()\r
+            PromptObj.FromXml(PromptItem, '%s/Prompt' % Key)\r
+            self.Prompt.append(PromptObj)\r
         for HelpTextItem in XmlList(Item, '%s/HelpText' % Key):\r
             HelpTextObj = HelpTextXml()\r
             HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key)\r
@@ -214,7 +367,8 @@ class PcdEntryXml(object):
         PcdEntry.SetDefaultValue(self.DefaultValue)\r
         PcdEntry.SetMaxDatumSize(self.MaxDatumSize)\r
         PcdEntry.SetFeatureFlag(ConvertNOTEQToNE(self.CommonDefines.FeatureFlag))\r
-\r
+        \r
+        PcdEntry.SetPromptList(GetPromptList(self.Prompt))\r
         PcdEntry.SetHelpTextList(GetHelpTextList(self.HelpText))\r
         PcdEntry.SetPcdErrorsList(self.PcdError)\r
         \r
@@ -311,6 +465,10 @@ class PcdEntryXml(object):
                     ['DefaultValue', DefaultValue],\r
                     ['MaxDatumSize', PcdEntry.GetMaxDatumSize()],\r
                    ]\r
+        for Item in PcdEntry.GetPromptList():\r
+            Tmp = PromptXml()\r
+            NodeList.append(Tmp.ToXml(Item))\r
+                    \r
         for Item in PcdEntry.GetHelpTextList():\r
             Tmp = HelpTextXml()\r
             NodeList.append(Tmp.ToXml(Item))\r
@@ -400,4 +558,4 @@ class PcdEntryXml(object):
             Str = Str + "\n\t" + str(Item)\r
         for Item in self.PcdError:\r
             Str = Str + "\n\tPcdError:" + str(Item)\r
-        return Str
\ No newline at end of file
+        return Str\r
index 5a2f0dc70571603a22f019ab975bd08e8c5c3030..58959081d0ab2cadd38eb081cde102ecba0efdd1 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse a xml file of .PKG file\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -38,7 +38,6 @@ from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPARCHLIST
 from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST\r
 from Logger.StringTable import ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB\r
 from Logger.StringTable import ERR_FILE_NAME_INVALIDE\r
-from Logger.StringTable import ERR_XML_INVALID_BINARY_FILE_TYPE\r
 from Logger.ToolError import PARSER_ERROR\r
 from Logger.ToolError import FORMAT_INVALID\r
 \r
@@ -78,12 +77,25 @@ class DistributionPackageXml(object):
                 DpHeader = self.DistP.Header\r
                 XmlTreeLevel = ['DistributionPackage', 'DistributionHeader']\r
                 CheckDict = Sdict()\r
+                if DpHeader.GetAbstract():\r
+                    DPAbstract = DpHeader.GetAbstract()[0][1]\r
+                else:\r
+                    DPAbstract = ''\r
+                if DpHeader.GetCopyright():\r
+                    DPCopyright = DpHeader.GetCopyright()[0][1]\r
+                else:\r
+                    DPCopyright = ''\r
+                if DpHeader.GetLicense():\r
+                    DPLicense = DpHeader.GetLicense()[0][1]\r
+                else:\r
+                    DPLicense = ''\r
+                \r
                 CheckDict['Name'] = DpHeader.GetName()\r
                 CheckDict['GUID'] = DpHeader.GetGuid()\r
                 CheckDict['Version'] = DpHeader.GetVersion()\r
-                CheckDict['Copyright'] = DpHeader.GetCopyright()\r
-                CheckDict['License'] = DpHeader.GetLicense()\r
-                CheckDict['Abstract'] = DpHeader.GetAbstract()\r
+                CheckDict['Copyright'] = DPCopyright\r
+                CheckDict['License'] = DPLicense\r
+                CheckDict['Abstract'] = DPAbstract\r
                 CheckDict['Vendor'] = DpHeader.GetVendor()\r
                 CheckDict['Date'] = DpHeader.GetDate()\r
                 CheckDict['XmlSpecification'] = DpHeader.GetXmlSpecification()\r
@@ -610,11 +622,6 @@ def ValidateMS2(Module, TopXmlTreeLevel):
         if Item and len(Item.FileNamList) > 0 and Item.FileNamList[0].FileType == 'FREEFORM':\r
             Item.FileNamList[0].FileType = 'SUBTYPE_GUID'\r
             Module.GetBinaryFileList()[ItemCount] = Item\r
-        if Item and len(Item.FileNamList) > 0 and Item.FileNamList[0].FileType == 'DISPOSABLE':\r
-            Logger.Error('\nUPT',\r
-                 PARSER_ERROR,\r
-                 ERR_XML_INVALID_BINARY_FILE_TYPE % ('DISPOSABLE'),\r
-                 RaiseError=True)           \r
 \r
 ## ValidateMS3\r
 #\r
@@ -697,8 +704,7 @@ def ValidateMS3(Module, TopXmlTreeLevel):
             for PcdExItem in AsBuilt.PcdExValueList:\r
                 CheckDict = {'TokenSpaceGuidValue':PcdExItem.TokenSpaceGuidValue,\r
                              'Token':PcdExItem.Token,\r
-                             'DatumType':PcdExItem.DatumType,\r
-                             'Value':PcdExItem.DefaultValue}\r
+                             'DatumType':PcdExItem.DatumType}\r
                 XmlTreeLevel = TopXmlTreeLevel + ['BinaryFiles', 'BinaryFile', 'AsBuilt', 'PcdExValue']\r
                 IsRequiredItemListNull(CheckDict, XmlTreeLevel)\r
                 #\r
index 0ffa44d35fa4b4444a2ad7e1b14d022b0bdbae93..7e3dc94edf64499473311b921aad74646ad08ec3 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to parse a xml file of .PKG file\r
 #\r
-# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>\r
 #\r
 # This program and the accompanying materials are licensed and made available \r
 # under the terms and conditions of the BSD License which accompanies this \r
@@ -74,7 +74,6 @@ def IsRequiredItemListNull(ItemDict, XmlTreeLevel):
             ErrorMsg = ERR_XML_PARSER_REQUIRED_ITEM_MISSING % (Key, Msg)\r
             Logger.Error('\nUPT', PARSER_ERROR, ErrorMsg, RaiseError=True)\r
 \r
-            \r
 ## Get help text \r
 #\r
 # @param HelpText\r
@@ -87,3 +86,16 @@ def GetHelpTextList(HelpText):
         HelpTextObj.SetString(HelT.HelpText)\r
         HelpTextList.append(HelpTextObj)\r
     return HelpTextList\r
+    \r
+## Get Prompt text \r
+#\r
+# @param Prompt\r
+#\r
+def GetPromptList(Prompt):\r
+    PromptList = []\r
+    for SubPrompt in Prompt:\r
+        PromptObj = TextObject()\r
+        PromptObj.SetLang(SubPrompt.Lang)\r
+        PromptObj.SetString(SubPrompt.Prompt)\r
+        PromptList.append(PromptObj)\r
+    return PromptList\r