]>
Commit | Line | Data |
---|---|---|
4234283c LG |
1 | ## @file\r |
2 | # This file is used to define class objects of INF file [Protocols] section. \r | |
3 | # It will consumed by InfParser. \r | |
4 | #\r | |
5 | # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r | |
6 | #\r | |
7 | # This program and the accompanying materials are licensed and made available \r | |
8 | # under the terms and conditions of the BSD License which accompanies this \r | |
9 | # distribution. The full text of the license may be found at \r | |
10 | # http://opensource.org/licenses/bsd-license.php\r | |
11 | #\r | |
12 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
13 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
14 | \r | |
15 | '''\r | |
16 | InfProtocolObject\r | |
17 | '''\r | |
18 | \r | |
19 | from Library.ParserValidate import IsValidCVariableName\r | |
20 | from Library.CommentParsing import ParseComment\r | |
21 | from Library.ExpressionValidate import IsValidFeatureFlagExp \r | |
22 | \r | |
23 | from Library.Misc import Sdict\r | |
24 | \r | |
25 | from Object.Parser.InfMisc import ErrorInInf\r | |
26 | \r | |
27 | from Library import DataType as DT\r | |
28 | from Logger import StringTable as ST\r | |
29 | \r | |
30 | def ParseProtocolComment(CommentsList, InfProtocolItemObj):\r | |
31 | CommentInsList = []\r | |
32 | PreUsage = None\r | |
33 | PreNotify = None\r | |
34 | PreHelpText = ''\r | |
35 | BlockFlag = -1\r | |
36 | Count = 0\r | |
37 | for CommentItem in CommentsList:\r | |
38 | Count = Count + 1\r | |
39 | CommentItemUsage, \\r | |
40 | CommentItemNotify, \\r | |
41 | CommentItemString, \\r | |
42 | CommentItemHelpText = \\r | |
43 | ParseComment(CommentItem, \r | |
44 | DT.PROTOCOL_USAGE_TOKENS, \r | |
45 | DT.PROTOCOL_NOTIFY_TOKENS, \r | |
46 | ['PROTOCOL'], \r | |
47 | False)\r | |
48 | \r | |
49 | if CommentItemString:\r | |
50 | pass\r | |
51 | \r | |
4231a819 | 52 | if CommentItemHelpText is None:\r |
4234283c LG |
53 | CommentItemHelpText = ''\r |
54 | if Count == len(CommentsList) and CommentItemUsage == CommentItemNotify == DT.ITEM_UNDEFINED:\r | |
55 | CommentItemHelpText = DT.END_OF_LINE\r | |
56 | \r | |
57 | if Count == len(CommentsList):\r | |
58 | if BlockFlag == 1 or BlockFlag == 2:\r | |
59 | if CommentItemUsage == CommentItemNotify == DT.ITEM_UNDEFINED:\r | |
60 | BlockFlag = 4\r | |
61 | else:\r | |
62 | BlockFlag = 3\r | |
63 | elif BlockFlag == -1:\r | |
64 | BlockFlag = 4 \r | |
65 | \r | |
66 | if BlockFlag == -1 or BlockFlag == 1 or BlockFlag == 2: \r | |
67 | if CommentItemUsage == CommentItemNotify == DT.ITEM_UNDEFINED:\r | |
68 | if BlockFlag == -1:\r | |
69 | BlockFlag = 1\r | |
70 | elif BlockFlag == 1:\r | |
71 | BlockFlag = 2\r | |
72 | else:\r | |
73 | if BlockFlag == 1 or BlockFlag == 2:\r | |
74 | BlockFlag = 3\r | |
75 | elif BlockFlag == -1:\r | |
76 | BlockFlag = 4\r | |
77 | \r | |
78 | #\r | |
79 | # Combine two comment line if they are generic comment\r | |
80 | # \r | |
81 | if CommentItemUsage == CommentItemNotify == PreUsage == PreNotify == DT.ITEM_UNDEFINED:\r | |
82 | CommentItemHelpText = PreHelpText + DT.END_OF_LINE + CommentItemHelpText\r | |
83 | \r | |
84 | PreHelpText = CommentItemHelpText\r | |
85 | \r | |
86 | if BlockFlag == 4: \r | |
87 | CommentItemIns = InfProtocolItemCommentContent()\r | |
88 | CommentItemIns.SetUsageItem(CommentItemUsage)\r | |
89 | CommentItemIns.SetNotify(CommentItemNotify)\r | |
90 | CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r | |
91 | CommentInsList.append(CommentItemIns)\r | |
92 | \r | |
93 | BlockFlag = -1\r | |
94 | PreUsage = None\r | |
95 | PreNotify = None\r | |
96 | PreHelpText = ''\r | |
97 | \r | |
98 | elif BlockFlag == 3:\r | |
99 | #\r | |
100 | # Add previous help string\r | |
101 | # \r | |
102 | CommentItemIns = InfProtocolItemCommentContent()\r | |
103 | CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r | |
104 | CommentItemIns.SetNotify(DT.ITEM_UNDEFINED)\r | |
105 | if PreHelpText == '' or PreHelpText.endswith(DT.END_OF_LINE):\r | |
106 | PreHelpText += DT.END_OF_LINE \r | |
107 | CommentItemIns.SetHelpStringItem(PreHelpText)\r | |
108 | CommentInsList.append(CommentItemIns)\r | |
109 | #\r | |
110 | # Add Current help string\r | |
111 | #\r | |
112 | CommentItemIns = InfProtocolItemCommentContent()\r | |
113 | CommentItemIns.SetUsageItem(CommentItemUsage)\r | |
114 | CommentItemIns.SetNotify(CommentItemNotify)\r | |
115 | CommentItemIns.SetHelpStringItem(CommentItemHelpText)\r | |
116 | CommentInsList.append(CommentItemIns)\r | |
117 | \r | |
118 | BlockFlag = -1\r | |
119 | PreUsage = None\r | |
120 | PreNotify = None\r | |
121 | PreHelpText = '' \r | |
122 | \r | |
123 | else:\r | |
124 | PreUsage = CommentItemUsage\r | |
125 | PreNotify = CommentItemNotify\r | |
126 | PreHelpText = CommentItemHelpText\r | |
127 | \r | |
128 | InfProtocolItemObj.SetCommentList(CommentInsList)\r | |
129 | \r | |
130 | return InfProtocolItemObj\r | |
131 | \r | |
132 | class InfProtocolItemCommentContent():\r | |
133 | def __init__(self):\r | |
134 | #\r | |
135 | # ## SOMETIMES_CONSUMES ## HelpString \r | |
136 | #\r | |
137 | self.UsageItem = ''\r | |
138 | #\r | |
139 | # Help String\r | |
140 | #\r | |
141 | self.HelpStringItem = ''\r | |
142 | self.Notify = ''\r | |
143 | self.CommentList = []\r | |
144 | \r | |
145 | def SetUsageItem(self, UsageItem):\r | |
146 | self.UsageItem = UsageItem\r | |
147 | def GetUsageItem(self):\r | |
148 | return self.UsageItem\r | |
149 | \r | |
150 | def SetNotify(self, Notify):\r | |
151 | if Notify != DT.ITEM_UNDEFINED:\r | |
152 | self.Notify = 'true'\r | |
153 | def GetNotify(self):\r | |
154 | return self.Notify\r | |
155 | \r | |
156 | def SetHelpStringItem(self, HelpStringItem):\r | |
157 | self.HelpStringItem = HelpStringItem\r | |
158 | def GetHelpStringItem(self):\r | |
159 | return self.HelpStringItem\r | |
160 | \r | |
161 | class InfProtocolItem():\r | |
162 | def __init__(self):\r | |
163 | self.Name = ''\r | |
164 | self.FeatureFlagExp = ''\r | |
165 | self.SupArchList = []\r | |
166 | self.CommentList = []\r | |
167 | \r | |
168 | def SetName(self, Name):\r | |
169 | self.Name = Name\r | |
170 | def GetName(self):\r | |
171 | return self.Name\r | |
172 | \r | |
173 | def SetFeatureFlagExp(self, FeatureFlagExp):\r | |
174 | self.FeatureFlagExp = FeatureFlagExp\r | |
175 | def GetFeatureFlagExp(self):\r | |
176 | return self.FeatureFlagExp\r | |
177 | \r | |
178 | def SetSupArchList(self, SupArchList):\r | |
179 | self.SupArchList = SupArchList\r | |
180 | def GetSupArchList(self):\r | |
181 | return self.SupArchList \r | |
182 | \r | |
183 | def SetCommentList(self, CommentList):\r | |
184 | self.CommentList = CommentList\r | |
185 | def GetCommentList(self):\r | |
186 | return self.CommentList\r | |
187 | \r | |
188 | ##\r | |
189 | #\r | |
190 | #\r | |
191 | #\r | |
192 | class InfProtocolObject():\r | |
193 | def __init__(self):\r | |
194 | self.Protocols = Sdict()\r | |
195 | #\r | |
196 | # Macro defined in this section should be only used in this section.\r | |
197 | #\r | |
198 | self.Macros = {}\r | |
199 | \r | |
200 | def SetProtocol(self, ProtocolContent, Arch = None,):\r | |
201 | __SupArchList = []\r | |
202 | for ArchItem in Arch:\r | |
203 | #\r | |
204 | # Validate Arch\r | |
205 | # \r | |
4231a819 | 206 | if (ArchItem == '' or ArchItem is None):\r |
4234283c LG |
207 | ArchItem = 'COMMON'\r |
208 | __SupArchList.append(ArchItem)\r | |
209 | \r | |
210 | for Item in ProtocolContent:\r | |
211 | #\r | |
212 | # Get Comment content of this protocol\r | |
213 | #\r | |
214 | CommentsList = None\r | |
215 | if len(Item) == 3:\r | |
216 | CommentsList = Item[1]\r | |
217 | CurrentLineOfItem = Item[2]\r | |
218 | LineInfo = (CurrentLineOfItem[2], CurrentLineOfItem[1], CurrentLineOfItem[0])\r | |
219 | Item = Item[0]\r | |
220 | InfProtocolItemObj = InfProtocolItem()\r | |
221 | if len(Item) >= 1 and len(Item) <= 2:\r | |
222 | #\r | |
223 | # Only CName contained\r | |
224 | #\r | |
225 | if not IsValidCVariableName(Item[0]):\r | |
226 | ErrorInInf(ST.ERR_INF_PARSER_INVALID_CNAME%(Item[0]),\r | |
227 | LineInfo=LineInfo)\r | |
228 | if (Item[0] != ''):\r | |
229 | InfProtocolItemObj.SetName(Item[0])\r | |
230 | else:\r | |
231 | ErrorInInf(ST.ERR_INF_PARSER_CNAME_MISSING,\r | |
232 | LineInfo=LineInfo)\r | |
233 | if len(Item) == 2:\r | |
234 | #\r | |
235 | # Contained CName and Feature Flag Express\r | |
236 | # <statements> ::= <CName> ["|" \r | |
237 | # <FeatureFlagExpress>]\r | |
238 | # For Protocol Object\r | |
239 | #\r | |
240 | if Item[1].strip() == '':\r | |
241 | ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_MISSING,\r | |
242 | LineInfo=LineInfo)\r | |
243 | #\r | |
244 | # Validate Feature Flag Express for Item[1]\r | |
245 | #\r | |
246 | FeatureFlagRtv = IsValidFeatureFlagExp(Item[1].strip())\r | |
247 | if not FeatureFlagRtv[0]:\r | |
248 | ErrorInInf(ST.ERR_INF_PARSER_FEATURE_FLAG_EXP_SYNTAX_INVLID%(FeatureFlagRtv[1]),\r | |
249 | LineInfo=LineInfo)\r | |
250 | InfProtocolItemObj.SetFeatureFlagExp(Item[1])\r | |
251 | \r | |
252 | if len(Item) < 1 or len(Item) > 2:\r | |
253 | #\r | |
254 | # Invalid format of Protocols statement \r | |
255 | #\r | |
256 | ErrorInInf(ST.ERR_INF_PARSER_GUID_PPI_PROTOCOL_SECTION_CONTENT_ERROR,\r | |
257 | LineInfo=LineInfo)\r | |
258 | \r | |
259 | #\r | |
260 | # Get/Set Usage and HelpString for Protocol entry\r | |
261 | #\r | |
4231a819 | 262 | if CommentsList is not None and len(CommentsList) != 0:\r |
4234283c LG |
263 | InfProtocolItemObj = ParseProtocolComment(CommentsList, InfProtocolItemObj)\r |
264 | else:\r | |
265 | CommentItemIns = InfProtocolItemCommentContent()\r | |
266 | CommentItemIns.SetUsageItem(DT.ITEM_UNDEFINED)\r | |
267 | CommentItemIns.SetNotify(DT.ITEM_UNDEFINED)\r | |
268 | InfProtocolItemObj.SetCommentList([CommentItemIns])\r | |
269 | \r | |
270 | InfProtocolItemObj.SetSupArchList(__SupArchList)\r | |
271 | \r | |
272 | #\r | |
273 | # Determine protocol name duplicate. Follow below rule:\r | |
274 | #\r | |
275 | # A protocol must not be duplicated within a [Protocols] section. \r | |
276 | # A protocol may appear in multiple architectural [Protocols] \r | |
277 | # sections. A protocol listed in an architectural [Protocols] \r | |
278 | # section must not be listed in the common architectural \r | |
279 | # [Protocols] section.\r | |
280 | # \r | |
281 | # NOTE: This check will not report error now.\r | |
282 | # \r | |
283 | for Item in self.Protocols:\r | |
284 | if Item.GetName() == InfProtocolItemObj.GetName():\r | |
285 | ItemSupArchList = Item.GetSupArchList()\r | |
286 | for ItemArch in ItemSupArchList:\r | |
287 | for ProtocolItemObjArch in __SupArchList:\r | |
288 | if ItemArch == ProtocolItemObjArch:\r | |
289 | #\r | |
290 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE\r | |
291 | #\r | |
292 | pass\r | |
293 | if ItemArch.upper() == 'COMMON' or ProtocolItemObjArch.upper() == 'COMMON':\r | |
294 | #\r | |
295 | # ST.ERR_INF_PARSER_ITEM_DUPLICATE_COMMON\r | |
296 | #\r | |
297 | pass \r | |
298 | \r | |
299 | if self.Protocols.has_key((InfProtocolItemObj)): \r | |
300 | ProcotolList = self.Protocols[InfProtocolItemObj]\r | |
301 | ProcotolList.append(InfProtocolItemObj)\r | |
302 | self.Protocols[InfProtocolItemObj] = ProcotolList\r | |
303 | else:\r | |
304 | ProcotolList = []\r | |
305 | ProcotolList.append(InfProtocolItemObj)\r | |
306 | self.Protocols[InfProtocolItemObj] = ProcotolList\r | |
307 | \r | |
308 | return True\r | |
309 | \r | |
310 | def GetProtocol(self):\r | |
311 | return self.Protocols\r |