1. Fix trackers 200741, 200898, 200917, 200925, 200945, 200947, 200949
[people/mcb30/basetools.git] / Source / Python / Common / DecClassObject.py
1 ## @file\r
2 # This file is used to define each component of DEC file\r
3 #\r
4 # Copyright (c) 2007, Intel Corporation\r
5 # All rights reserved. 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 ##\r
15 # Import Modules\r
16 #\r
17 import os\r
18 from String import *\r
19 from DataType import *\r
20 from Identification import *\r
21 from Dictionary import *\r
22 from CommonDataClass.PackageClass import *\r
23 from CommonDataClass.CommonClass import PcdClass\r
24 from BuildToolError import *\r
25 from Table.TableDec import TableDec\r
26 import Database as Database\r
27 from Parsing import *\r
28 import GlobalData\r
29 \r
30 #\r
31 # Global variable\r
32 #\r
33 Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN,\r
34            TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
35            TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE,\r
36            TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS,\r
37            TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT,\r
38            TAB_GUIDS.upper() : MODEL_EFI_GUID,\r
39            TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL,\r
40            TAB_PPIS.upper() : MODEL_EFI_PPI,\r
41            TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD,\r
42            TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE,\r
43            TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG,\r
44            TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX,\r
45            TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC,\r
46            TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION\r
47            }\r
48 \r
49 \r
50 ## DecObject\r
51 #\r
52 # This class defined basic Dec object which is used by inheriting\r
53\r
54 # @param object:       Inherited from object class\r
55 #\r
56 class DecObject(object):\r
57     def __init__(self):\r
58         object.__init__()\r
59 \r
60 ## Dec\r
61 #\r
62 # This class defined the structure used in Dec object\r
63\r
64 # @param DecObject:         Inherited from DecObject class\r
65 # @param Filename:          Input value for Filename of Dec file, default is None\r
66 # @param IsMergeAllArches:  Input value for IsMergeAllArches\r
67 #                           True is to merge all arches\r
68 #                           Fales is not to merge all arches\r
69 #                           default is False\r
70 # @param IsToPackage:       Input value for IsToPackage\r
71 #                           True is to transfer to PackageObject automatically\r
72 #                           False is not to transfer to PackageObject automatically\r
73 #                           default is False\r
74 # @param WorkspaceDir:      Input value for current workspace directory, default is None\r
75 #\r
76 # @var Identification:      To store value for Identification, it is a structure as Identification\r
77 # @var Defines:             To store value for Defines, it is a structure as DecDefines\r
78 # @var UserExtensions:      To store value for UserExtensions\r
79 # @var Package:             To store value for Package, it is a structure as PackageClass\r
80 # @var WorkspaceDir:        To store value for WorkspaceDir\r
81 # @var Contents:            To store value for Contents, it is a structure as DecContents\r
82 # @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
83 #\r
84 class Dec(DecObject):\r
85     def __init__(self, Filename = None, IsMergeAllArches = False, IsToPackage = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
86         self.Identification = Identification()\r
87         self.Package = PackageClass()\r
88         self.UserExtensions = ''\r
89         self.WorkspaceDir = WorkspaceDir\r
90         self.SupArchList = SupArchList\r
91         \r
92         self.Cur = Database.Cur\r
93         self.TblFile = Database.TblFile\r
94         self.TblDec = TableDec(Database.Cur)\r
95 \r
96         self.KeyList = [\r
97             TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
98             TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
99             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES\r
100         ]\r
101         #\r
102         # Upper all KEYs to ignore case sensitive when parsing\r
103         #\r
104         self.KeyList = map(lambda c: c.upper(), self.KeyList)\r
105         \r
106         #\r
107         # Init RecordSet\r
108         #\r
109         self.RecordSet = {}        \r
110         for Key in self.KeyList:\r
111             self.RecordSet[Section[Key]] = []\r
112         \r
113         #\r
114         # Load Dec file if filename is not None\r
115         #\r
116         if Filename != None:\r
117             self.LoadDecFile(Filename)\r
118         \r
119         #\r
120         # Transfer to Package Object if IsToPackage is True\r
121         #\r
122         if IsToPackage:\r
123             self.DecToPackage()\r
124     \r
125     ## Load Dec file\r
126     #\r
127     # Load the file if it exists\r
128     #\r
129     # @param Filename:  Input value for filename of Dec file\r
130     #\r
131     def LoadDecFile(self, Filename):\r
132         #\r
133         # Insert a record for file\r
134         #\r
135         Filename = NormPath(Filename)\r
136         self.Identification.FileFullPath = Filename\r
137         (self.Identification.FileRelativePath, self.Identification.FileName) = os.path.split(Filename)\r
138         FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DSC)\r
139         \r
140         #\r
141         # Init DecTable\r
142         #\r
143         self.TblDec.Table = "Dec%s" % FileID\r
144         self.TblDec.Create()\r
145         \r
146         #\r
147         # Init common datas\r
148         #\r
149         IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \\r
150         [], [], TAB_UNKNOWN, [], [], []\r
151         LineNo = 0\r
152         \r
153         #\r
154         # Parse file content\r
155         #\r
156         FileContent = open(Filename, 'r').read()\r
157         for Line in FileContent.splitlines():\r
158             LineNo = LineNo + 1\r
159             #\r
160             # Reomve spaces in head and tail\r
161             #\r
162             Line = Line.strip()\r
163             \r
164             #\r
165             # Ignore comments\r
166             #\r
167             if Line.startswith(TAB_COMMENT_SPLIT):\r
168                 continue\r
169             \r
170             #\r
171             # Remove comments at tail and remove spaces again\r
172             #\r
173             Line = CleanString(Line)\r
174             if Line == '':\r
175                 continue\r
176             \r
177             #\r
178             # Find a new section tab\r
179             # First insert previous section items\r
180             # And then parse the content of the new section\r
181             #\r
182             if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END):\r
183                 #\r
184                 # Insert items data of previous section\r
185                 #\r
186                 Model = Section[CurrentSection.upper()]\r
187                 InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
188 \r
189                 #\r
190                 # Parse the new section\r
191                 #\r
192                 SectionItemList = []\r
193                 ArchList = []\r
194                 ThirdList = []\r
195                 \r
196                 CurrentSection = ''\r
197                 LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
198                 for Item in LineList:\r
199                     ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
200                     if CurrentSection == '':\r
201                         CurrentSection = ItemList[0]\r
202                     else:\r
203                         if CurrentSection != ItemList[0]:\r
204                             EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo)\r
205                     if CurrentSection.upper() not in self.KeyList:\r
206                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
207                     ItemList.append('')\r
208                     ItemList.append('')\r
209                     if len(ItemList) > 5:\r
210                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
211                     else:\r
212                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
213                             EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
214                         ArchList.append(ItemList[1].upper())\r
215                         ThirdList.append(ItemList[2])\r
216 \r
217                 continue\r
218             \r
219             #\r
220             # Not in any defined section\r
221             #\r
222             if CurrentSection == TAB_UNKNOWN:\r
223                 ErrorMsg = "%s is not in any defined section" % Line\r
224                 EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
225 \r
226             #\r
227             # Add a section item\r
228             #\r
229             SectionItemList.append([Line, LineNo])\r
230             # End of parse\r
231         #End of For\r
232         \r
233         #\r
234         # Insert items data of last section\r
235         #\r
236         Model = Section[CurrentSection.upper()]\r
237         InsertSectionItemsIntoDatabase(self.TblDec, FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
238         \r
239         #\r
240         # Replace all DEFINE macros with its actual values\r
241         #\r
242         ParseDefineMacro2(self.TblDec, self.RecordSet, GlobalData.gGlobalDefines)\r
243 \r
244     ## Transfer to Package Object\r
245     # \r
246     # Transfer all contents of a Dec file to a standard Package Object\r
247     #\r
248     def DecToPackage(self):\r
249         #\r
250         # Init global information for the file\r
251         #\r
252         ContainerFile = self.Identification.FileFullPath\r
253         \r
254         #\r
255         # Generate Package Header\r
256         #\r
257         self.GenPackageHeader(ContainerFile)\r
258         \r
259         #\r
260         # Generate Includes\r
261         #\r
262         self.GenIncludes(ContainerFile)\r
263 \r
264         #\r
265         # Generate Guids\r
266         #\r
267         self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
268 \r
269         #\r
270         # Generate Protocols\r
271         #\r
272         self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
273 \r
274         #\r
275         # Generate Ppis\r
276         #\r
277         self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
278         \r
279         #\r
280         # Generate LibraryClasses\r
281         #\r
282         self.GenLibraryClasses(ContainerFile)\r
283         \r
284         #\r
285         # Generate Pcds\r
286         #\r
287         self.GenPcds(ContainerFile)\r
288     \r
289     ## Get Package Header\r
290     #\r
291     # Gen Package Header of Dec as <Key> = <Value>\r
292     #\r
293     # @param ContainerFile: The Dec file full path \r
294     #\r
295     def GenPackageHeader(self, ContainerFile):\r
296         EdkLogger.debug(2, "Generate PackageHeader ...")\r
297         #\r
298         # Update all defines item in database\r
299         #\r
300         RecordSet = self.RecordSet[MODEL_META_DATA_HEADER]\r
301         for Record in RecordSet:\r
302             ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT)\r
303             if len(ValueList) != 2:\r
304                 RaiseParserError(Record[0], 'Defines', ContainerFile, '<Key> = <Value>', Record[2])\r
305             ID, Value1, Value2, Arch, LineNo = Record[3], ValueList[0], ValueList[1], Record[1], Record[2]\r
306             SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
307                             where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(Value1), ConvertToSqlString2(Value2), ID)\r
308             self.TblDec.Exec(SqlCommand)\r
309         \r
310         #\r
311         # Get detailed information\r
312         #\r
313         for Arch in self.SupArchList:\r
314             PackageHeader = PackageHeaderClass()\r
315             \r
316             PackageHeader.Name = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_NAME, Arch)[0]\r
317             PackageHeader.Guid = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_GUID, Arch)[0]\r
318             PackageHeader.Version = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_VERSION, Arch)[0]\r
319             PackageHeader.FileName = self.Identification.FileName\r
320             PackageHeader.FullPath = self.Identification.FileFullPath\r
321             PackageHeader.DecSpecification = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_DEC_SPECIFICATION, Arch)[0]\r
322             \r
323             self.Package.Header[Arch] = PackageHeader\r
324     \r
325     ## GenIncludes\r
326     #\r
327     # Gen Includes of Dec\r
328     # \r
329     #\r
330     # @param ContainerFile: The Dec file full path \r
331     #\r
332     def GenIncludes(self, ContainerFile):\r
333         EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES)\r
334         Includes = {}\r
335         #\r
336         # Get all Includes\r
337         #\r
338         RecordSet = self.RecordSet[MODEL_EFI_INCLUDE]\r
339         \r
340         #\r
341         # Go through each arch\r
342         #\r
343         for Arch in self.SupArchList:\r
344             for Record in RecordSet:\r
345                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
346                     MergeArches(Includes, Record[0], Arch)\r
347 \r
348         for Key in Includes.keys():\r
349             Include = IncludeClass()\r
350             Include.FilePath = NormPath(Key)\r
351             Include.SupArchList = Includes[Key]\r
352             self.Package.Includes.append(Include)\r
353     \r
354     ## GenPpis\r
355     #\r
356     # Gen Ppis of Dec\r
357     # <CName>=<GuidValue>\r
358     #\r
359     # @param ContainerFile: The Dec file full path \r
360     #\r
361     def GenGuidProtocolPpis(self, Type, ContainerFile):\r
362         EdkLogger.debug(2, "Generate %s ..." % Type)\r
363         Lists = {}\r
364         #\r
365         # Get all Items\r
366         #\r
367         RecordSet = self.RecordSet[Section[Type.upper()]]\r
368         \r
369         #\r
370         # Go through each arch\r
371         #\r
372         for Arch in self.SupArchList:\r
373             for Record in RecordSet:\r
374                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
375                     MergeArches(Lists, GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2]), Arch)\r
376         \r
377         ListMember = None\r
378         if Type == TAB_GUIDS:\r
379             ListMember = self.Package.GuidDeclarations\r
380         elif Type == TAB_PROTOCOLS:\r
381             ListMember = self.Package.ProtocolDeclarations\r
382         elif Type == TAB_PPIS:\r
383             ListMember = self.Package.PpiDeclarations\r
384         \r
385         for Key in Lists.keys():\r
386             ListClass = GuidProtocolPpiCommonClass()\r
387             ListClass.CName = Key[0]\r
388             ListClass.Guid = Key[1]\r
389             ListClass.SupArchList = Lists[Key]\r
390             ListMember.append(ListClass)\r
391             \r
392     \r
393     ## GenLibraryClasses\r
394     #\r
395     # Gen LibraryClasses of Dec\r
396     # <CName>=<GuidValue>\r
397     #\r
398     # @param ContainerFile: The Dec file full path \r
399     #\r
400     def GenLibraryClasses(self, ContainerFile):\r
401         EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)\r
402         LibraryClasses = {}\r
403         #\r
404         # Get all Guids\r
405         #\r
406         RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS]\r
407         \r
408         #\r
409         # Go through each arch\r
410         #\r
411         for Arch in self.SupArchList:\r
412             for Record in RecordSet:\r
413                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
414                     List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT)\r
415                     if len(List) != 2:\r
416                         RaiseParserError(Record[0], 'LibraryClasses', ContainerFile, '<LibraryClassName>|<LibraryClassInstanceFilename>', Record[2])\r
417                     else:\r
418                         CheckFileExist(self.Identification.FileRelativePath, List[1], ContainerFile, 'LibraryClasses', Record[0])\r
419                     MergeArches(LibraryClasses, (List[0], List[1]), Arch)\r
420         \r
421         for Key in LibraryClasses.keys():\r
422             LibraryClass = LibraryClassClass()\r
423             LibraryClass.LibraryClass = Key[0]\r
424             LibraryClass.RecommendedInstance = NormPath(Key[1])\r
425             LibraryClass.SupModuleList = SUP_MODULE_LIST\r
426             LibraryClass.SupArchList = LibraryClasses[Key]\r
427             self.Package.LibraryClassDeclarations.append(LibraryClass)\r
428     \r
429     ## GenPcds\r
430     #\r
431     # Gen Pcds of Dec\r
432     # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
433     #\r
434     # @param ContainerFile: The Dec file full path \r
435     #\r
436     def GenPcds(self, ContainerFile):\r
437         EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
438         Pcds = {}\r
439         #\r
440         # Get all Guids\r
441         #\r
442         RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD]\r
443         RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE]\r
444         RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG]\r
445         RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX]\r
446         RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC]\r
447         \r
448         #\r
449         # Go through each arch\r
450         #\r
451         for Arch in self.SupArchList:\r
452             for Record in RecordSet1:\r
453                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
454                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
455             for Record in RecordSet2:\r
456                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
457                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
458             for Record in RecordSet3:\r
459                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
460                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
461             for Record in RecordSet4:\r
462                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
463                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
464             for Record in RecordSet5:\r
465                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
466                     MergeArches(Pcds, GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
467 \r
468         for Key in Pcds.keys():\r
469             Pcd = PcdClass()\r
470             Pcd.CName = Key[1]\r
471             Pcd.Token = Key[4]\r
472             Pcd.TokenSpaceGuidCName = Key[0]\r
473             Pcd.DatumType = Key[3]\r
474             Pcd.DefaultValue = Key[2]\r
475             Pcd.ItemType = Key[5]\r
476             Pcd.SupArchList = Pcds[Key]\r
477             self.Package.PcdDeclarations.append(Pcd)\r
478     \r
479     ## Show detailed information of Package\r
480     #\r
481     # Print all members and their values of Package class\r
482     #\r
483     def ShowPackage(self):\r
484         M = self.Package\r
485         for Arch in M.Header.keys():\r
486             print '\nArch =', Arch\r
487             print 'Filename =', M.Header[Arch].FileName\r
488             print 'FullPath =', M.Header[Arch].FullPath\r
489             print 'BaseName =', M.Header[Arch].Name\r
490             print 'Guid =', M.Header[Arch].Guid\r
491             print 'Version =', M.Header[Arch].Version\r
492             print 'DecSpecification =', M.Header[Arch].DecSpecification\r
493         print '\nIncludes =', M.Includes\r
494         for Item in M.Includes:\r
495             print Item.FilePath, Item.SupArchList\r
496         print '\nGuids =', M.GuidDeclarations\r
497         for Item in M.GuidDeclarations:\r
498             print Item.CName, Item.Guid, Item.SupArchList\r
499         print '\nProtocols =', M.ProtocolDeclarations\r
500         for Item in M.ProtocolDeclarations:\r
501             print Item.CName, Item.Guid, Item.SupArchList\r
502         print '\nPpis =', M.PpiDeclarations\r
503         for Item in M.PpiDeclarations:\r
504             print Item.CName, Item.Guid, Item.SupArchList\r
505         print '\nLibraryClasses =', M.LibraryClassDeclarations\r
506         for Item in M.LibraryClassDeclarations:\r
507             print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList\r
508         print '\nPcds =', M.PcdDeclarations\r
509         for Item in M.PcdDeclarations:\r
510             print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList\r
511 \r
512 ##\r
513 #\r
514 # This acts like the main() function for the script, unless it is 'import'ed into another\r
515 # script.\r
516 #\r
517 if __name__ == '__main__':\r
518     EdkLogger.Initialize()\r
519     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
520     \r
521     W = os.getenv('WORKSPACE')\r
522     F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
523 \r
524     Db = Database.Database(DATABASE_PATH)\r
525     Db.InitDatabase()\r
526     \r
527     P = Dec(os.path.normpath(F), False, True, W, Db)\r
528     P.ShowPackage()\r
529     \r
530     Db.Close()\r