## @file
# Store a Package class object to a DEC file.
#
# Copyright (c) 2007, 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.
#

##
# Import Modules
#
import os
from Common.MigrationUtilities import *
from LoadSpd import LoadSpd
from CommonDataClass.PackageClass import *


## Store Defines section.
#
# Write [Defines] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Defines section.
# @param  Package            An input Package class object.
#
def StorePackageDefinesSection(DecFile, Package):
    DefinesTupleList = []
    DefinesTupleList.append(("DEC_VERSION", Package.Header.DecSpecification))
    DefinesTupleList.append(("PACKAGE_NAME", Package.Header.Name))
    DefinesTupleList.append(("PACKAGE_GUID", Package.Header.Guid))
    
    StoreDefinesSection(DecFile, DefinesTupleList)


## Return a Package Include Class Item.
#
# Read the input Include class object and return one Include Class Item.
#
# @param  Include            An input Include class object.
#
# @retval IncludeClassItem   A Package Include Class Item.
#
def GetPackageIncludeClassItem(Include):
    return Include.FilePath


## Store Includes section.
#
# Write [Includes] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Includes section.
# @param  Package            An input Package class object.
#
def StorePackageIncludesSection(DecFile, Package):
    Includes = Package.Includes
    Section = GetSection("Includes", GetPackageIncludeClassItem, Includes)
    StoreTextFile(DecFile, Section)
    

## Return a Package Library Class Item.
#
# Read the input LibraryClass class object and return one Library Class Item.
#
# @param  LibraryClass       An input LibraryClass class object.
#
# @retval LibraryClassItem   A Package Library Class Item.
#
def GetPackageLibraryClassItem(LibraryClass):
    return "|".join((LibraryClass.LibraryClass, LibraryClass.IncludeHeader))


## Store Library Classes section.
#
# Write [LibraryClasses] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Library Classes
#                            section.
# @param  Package            An input Package class object.
#
def StorePackageLibraryClassesSection(DecFile, Package):
    LibraryClasses = Package.LibraryClassDeclarations
    Section = GetSection("LibraryClasses", GetPackageLibraryClassItem, LibraryClasses)
    StoreTextFile(DecFile, Section)


## Return a Package Guid Declaration Item.
#
# Read the input Guid class object and return one line of Guid Declaration Item.
#
# @param  Guid                An input Guid class object.
#
# @retval GuidDeclarationItem A Package Guid Declaration Item.
#
def GetPackageGuidDeclarationItem(Guid):
    GuidCName = Guid.CName
    GuidValue = Guid.Guid.replace("-", "")
    GuidValueList = [GuidValue[0:8]]
    GuidValueList += [GuidValue[i : i + 4] for i in range(8, 16, 4)]
    GuidValueList += [GuidValue[i : i + 2] for i in range(16, 32, 2)]

    GuidCFormat = "{0x%s" + ", 0x%s" * 2 + ", {0x%s" + ", 0x%s" * 7 + "}}"
    GuidCValue = GuidCFormat % tuple(GuidValueList)
    return "%-30s = %s" % (GuidCName, GuidCValue)


## Store Protocols section.
#
# Write [Protocols] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Protocols section.
# @param  Package            An input Package class object.
#
def StorePackageProtocolsSection(DecFile, Package):
    Protocols = Package.ProtocolDeclarations
    Section = GetSection("Protocols", GetPackageGuidDeclarationItem, Protocols)
    StoreTextFile(DecFile, Section)
    

## Store Ppis section.
#
# Write [Ppis] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Ppis section.
# @param  Package            An input Package class object.
#
def StorePackagePpisSection(DecFile, Package):
    Ppis = Package.PpiDeclarations
    Section = GetSection("Ppis", GetPackageGuidDeclarationItem, Ppis)
    StoreTextFile(DecFile, Section)


## Store Guids section.
#
# Write [Guids] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile            The output DEC file to store the Guids section.
# @param  Package            An input Package class object.
#
def StorePackageGuidsSection(DecFile, Package):
    Guids = Package.GuidDeclarations
    Section = GetSection("Guids", GetPackageGuidDeclarationItem, Guids)
    StoreTextFile(DecFile, Section)


## Return a Package Pcd Item.
#
# Read the input Pcd class object and return one line of Pcd Item.
#
# @param  Pcd                An input Pcd class object.
#
# @retval PcdItem            A Package Pcd Item.
#
def GetPackagePcdItem(Pcd):
    PcdPair = "%s.%s" % (Pcd.TokenSpaceGuidCName, Pcd.CName)
    DatumType = Pcd.DatumType
    DefaultValue = Pcd.DefaultValue
    Token = Pcd.Token
    PcdList = [PcdPair, DefaultValue, DatumType, Token]
    return "|".join(PcdList)


## DEC Pcd Section Name dictionary indexed by PCD Item Type.
mDecPcdSectionNameDict = {
    "FEATURE_FLAG" : "PcdsFeatureFlag",
    "FIXED_AT_BUILD" : "PcdsFixedAtBuild",
    "PATCHABLE_IN_MODULE" : "PcdsPatchableInModule",
    "DYNAMIC" : "PcdsDynamic",
    "DYNAMIC_EX" : "PcdsDynamicEx"
    }

## Store Pcds section.
#
# Write [Pcds*] section to the DecFile based on Package class object.
# Different CPU architectures are specified in the subsection if possible.
#
# @param  DecFile              The output DEC file to store the Pcds section.
# @param  Package              An input Package class object.
#
def StorePackagePcdsSection(DecFile, Package):
    PcdsDict = {}
    for Pcd in Package.PcdDeclarations:
        for PcdItemType in Pcd.ValidUsage:
            PcdSectionName = mDecPcdSectionNameDict.get(PcdItemType)
            if PcdSectionName:
                PcdsDict.setdefault(PcdSectionName, []).append(Pcd)
            else:
                EdkLogger.info("Unknown Pcd Item Type: %s" % PcdItemType)

    Section = ""
    for PcdSectionName in PcdsDict:
        Pcds = PcdsDict[PcdSectionName]
        Section += GetSection(PcdSectionName, GetPackagePcdItem, Pcds)

    StoreTextFile(DecFile, Section)


## Store User Extensions section.
#
# Write [UserExtensions] section to the DecFile based on Package class object.
#
# @param  DecFile              The output DEC file to store the User Extensions section.
# @param  Package              An input Package class object.
#
def StorePackageUserExtensionsSection(DecFile, Package):
    Section = "".join(map(GetUserExtensions, Package.UserExtensions))
    StoreTextFile(DecFile, Section)


## Store a Package class object to a new DEC file.
#
# Read an input Package class object and ave the contents to a new DEC file.
#
# @param  DecFileName          The output DEC file.
# @param  Package              An input Package class object.
#
def StoreDec(DecFileName, Package):
    DecFile = open(DecFileName, "w+")
    EdkLogger.info("Save file to %s" % DecFileName)
    
    StoreHeader(DecFile, Package.Header)
    StorePackageDefinesSection(DecFile, Package)
    StorePackageIncludesSection(DecFile, Package)
    StorePackageLibraryClassesSection(DecFile, Package)
    StorePackageProtocolsSection(DecFile, Package)
    StorePackagePpisSection(DecFile, Package)
    StorePackageGuidsSection(DecFile, Package)
    StorePackagePcdsSection(DecFile, Package)
    StorePackageUserExtensionsSection(DecFile, Package)
    
    DecFile.close()

    
# This acts like the main() function for the script, unless it is 'import'ed
# into another script.
if __name__ == '__main__':
    pass
    