aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/manifest.cpp
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2021-04-22 17:06:54 -0700
committerRob Mensching <rob@firegiant.com>2021-04-29 16:36:06 -0700
commitaf10c45d7b3a44af0b461a557847fe03263dcc10 (patch)
tree6a5c1532304782c36ffe4200b38f3afb76789a43 /src/burn/engine/manifest.cpp
parent9c2aed97299fb96aeee3f1471ce40225437aaecf (diff)
downloadwix-af10c45d7b3a44af0b461a557847fe03263dcc10.tar.gz
wix-af10c45d7b3a44af0b461a557847fe03263dcc10.tar.bz2
wix-af10c45d7b3a44af0b461a557847fe03263dcc10.zip
Move burn into burn
Diffstat (limited to 'src/burn/engine/manifest.cpp')
-rw-r--r--src/burn/engine/manifest.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/burn/engine/manifest.cpp b/src/burn/engine/manifest.cpp
new file mode 100644
index 00000000..b1740083
--- /dev/null
+++ b/src/burn/engine/manifest.cpp
@@ -0,0 +1,164 @@
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
6static HRESULT ParseFromXml(
7 __in IXMLDOMDocument* pixdDocument,
8 __in BURN_ENGINE_STATE* pEngineState
9 );
10
11// function definitions
12
13extern "C" HRESULT ManifestLoadXmlFromFile(
14 __in LPCWSTR wzPath,
15 __in BURN_ENGINE_STATE* pEngineState
16 )
17{
18 HRESULT hr = S_OK;
19 IXMLDOMDocument* pixdDocument = NULL;
20
21 // load xml document
22 hr = XmlLoadDocumentFromFile(wzPath, &pixdDocument);
23 ExitOnFailure(hr, "Failed to load manifest as XML document.");
24
25 hr = ParseFromXml(pixdDocument, pEngineState);
26
27LExit:
28 ReleaseObject(pixdDocument);
29
30 return hr;
31}
32
33extern "C" HRESULT ManifestLoadXmlFromBuffer(
34 __in_bcount(cbBuffer) BYTE* pbBuffer,
35 __in SIZE_T cbBuffer,
36 __in BURN_ENGINE_STATE* pEngineState
37 )
38{
39 HRESULT hr = S_OK;
40 IXMLDOMDocument* pixdDocument = NULL;
41
42 // load xml document
43 hr = XmlLoadDocumentFromBuffer(pbBuffer, cbBuffer, &pixdDocument);
44 ExitOnFailure(hr, "Failed to load manifest as XML document.");
45
46 hr = ParseFromXml(pixdDocument, pEngineState);
47
48LExit:
49 ReleaseObject(pixdDocument);
50
51 return hr;
52}
53
54static HRESULT ParseFromXml(
55 __in IXMLDOMDocument* pixdDocument,
56 __in BURN_ENGINE_STATE* pEngineState
57 )
58{
59 HRESULT hr = S_OK;
60 IXMLDOMElement* pixeBundle = NULL;
61 IXMLDOMNode* pixnLog = NULL;
62 IXMLDOMNode* pixnChain = NULL;
63
64 // get bundle element
65 hr = pixdDocument->get_documentElement(&pixeBundle);
66 ExitOnFailure(hr, "Failed to get bundle element.");
67
68 // parse the log element, if present.
69 hr = XmlSelectSingleNode(pixeBundle, L"Log", &pixnLog);
70 ExitOnFailure(hr, "Failed to get Log element.");
71
72 if (S_OK == hr)
73 {
74 hr = XmlGetAttributeEx(pixnLog, L"PathVariable", &pEngineState->log.sczPathVariable);
75 if (E_NOTFOUND != hr)
76 {
77 ExitOnFailure(hr, "Failed to get Log/@PathVariable.");
78 }
79
80 hr = XmlGetAttributeEx(pixnLog, L"Prefix", &pEngineState->log.sczPrefix);
81 ExitOnFailure(hr, "Failed to get Log/@Prefix attribute.");
82
83 hr = XmlGetAttributeEx(pixnLog, L"Extension", &pEngineState->log.sczExtension);
84 ExitOnFailure(hr, "Failed to get Log/@Extension attribute.");
85 }
86
87 // get the chain element
88 hr = XmlSelectSingleNode(pixeBundle, L"Chain", &pixnChain);
89 ExitOnFailure(hr, "Failed to get chain element.");
90
91 if (S_OK == hr)
92 {
93 // parse disable rollback
94 hr = XmlGetYesNoAttribute(pixnChain, L"DisableRollback", &pEngineState->fDisableRollback);
95 if (E_NOTFOUND != hr)
96 {
97 ExitOnFailure(hr, "Failed to get Chain/@DisableRollback");
98 }
99
100 // parse disable system restore
101 hr = XmlGetYesNoAttribute(pixnChain, L"DisableSystemRestore", &pEngineState->fDisableSystemRestore);
102 if (E_NOTFOUND != hr)
103 {
104 ExitOnFailure(hr, "Failed to get Chain/@DisableSystemRestore");
105 }
106
107 // parse parallel cache
108 hr = XmlGetYesNoAttribute(pixnChain, L"ParallelCache", &pEngineState->fParallelCacheAndExecute);
109 if (E_NOTFOUND != hr)
110 {
111 ExitOnFailure(hr, "Failed to get Chain/@ParallelCache");
112 }
113 }
114
115 // parse built-in condition
116 hr = ConditionGlobalParseFromXml(&pEngineState->condition, pixeBundle);
117 ExitOnFailure(hr, "Failed to parse global condition.");
118
119 // parse variables
120 hr = VariablesParseFromXml(&pEngineState->variables, pixeBundle);
121 ExitOnFailure(hr, "Failed to parse variables.");
122
123 // parse user experience
124 hr = UserExperienceParseFromXml(&pEngineState->userExperience, pixeBundle);
125 ExitOnFailure(hr, "Failed to parse user experience.");
126
127 // parse extensions
128 hr = BurnExtensionParseFromXml(&pEngineState->extensions, &pEngineState->userExperience.payloads, pixeBundle);
129 ExitOnFailure(hr, "Failed to parse extensions.");
130
131 // parse searches
132 hr = SearchesParseFromXml(&pEngineState->searches, &pEngineState->extensions, pixeBundle);
133 ExitOnFailure(hr, "Failed to parse searches.");
134
135 // parse registration
136 hr = RegistrationParseFromXml(&pEngineState->registration, pixeBundle);
137 ExitOnFailure(hr, "Failed to parse registration.");
138
139 // parse update
140 hr = UpdateParseFromXml(&pEngineState->update, pixeBundle);
141 ExitOnFailure(hr, "Failed to parse update.");
142
143 // parse containers
144 hr = ContainersParseFromXml(&pEngineState->containers, pixeBundle);
145 ExitOnFailure(hr, "Failed to parse containers.");
146
147 // parse payloads
148 hr = PayloadsParseFromXml(&pEngineState->payloads, &pEngineState->containers, &pEngineState->layoutPayloads, pixeBundle);
149 ExitOnFailure(hr, "Failed to parse payloads.");
150
151 // parse packages
152 hr = PackagesParseFromXml(&pEngineState->packages, &pEngineState->payloads, pixeBundle);
153 ExitOnFailure(hr, "Failed to parse packages.");
154
155 // parse approved exes for elevation
156 hr = ApprovedExesParseFromXml(&pEngineState->approvedExes, pixeBundle);
157 ExitOnFailure(hr, "Failed to parse approved exes.");
158
159LExit:
160 ReleaseObject(pixnChain);
161 ReleaseObject(pixnLog);
162 ReleaseObject(pixeBundle);
163 return hr;
164}