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