## @file
# This file is used to define a class object to describe a module
#
# Copyright (c) 2011, 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.

'''
ModuleObject
'''

##
# 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 HelpTextListObject
from Object.POM.CommonObject import GuidVersionObject
                         

## 
# BootModeObject
#
class BootModeObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.SupportedBootModes = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)
    
    def SetSupportedBootModes(self, SupportedBootModes):
        self.SupportedBootModes = SupportedBootModes
    
    def GetSupportedBootModes(self):
        return self.SupportedBootModes

##
# EventObject
#
class EventObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.EventType = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)
    
    def SetEventType(self, EventType):
        self.EventType = EventType
    
    def GetEventType(self):
        return self.EventType

##
# HobObject
#
class HobObject(CommonPropertiesObject, HelpTextListObject):
    def __init__(self):
        self.HobType = ''
        CommonPropertiesObject.__init__(self)
        HelpTextListObject.__init__(self)
        
    def SetHobType(self, HobType):
        self.HobType = HobType
    
    def GetHobType(self):
        return self.HobType

##
# SpecObject
#
class SpecObject(object):
    def __init__(self):
        self.Spec = ''
        self.Version = ''
    
    def SetSpec(self, Spec):
        self.Spec = Spec
    
    def GetSpec(self):
        return self.Spec
    
    def SetVersion(self, Version):
        self.Version = Version
    
    def GetVersion(self):
        return self.Version

## ModuleHeaderObject
#
# This class defined header items used in Module file
# 
class ModuleHeaderObject(IdentificationObject, CommonHeaderObject):
    def __init__(self):
        self.IsLibrary = False
        self.IsLibraryModList = []
        self.ModuleType = ''
        self.BinaryModule = False
        self.PcdIsDriver = ''
        self.PiSpecificationVersion = ''
        self.UefiSpecificationVersion = ''
        #
        # SpecObject
        #
        self.SpecList = []              
        #
        # BootModeObject
        #
        self.BootModeList = []          
        #
        # EventObject
        #
        self.EventList = []             
        #
        # HobObject
        #
        self.HobList = []
        #               
        # LibraryClassObject
        #
        self.LibraryClassList = []      
        self.SupArchList = []
        IdentificationObject.__init__(self)
        CommonHeaderObject.__init__(self)
    
    def SetIsLibrary(self, IsLibrary):
        self.IsLibrary = IsLibrary
    
    def GetIsLibrary(self):
        return self.IsLibrary
    
    def SetIsLibraryModList(self, IsLibraryModList):
        self.IsLibraryModList = IsLibraryModList
    
    def GetIsLibraryModList(self):
        return self.IsLibraryModList
    
    def SetModuleType(self, ModuleType):
        self.ModuleType = ModuleType
    
    def GetModuleType(self):
        return self.ModuleType
    
    def SetBinaryModule(self, BinaryModule):
        self.BinaryModule = BinaryModule
        
    def GetBinaryModule(self):
        return self.BinaryModule
    
    def SetPcdIsDriver(self, PcdIsDriver):
        self.PcdIsDriver = PcdIsDriver
        
    def GetPcdIsDriver(self):
        return self.PcdIsDriver
    
    def SetPiSpecificationVersion(self, PiSpecificationVersion):
        self.PiSpecificationVersion = PiSpecificationVersion
        
    def GetPiSpecificationVersion(self):
        return self.PiSpecificationVersion
    
    def SetUefiSpecificationVersion(self, UefiSpecificationVersion):
        self.UefiSpecificationVersion = UefiSpecificationVersion
    
    def GetUefiSpecificationVersion(self):
        return self.UefiSpecificationVersion
    
    def SetSpecList(self, SpecList):
        self.SpecList = SpecList
        
    def GetSpecList(self):
        return self.SpecList
    
    def SetBootModeList(self, BootModeList):
        self.BootModeList = BootModeList
        
    def GetBootModeList(self):
        return self.BootModeList
    
    def SetEventList(self, EventList):
        self.EventList = EventList
    
    def GetEventList(self):
        return self.EventList
    
    def SetHobList(self, HobList):
        self.HobList = HobList
    
    def GetHobList(self):
        return self.HobList

    def SetLibraryClassList(self, LibraryClassList):
        self.LibraryClassList = LibraryClassList
    
    def GetLibraryClassList(self):
        return self.LibraryClassList

    def SetSupArchList(self, SupArchList):
        self.SupArchList = SupArchList

    def GetSupArchList(self):
        return self.SupArchList

