## @file
# This file is used to parse a xml file of .PKG file
#
# 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.
#

'''
XmlParserMisc
'''
from Object.POM.CommonObject import TextObject
from Logger.StringTable import ERR_XML_PARSER_REQUIRED_ITEM_MISSING
from Logger.ToolError import PARSER_ERROR
import Logger.Log as Logger

## ConvertVariableName()
# Convert VariableName to be L"string", 
# input of UCS-2 format Hex Array or L"string" (C style.) could be converted successfully,
# others will not.
#
# @param VariableName: string need to be converted
# @retval: the L quoted string converted if success, else None will be returned
#
def ConvertVariableName(VariableName):
    VariableName = VariableName.strip()
    #
    # check for L quoted string 
    #
    if VariableName.startswith('L"') and VariableName.endswith('"'):
        return VariableName
    
    #
    # check for Hex Array, it should be little endian even number of hex numbers
    #
    ValueList = VariableName.split(' ')
    if len(ValueList)%2 == 1:
        return None

    TransferedStr = ''

    Index = 0

    while Index < len(ValueList):
        FirstByte = int(ValueList[Index], 16)
        SecondByte = int(ValueList[Index + 1], 16)
        if SecondByte != 0:
            return None
  
        if FirstByte not in xrange(0x20, 0x7F):
            return None
        TransferedStr += ('%c')%FirstByte
        Index = Index + 2

    return 'L"' + TransferedStr + '"'

## IsRequiredItemListNull
#
# Check if a required XML section item/attribue is NULL
# 
# @param ItemList:     The list of items to be checked
# @param XmlTreeLevel: The error message tree level
# 
def IsRequiredItemListNull(ItemDict, XmlTreeLevel):
    for Key in ItemDict:
        if not ItemDict[Key]:
            Msg = "->".join(Node for Node in XmlTreeLevel)
            ErrorMsg = ERR_XML_PARSER_REQUIRED_ITEM_MISSING % (Key, Msg)
            Logger.Error('\nUPT', PARSER_ERROR, ErrorMsg, RaiseError=True)

## Get help text 
#
# @param HelpText
#
def GetHelpTextList(HelpText):
    HelpTextList = []
    for HelT in HelpText:
        HelpTextObj = TextObject()
        HelpTextObj.SetLang(HelT.Lang)
        HelpTextObj.SetString(HelT.HelpText)
        HelpTextList.append(HelpTextObj)
    return HelpTextList
    
## Get Prompt text 
#
# @param Prompt
#
def GetPromptList(Prompt):
    PromptList = []
    for SubPrompt in Prompt:
        PromptObj = TextObject()
        PromptObj.SetLang(SubPrompt.Lang)
        PromptObj.SetString(SubPrompt.Prompt)
        PromptList.append(PromptObj)
    return PromptList
