text: ## @file
  # This file is used to define class objects of INF file [UserExtension] section.
  # It will consumed by InfParser.
  #
  # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
  #
  # SPDX-License-Identifier: BSD-2-Clause-Patent
  
  '''
  InfUserExtensionsObject
  '''
  
  from Logger import StringTable as ST
  from Logger import ToolError
  import Logger.Log as Logger
  from Library import GlobalData
  
  from Library.Misc import Sdict
  
  class InfUserExtensionItem():
      def __init__(self,
                   Content = '',
                   UserId = '',
                   IdString = ''):
          self.Content  = Content
          self.UserId   = UserId
          self.IdString = IdString
          self.SupArchList = []
  
      def SetContent(self, Content):
          self.Content = Content
      def GetContent(self):
          return self.Content
  
      def SetUserId(self, UserId):
          self.UserId = UserId
      def GetUserId(self):
          return self.UserId
  
      def SetIdString(self, IdString):
          self.IdString = IdString
      def GetIdString(self):
          return self.IdString
  
      def SetSupArchList(self, SupArchList):
          self.SupArchList = SupArchList
      def GetSupArchList(self):
          return self.SupArchList
  
  ##
  #
  #
  #
  class InfUserExtensionObject():
      def __init__(self):
          self.UserExtension = Sdict()
  
      def SetUserExtension(self, UserExtensionCont, IdContent=None, LineNo=None):
          if not UserExtensionCont or UserExtensionCont == '':
              return True
          #
          # IdContent is a list contain UserId and IdString
          # For this call the general section header  parser, if no definition of
          # IdString/UserId, it will return 'COMMON'
          #
          for IdContentItem in IdContent:
              InfUserExtensionItemObj = InfUserExtensionItem()
              if IdContentItem[0] == 'COMMON':
                  UserId = ''
              else:
                  UserId = IdContentItem[0]
  
              if IdContentItem[1] == 'COMMON':
                  IdString = ''
              else:
                  IdString = IdContentItem[1]
  
              #
              # Fill UserExtensionObj members.
              #
              InfUserExtensionItemObj.SetUserId(UserId)
              InfUserExtensionItemObj.SetIdString(IdString)
              InfUserExtensionItemObj.SetContent(UserExtensionCont)
              InfUserExtensionItemObj.SetSupArchList(IdContentItem[2])
  
  #            for CheckItem in self.UserExtension:
  #                if IdContentItem[0] == CheckItem[0] and IdContentItem[1] == CheckItem[1]:
  #                    if IdContentItem[2].upper() == 'COMMON' or CheckItem[2].upper() == 'COMMON':
  #                        #
  #                        # For COMMON ARCH type, do special check.
  #                        #
  #                        Logger.Error('InfParser',
  #                            ToolError.FORMAT_INVALID,
  #                            ST.ERR_INF_PARSER_UE_SECTION_DUPLICATE_ERROR%\
  #                            (IdContentItem[0] + '.' + IdContentItem[1] + '.' + IdContentItem[2]),
  #                            File=GlobalData.gINF_MODULE_NAME,
  #                            Line=LineNo,
  #                            ExtraData=None)
  
              if IdContentItem in self.UserExtension:
                  #
                  # Each UserExtensions section header must have a unique set
                  # of UserId, IdString and Arch values.
                  # This means that the same UserId can be used in more than one
                  # section header, provided the IdString or Arch values are
                  # different. The same IdString values can be used in more than
                  # one section header if the UserId or Arch values are
                  # different. The same UserId and the same IdString can be used
                  # in a section header if the Arch values are different in each
                  # of the section headers.
                  #
                  Logger.Error('InfParser',
                               ToolError.FORMAT_INVALID,
                               ST.ERR_INF_PARSER_UE_SECTION_DUPLICATE_ERROR%\
                               (IdContentItem[0] + '.' + IdContentItem[1] + '.' + IdContentItem[2]),
                               File=GlobalData.gINF_MODULE_NAME,
                               Line=LineNo,
                               ExtraData=None)
              else:
                  UserExtensionList = []
                  UserExtensionList.append(InfUserExtensionItemObj)
                  self.UserExtension[IdContentItem] = UserExtensionList
  
          return True
  
      def GetUserExtension(self):
          return self.UserExtension
  