## @file
# This file is used to define common class objects for INF file.
# It will consumed by InfParser
#
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent

'''
InfCommonObject
'''

## InfLineCommentObject
#
#  Comment Object for any line in the INF file
#
#  #
#  # HeaderComment
#  #
#  Line # TailComment
#
class InfLineCommentObject():
    def __init__(self):
        self.HeaderComments = ''
        self.TailComments = ''

    def SetHeaderComments(self, HeaderComments):
        self.HeaderComments = HeaderComments

    def GetHeaderComments(self):
        return self.HeaderComments

    def SetTailComments(self, TailComments):
        self.TailComments = TailComments

    def GetTailComments(self):
        return self.TailComments

## CurrentLine
#
class CurrentLine():
    def __init__(self):
        self.LineNo = ''
        self.LineString = ''
        self.FileName = ''

    ## SetLineNo
    #
    # @param LineNo: LineNo
    #
    def SetLineNo(self, LineNo):
        self.LineNo = LineNo

    ## GetLineNo
    #
    def GetLineNo(self):
        return self.LineNo

    ## SetLineString
    #
    # @param LineString: Line String content
    #
    def SetLineString(self, LineString):
        self.LineString = LineString

    ## GetLineString
    #
    def GetLineString(self):
        return self.LineString

    ## SetFileName
    #
    # @param FileName: File Name
    #
    def SetFileName(self, FileName):
        self.FileName = FileName

    ## GetFileName
    #
    def GetFileName(self):
        return self.FileName

##
# Inf Section common data
#
class InfSectionCommonDef():
    def __init__(self):
        #
        # #
        # # HeaderComments at here
        # #
        # [xxSection] TailComments at here
        # data
        #
        self.HeaderComments = ''
        self.TailComments   = ''
        #
        # The support arch list of this section
        #
        self.SupArchList  = []

        #
        # Store all section content
        # Key is supported Arch
        #
        self.AllContent   = {}

    ## SetHeaderComments
    #
    # @param HeaderComments: HeaderComments
    #
    def SetHeaderComments(self, HeaderComments):
        self.HeaderComments = HeaderComments

    ## GetHeaderComments
    #
    def GetHeaderComments(self):
        return self.HeaderComments

    ## SetTailComments
    #
    # @param TailComments: TailComments
    #
    def SetTailComments(self, TailComments):
        self.TailComments = TailComments

    ## GetTailComments
    #
    def GetTailComments(self):
        return self.TailComments

    ## SetSupArchList
    #
    # @param Arch: Arch
    #
    def SetSupArchList(self, Arch):
        if Arch not in self.SupArchList:
            self.SupArchList.append(Arch)

    ## GetSupArchList
    #
    def GetSupArchList(self):
        return self.SupArchList

    ## SetAllContent
    #
    # @param ArchList: ArchList
    # @param Content: Content
    #
    def SetAllContent(self, Content):
        self.AllContent = Content

    ## GetAllContent
    #
    def GetAllContent(self):
        return self.AllContent
