main
cpp 190 lines 6.37 KB
Raw
1 // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3 #include "precomp.h"
4
5
6 STDMETHODIMP NetfxSearchParseFromXml(
7 __in NETFX_SEARCHES* pSearches,
8 __in IXMLDOMNode* pixnBootstrapperExtension
9 )
10 {
11 HRESULT hr = S_OK;
12 IXMLDOMNodeList* pixnNodes = NULL;
13 IXMLDOMNode* pixnNode = NULL;
14 DWORD cNodes = 0;
15 BSTR bstrNodeName = NULL;
16
17 // Select Netfx search nodes.
18 hr = XmlSelectNodes(pixnBootstrapperExtension, L"NetFxNetCoreSearch|NetFxNetCoreSdkSearch|NetFxNetCoreSdkFeatureBandSearch", &pixnNodes);
19 BextExitOnFailure(hr, "Failed to select Netfx search nodes.");
20
21 // Get Netfx search node count.
22 hr = pixnNodes->get_length((long*)&cNodes);
23 BextExitOnFailure(hr, "Failed to get Netfx search node count.");
24
25 if (!cNodes)
26 {
27 ExitFunction();
28 }
29
30 // Allocate memory for searches.
31 pSearches->rgSearches = (NETFX_SEARCH*)MemAlloc(sizeof(NETFX_SEARCH) * cNodes, TRUE);
32 BextExitOnNull(pSearches->rgSearches, hr, E_OUTOFMEMORY, "Failed to allocate memory for search structs.");
33
34 pSearches->cSearches = cNodes;
35
36 // Parse search elements.
37 for (DWORD i = 0; i < cNodes; ++i)
38 {
39 NETFX_SEARCH* pSearch = &pSearches->rgSearches[i];
40
41 hr = XmlNextElement(pixnNodes, &pixnNode, &bstrNodeName);
42 BextExitOnFailure(hr, "Failed to get next node.");
43
44 // @Id
45 hr = XmlGetAttributeEx(pixnNode, L"Id", &pSearch->sczId);
46 BextExitOnFailure(hr, "Failed to get @Id.");
47
48 // Read type specific attributes.
49 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"NetFxNetCoreSearch", -1))
50 {
51 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SEARCH;
52
53 auto& netCoreSearch = pSearch->NetCoreSearch;
54 // @RuntimeType
55 hr = XmlGetAttributeUInt32(pixnNode, L"RuntimeType", reinterpret_cast<DWORD*>(&netCoreSearch.runtimeType));
56 BextExitOnFailure(hr, "Failed to get @RuntimeType.");
57
58 // @Platform
59 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSearch.platform));
60 BextExitOnFailure(hr, "Failed to get @Platform.");
61
62 // @MajorVersion
63 hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSearch.sczMajorVersion);
64 BextExitOnFailure(hr, "Failed to get @MajorVersion.");
65 }
66 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"NetFxNetCoreSdkSearch", -1))
67 {
68 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH;
69
70 auto& netCoreSdkSearch = pSearch->NetCoreSdkSearch;
71 // @Platform
72 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSdkSearch.platform));
73 BextExitOnFailure(hr, "Failed to get @Platform.");
74
75 // @MajorVersion
76 hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSdkSearch.sczMajorVersion);
77 BextExitOnFailure(hr, "Failed to get @MajorVersion.");
78 }
79 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"NetFxNetCoreSdkFeatureBandSearch", -1))
80 {
81 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SDK_FEATURE_BAND_SEARCH;
82
83 auto& netCoreSdkSearch = pSearch->NetCoreSdkFeatureBandSearch;
84 // @Platform
85 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSdkSearch.platform));
86 BextExitOnFailure(hr, "Failed to get @Platform.");
87
88 // @MajorVersion
89 hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSdkSearch.sczMajorVersion);
90 BextExitOnFailure(hr, "Failed to get @MajorVersion.");
91
92 // @MinorVersion
93 hr = XmlGetAttributeEx(pixnNode, L"MinorVersion", &netCoreSdkSearch.sczMinorVersion);
94 BextExitOnFailure(hr, "Failed to get @MinorVersion.");
95
96 // @PatchVersion
97 hr = XmlGetAttributeEx(pixnNode, L"PatchVersion", &netCoreSdkSearch.sczPatchVersion);
98 BextExitOnFailure(hr, "Failed to get @PatchVersion.");
99 }
100 else
101 {
102 BextExitWithRootFailure(hr, E_UNEXPECTED, "Unexpected element name: %ls", bstrNodeName);
103 }
104
105 // prepare next iteration
106 ReleaseNullObject(pixnNode);
107 ReleaseNullBSTR(bstrNodeName);
108 }
109
110 LExit:
111 ReleaseBSTR(bstrNodeName);
112 ReleaseObject(pixnNode);
113 ReleaseObject(pixnNodes);
114
115 return hr;
116 }
117
118 void NetfxSearchUninitialize(
119 __in NETFX_SEARCHES* pSearches
120 )
121 {
122 if (pSearches->rgSearches)
123 {
124 for (DWORD i = 0; i < pSearches->cSearches; ++i)
125 {
126 NETFX_SEARCH* pSearch = &pSearches->rgSearches[i];
127
128 ReleaseStr(pSearch->sczId);
129 }
130 MemFree(pSearches->rgSearches);
131 }
132 }
133
134 STDMETHODIMP NetfxSearchExecute(
135 __in NETFX_SEARCHES* pSearches,
136 __in LPCWSTR wzSearchId,
137 __in LPCWSTR wzVariable,
138 __in IBootstrapperExtensionEngine* pEngine,
139 __in LPCWSTR wzBaseDirectory
140 )
141 {
142 HRESULT hr = S_OK;
143 NETFX_SEARCH* pSearch = NULL;
144
145 hr = NetfxSearchFindById(pSearches, wzSearchId, &pSearch);
146 BextExitOnFailure(hr, "Search id '%ls' is unknown to the util extension.", wzSearchId);
147
148 switch (pSearch->Type)
149 {
150 case NETFX_SEARCH_TYPE_NET_CORE_SEARCH:
151 hr = NetfxPerformDetectNetCore(wzVariable, pSearch, pEngine, wzBaseDirectory);
152 break;
153 case NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH:
154 hr = NetfxPerformDetectNetCoreSdk(wzVariable, pSearch, pEngine, wzBaseDirectory);
155 break;
156 case NETFX_SEARCH_TYPE_NET_CORE_SDK_FEATURE_BAND_SEARCH:
157 hr = NetfxPerformDetectNetCoreSdkFeatureBand(wzVariable, pSearch, pEngine, wzBaseDirectory);
158 break;
159 default:
160 hr = E_UNEXPECTED;
161 }
162
163 LExit:
164 return hr;
165 }
166
167 STDMETHODIMP NetfxSearchFindById(
168 __in NETFX_SEARCHES* pSearches,
169 __in LPCWSTR wzId,
170 __out NETFX_SEARCH** ppSearch
171 )
172 {
173 HRESULT hr = S_OK;
174
175 for (DWORD i = 0; i < pSearches->cSearches; ++i)
176 {
177 NETFX_SEARCH* pSearch = &pSearches->rgSearches[i];
178
179 if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pSearch->sczId, -1, wzId, -1))
180 {
181 *ppSearch = pSearch;
182 ExitFunction1(hr = S_OK);
183 }
184 }
185
186 hr = E_NOTFOUND;
187
188 LExit:
189 return hr;
190 }