1## @file
2# Inventory workspace's distribution package information.
3#
4# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
5#
6# SPDX-License-Identifier: BSD-2-Clause-Patent
7#
8"""
9Inventory workspace's distribution package information.
10"""
11##
12# Import Modules
13#
14from sys import platform
15from traceback import format_exc
16from platform import python_version
17
18from Logger import StringTable as ST
19from Logger.ToolError import FatalError
20from Logger.ToolError import ABORT_ERROR
21from Logger.ToolError import CODE_ERROR
22import Logger.Log as Logger
23
24from Library import GlobalData
25
26## InventoryDistInstalled
27#
28# This method retrieves the installed distribution information from the internal UPT database
29#
30# @param  DataBase: the UPT database
31#
32def InventoryDistInstalled(DataBase):
33    DistInstalled = DataBase.InventoryDistInstalled()
34
35    #
36    # find the max length for each item
37    #
38    DpNameStr = "DpName"
39    DpGuidStr = "DpGuid"
40    DpVerStr = "DpVer"
41    DpOriginalNameStr = "DpOriginalName"
42    MaxGuidlen = len(DpGuidStr)
43    MaxVerlen = len(DpVerStr)
44    MaxDpAliasFileNameLen = len(DpNameStr)
45    MaxDpOrigFileNamelen = len(DpOriginalNameStr)
46
47    for (DpGuid, DpVersion, DpOriginalName, DpAliasFileName) in DistInstalled:
48        MaxGuidlen = max(MaxGuidlen, len(DpGuid))
49        MaxVerlen = max(MaxVerlen, len(DpVersion))
50        MaxDpAliasFileNameLen = max(MaxDpAliasFileNameLen, len(DpAliasFileName))
51        MaxDpOrigFileNamelen = max(MaxDpOrigFileNamelen, len(DpOriginalName))
52
53    OutMsgFmt = "%-*s\t%-*s\t%-*s\t%-s"
54    OutMsg = OutMsgFmt % (MaxDpAliasFileNameLen,
55                          DpNameStr,
56                          MaxGuidlen,
57                          DpGuidStr,
58                          MaxVerlen,
59                          DpVerStr,
60                          DpOriginalNameStr)
61    Logger.Info(OutMsg)
62
63    for (DpGuid, DpVersion, DpFileName, DpAliasFileName) in DistInstalled:
64        OutMsg = OutMsgFmt % (MaxDpAliasFileNameLen,
65                            DpAliasFileName,
66                            MaxGuidlen,
67                            DpGuid,
68                            MaxVerlen,
69                            DpVersion,
70                            DpFileName)
71        Logger.Info(OutMsg)
72
73## Tool entrance method
74#
75# This method mainly dispatch specific methods per the command line options.
76# If no error found, return zero value so the caller of this tool can know
77# if it's executed successfully or not.
78#
79# @param  Options: command Options
80#
81def Main(Options = None):
82    if Options:
83        pass
84
85    try:
86        DataBase = GlobalData.gDB
87        InventoryDistInstalled(DataBase)
88        ReturnCode = 0
89    except FatalError as XExcept:
90        ReturnCode = XExcept.args[0]
91        if Logger.GetLevel() <= Logger.DEBUG_9:
92            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
93    except KeyboardInterrupt:
94        ReturnCode = ABORT_ERROR
95        if Logger.GetLevel() <= Logger.DEBUG_9:
96            Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(), platform) + format_exc())
97    except:
98        ReturnCode = CODE_ERROR
99        Logger.Error("\nInventoryWs",
100                    CODE_ERROR,
101                    ST.ERR_UNKNOWN_FATAL_INVENTORYWS_ERR,
102                    ExtraData=ST.MSG_SEARCH_FOR_HELP % ST.MSG_EDKII_MAIL_ADDR,
103                    RaiseError=False
104                    )
105        Logger.Quiet(ST.MSG_PYTHON_ON % (python_version(),
106            platform) + format_exc())
107
108    if ReturnCode == 0:
109        Logger.Quiet(ST.MSG_FINISH)
110
111    return ReturnCode
112