4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This file is used to create report for Eot tool
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# Import Modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport os
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimport EotGlobalData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync## Report() class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This class defined Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# @param object: Inherited from object class
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass Report(object):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## The constructor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param ReportName: name of the report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param FvObj: FV object after parsing FV images
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def __init__(self, ReportName = 'Report.html', FvObj = None, DispatchName=None):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ReportName = ReportName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Op = open(ReportName, 'w+')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if DispatchName:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList = open(DispatchName, 'w+')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.FvObj = FvObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.FfsIndex = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.PpiIndex = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ProtocolIndex = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if EotGlobalData.gMACRO['EFI_SOURCE'] == '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gMACRO['EFI_SOURCE'] = EotGlobalData.gMACRO['EDK_SOURCE']
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## WriteLn() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Write a line in the report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Line: The lint to be written into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def WriteLn(self, Line):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Op.write('%s\n' % Line)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateReport() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # A caller to generate report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateReport(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateHeader()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateFv()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateTail()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.Op.close()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateUnDispatchedList()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateUnDispatchedList() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Create a list for not dispatched items
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateUnDispatchedList(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FvObj = self.FvObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.Name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in FvObj.UnDispatchedFfsDict:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_UN_DISPATCHED.write('%s\n' % FvObj.UnDispatchedFfsDict[Item])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateFv() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate FV information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateFv(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FvObj = self.FvObj
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="20%%"><strong>Name</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="60%%"><strong>Guid</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="20%%"><strong>Size</strong></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Info in FvObj.BasicInfo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FvName = Info[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FvGuid = Info[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FvSize = Info[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td>%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>""" % (FvName, FvGuid, FvSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <td colspan="3"><table width="100%%" border="1">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('Dispatched:\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for FfsId in FvObj.OrderedFfsDict:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateFfs(FvObj.OrderedFfsDict[FfsId])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # For UnDispatched
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <td colspan="3"><table width="100%%" border="1">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr><strong>UnDispatched</strong></tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('\nUnDispatched:\n')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for FfsId in FvObj.UnDispatchedFfsDict:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateFfs(FvObj.UnDispatchedFfsDict[FfsId])
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateDepex() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate Depex information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param DepexString: A DEPEX string needed to be parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateDepex(self, DepexString):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NonGuidList = ['AND', 'OR', 'NOT', 'BEFORE', 'AFTER', 'TRUE', 'FALSE']
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ItemList = DepexString.split(' ')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DepexString = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in ItemList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Item not in NonGuidList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select DISTINCT GuidName from Report where GuidValue like '%s' and ItemMode = 'Produced' group by GuidName""" % (Item)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != []:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = RecordSet[0][0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DepexString = DepexString + Item + ' '
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="95%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>""" % (DepexString)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GeneratePpi() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PPI information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: CName of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GeneratePpi(self, Name, Guid, Type):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol('Ppi', Name, Guid, Type, self.PpiIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateProtocol() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PROTOCOL information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: CName of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateProtocol(self, Name, Guid, Type):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol('Protocol', Name, Guid, Type, self.ProtocolIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GeneratePpiProtocol() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate PPI/PROTOCOL information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Model: Model of a GUID, PPI or PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Name: Name of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Guid: Value of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param Type: Type of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param CName: CName(Index) of a GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GeneratePpiProtocol(self, Model, Name, Guid, Type, CName):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="85%%" colspan="3">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!-- %s -->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>""" % (Model, Name, Guid)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Type == 'Produced':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select DISTINCT SourceFileFullPath, BelongsToFunction from Report where GuidName like '%s' and ItemMode = 'Callback'""" % Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select FullPath from File
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where ID = (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync select DISTINCT BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where Value1 like '%s')""" % Record[0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ModuleSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Inf = ModuleSet[0][0].replace(EotGlobalData.gMACRO['WORKSPACE'], '.')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function = Record[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Item in EotGlobalData.gMap:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Function in EotGlobalData.gMap[Item]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = EotGlobalData.gMap[Item][Function]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if '_' + Function in EotGlobalData.gMap[Item]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = EotGlobalData.gMap[Item]['_' + Function]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="5%%"></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="40%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="35%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>""" % ('Callback', Inf, Function, Address)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateFfs() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate FFS information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param FfsObj: FFS object after FV image is parsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateFfs(self, FfsObj):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.FfsIndex = self.FfsIndex + 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsObj != None and FfsObj.Type in [0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xA]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsGuid = FfsObj.Guid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsOffset = FfsObj._OFF_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsName = 'Unknown-Module'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsPath = FfsGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsType = FfsObj._TypeName[FfsObj.Type]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Hard code for Binary INF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '7BB28B99-61BB-11D5-9A5D-0090273FC14D':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsName = 'Logo'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '7E374E25-8E01-4FEE-87F2-390C23C606CD':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsName = 'AcpiTables'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsGuid.upper() == '961578FE-B6B7-44C3-AF35-6BC705CD2B1F':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsName = 'Fat'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find FFS Path and Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select Value2 from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where BelongsToFile = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s and Value1='BASE_NAME'""" % (FfsGuid, 5001, 5001)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != []:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsName = RecordSet[0][0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select FullPath from File
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where ID = (select BelongsToFile from Inf where Value1 = 'FILE_GUID' and lower(Value2) = lower('%s') and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s""" % (FfsGuid, 5001, 1011)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != []:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FfsPath = RecordSet[0][0]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr class='styleFfs' id='FfsHeader%s'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="55%%"><span onclick="Display('FfsHeader%s', 'Ffs%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">%s</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="15%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!--<td width="20%%">%s</td>-->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <!--<td width="20%%">%s</td>-->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td width="10%%">%s</td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Ffs%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td colspan="4"><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, FfsPath, FfsName, FfsGuid, FfsOffset, FfsType, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if self.DispatchList:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsObj.Type in [0x04, 0x06]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList.write("%s %s %s %s\n" % (FfsGuid, "P", FfsName, FfsPath))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsObj.Type in [0x05, 0x07, 0x08, 0x0A]:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.DispatchList.write("%s %s %s %s\n" % (FfsGuid, "D", FfsName, FfsPath))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EotGlobalData.gOP_DISPATCH_ORDER.write('%s\n' %FfsName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FfsObj.Depex != '':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='DepexHeader%s' class="styleDepex" onclick="Display('DepexHeader%s', 'Depex%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">&nbsp&nbspDEPEX expression</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Depex%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GenerateDepex(FfsObj.Depex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # End of DEPEX
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find Consumed Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ModuleName, ItemType, GuidName, GuidValue, GuidMacro from Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where SourceFileFullPath in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select Value1 from Inf where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ItemMode = 'Consumed' group by GuidName order by ItemType""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync % (FfsGuid, 5001, 3007)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != []:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = len(RecordSet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='ConsumedHeader%s' class="styleConsumed" onclick="Display('ConsumedHeader%s', 'Consumed%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">&nbsp&nbspConsumed Ppis/Protocols List (%s)</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Consumed%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, Count, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ProtocolIndex = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.ProtocolIndex = self.ProtocolIndex + 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Name = Record[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CName = Record[4]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Guid = Record[3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Type = Record[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol(Type, Name, Guid, 'Consumed', CName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #End of Consumed Ppi/Portocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Find Produced Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SqlCommand = """select ModuleName, ItemType, GuidName, GuidValue, GuidMacro from Report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where SourceFileFullPath in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select Value1 from Inf where BelongsToFile =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (select BelongsToFile from Inf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where Value1 = 'FILE_GUID' and Value2 like '%s' and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Model = %s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ItemMode = 'Produced' group by GuidName order by ItemType""" \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync % (FfsGuid, 5001, 3007)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = EotGlobalData.gDb.TblReport.Exec(SqlCommand)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if RecordSet != []:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = len(RecordSet)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ <tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><span id='ProducedHeader%s' class="styleProduced" onclick="Display('ProducedHeader%s', 'Produced%s')" onMouseOver="funOnMouseOver()" onMouseOut="funOnMouseOut()">&nbsp&nbspProduced Ppis/Protocols List (%s)</span></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <tr id='Produced%s' style='display:none;'>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <td><table width="100%%" border="1">""" % (self.FfsIndex, self.FfsIndex, self.FfsIndex, Count, self.FfsIndex)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.PpiIndex = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for Record in RecordSet:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.PpiIndex = self.PpiIndex + 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Name = Record[2]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CName = Record[4]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Guid = Record[3]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Type = Record[1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.GeneratePpiProtocol(Type, Name, Guid, 'Produced', CName)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSet = None
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # End of Produced Ppi/Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Content = """ </table></td>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync </tr>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Content)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateTail() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate end tags of HTML report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateTail(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tail = """</table>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</body>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</html>"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Tail)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ## GenerateHeader() method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Generate start tags of HTML report
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # @param self: The object pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync def GenerateHeader(self):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync"http://www.w3.org/TR/html4/loose.dtd">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<html>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<head>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<title>Execution Order Tool Report</title>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<meta http-equiv="Content-Type" content="text/html">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<style type="text/css">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<!--
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleFfs {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #006600;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleDepex {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #FF0066;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleProduced {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #0000FF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.styleConsumed {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync color: #FF00FF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync font-weight: bold;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</style>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<Script type="text/javascript">
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction Display(ParentID, SubID)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem = document.getElementById(SubID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem = document.getElementById(ParentID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SubItem.style.display == 'none')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem.style.display = ''
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem.style.fontWeight = 'normal'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SubItem.style.display = 'none'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentItem.style.fontWeight = 'bold'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction funOnMouseOver()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync document.body.style.cursor = "hand";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfunction funOnMouseOut()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync document.body.style.cursor = "";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</Script>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync</head>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<body>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<table width="100%%" border="1">"""
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync self.WriteLn(Header)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync##
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# This acts like the main() function for the script, unless it is 'import'ed into another
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync# script.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncif __name__ == '__main__':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync # Initialize log system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = 'FVRECOVERYFLOPPY.fv'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FilePath.lower().endswith(".fv"):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fd = open(FilePath, 'rb')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buf = array('B')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buf.fromfile(fd, os.path.getsize(FilePath))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except EOFError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pass
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fv = FirmwareVolume("FVRECOVERY", buf, 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync report = Report('Report.html', fv)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync report.GenerateReport()