1## @file
2# This file is used to define class objects of INF file [Depex] section.
3# It will consumed by InfParser.
4#
5# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6#
7# SPDX-License-Identifier: BSD-2-Clause-Patent
8
9'''
10InfDepexObject
11'''
12
13from Library import DataType as DT
14from Library import GlobalData
15import Logger.Log as Logger
16from Logger import ToolError
17from Logger import StringTable as ST
18
19from Object.Parser.InfCommonObject import InfSectionCommonDef
20from Library.ParserValidate import IsValidArch
21
22class InfDepexContentItem():
23    def __init__(self):
24        self.SectionType = ''
25        self.SectionString = ''
26
27    def SetSectionType(self, SectionType):
28        self.SectionType = SectionType
29    def GetSectionType(self):
30        return self.SectionType
31
32    def SetSectionString(self, SectionString):
33        self.SectionString = SectionString
34    def GetSectionString(self):
35        return self.SectionString
36
37
38class InfDepexItem():
39    def __init__(self):
40        self.DepexContent = ''
41        self.ModuleType = ''
42        self.SupArch = ''
43        self.HelpString = ''
44        self.FeatureFlagExp = ''
45        self.InfDepexContentItemList = []
46
47    def SetFeatureFlagExp(self, FeatureFlagExp):
48        self.FeatureFlagExp = FeatureFlagExp
49    def GetFeatureFlagExp(self):
50        return self.FeatureFlagExp
51
52    def SetSupArch(self, Arch):
53        self.SupArch = Arch
54    def GetSupArch(self):
55        return self.SupArch
56
57    def SetHelpString(self, HelpString):
58        self.HelpString = HelpString
59    def GetHelpString(self):
60        return self.HelpString
61
62    def SetModuleType(self, Type):
63        self.ModuleType = Type
64    def GetModuleType(self):
65        return self.ModuleType
66
67    def SetDepexConent(self, Content):
68        self.DepexContent = Content
69    def GetDepexContent(self):
70        return self.DepexContent
71
72    def SetInfDepexContentItemList(self, InfDepexContentItemList):
73        self.InfDepexContentItemList = InfDepexContentItemList
74    def GetInfDepexContentItemList(self):
75        return self.InfDepexContentItemList
76
77## InfDepexObject
78#
79#
80#
81class InfDepexObject(InfSectionCommonDef):
82    def __init__(self):
83        self.Depex = []
84        self.AllContent = ''
85        self.SectionContent = ''
86        InfSectionCommonDef.__init__(self)
87
88    def SetDepex(self, DepexContent, KeyList=None, CommentList=None):
89        for KeyItem in KeyList:
90            Arch = KeyItem[0]
91            ModuleType = KeyItem[1]
92            InfDepexItemIns = InfDepexItem()
93
94            #
95            # Validate Arch
96            #
97            if IsValidArch(Arch.strip().upper()):
98                InfDepexItemIns.SetSupArch(Arch)
99            else:
100                Logger.Error("InfParser",
101                             ToolError.FORMAT_INVALID,
102                             ST.ERR_INF_PARSER_DEFINE_NAME_INVALID % (Arch),
103                             File=GlobalData.gINF_MODULE_NAME,
104                             Line=KeyItem[2])
105
106            #
107            # Validate Module Type
108            #
109            if ModuleType and ModuleType != 'COMMON':
110                if ModuleType in DT.VALID_DEPEX_MODULE_TYPE_LIST:
111                    InfDepexItemIns.SetModuleType(ModuleType)
112                else:
113                    Logger.Error("InfParser",
114                                 ToolError.FORMAT_INVALID,
115                                 ST.ERR_INF_PARSER_DEPEX_SECTION_MODULE_TYPE_ERROR % (ModuleType),
116                                 File=GlobalData.gINF_MODULE_NAME,
117                                 Line=KeyItem[2])
118
119            #
120            # Parser content in [Depex] section.
121            #
122            DepexString = ''
123            HelpString = ''
124            #
125            # Get Depex Expression
126            #
127            for Line in DepexContent:
128                LineContent = Line[0].strip()
129                if LineContent.find(DT.TAB_COMMENT_SPLIT) > -1:
130                    LineContent = LineContent[:LineContent.find(DT.TAB_COMMENT_SPLIT)]
131                if LineContent:
132                    DepexString = DepexString + LineContent + DT.END_OF_LINE
133                continue
134
135            if DepexString.endswith(DT.END_OF_LINE):
136                DepexString = DepexString[:-1]
137
138            if not DepexString.strip():
139                continue
140
141            #
142            # Get Help Text
143            #
144            for HelpLine in CommentList:
145                HelpString = HelpString + HelpLine + DT.END_OF_LINE
146            if HelpString.endswith(DT.END_OF_LINE):
147                HelpString = HelpString[:-1]
148
149            InfDepexItemIns.SetDepexConent(DepexString)
150            InfDepexItemIns.SetHelpString(HelpString)
151
152            self.Depex.append(InfDepexItemIns)
153
154        return True
155
156    def GetDepex(self):
157        return self.Depex
158
159    def GetAllContent(self):
160        return self.AllContent
161