##
# SourceFileObject
#
class SourceFileObject(CommonPropertiesObject):
    def __init__(self):
        CommonPropertiesObject.__init__(self)
        self.SourceFile = ''
        self.TagName = ''
        self.ToolCode = ''
        self.Family = ''
        self.FileType = ''
    
    def SetSourceFile(self, SourceFile):
        self.SourceFile = SourceFile
    
    def GetSourceFile(self):
        return  self.SourceFile
    
    def SetTagName(self, TagName):
        self.TagName = TagName
    
    def GetTagName(self):
        return self.TagName
    
    def SetToolCode(self, ToolCode):
        self.ToolCode = ToolCode
    
    def GetToolCode(self):
        return self.ToolCode
    
    def SetFamily(self, Family):
        self.Family = Family
    
    def GetFamily(self):
        return self.Family
    
    def SetFileType(self, FileType):
        self.FileType = FileType
        
    def GetFileType(self):
        return self.FileType

       
##
# BinaryFileObject
#
class BinaryFileObject(CommonPropertiesObject):
    def __init__(self):
        self.FileNamList = []
        self.AsBuiltList = []
        CommonPropertiesObject.__init__(self)
        
    def SetFileNameList(self, FileNamList):
        self.FileNamList = FileNamList

    def GetFileNameList(self):
        return self.FileNamList

    def SetAsBuiltList(self, AsBuiltList):
        self.AsBuiltList = AsBuiltList

    def GetAsBuiltList(self):
        return self.AsBuiltList
               

##
# AsBuildLibraryClassObject
#
class AsBuildLibraryClassObject(object):
    def __init__(self):
        self.LibGuid = ''
        self.LibVersion = ''
    
    def SetLibGuid(self, LibGuid):
        self.LibGuid = LibGuid
    def GetLibGuid(self):
        return self.LibGuid
    
    def SetLibVersion(self, LibVersion):
        self.LibVersion = LibVersion
    def GetLibVersion(self):
        return self.LibVersion

##
# AsBuiltObject
#
class AsBuiltObject(object):
    def __init__(self):
        #
        # list of PcdObject
        #
        self.PatchPcdList = []
        #
        # list of PcdObject
        #
        self.PcdExValueList = []
        #
        # list of GuidVersionObject
        #
        self.LibraryInstancesList = []
        #
        # List of BinaryBuildFlag object
        #
        self.BinaryBuildFlagList = ''

    def SetPatchPcdList(self, PatchPcdList):
        self.PatchPcdList = PatchPcdList

    def GetPatchPcdList(self):
        return self.PatchPcdList

    def SetPcdExList(self, PcdExValueList):
        self.PcdExValueList = PcdExValueList

    def GetPcdExList(self):
        return self.PcdExValueList

    def SetLibraryInstancesList(self, LibraryInstancesList):
        self.LibraryInstancesList = LibraryInstancesList

    def GetLibraryInstancesList(self):
        return self.LibraryInstancesList
    
    def SetBuildFlagsList(self, BinaryBuildFlagList):
        self.BinaryBuildFlagList = BinaryBuildFlagList

    def GetBuildFlagsList(self):
        return self.BinaryBuildFlagList

##
# BinaryBuildFlag, this object will include those fields that are not
# covered by the UPT Spec BinaryFile field 
#
class BinaryBuildFlagObject(object):
    def __init__(self):
        self.Target = ''
        self.TagName = ''
        self.Family = ''
        self.AsBuiltOptionFlags = ''
        
    def SetTarget(self, Target):
        self.Target = Target

    def GetTarget(self):
        return self.Target        

    def SetTagName(self, TagName):
        self.TagName = TagName
        
    def GetTagName(self):
        return self.TagName
    
    def SetFamily(self, Family):
        self.Family = Family
        
    def GetFamily(self):
        return self.Family
    
    def SetAsBuiltOptionFlags(self, AsBuiltOptionFlags):
        self.AsBuiltOptionFlags = AsBuiltOptionFlags
    def GetAsBuiltOptionFlags(self):
        return self.AsBuiltOptionFlags
                
## 
# ExternObject
#
class ExternObject(CommonPropertiesObject):
    def __init__(self):
        self.EntryPoint = ''
        self.UnloadImage = ''
        self.Constructor = ''
        self.Destructor = ''
        self.SupModList = []
        CommonPropertiesObject.__init__(self)
        
    def SetEntryPoint(self, EntryPoint):
        self.EntryPoint = EntryPoint
    
    def GetEntryPoint(self):
        return self.EntryPoint
    
    def SetUnloadImage(self, UnloadImage):
        self.UnloadImage = UnloadImage
    
    def GetUnloadImage(self):
        return self.UnloadImage
    
    def SetConstructor(self, Constructor):
        self.Constructor = Constructor
    
    def GetConstructor(self):
        return self.Constructor
    
    def SetDestructor(self, Destructor):
        self.Destructor = Destructor
    
    def GetDestructor(self):
        return self.Destructor
    
    def SetSupModList(self, SupModList):
        self.SupModList = SupModList
    def GetSupModList(self):
        return self.SupModList

##
# DepexObject
#
class DepexObject(CommonPropertiesObject):
    def __init__(self):
        self.Depex = ''
        self.ModuelType = ''
        CommonPropertiesObject.__init__(self)
        
    def SetDepex(self, Depex):
        self.Depex = Depex
    
    def GetDepex(self):
        return self.Depex
    
    def SetModuleType(self, ModuleType):
        self.ModuelType = ModuleType
    
    def GetModuleType(self):
        return self.ModuelType

