]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/AutoGen/IdfClassObject.py
BaseTools: AutoGen - refactor function to remove extra variables
[mirror_edk2.git] / BaseTools / Source / Python / AutoGen / IdfClassObject.py
1 ## @file
2 # This file is used to collect all defined strings in Image Definition files
3 #
4 # Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 # This program and the accompanying materials
6 # are licensed and made available under the terms and conditions of the BSD License
7 # which accompanies this distribution. The full text of the license may be found at
8 # http://opensource.org/licenses/bsd-license.php
9 #
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 ##
14 # Import Modules
15 #
16 import Common.EdkLogger as EdkLogger
17 import StringIO
18 from Common.BuildToolError import *
19 from Common.String import GetLineNo
20 from Common.Misc import PathClass
21 from Common.LongFilePathSupport import LongFilePath
22 import re
23 import os
24 from Common.GlobalData import gIdentifierPattern
25 from UniClassObject import StripComments
26
27 IMAGE_TOKEN = re.compile('IMAGE_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE)
28
29 #
30 # Value of different image information block types
31 #
32 EFI_HII_IIBT_END = 0x00
33 EFI_HII_IIBT_IMAGE_1BIT = 0x10
34 EFI_HII_IIBT_IMAGE_1BIT_TRANS = 0x11
35 EFI_HII_IIBT_IMAGE_4BIT = 0x12
36 EFI_HII_IIBT_IMAGE_4BIT_TRANS = 0x13
37 EFI_HII_IIBT_IMAGE_8BIT = 0x14
38 EFI_HII_IIBT_IMAGE_8BIT_TRANS = 0x15
39 EFI_HII_IIBT_IMAGE_24BIT = 0x16
40 EFI_HII_IIBT_IMAGE_24BIT_TRANS = 0x17
41 EFI_HII_IIBT_IMAGE_JPEG = 0x18
42 EFI_HII_IIBT_IMAGE_PNG = 0x19
43 EFI_HII_IIBT_DUPLICATE = 0x20
44 EFI_HII_IIBT_SKIP2 = 0x21
45 EFI_HII_IIBT_SKIP1 = 0x22
46 EFI_HII_IIBT_EXT1 = 0x30
47 EFI_HII_IIBT_EXT2 = 0x31
48 EFI_HII_IIBT_EXT4 = 0x32
49
50 #
51 # Value of HII package type
52 #
53 EFI_HII_PACKAGE_TYPE_ALL = 0x00
54 EFI_HII_PACKAGE_TYPE_GUID = 0x01
55 EFI_HII_PACKAGE_FORMS = 0x02
56 EFI_HII_PACKAGE_STRINGS = 0x04
57 EFI_HII_PACKAGE_FONTS = 0x05
58 EFI_HII_PACKAGE_IMAGES = 0x06
59 EFI_HII_PACKAGE_SIMPLE_FONTS = 0x07
60 EFI_HII_PACKAGE_DEVICE_PATH = 0x08
61 EFI_HII_PACKAGE_KEYBOARD_LAYOUT = 0x09
62 EFI_HII_PACKAGE_ANIMATIONS = 0x0A
63 EFI_HII_PACKAGE_END = 0xDF
64 EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN = 0xE0
65 EFI_HII_PACKAGE_TYPE_SYSTEM_END = 0xFF
66
67 class IdfFileClassObject(object):
68 def __init__(self, FileList = []):
69 self.FileList = FileList
70 self.ImageFilesDict = {}
71 self.ImageIDList = []
72 if len(self.FileList) > 0:
73 self.LoadIdfFiles(FileList)
74
75 def LoadIdfFiles(self, FileList):
76 if len(FileList) > 0:
77 for File in FileList:
78 self.LoadIdfFile(File)
79
80 def LoadIdfFile(self, File = None):
81 if File is None:
82 EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'No Image definition file is given.')
83 self.File = File
84
85 try:
86 IdfFile = open(LongFilePath(File.Path), mode='r')
87 FileIn = IdfFile.read()
88 IdfFile.close()
89 except:
90 EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=File)
91
92 ImageFileList = []
93 for Line in FileIn.splitlines():
94 Line = Line.strip()
95 Line = StripComments(Line)
96 if len(Line) == 0:
97 continue
98
99 LineNo = GetLineNo(FileIn, Line, False)
100 if not Line.startswith('#image '):
101 EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The %s in Line %s of File %s is invalid.' % (Line, LineNo, File.Path))
102
103 if Line.find('#image ') >= 0:
104 LineDetails = Line.split()
105 Len = len(LineDetails)
106 if Len != 3 and Len != 4:
107 EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The format is not match #image IMAGE_ID [TRANSPARENT] ImageFileName in Line %s of File %s.' % (LineNo, File.Path))
108 if Len == 4 and LineDetails[2] != 'TRANSPARENT':
109 EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'Please use the keyword "TRANSPARENT" to describe the transparency setting in Line %s of File %s.' % (LineNo, File.Path))
110 MatchString = gIdentifierPattern.match(LineDetails[1])
111 if MatchString is None:
112 EdkLogger.error('Image Definition File Parser', FORMAT_INVALID, 'The Image token name %s defined in Idf file %s contains the invalid character.' % (LineDetails[1], File.Path))
113 if LineDetails[1] not in self.ImageIDList:
114 self.ImageIDList.append(LineDetails[1])
115 else:
116 EdkLogger.error("Image Definition File Parser", PARSER_ERROR, 'The %s in Line %s of File %s is already defined.' % (LineDetails[1], LineNo, File.Path))
117 if Len == 4:
118 ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], True)
119 else:
120 ImageFile = ImageFileObject(LineDetails[Len-1], LineDetails[1], False)
121 ImageFileList.append(ImageFile)
122 if ImageFileList:
123 self.ImageFilesDict[File] = ImageFileList
124
125 def SearchImageID(ImageFileObject, FileList):
126 if FileList == []:
127 return ImageFileObject
128
129 for File in FileList:
130 if os.path.isfile(File):
131 Lines = open(File, 'r')
132 for Line in Lines:
133 ImageIdList = IMAGE_TOKEN.findall(Line)
134 for ID in ImageIdList:
135 EdkLogger.debug(EdkLogger.DEBUG_5, "Found ImageID identifier: " + ID)
136 ImageFileObject.SetImageIDReferenced(ID)
137
138 class ImageFileObject(object):
139 def __init__(self, FileName, ImageID, TransParent = False):
140 self.FileName = FileName
141 self.File = ''
142 self.ImageID = ImageID
143 self.TransParent = TransParent
144 self.Referenced = False
145
146 def SetImageIDReferenced(self, ImageID):
147 if ImageID == self.ImageID:
148 self.Referenced = True