2 # This file is used to collect all defined strings in Image Definition files
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
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.
16 import Common
.EdkLogger
as EdkLogger
18 from Common
.BuildToolError
import *
19 from Common
.String
import GetLineNo
20 from Common
.Misc
import PathClass
21 from Common
.LongFilePathSupport
import LongFilePath
24 from Common
.GlobalData
import gIdentifierPattern
26 IMAGE_TOKEN
= re
.compile('IMAGE_TOKEN *\(([A-Z0-9_]+) *\)', re
.MULTILINE | re
.UNICODE
)
29 # Value of different image information block types
31 EFI_HII_IIBT_END
= 0x00
32 EFI_HII_IIBT_IMAGE_1BIT
= 0x10
33 EFI_HII_IIBT_IMAGE_1BIT_TRANS
= 0x11
34 EFI_HII_IIBT_IMAGE_4BIT
= 0x12
35 EFI_HII_IIBT_IMAGE_4BIT_TRANS
= 0x13
36 EFI_HII_IIBT_IMAGE_8BIT
= 0x14
37 EFI_HII_IIBT_IMAGE_8BIT_TRANS
= 0x15
38 EFI_HII_IIBT_IMAGE_24BIT
= 0x16
39 EFI_HII_IIBT_IMAGE_24BIT_TRANS
= 0x17
40 EFI_HII_IIBT_IMAGE_JPEG
= 0x18
41 EFI_HII_IIBT_IMAGE_PNG
= 0x19
42 EFI_HII_IIBT_DUPLICATE
= 0x20
43 EFI_HII_IIBT_SKIP2
= 0x21
44 EFI_HII_IIBT_SKIP1
= 0x22
45 EFI_HII_IIBT_EXT1
= 0x30
46 EFI_HII_IIBT_EXT2
= 0x31
47 EFI_HII_IIBT_EXT4
= 0x32
50 # Value of HII package type
52 EFI_HII_PACKAGE_TYPE_ALL
= 0x00
53 EFI_HII_PACKAGE_TYPE_GUID
= 0x01
54 EFI_HII_PACKAGE_FORMS
= 0x02
55 EFI_HII_PACKAGE_STRINGS
= 0x04
56 EFI_HII_PACKAGE_FONTS
= 0x05
57 EFI_HII_PACKAGE_IMAGES
= 0x06
58 EFI_HII_PACKAGE_SIMPLE_FONTS
= 0x07
59 EFI_HII_PACKAGE_DEVICE_PATH
= 0x08
60 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
= 0x09
61 EFI_HII_PACKAGE_ANIMATIONS
= 0x0A
62 EFI_HII_PACKAGE_END
= 0xDF
63 EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN
= 0xE0
64 EFI_HII_PACKAGE_TYPE_SYSTEM_END
= 0xFF
66 class IdfFileClassObject(object):
67 def __init__(self
, FileList
= []):
68 self
.FileList
= FileList
69 self
.ImageFilesDict
= {}
71 if len(self
.FileList
) > 0:
72 self
.LoadIdfFiles(FileList
)
74 def LoadIdfFiles(self
, FileList
):
77 self
.LoadIdfFile(File
)
79 def LoadIdfFile(self
, File
= None):
81 EdkLogger
.error("Image Definition File Parser", PARSER_ERROR
, 'No Image definition file is given.')
85 IdfFile
= open(LongFilePath(File
.Path
), mode
='r')
86 FileIn
= IdfFile
.read()
89 EdkLogger
.error("build", FILE_OPEN_FAILURE
, ExtraData
=File
)
92 for Line
in FileIn
.splitlines():
94 Line
= self
.StripComments(Line
)
98 LineNo
= GetLineNo(FileIn
, Line
, False)
99 if not Line
.startswith('#image '):
100 EdkLogger
.error("Image Definition File Parser", PARSER_ERROR
, 'The %s in Line %s of File %s is invalid.' % (Line
, LineNo
, File
.Path
))
102 if Line
.find('#image ') >= 0:
103 LineDetails
= Line
.split()
104 Len
= len(LineDetails
)
105 if Len
!= 3 and Len
!= 4:
106 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
))
107 if Len
== 4 and LineDetails
[2] != 'TRANSPARENT':
108 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
))
109 MatchString
= gIdentifierPattern
.match(LineDetails
[1])
110 if MatchString
is None:
111 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
))
112 if LineDetails
[1] not in self
.ImageIDList
:
113 self
.ImageIDList
.append(LineDetails
[1])
115 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 ImageFile
= ImageFileObject(LineDetails
[Len
-1], LineDetails
[1], True)
119 ImageFile
= ImageFileObject(LineDetails
[Len
-1], LineDetails
[1], False)
120 ImageFileList
.append(ImageFile
)
122 self
.ImageFilesDict
[File
] = ImageFileList
124 def StripComments(self
, Line
):
126 CommentPos
= Line
.find(Comment
)
127 while CommentPos
>= 0:
128 # if there are non matched quotes before the comment header
129 # then we are in the middle of a string
130 # but we need to ignore the escaped quotes and backslashes.
131 if ((Line
.count('"', 0, CommentPos
) - Line
.count('\\"', 0, CommentPos
)) & 1) == 1:
132 CommentPos
= Line
.find (Comment
, CommentPos
+ 1)
134 return Line
[:CommentPos
].strip()
137 def ImageDecoder(self
, File
):
140 def SearchImageID(ImageFileObject
, FileList
):
142 return ImageFileObject
144 for File
in FileList
:
145 if os
.path
.isfile(File
):
146 Lines
= open(File
, 'r')
148 ImageIdList
= IMAGE_TOKEN
.findall(Line
)
149 for ID
in ImageIdList
:
150 EdkLogger
.debug(EdkLogger
.DEBUG_5
, "Found ImageID identifier: " + ID
)
151 ImageFileObject
.SetImageIDReferenced(ID
)
153 class ImageFileObject(object):
154 def __init__(self
, FileName
, ImageID
, TransParent
= False):
155 self
.FileName
= FileName
157 self
.ImageID
= ImageID
158 self
.TransParent
= TransParent
159 self
.Referenced
= False
161 def SetImageIDReferenced(self
, ImageID
):
162 if ImageID
== self
.ImageID
:
163 self
.Referenced
= True