## @file
# This file is used to define a class object to describe a package
#
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are licensed and made available 
# under the terms and conditions of the BSD License which accompanies this 
# distribution. The full text of the license may be found at 
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

'''
PackageObject
'''

##
# Import Modules
#
from Object.POM.CommonObject import CommonPropertiesObject
from Object.POM.CommonObject import IdentificationObject
from Object.POM.CommonObject import CommonHeaderObject
from Object.POM.CommonObject import BinaryHeaderObject
from Library.Misc import Sdict

## StandardIncludeFileObject
#
class StandardIncludeFileObject(CommonPropertiesObject):
    def __init__(self):
        CommonPropertiesObject.__init__(self)
        self.IncludeFile = ''
    
    def SetIncludeFile(self, IncludeFile):
        self.IncludeFile = IncludeFile
    
    def GetIncludeFile(self):
        return self.IncludeFile

## PackageIncludeFileObject
#
class PackageIncludeFileObject(StandardIncludeFileObject):
    pass

##
# PackageObject
#
class PackageObject(IdentificationObject, CommonHeaderObject, BinaryHeaderObject):
    def __init__(self):
        IdentificationObject.__init__(self)
        CommonHeaderObject.__init__(self)
        BinaryHeaderObject.__init__(self)
        #
        # LibraryClassObject
        #
        self.LibraryClassList = [] 
        #
        # FileObject
        #
        self.IncludePathList = [] 
        #
        # StandardIncludeFileObject
        #
        self.StandardIncludeFileList = [] 
        #
        # PackageIncludeFileObject
        #
        self.PackageIncludeFileList = [] 
        #
        # Include and Arch List, item is (IncludePath, SupArchList-List of Arch), used during install package
        #
        self.IncludeArchList = []
        #
        # ProtocolObject
        #
        self.ProtocolList = [] 
        #
        # PpiObject
        #
        self.PpiList = [] 
        #
        # GuidObject
        #
        self.GuidList = [] 
        #
        # (PcdObject, PcdErrorObject)
        #
        self.PcdList = [] 
        #
        # {(PcdTokenSpaceGuidCName, PcdErrroNumber): PcdErrorMessageList}
        #
        self.PcdErrorCommentDict = {}
        #
        # UserExtensionObject
        #        
        self.UserExtensionList = [] 
        #
        # MiscFileObject
        #
        self.MiscFileList = [] 
        self.ModuleDict = Sdict()
        #
        # ClonedRecordObject
        #
        self.ClonedFromList = [] 
        #
        # string object
        #
        self.ModuleFileList = [] 
        
        self.PcdChecks = []
        
        self.UNIFlag = False
        
    def SetLibraryClassList(self, LibraryClassList):
        self.LibraryClassList = LibraryClassList
    
    def GetLibraryClassList(self):
        return self.LibraryClassList
    
    def SetIncludePathList(self, IncludePathList):
        self.IncludePathList = IncludePathList
    
    def GetIncludePathList(self):
        return self.IncludePathList

    def SetIncludeArchList(self, IncludeArchList):
        self.IncludeArchList = IncludeArchList
    
    def GetIncludeArchList(self):
        return self.IncludeArchList    
    
    def SetStandardIncludeFileList(self, StandardIncludeFileList):
        self.StandardIncludeFileList = StandardIncludeFileList
        
    def GetStandardIncludeFileList(self):
        return self.StandardIncludeFileList
    
    def SetPackageIncludeFileList(self, PackageIncludeFileList):
        self.PackageIncludeFileList = PackageIncludeFileList
        
    def GetPackageIncludeFileList(self):
        return self.PackageIncludeFileList
    
    def SetProtocolList(self, ProtocolList):
        self.ProtocolList = ProtocolList
        
    def GetProtocolList(self):
        return self.ProtocolList
    
    def SetPpiList(self, PpiList):
        self.PpiList = PpiList
        
    def GetPpiList(self):
        return self.PpiList
    
    def SetGuidList(self, GuidList):
        self.GuidList = GuidList
        
    def GetGuidList(self):
        return self.GuidList
    
    def SetPcdList(self, PcdList):
        self.PcdList = PcdList
        
    def GetPcdList(self):
        return self.PcdList
    
    def SetUserExtensionList(self, UserExtensionList):
        self.UserExtensionList = UserExtensionList
        
    def GetUserExtensionList(self):
        return self.UserExtensionList
        
    def SetMiscFileList(self, MiscFileList):
        self.MiscFileList = MiscFileList
        
    def GetMiscFileList(self):
        return self.MiscFileList

    def SetModuleDict(self, ModuleDict):
        self.ModuleDict = ModuleDict
        
    def GetModuleDict(self):
        return self.ModuleDict

    def SetClonedFromList(self, ClonedFromList):
        self.ClonedFromList = ClonedFromList
        
    def GetClonedFromList(self):
        return self.ClonedFromList

    def SetModuleFileList(self, ModuleFileList):
        self.ModuleFileList = ModuleFileList
        
    def GetModuleFileList(self):
        return self.ModuleFileList

