+##\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