##
# PackageDependencyObject
#
class PackageDependencyObject(GuidVersionObject, CommonPropertiesObject):
    def __init__(self):
        self.Package = ''
        self.PackageFilePath = ''
        GuidVersionObject.__init__(self)
        CommonPropertiesObject.__init__(self)
        
    def SetPackageFilePath(self, PackageFilePath):
        self.PackageFilePath = PackageFilePath
        
    def GetPackageFilePath(self):
        return self.PackageFilePath

    def SetPackage(self, Package):
        self.Package = Package
        
    def GetPackage(self):
        return self.Package

##
# BuildOptionObject
#
class BuildOptionObject(CommonPropertiesObject):
    def __init__(self):
        CommonPropertiesObject.__init__(self)
        self.BuildOption = ''
    
    def SetBuildOption(self, BuildOption):
        self.BuildOption = BuildOption
    
    def GetBuildOption(self):
        return self.BuildOption
    
##
# ModuleObject
#
class ModuleObject(ModuleHeaderObject):
    def __init__(self):
        #
        # {Arch : ModuleHeaderObject}
        #
        self.HeaderDict = {} 
        #
        # LibraryClassObject
        #
        self.LibraryClassList = [] 
        #
        # SourceFileObject
        #
        self.SourceFileList = [] 
        #
        # BinaryFileObject
        #
        self.BinaryFileList = [] 
        #
        # PackageDependencyObject
        #
        self.PackageDependencyList = [] 
        #
        # DepexObject
        #
        self.PeiDepex = [] 
        #
        # DepexObject
        #
        self.DxeDepex = [] 
        #
        # DepexObject
        #
        self.SmmDepex = [] 
        #
        # ProtocolObject
        #
        self.ProtocolList = [] 
        #
        # PpiObject
        #
        self.PpiList = [] 
        #
        # GuidObject
        #
        self.GuidList = [] 
        #
        # PcdObject
        #
        self.PcdList = [] 
        #
        # ExternObject
        #
        self.ExternList = [] 
        #
        # BuildOptionObject
        #
        self.BuildOptionList = [] 
        #
        # UserExtensionObject
        #
        self.UserExtensionList = [] 
        #
        # MiscFileObject
        #
        self.MiscFileList = [] 
        #
        # ClonedFromObject
        #
        self.ClonedFrom = None 
        
        ModuleHeaderObject.__init__(self)
        
    def SetHeaderDict(self, HeaderDict):
        self.HeaderDict = HeaderDict
    
    def GetHeaderDict(self):
        return self.HeaderDict
            
    def SetLibraryClassList(self, LibraryClassList):
        self.LibraryClassList = LibraryClassList
    
    def GetLibraryClassList(self):
        return self.LibraryClassList
    
    def SetSourceFileList(self, SourceFileList):
        self.SourceFileList = SourceFileList
        
    def GetSourceFileList(self):
        return self.SourceFileList
    
    def SetBinaryFileList(self, BinaryFileList):
        self.BinaryFileList = BinaryFileList

    def GetBinaryFileList(self):
        return self.BinaryFileList
    
    def SetPackageDependencyList(self, PackageDependencyList):
        self.PackageDependencyList = PackageDependencyList
        
    def GetPackageDependencyList(self):
        return self.PackageDependencyList
    
    def SetPeiDepex(self, PeiDepex):
        self.PeiDepex = PeiDepex
        
    def GetPeiDepex(self):
        return self.PeiDepex
    
    def SetDxeDepex(self, DxeDepex):
        self.DxeDepex = DxeDepex
        
    def GetDxeDepex(self):
        return self.DxeDepex
    
    def SetSmmDepex(self, SmmDepex):
        self.SmmDepex = SmmDepex
        
    def GetSmmDepex(self):
        return self.SmmDepex
    
    def SetPpiList(self, PpiList):
        self.PpiList = PpiList
        
    def GetPpiList(self):
        return self.PpiList

    def SetProtocolList(self, ProtocolList):
        self.ProtocolList = ProtocolList
        
    def GetProtocolList(self):
        return self.ProtocolList

    def SetPcdList(self, PcdList):
        self.PcdList = PcdList
        
    def GetPcdList(self):
        return self.PcdList
    
    def SetGuidList(self, GuidList):
        self.GuidList = GuidList
        
    def GetGuidList(self):
        return self.GuidList
    
    def SetExternList(self, ExternList):
        self.ExternList = ExternList

    def GetExternList(self):
        return self.ExternList
    
    def SetBuildOptionList(self, BuildOptionList):
        self.BuildOptionList = BuildOptionList
        
    def GetBuildOptionList(self):
        return self.BuildOptionList
    
    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 SetClonedFrom(self, ClonedFrom):
        self.ClonedFrom = ClonedFrom
        
    def GetClonedFrom(self):
        return self.ClonedFrom
