diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2019-12-11 19:34:47 +1100 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2019-12-11 20:10:40 +1000 |
commit | 62352fabd541aaa9d0a2c957c4bdd4b9c682df9c (patch) | |
tree | 941513045cb644553af582fc0722c853793a90dd /src | |
parent | ca118d0123624e4e1523eeb7a54eb56364d5876e (diff) | |
download | wix-62352fabd541aaa9d0a2c957c4bdd4b9c682df9c.tar.gz wix-62352fabd541aaa9d0a2c957c4bdd4b9c682df9c.tar.bz2 wix-62352fabd541aaa9d0a2c957c4bdd4b9c682df9c.zip |
Import files from BootstrapperCore repo.
Diffstat (limited to 'src')
26 files changed, 5377 insertions, 0 deletions
diff --git a/src/WixToolset.Mba.Core/BaseBootstrapperApplicationFactory.cs b/src/WixToolset.Mba.Core/BaseBootstrapperApplicationFactory.cs new file mode 100644 index 00000000..e9b60929 --- /dev/null +++ b/src/WixToolset.Mba.Core/BaseBootstrapperApplicationFactory.cs | |||
@@ -0,0 +1,16 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | public abstract class BaseBootstrapperApplicationFactory : IBootstrapperApplicationFactory | ||
6 | { | ||
7 | public IBootstrapperApplication Create(IBootstrapperEngine pEngine, ref Command command) | ||
8 | { | ||
9 | IEngine engine = new Engine(pEngine); | ||
10 | IBootstrapperCommand bootstrapperCommand = command.GetBootstrapperCommand(); | ||
11 | return this.Create(engine, bootstrapperCommand); | ||
12 | } | ||
13 | |||
14 | protected abstract IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand); | ||
15 | } | ||
16 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperApplication.cs b/src/WixToolset.Mba.Core/BootstrapperApplication.cs new file mode 100644 index 00000000..c08a60c7 --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperApplication.cs | |||
@@ -0,0 +1,1591 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Runtime.InteropServices; | ||
7 | using System.Threading; | ||
8 | |||
9 | /// <summary> | ||
10 | /// The default bootstrapper application. | ||
11 | /// </summary> | ||
12 | [ClassInterface(ClassInterfaceType.None)] | ||
13 | public abstract class BootstrapperApplication : MarshalByRefObject, IDefaultBootstrapperApplication | ||
14 | { | ||
15 | /// <summary> | ||
16 | /// Specifies whether this bootstrapper should run asynchronously. The default is true. | ||
17 | /// </summary> | ||
18 | protected readonly bool asyncExecution; | ||
19 | |||
20 | /// <summary> | ||
21 | /// Gets the <see cref="IEngine"/> for interaction with the engine. | ||
22 | /// </summary> | ||
23 | protected readonly IEngine engine; | ||
24 | |||
25 | private bool applying; | ||
26 | |||
27 | /// <summary> | ||
28 | /// Creates a new instance of the <see cref="BootstrapperApplication"/> class. | ||
29 | /// </summary> | ||
30 | protected BootstrapperApplication(IEngine engine) | ||
31 | { | ||
32 | this.engine = engine; | ||
33 | this.applying = false; | ||
34 | this.asyncExecution = true; | ||
35 | } | ||
36 | |||
37 | /// <summary> | ||
38 | /// Fired when the engine is starting up the bootstrapper application. | ||
39 | /// </summary> | ||
40 | public event EventHandler<StartupEventArgs> Startup; | ||
41 | |||
42 | /// <summary> | ||
43 | /// Fired when the engine is shutting down the bootstrapper application. | ||
44 | /// </summary> | ||
45 | public event EventHandler<ShutdownEventArgs> Shutdown; | ||
46 | |||
47 | /// <summary> | ||
48 | /// Fired when the system is shutting down or user is logging off. | ||
49 | /// </summary> | ||
50 | /// <remarks> | ||
51 | /// <para>To prevent shutting down or logging off, set <see cref="CancellableHResultEventArgs.Cancel"/> to | ||
52 | /// true; otherwise, set it to false.</para> | ||
53 | /// <para>By default setup will prevent shutting down or logging off between | ||
54 | /// <see cref="BootstrapperApplication.ApplyBegin"/> and <see cref="BootstrapperApplication.ApplyComplete"/>. | ||
55 | /// Derivatives can change this behavior by overriding <see cref="BootstrapperApplication.OnSystemShutdown"/> | ||
56 | /// or handling <see cref="BootstrapperApplication.SystemShutdown"/>.</para> | ||
57 | /// <para>If <see cref="SystemShutdownEventArgs.Reasons"/> contains <see cref="EndSessionReasons.Critical"/> | ||
58 | /// the bootstrapper cannot prevent the shutdown and only has a few seconds to save state or perform any other | ||
59 | /// critical operations before being closed by the operating system.</para> | ||
60 | /// <para>This event may be fired on a different thread.</para> | ||
61 | /// </remarks> | ||
62 | public event EventHandler<SystemShutdownEventArgs> SystemShutdown; | ||
63 | |||
64 | /// <summary> | ||
65 | /// Fired when the overall detection phase has begun. | ||
66 | /// </summary> | ||
67 | public event EventHandler<DetectBeginEventArgs> DetectBegin; | ||
68 | |||
69 | /// <summary> | ||
70 | /// Fired when a forward compatible bundle is detected. | ||
71 | /// </summary> | ||
72 | public event EventHandler<DetectForwardCompatibleBundleEventArgs> DetectForwardCompatibleBundle; | ||
73 | |||
74 | /// <summary> | ||
75 | /// Fired when the update detection phase has begun. | ||
76 | /// </summary> | ||
77 | public event EventHandler<DetectUpdateBeginEventArgs> DetectUpdateBegin; | ||
78 | |||
79 | /// <summary> | ||
80 | /// Fired when the update detection has found a potential update candidate. | ||
81 | /// </summary> | ||
82 | public event EventHandler<DetectUpdateEventArgs> DetectUpdate; | ||
83 | |||
84 | /// <summary> | ||
85 | /// Fired when the update detection phase has completed. | ||
86 | /// </summary> | ||
87 | public event EventHandler<DetectUpdateCompleteEventArgs> DetectUpdateComplete; | ||
88 | |||
89 | /// <summary> | ||
90 | /// Fired when a related bundle has been detected for a bundle. | ||
91 | /// </summary> | ||
92 | public event EventHandler<DetectRelatedBundleEventArgs> DetectRelatedBundle; | ||
93 | |||
94 | /// <summary> | ||
95 | /// Fired when the detection for a specific package has begun. | ||
96 | /// </summary> | ||
97 | public event EventHandler<DetectPackageBeginEventArgs> DetectPackageBegin; | ||
98 | |||
99 | /// <summary> | ||
100 | /// Fired when a package was not detected but a package using the same provider key was. | ||
101 | /// </summary> | ||
102 | public event EventHandler<DetectCompatibleMsiPackageEventArgs> DetectCompatibleMsiPackage; | ||
103 | |||
104 | /// <summary> | ||
105 | /// Fired when a related MSI package has been detected for a package. | ||
106 | /// </summary> | ||
107 | public event EventHandler<DetectRelatedMsiPackageEventArgs> DetectRelatedMsiPackage; | ||
108 | |||
109 | /// <summary> | ||
110 | /// Fired when an MSP package detects a target MSI has been detected. | ||
111 | /// </summary> | ||
112 | public event EventHandler<DetectTargetMsiPackageEventArgs> DetectTargetMsiPackage; | ||
113 | |||
114 | /// <summary> | ||
115 | /// Fired when a feature in an MSI package has been detected. | ||
116 | /// </summary> | ||
117 | public event EventHandler<DetectMsiFeatureEventArgs> DetectMsiFeature; | ||
118 | |||
119 | /// <summary> | ||
120 | /// Fired when the detection for a specific package has completed. | ||
121 | /// </summary> | ||
122 | public event EventHandler<DetectPackageCompleteEventArgs> DetectPackageComplete; | ||
123 | |||
124 | /// <summary> | ||
125 | /// Fired when the detection phase has completed. | ||
126 | /// </summary> | ||
127 | public event EventHandler<DetectCompleteEventArgs> DetectComplete; | ||
128 | |||
129 | /// <summary> | ||
130 | /// Fired when the engine has begun planning the installation. | ||
131 | /// </summary> | ||
132 | public event EventHandler<PlanBeginEventArgs> PlanBegin; | ||
133 | |||
134 | /// <summary> | ||
135 | /// Fired when the engine has begun planning for a related bundle. | ||
136 | /// </summary> | ||
137 | public event EventHandler<PlanRelatedBundleEventArgs> PlanRelatedBundle; | ||
138 | |||
139 | /// <summary> | ||
140 | /// Fired when the engine has begun planning the installation of a specific package. | ||
141 | /// </summary> | ||
142 | public event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin; | ||
143 | |||
144 | /// <summary> | ||
145 | /// Fired when the engine plans a new, compatible package using the same provider key. | ||
146 | /// </summary> | ||
147 | public event EventHandler<PlanCompatibleMsiPackageBeginEventArgs> PlanCompatibleMsiPackageBegin; | ||
148 | |||
149 | /// <summary> | ||
150 | /// Fired when the engine has completed planning the installation of a specific package. | ||
151 | /// </summary> | ||
152 | public event EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> PlanCompatibleMsiPackageComplete; | ||
153 | |||
154 | /// <summary> | ||
155 | /// Fired when the engine is about to plan the target MSI of a MSP package. | ||
156 | /// </summary> | ||
157 | public event EventHandler<PlanTargetMsiPackageEventArgs> PlanTargetMsiPackage; | ||
158 | |||
159 | /// <summary> | ||
160 | /// Fired when the engine is about to plan a feature in an MSI package. | ||
161 | /// </summary> | ||
162 | public event EventHandler<PlanMsiFeatureEventArgs> PlanMsiFeature; | ||
163 | |||
164 | /// <summary> | ||
165 | /// Fired when the engine has completed planning the installation of a specific package. | ||
166 | /// </summary> | ||
167 | public event EventHandler<PlanPackageCompleteEventArgs> PlanPackageComplete; | ||
168 | |||
169 | /// <summary> | ||
170 | /// Fired when the engine has completed planning the installation. | ||
171 | /// </summary> | ||
172 | public event EventHandler<PlanCompleteEventArgs> PlanComplete; | ||
173 | |||
174 | /// <summary> | ||
175 | /// Fired when the engine has begun installing the bundle. | ||
176 | /// </summary> | ||
177 | public event EventHandler<ApplyBeginEventArgs> ApplyBegin; | ||
178 | |||
179 | /// <summary> | ||
180 | /// Fired when the engine is about to start the elevated process. | ||
181 | /// </summary> | ||
182 | public event EventHandler<ElevateBeginEventArgs> ElevateBegin; | ||
183 | |||
184 | /// <summary> | ||
185 | /// Fired when the engine has completed starting the elevated process. | ||
186 | /// </summary> | ||
187 | public event EventHandler<ElevateCompleteEventArgs> ElevateComplete; | ||
188 | |||
189 | /// <summary> | ||
190 | /// Fired when the engine has changed progress for the bundle installation. | ||
191 | /// </summary> | ||
192 | public event EventHandler<ProgressEventArgs> Progress; | ||
193 | |||
194 | /// <summary> | ||
195 | /// Fired when the engine has encountered an error. | ||
196 | /// </summary> | ||
197 | public event EventHandler<ErrorEventArgs> Error; | ||
198 | |||
199 | /// <summary> | ||
200 | /// Fired when the engine has begun registering the location and visibility of the bundle. | ||
201 | /// </summary> | ||
202 | public event EventHandler<RegisterBeginEventArgs> RegisterBegin; | ||
203 | |||
204 | /// <summary> | ||
205 | /// Fired when the engine has completed registering the location and visibility of the bundle. | ||
206 | /// </summary> | ||
207 | public event EventHandler<RegisterCompleteEventArgs> RegisterComplete; | ||
208 | |||
209 | /// <summary> | ||
210 | /// Fired when the engine has begun removing the registration for the location and visibility of the bundle. | ||
211 | /// </summary> | ||
212 | public event EventHandler<UnregisterBeginEventArgs> UnregisterBegin; | ||
213 | |||
214 | /// <summary> | ||
215 | /// Fired when the engine has completed removing the registration for the location and visibility of the bundle. | ||
216 | /// </summary> | ||
217 | public event EventHandler<UnregisterCompleteEventArgs> UnregisterComplete; | ||
218 | |||
219 | /// <summary> | ||
220 | /// Fired when the engine has begun caching the installation sources. | ||
221 | /// </summary> | ||
222 | public event EventHandler<CacheBeginEventArgs> CacheBegin; | ||
223 | |||
224 | /// <summary> | ||
225 | /// Fired when the engine has begun caching a specific package. | ||
226 | /// </summary> | ||
227 | public event EventHandler<CachePackageBeginEventArgs> CachePackageBegin; | ||
228 | |||
229 | /// <summary> | ||
230 | /// Fired when the engine has begun acquiring the installation sources. | ||
231 | /// </summary> | ||
232 | public event EventHandler<CacheAcquireBeginEventArgs> CacheAcquireBegin; | ||
233 | |||
234 | /// <summary> | ||
235 | /// Fired when the engine has progress acquiring the installation sources. | ||
236 | /// </summary> | ||
237 | public event EventHandler<CacheAcquireProgressEventArgs> CacheAcquireProgress; | ||
238 | |||
239 | /// <summary> | ||
240 | /// Fired by the engine to allow the BA to change the source | ||
241 | /// using <see cref="M:Engine.SetLocalSource"/> or <see cref="M:Engine.SetDownloadSource"/>. | ||
242 | /// </summary> | ||
243 | public event EventHandler<ResolveSourceEventArgs> ResolveSource; | ||
244 | |||
245 | /// <summary> | ||
246 | /// Fired when the engine has completed the acquisition of the installation sources. | ||
247 | /// </summary> | ||
248 | public event EventHandler<CacheAcquireCompleteEventArgs> CacheAcquireComplete; | ||
249 | |||
250 | /// <summary> | ||
251 | /// Fired when the engine begins the verification of the acquired installation sources. | ||
252 | /// </summary> | ||
253 | public event EventHandler<CacheVerifyBeginEventArgs> CacheVerifyBegin; | ||
254 | |||
255 | /// <summary> | ||
256 | /// Fired when the engine complete the verification of the acquired installation sources. | ||
257 | /// </summary> | ||
258 | public event EventHandler<CacheVerifyCompleteEventArgs> CacheVerifyComplete; | ||
259 | |||
260 | /// <summary> | ||
261 | /// Fired when the engine has completed caching a specific package. | ||
262 | /// </summary> | ||
263 | public event EventHandler<CachePackageCompleteEventArgs> CachePackageComplete; | ||
264 | |||
265 | /// <summary> | ||
266 | /// Fired after the engine has cached the installation sources. | ||
267 | /// </summary> | ||
268 | public event EventHandler<CacheCompleteEventArgs> CacheComplete; | ||
269 | |||
270 | /// <summary> | ||
271 | /// Fired when the engine has begun installing packages. | ||
272 | /// </summary> | ||
273 | public event EventHandler<ExecuteBeginEventArgs> ExecuteBegin; | ||
274 | |||
275 | /// <summary> | ||
276 | /// Fired when the engine has begun installing a specific package. | ||
277 | /// </summary> | ||
278 | public event EventHandler<ExecutePackageBeginEventArgs> ExecutePackageBegin; | ||
279 | |||
280 | /// <summary> | ||
281 | /// Fired when the engine executes one or more patches targeting a product. | ||
282 | /// </summary> | ||
283 | public event EventHandler<ExecutePatchTargetEventArgs> ExecutePatchTarget; | ||
284 | |||
285 | /// <summary> | ||
286 | /// Fired when Windows Installer sends an installation message. | ||
287 | /// </summary> | ||
288 | public event EventHandler<ExecuteMsiMessageEventArgs> ExecuteMsiMessage; | ||
289 | |||
290 | /// <summary> | ||
291 | /// Fired when Windows Installer sends a files in use installation message. | ||
292 | /// </summary> | ||
293 | public event EventHandler<ExecuteFilesInUseEventArgs> ExecuteFilesInUse; | ||
294 | |||
295 | /// <summary> | ||
296 | /// Fired when the engine has completed installing a specific package. | ||
297 | /// </summary> | ||
298 | public event EventHandler<ExecutePackageCompleteEventArgs> ExecutePackageComplete; | ||
299 | |||
300 | /// <summary> | ||
301 | /// Fired when the engine has completed installing packages. | ||
302 | /// </summary> | ||
303 | public event EventHandler<ExecuteCompleteEventArgs> ExecuteComplete; | ||
304 | |||
305 | /// <summary> | ||
306 | /// Fired when the engine has completed installing the bundle. | ||
307 | /// </summary> | ||
308 | public event EventHandler<ApplyCompleteEventArgs> ApplyComplete; | ||
309 | |||
310 | /// <summary> | ||
311 | /// Fired by the engine while executing on payload. | ||
312 | /// </summary> | ||
313 | public event EventHandler<ExecuteProgressEventArgs> ExecuteProgress; | ||
314 | |||
315 | /// <summary> | ||
316 | /// Fired when the engine is about to launch the preapproved executable. | ||
317 | /// </summary> | ||
318 | public event EventHandler<LaunchApprovedExeBeginArgs> LaunchApprovedExeBegin; | ||
319 | |||
320 | /// <summary> | ||
321 | /// Fired when the engine has completed launching the preapproved executable. | ||
322 | /// </summary> | ||
323 | public event EventHandler<LaunchApprovedExeCompleteArgs> LaunchApprovedExeComplete; | ||
324 | |||
325 | /// <summary> | ||
326 | /// Entry point that is called when the bootstrapper application is ready to run. | ||
327 | /// </summary> | ||
328 | protected abstract void Run(); | ||
329 | |||
330 | /// <summary> | ||
331 | /// Called by the engine on startup of the bootstrapper application. | ||
332 | /// </summary> | ||
333 | /// <param name="args">Additional arguments for this event.</param> | ||
334 | protected virtual void OnStartup(StartupEventArgs args) | ||
335 | { | ||
336 | EventHandler<StartupEventArgs> handler = this.Startup; | ||
337 | if (null != handler) | ||
338 | { | ||
339 | handler(this, args); | ||
340 | } | ||
341 | |||
342 | if (this.asyncExecution) | ||
343 | { | ||
344 | this.engine.Log(LogLevel.Verbose, "Creating BA thread to run asynchronously."); | ||
345 | Thread uiThread = new Thread(this.Run); | ||
346 | uiThread.Name = "UIThread"; | ||
347 | uiThread.SetApartmentState(ApartmentState.STA); | ||
348 | uiThread.Start(); | ||
349 | } | ||
350 | else | ||
351 | { | ||
352 | this.engine.Log(LogLevel.Verbose, "Creating BA thread to run synchronously."); | ||
353 | this.Run(); | ||
354 | } | ||
355 | } | ||
356 | |||
357 | /// <summary> | ||
358 | /// Called by the engine to uninitialize the BA. | ||
359 | /// </summary> | ||
360 | /// <param name="args">Additional arguments for this event.</param> | ||
361 | protected virtual void OnShutdown(ShutdownEventArgs args) | ||
362 | { | ||
363 | EventHandler<ShutdownEventArgs> handler = this.Shutdown; | ||
364 | if (null != handler) | ||
365 | { | ||
366 | handler(this, args); | ||
367 | } | ||
368 | } | ||
369 | |||
370 | /// <summary> | ||
371 | /// Called when the system is shutting down or the user is logging off. | ||
372 | /// </summary> | ||
373 | /// <param name="args">Additional arguments for this event.</param> | ||
374 | /// <remarks> | ||
375 | /// <para>To prevent shutting down or logging off, set <see cref="CancellableHResultEventArgs.Cancel"/> to | ||
376 | /// true; otherwise, set it to false.</para> | ||
377 | /// <para>By default setup will prevent shutting down or logging off between | ||
378 | /// <see cref="BootstrapperApplication.ApplyBegin"/> and <see cref="BootstrapperApplication.ApplyComplete"/>. | ||
379 | /// Derivatives can change this behavior by overriding <see cref="BootstrapperApplication.OnSystemShutdown"/> | ||
380 | /// or handling <see cref="BootstrapperApplication.SystemShutdown"/>.</para> | ||
381 | /// <para>If <see cref="SystemShutdownEventArgs.Reasons"/> contains <see cref="EndSessionReasons.Critical"/> | ||
382 | /// the bootstrapper cannot prevent the shutdown and only has a few seconds to save state or perform any other | ||
383 | /// critical operations before being closed by the operating system.</para> | ||
384 | /// <para>This method may be called on a different thread.</para> | ||
385 | /// </remarks> | ||
386 | protected virtual void OnSystemShutdown(SystemShutdownEventArgs args) | ||
387 | { | ||
388 | EventHandler<SystemShutdownEventArgs> handler = this.SystemShutdown; | ||
389 | if (null != handler) | ||
390 | { | ||
391 | handler(this, args); | ||
392 | } | ||
393 | else if (null != args) | ||
394 | { | ||
395 | // Allow requests to shut down when critical or not applying. | ||
396 | bool critical = EndSessionReasons.Critical == (EndSessionReasons.Critical & args.Reasons); | ||
397 | args.Cancel = !critical && this.applying; | ||
398 | } | ||
399 | } | ||
400 | |||
401 | /// <summary> | ||
402 | /// Called when the overall detection phase has begun. | ||
403 | /// </summary> | ||
404 | /// <param name="args">Additional arguments for this event.</param> | ||
405 | protected virtual void OnDetectBegin(DetectBeginEventArgs args) | ||
406 | { | ||
407 | EventHandler<DetectBeginEventArgs> handler = this.DetectBegin; | ||
408 | if (null != handler) | ||
409 | { | ||
410 | handler(this, args); | ||
411 | } | ||
412 | } | ||
413 | |||
414 | /// <summary> | ||
415 | /// Called when the update detection phase has begun. | ||
416 | /// </summary> | ||
417 | /// <param name="args">Additional arguments for this event.</param> | ||
418 | protected virtual void OnDetectForwardCompatibleBundle(DetectForwardCompatibleBundleEventArgs args) | ||
419 | { | ||
420 | EventHandler<DetectForwardCompatibleBundleEventArgs> handler = this.DetectForwardCompatibleBundle; | ||
421 | if (null != handler) | ||
422 | { | ||
423 | handler(this, args); | ||
424 | } | ||
425 | } | ||
426 | |||
427 | /// <summary> | ||
428 | /// Called when the update detection phase has begun. | ||
429 | /// </summary> | ||
430 | /// <param name="args">Additional arguments for this event.</param> | ||
431 | protected virtual void OnDetectUpdateBegin(DetectUpdateBeginEventArgs args) | ||
432 | { | ||
433 | EventHandler<DetectUpdateBeginEventArgs> handler = this.DetectUpdateBegin; | ||
434 | if (null != handler) | ||
435 | { | ||
436 | handler(this, args); | ||
437 | } | ||
438 | } | ||
439 | |||
440 | /// <summary> | ||
441 | /// Fired when the update detection has found a potential update candidate. | ||
442 | /// </summary> | ||
443 | /// <param name="args">Additional arguments for this event.</param> | ||
444 | protected virtual void OnDetectUpdate(DetectUpdateEventArgs args) | ||
445 | { | ||
446 | EventHandler<DetectUpdateEventArgs> handler = this.DetectUpdate; | ||
447 | if (null != handler) | ||
448 | { | ||
449 | handler(this, args); | ||
450 | } | ||
451 | } | ||
452 | |||
453 | /// <summary> | ||
454 | /// Called when the update detection phase has completed. | ||
455 | /// </summary> | ||
456 | /// <param name="args">Additional arguments for this event.</param> | ||
457 | protected virtual void OnDetectUpdateComplete(DetectUpdateCompleteEventArgs args) | ||
458 | { | ||
459 | EventHandler<DetectUpdateCompleteEventArgs> handler = this.DetectUpdateComplete; | ||
460 | if (null != handler) | ||
461 | { | ||
462 | handler(this, args); | ||
463 | } | ||
464 | } | ||
465 | |||
466 | /// <summary> | ||
467 | /// Called when a related bundle has been detected for a bundle. | ||
468 | /// </summary> | ||
469 | /// <param name="args">Additional arguments for this event.</param> | ||
470 | protected virtual void OnDetectRelatedBundle(DetectRelatedBundleEventArgs args) | ||
471 | { | ||
472 | EventHandler<DetectRelatedBundleEventArgs> handler = this.DetectRelatedBundle; | ||
473 | if (null != handler) | ||
474 | { | ||
475 | handler(this, args); | ||
476 | } | ||
477 | } | ||
478 | |||
479 | /// <summary> | ||
480 | /// Called when the detection for a specific package has begun. | ||
481 | /// </summary> | ||
482 | /// <param name="args">Additional arguments for this event.</param> | ||
483 | protected virtual void OnDetectPackageBegin(DetectPackageBeginEventArgs args) | ||
484 | { | ||
485 | EventHandler<DetectPackageBeginEventArgs> handler = this.DetectPackageBegin; | ||
486 | if (null != handler) | ||
487 | { | ||
488 | handler(this, args); | ||
489 | } | ||
490 | } | ||
491 | |||
492 | /// <summary> | ||
493 | /// Called when a package was not detected but a package using the same provider key was. | ||
494 | /// </summary> | ||
495 | /// <param name="args">Additional arguments for this event.</param> | ||
496 | protected virtual void OnDetectCompatibleMsiPackage(DetectCompatibleMsiPackageEventArgs args) | ||
497 | { | ||
498 | EventHandler<DetectCompatibleMsiPackageEventArgs> handler = this.DetectCompatibleMsiPackage; | ||
499 | if (null != handler) | ||
500 | { | ||
501 | handler(this, args); | ||
502 | } | ||
503 | } | ||
504 | |||
505 | /// <summary> | ||
506 | /// Called when a related MSI package has been detected for a package. | ||
507 | /// </summary> | ||
508 | /// <param name="args">Additional arguments for this event.</param> | ||
509 | protected virtual void OnDetectRelatedMsiPackage(DetectRelatedMsiPackageEventArgs args) | ||
510 | { | ||
511 | EventHandler<DetectRelatedMsiPackageEventArgs> handler = this.DetectRelatedMsiPackage; | ||
512 | if (null != handler) | ||
513 | { | ||
514 | handler(this, args); | ||
515 | } | ||
516 | } | ||
517 | |||
518 | /// <summary> | ||
519 | /// Called when an MSP package detects a target MSI has been detected. | ||
520 | /// </summary> | ||
521 | /// <param name="args">Additional arguments for this event.</param> | ||
522 | protected virtual void OnDetectTargetMsiPackage(DetectTargetMsiPackageEventArgs args) | ||
523 | { | ||
524 | EventHandler<DetectTargetMsiPackageEventArgs> handler = this.DetectTargetMsiPackage; | ||
525 | if (null != handler) | ||
526 | { | ||
527 | handler(this, args); | ||
528 | } | ||
529 | } | ||
530 | |||
531 | /// <summary> | ||
532 | /// Called when an MSI feature has been detected for a package. | ||
533 | /// </summary> | ||
534 | /// <param name="args">Additional arguments for this event.</param> | ||
535 | protected virtual void OnDetectMsiFeature(DetectMsiFeatureEventArgs args) | ||
536 | { | ||
537 | EventHandler<DetectMsiFeatureEventArgs> handler = this.DetectMsiFeature; | ||
538 | if (null != handler) | ||
539 | { | ||
540 | handler(this, args); | ||
541 | } | ||
542 | } | ||
543 | |||
544 | /// <summary> | ||
545 | /// Called when the detection for a specific package has completed. | ||
546 | /// </summary> | ||
547 | /// <param name="args">Additional arguments for this event.</param> | ||
548 | protected virtual void OnDetectPackageComplete(DetectPackageCompleteEventArgs args) | ||
549 | { | ||
550 | EventHandler<DetectPackageCompleteEventArgs> handler = this.DetectPackageComplete; | ||
551 | if (null != handler) | ||
552 | { | ||
553 | handler(this, args); | ||
554 | } | ||
555 | } | ||
556 | |||
557 | /// <summary> | ||
558 | /// Called when the detection phase has completed. | ||
559 | /// </summary> | ||
560 | /// <param name="args">Additional arguments for this event.</param> | ||
561 | protected virtual void OnDetectComplete(DetectCompleteEventArgs args) | ||
562 | { | ||
563 | EventHandler<DetectCompleteEventArgs> handler = this.DetectComplete; | ||
564 | if (null != handler) | ||
565 | { | ||
566 | handler(this, args); | ||
567 | } | ||
568 | } | ||
569 | |||
570 | /// <summary> | ||
571 | /// Called when the engine has begun planning the installation. | ||
572 | /// </summary> | ||
573 | /// <param name="args">Additional arguments for this event.</param> | ||
574 | protected virtual void OnPlanBegin(PlanBeginEventArgs args) | ||
575 | { | ||
576 | EventHandler<PlanBeginEventArgs> handler = this.PlanBegin; | ||
577 | if (null != handler) | ||
578 | { | ||
579 | handler(this, args); | ||
580 | } | ||
581 | } | ||
582 | |||
583 | /// <summary> | ||
584 | /// Called when the engine has begun planning for a prior bundle. | ||
585 | /// </summary> | ||
586 | /// <param name="args">Additional arguments for this event.</param> | ||
587 | protected virtual void OnPlanRelatedBundle(PlanRelatedBundleEventArgs args) | ||
588 | { | ||
589 | EventHandler<PlanRelatedBundleEventArgs> handler = this.PlanRelatedBundle; | ||
590 | if (null != handler) | ||
591 | { | ||
592 | handler(this, args); | ||
593 | } | ||
594 | } | ||
595 | |||
596 | /// <summary> | ||
597 | /// Called when the engine has begun planning the installation of a specific package. | ||
598 | /// </summary> | ||
599 | /// <param name="args">Additional arguments for this event.</param> | ||
600 | protected virtual void OnPlanPackageBegin(PlanPackageBeginEventArgs args) | ||
601 | { | ||
602 | EventHandler<PlanPackageBeginEventArgs> handler = this.PlanPackageBegin; | ||
603 | if (null != handler) | ||
604 | { | ||
605 | handler(this, args); | ||
606 | } | ||
607 | } | ||
608 | |||
609 | /// <summary> | ||
610 | /// Called when the engine plans a new, compatible package using the same provider key. | ||
611 | /// </summary> | ||
612 | /// <param name="args">Additional arguments for this event.</param> | ||
613 | protected virtual void OnPlanCompatibleMsiPackageBegin(PlanCompatibleMsiPackageBeginEventArgs args) | ||
614 | { | ||
615 | EventHandler<PlanCompatibleMsiPackageBeginEventArgs> handler = this.PlanCompatibleMsiPackageBegin; | ||
616 | if (null != handler) | ||
617 | { | ||
618 | handler(this, args); | ||
619 | } | ||
620 | } | ||
621 | |||
622 | /// <summary> | ||
623 | /// Called when the engine has completed planning the installation of a specific package. | ||
624 | /// </summary> | ||
625 | /// <param name="args">Additional arguments for this event.</param> | ||
626 | protected virtual void OnPlanCompatibleMsiPackageComplete(PlanCompatibleMsiPackageCompleteEventArgs args) | ||
627 | { | ||
628 | EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> handler = this.PlanCompatibleMsiPackageComplete; | ||
629 | if (null != handler) | ||
630 | { | ||
631 | handler(this, args); | ||
632 | } | ||
633 | } | ||
634 | |||
635 | /// <summary> | ||
636 | /// Called when the engine is about to plan the target MSI of a MSP package. | ||
637 | /// </summary> | ||
638 | /// <param name="args">Additional arguments for this event.</param> | ||
639 | protected virtual void OnPlanTargetMsiPackage(PlanTargetMsiPackageEventArgs args) | ||
640 | { | ||
641 | EventHandler<PlanTargetMsiPackageEventArgs> handler = this.PlanTargetMsiPackage; | ||
642 | if (null != handler) | ||
643 | { | ||
644 | handler(this, args); | ||
645 | } | ||
646 | } | ||
647 | |||
648 | /// <summary> | ||
649 | /// Called when the engine is about to plan an MSI feature of a specific package. | ||
650 | /// </summary> | ||
651 | /// <param name="args">Additional arguments for this event.</param> | ||
652 | protected virtual void OnPlanMsiFeature(PlanMsiFeatureEventArgs args) | ||
653 | { | ||
654 | EventHandler<PlanMsiFeatureEventArgs> handler = this.PlanMsiFeature; | ||
655 | if (null != handler) | ||
656 | { | ||
657 | handler(this, args); | ||
658 | } | ||
659 | } | ||
660 | |||
661 | /// <summary> | ||
662 | /// Called when then engine has completed planning the installation of a specific package. | ||
663 | /// </summary> | ||
664 | /// <param name="args">Additional arguments for this event.</param> | ||
665 | protected virtual void OnPlanPackageComplete(PlanPackageCompleteEventArgs args) | ||
666 | { | ||
667 | EventHandler<PlanPackageCompleteEventArgs> handler = this.PlanPackageComplete; | ||
668 | if (null != handler) | ||
669 | { | ||
670 | handler(this, args); | ||
671 | } | ||
672 | } | ||
673 | |||
674 | /// <summary> | ||
675 | /// Called when the engine has completed planning the installation. | ||
676 | /// </summary> | ||
677 | /// <param name="args">Additional arguments for this event.</param> | ||
678 | protected virtual void OnPlanComplete(PlanCompleteEventArgs args) | ||
679 | { | ||
680 | EventHandler<PlanCompleteEventArgs> handler = this.PlanComplete; | ||
681 | if (null != handler) | ||
682 | { | ||
683 | handler(this, args); | ||
684 | } | ||
685 | } | ||
686 | |||
687 | /// <summary> | ||
688 | /// Called when the engine has begun installing the bundle. | ||
689 | /// </summary> | ||
690 | /// <param name="args">Additional arguments for this event.</param> | ||
691 | protected virtual void OnApplyBegin(ApplyBeginEventArgs args) | ||
692 | { | ||
693 | EventHandler<ApplyBeginEventArgs> handler = this.ApplyBegin; | ||
694 | if (null != handler) | ||
695 | { | ||
696 | handler(this, args); | ||
697 | } | ||
698 | } | ||
699 | |||
700 | /// <summary> | ||
701 | /// Called when the engine is about to start the elevated process. | ||
702 | /// </summary> | ||
703 | /// <param name="args">Additional arguments for this event.</param> | ||
704 | protected virtual void OnElevateBegin(ElevateBeginEventArgs args) | ||
705 | { | ||
706 | EventHandler<ElevateBeginEventArgs> handler = this.ElevateBegin; | ||
707 | if (null != handler) | ||
708 | { | ||
709 | handler(this, args); | ||
710 | } | ||
711 | } | ||
712 | |||
713 | /// <summary> | ||
714 | /// Called when the engine has completed starting the elevated process. | ||
715 | /// </summary> | ||
716 | /// <param name="args">Additional arguments for this event.</param> | ||
717 | protected virtual void OnElevateComplete(ElevateCompleteEventArgs args) | ||
718 | { | ||
719 | EventHandler<ElevateCompleteEventArgs> handler = this.ElevateComplete; | ||
720 | if (null != handler) | ||
721 | { | ||
722 | handler(this, args); | ||
723 | } | ||
724 | } | ||
725 | |||
726 | /// <summary> | ||
727 | /// Called when the engine has changed progress for the bundle installation. | ||
728 | /// </summary> | ||
729 | /// <param name="args">Additional arguments for this event.</param> | ||
730 | protected virtual void OnProgress(ProgressEventArgs args) | ||
731 | { | ||
732 | EventHandler<ProgressEventArgs> handler = this.Progress; | ||
733 | if (null != handler) | ||
734 | { | ||
735 | handler(this, args); | ||
736 | } | ||
737 | } | ||
738 | |||
739 | /// <summary> | ||
740 | /// Called when the engine has encountered an error. | ||
741 | /// </summary> | ||
742 | /// <param name="args">Additional arguments for this event.</param> | ||
743 | protected virtual void OnError(ErrorEventArgs args) | ||
744 | { | ||
745 | EventHandler<ErrorEventArgs> handler = this.Error; | ||
746 | if (null != handler) | ||
747 | { | ||
748 | handler(this, args); | ||
749 | } | ||
750 | } | ||
751 | |||
752 | /// <summary> | ||
753 | /// Called when the engine has begun registering the location and visibility of the bundle. | ||
754 | /// </summary> | ||
755 | /// <param name="args">Additional arguments for this event.</param> | ||
756 | protected virtual void OnRegisterBegin(RegisterBeginEventArgs args) | ||
757 | { | ||
758 | EventHandler<RegisterBeginEventArgs> handler = this.RegisterBegin; | ||
759 | if (null != handler) | ||
760 | { | ||
761 | handler(this, args); | ||
762 | } | ||
763 | } | ||
764 | |||
765 | /// <summary> | ||
766 | /// Called when the engine has completed registering the location and visilibity of the bundle. | ||
767 | /// </summary> | ||
768 | /// <param name="args">Additional arguments for this event.</param> | ||
769 | protected virtual void OnRegisterComplete(RegisterCompleteEventArgs args) | ||
770 | { | ||
771 | EventHandler<RegisterCompleteEventArgs> handler = this.RegisterComplete; | ||
772 | if (null != handler) | ||
773 | { | ||
774 | handler(this, args); | ||
775 | } | ||
776 | } | ||
777 | |||
778 | /// <summary> | ||
779 | /// Called when the engine has begun removing the registration for the location and visibility of the bundle. | ||
780 | /// </summary> | ||
781 | /// <param name="args">Additional arguments for this event.</param> | ||
782 | protected virtual void OnUnregisterBegin(UnregisterBeginEventArgs args) | ||
783 | { | ||
784 | EventHandler<UnregisterBeginEventArgs> handler = this.UnregisterBegin; | ||
785 | if (null != handler) | ||
786 | { | ||
787 | handler(this, args); | ||
788 | } | ||
789 | } | ||
790 | |||
791 | /// <summary> | ||
792 | /// Called when the engine has completed removing the registration for the location and visibility of the bundle. | ||
793 | /// </summary> | ||
794 | /// <param name="args">Additional arguments for this event.</param> | ||
795 | protected virtual void OnUnregisterComplete(UnregisterCompleteEventArgs args) | ||
796 | { | ||
797 | EventHandler<UnregisterCompleteEventArgs> handler = this.UnregisterComplete; | ||
798 | if (null != handler) | ||
799 | { | ||
800 | handler(this, args); | ||
801 | } | ||
802 | } | ||
803 | |||
804 | /// <summary> | ||
805 | /// Called when the engine begins to cache the installation sources. | ||
806 | /// </summary> | ||
807 | /// <param name="args"></param> | ||
808 | protected virtual void OnCacheBegin(CacheBeginEventArgs args) | ||
809 | { | ||
810 | EventHandler<CacheBeginEventArgs> handler = this.CacheBegin; | ||
811 | if (null != handler) | ||
812 | { | ||
813 | handler(this, args); | ||
814 | } | ||
815 | } | ||
816 | |||
817 | /// <summary> | ||
818 | /// Called by the engine when it begins to cache a specific package. | ||
819 | /// </summary> | ||
820 | /// <param name="args"></param> | ||
821 | protected virtual void OnCachePackageBegin(CachePackageBeginEventArgs args) | ||
822 | { | ||
823 | EventHandler<CachePackageBeginEventArgs> handler = this.CachePackageBegin; | ||
824 | if (null != handler) | ||
825 | { | ||
826 | handler(this, args); | ||
827 | } | ||
828 | } | ||
829 | |||
830 | /// <summary> | ||
831 | /// Called when the engine begins to cache the container or payload. | ||
832 | /// </summary> | ||
833 | /// <param name="args"></param> | ||
834 | protected virtual void OnCacheAcquireBegin(CacheAcquireBeginEventArgs args) | ||
835 | { | ||
836 | EventHandler<CacheAcquireBeginEventArgs> handler = this.CacheAcquireBegin; | ||
837 | if (null != handler) | ||
838 | { | ||
839 | handler(this, args); | ||
840 | } | ||
841 | } | ||
842 | |||
843 | /// <summary> | ||
844 | /// Called when the engine has progressed on caching the container or payload. | ||
845 | /// </summary> | ||
846 | /// <param name="args"></param> | ||
847 | protected virtual void OnCacheAcquireProgress(CacheAcquireProgressEventArgs args) | ||
848 | { | ||
849 | EventHandler<CacheAcquireProgressEventArgs> handler = this.CacheAcquireProgress; | ||
850 | if (null != handler) | ||
851 | { | ||
852 | handler(this, args); | ||
853 | } | ||
854 | } | ||
855 | |||
856 | /// <summary> | ||
857 | /// Called by the engine to allow the BA to change the source | ||
858 | /// using <see cref="M:Engine.SetLocalSource"/> or <see cref="M:Engine.SetDownloadSource"/>. | ||
859 | /// </summary> | ||
860 | /// <param name="args">Additional arguments for this event.</param> | ||
861 | protected virtual void OnResolveSource(ResolveSourceEventArgs args) | ||
862 | { | ||
863 | EventHandler<ResolveSourceEventArgs> handler = this.ResolveSource; | ||
864 | if (null != handler) | ||
865 | { | ||
866 | handler(this, args); | ||
867 | } | ||
868 | } | ||
869 | |||
870 | /// <summary> | ||
871 | /// Called when the engine completes caching of the container or payload. | ||
872 | /// </summary> | ||
873 | /// <param name="args"></param> | ||
874 | protected virtual void OnCacheAcquireComplete(CacheAcquireCompleteEventArgs args) | ||
875 | { | ||
876 | EventHandler<CacheAcquireCompleteEventArgs> handler = this.CacheAcquireComplete; | ||
877 | if (null != handler) | ||
878 | { | ||
879 | handler(this, args); | ||
880 | } | ||
881 | } | ||
882 | |||
883 | /// <summary> | ||
884 | /// Called when the engine has started verify the payload. | ||
885 | /// </summary> | ||
886 | /// <param name="args"></param> | ||
887 | protected virtual void OnCacheVerifyBegin(CacheVerifyBeginEventArgs args) | ||
888 | { | ||
889 | EventHandler<CacheVerifyBeginEventArgs> handler = this.CacheVerifyBegin; | ||
890 | if (null != handler) | ||
891 | { | ||
892 | handler(this, args); | ||
893 | } | ||
894 | } | ||
895 | |||
896 | /// <summary> | ||
897 | /// Called when the engine completes verification of the payload. | ||
898 | /// </summary> | ||
899 | /// <param name="args"></param> | ||
900 | protected virtual void OnCacheVerifyComplete(CacheVerifyCompleteEventArgs args) | ||
901 | { | ||
902 | EventHandler<CacheVerifyCompleteEventArgs> handler = this.CacheVerifyComplete; | ||
903 | if (null != handler) | ||
904 | { | ||
905 | handler(this, args); | ||
906 | } | ||
907 | } | ||
908 | |||
909 | /// <summary> | ||
910 | /// Called when the engine completes caching a specific package. | ||
911 | /// </summary> | ||
912 | /// <param name="args"></param> | ||
913 | protected virtual void OnCachePackageComplete(CachePackageCompleteEventArgs args) | ||
914 | { | ||
915 | EventHandler<CachePackageCompleteEventArgs> handler = this.CachePackageComplete; | ||
916 | if (null != handler) | ||
917 | { | ||
918 | handler(this, args); | ||
919 | } | ||
920 | } | ||
921 | |||
922 | /// <summary> | ||
923 | /// Called after the engine has cached the installation sources. | ||
924 | /// </summary> | ||
925 | /// <param name="args">Additional arguments for this event.</param> | ||
926 | protected virtual void OnCacheComplete(CacheCompleteEventArgs args) | ||
927 | { | ||
928 | EventHandler<CacheCompleteEventArgs> handler = this.CacheComplete; | ||
929 | if (null != handler) | ||
930 | { | ||
931 | handler(this, args); | ||
932 | } | ||
933 | } | ||
934 | |||
935 | /// <summary> | ||
936 | /// Called when the engine has begun installing packages. | ||
937 | /// </summary> | ||
938 | /// <param name="args">Additional arguments for this event.</param> | ||
939 | protected virtual void OnExecuteBegin(ExecuteBeginEventArgs args) | ||
940 | { | ||
941 | EventHandler<ExecuteBeginEventArgs> handler = this.ExecuteBegin; | ||
942 | if (null != handler) | ||
943 | { | ||
944 | handler(this, args); | ||
945 | } | ||
946 | } | ||
947 | |||
948 | /// <summary> | ||
949 | /// Called when the engine has begun installing a specific package. | ||
950 | /// </summary> | ||
951 | /// <param name="args">Additional arguments for this event.</param> | ||
952 | protected virtual void OnExecutePackageBegin(ExecutePackageBeginEventArgs args) | ||
953 | { | ||
954 | EventHandler<ExecutePackageBeginEventArgs> handler = this.ExecutePackageBegin; | ||
955 | if (null != handler) | ||
956 | { | ||
957 | handler(this, args); | ||
958 | } | ||
959 | } | ||
960 | |||
961 | /// <summary> | ||
962 | /// Called when the engine executes one or more patches targeting a product. | ||
963 | /// </summary> | ||
964 | /// <param name="args">Additional arguments for this event.</param> | ||
965 | protected virtual void OnExecutePatchTarget(ExecutePatchTargetEventArgs args) | ||
966 | { | ||
967 | EventHandler<ExecutePatchTargetEventArgs> handler = this.ExecutePatchTarget; | ||
968 | if (null != handler) | ||
969 | { | ||
970 | handler(this, args); | ||
971 | } | ||
972 | } | ||
973 | |||
974 | /// <summary> | ||
975 | /// Called when Windows Installer sends an installation message. | ||
976 | /// </summary> | ||
977 | /// <param name="args">Additional arguments for this event.</param> | ||
978 | protected virtual void OnExecuteMsiMessage(ExecuteMsiMessageEventArgs args) | ||
979 | { | ||
980 | EventHandler<ExecuteMsiMessageEventArgs> handler = this.ExecuteMsiMessage; | ||
981 | if (null != handler) | ||
982 | { | ||
983 | handler(this, args); | ||
984 | } | ||
985 | } | ||
986 | |||
987 | /// <summary> | ||
988 | /// Called when Windows Installer sends a file in use installation message. | ||
989 | /// </summary> | ||
990 | /// <param name="args">Additional arguments for this event.</param> | ||
991 | protected virtual void OnExecuteFilesInUse(ExecuteFilesInUseEventArgs args) | ||
992 | { | ||
993 | EventHandler<ExecuteFilesInUseEventArgs> handler = this.ExecuteFilesInUse; | ||
994 | if (null != handler) | ||
995 | { | ||
996 | handler(this, args); | ||
997 | } | ||
998 | } | ||
999 | |||
1000 | /// <summary> | ||
1001 | /// Called when the engine has completed installing a specific package. | ||
1002 | /// </summary> | ||
1003 | /// <param name="args">Additional arguments for this event.</param> | ||
1004 | protected virtual void OnExecutePackageComplete(ExecutePackageCompleteEventArgs args) | ||
1005 | { | ||
1006 | EventHandler<ExecutePackageCompleteEventArgs> handler = this.ExecutePackageComplete; | ||
1007 | if (null != handler) | ||
1008 | { | ||
1009 | handler(this, args); | ||
1010 | } | ||
1011 | } | ||
1012 | |||
1013 | /// <summary> | ||
1014 | /// Called when the engine has completed installing packages. | ||
1015 | /// </summary> | ||
1016 | /// <param name="args">Additional arguments for this event.</param> | ||
1017 | protected virtual void OnExecuteComplete(ExecuteCompleteEventArgs args) | ||
1018 | { | ||
1019 | EventHandler<ExecuteCompleteEventArgs> handler = this.ExecuteComplete; | ||
1020 | if (null != handler) | ||
1021 | { | ||
1022 | handler(this, args); | ||
1023 | } | ||
1024 | } | ||
1025 | |||
1026 | /// <summary> | ||
1027 | /// Called when the engine has completed installing the bundle. | ||
1028 | /// </summary> | ||
1029 | /// <param name="args">Additional arguments for this event.</param> | ||
1030 | protected virtual void OnApplyComplete(ApplyCompleteEventArgs args) | ||
1031 | { | ||
1032 | EventHandler<ApplyCompleteEventArgs> handler = this.ApplyComplete; | ||
1033 | if (null != handler) | ||
1034 | { | ||
1035 | handler(this, args); | ||
1036 | } | ||
1037 | } | ||
1038 | |||
1039 | /// <summary> | ||
1040 | /// Called by the engine while executing on payload. | ||
1041 | /// </summary> | ||
1042 | /// <param name="args">Additional arguments for this event.</param> | ||
1043 | protected virtual void OnExecuteProgress(ExecuteProgressEventArgs args) | ||
1044 | { | ||
1045 | EventHandler<ExecuteProgressEventArgs> handler = this.ExecuteProgress; | ||
1046 | if (null != handler) | ||
1047 | { | ||
1048 | handler(this, args); | ||
1049 | } | ||
1050 | } | ||
1051 | |||
1052 | /// <summary> | ||
1053 | /// Called by the engine before trying to launch the preapproved executable. | ||
1054 | /// </summary> | ||
1055 | /// <param name="args">Additional arguments for this event.</param> | ||
1056 | protected virtual void OnLaunchApprovedExeBegin(LaunchApprovedExeBeginArgs args) | ||
1057 | { | ||
1058 | EventHandler<LaunchApprovedExeBeginArgs> handler = this.LaunchApprovedExeBegin; | ||
1059 | if (null != handler) | ||
1060 | { | ||
1061 | handler(this, args); | ||
1062 | } | ||
1063 | } | ||
1064 | |||
1065 | /// <summary> | ||
1066 | /// Called by the engine after trying to launch the preapproved executable. | ||
1067 | /// </summary> | ||
1068 | /// <param name="args">Additional arguments for this event.</param> | ||
1069 | protected virtual void OnLaunchApprovedExeComplete(LaunchApprovedExeCompleteArgs args) | ||
1070 | { | ||
1071 | EventHandler<LaunchApprovedExeCompleteArgs> handler = this.LaunchApprovedExeComplete; | ||
1072 | if (null != handler) | ||
1073 | { | ||
1074 | handler(this, args); | ||
1075 | } | ||
1076 | } | ||
1077 | |||
1078 | #region IBootstrapperApplication Members | ||
1079 | |||
1080 | int IBootstrapperApplication.OnStartup() | ||
1081 | { | ||
1082 | StartupEventArgs args = new StartupEventArgs(); | ||
1083 | this.OnStartup(args); | ||
1084 | |||
1085 | return args.HResult; | ||
1086 | } | ||
1087 | |||
1088 | int IBootstrapperApplication.OnShutdown(ref BOOTSTRAPPER_SHUTDOWN_ACTION action) | ||
1089 | { | ||
1090 | ShutdownEventArgs args = new ShutdownEventArgs(action); | ||
1091 | this.OnShutdown(args); | ||
1092 | |||
1093 | action = args.Action; | ||
1094 | return args.HResult; | ||
1095 | } | ||
1096 | |||
1097 | int IBootstrapperApplication.OnSystemShutdown(EndSessionReasons dwEndSession, ref bool fCancel) | ||
1098 | { | ||
1099 | SystemShutdownEventArgs args = new SystemShutdownEventArgs(dwEndSession, fCancel); | ||
1100 | this.OnSystemShutdown(args); | ||
1101 | |||
1102 | fCancel = args.Cancel; | ||
1103 | return args.HResult; | ||
1104 | } | ||
1105 | |||
1106 | int IBootstrapperApplication.OnDetectBegin(bool fInstalled, int cPackages, ref bool fCancel) | ||
1107 | { | ||
1108 | DetectBeginEventArgs args = new DetectBeginEventArgs(fInstalled, cPackages, fCancel); | ||
1109 | this.OnDetectBegin(args); | ||
1110 | |||
1111 | fCancel = args.Cancel; | ||
1112 | return args.HResult; | ||
1113 | } | ||
1114 | |||
1115 | int IBootstrapperApplication.OnDetectForwardCompatibleBundle(string wzBundleId, RelationType relationType, string wzBundleTag, bool fPerMachine, long version, ref bool fCancel, ref bool fIgnoreBundle) | ||
1116 | { | ||
1117 | DetectForwardCompatibleBundleEventArgs args = new DetectForwardCompatibleBundleEventArgs(wzBundleId, relationType, wzBundleTag, fPerMachine, version, fCancel, fIgnoreBundle); | ||
1118 | this.OnDetectForwardCompatibleBundle(args); | ||
1119 | |||
1120 | fCancel = args.Cancel; | ||
1121 | fIgnoreBundle = args.IgnoreBundle; | ||
1122 | return args.HResult; | ||
1123 | } | ||
1124 | |||
1125 | int IBootstrapperApplication.OnDetectUpdateBegin(string wzUpdateLocation, ref bool fCancel, ref bool fSkip) | ||
1126 | { | ||
1127 | DetectUpdateBeginEventArgs args = new DetectUpdateBeginEventArgs(wzUpdateLocation, fCancel, fSkip); | ||
1128 | this.OnDetectUpdateBegin(args); | ||
1129 | |||
1130 | fCancel = args.Cancel; | ||
1131 | fSkip = args.Skip; | ||
1132 | return args.HResult; | ||
1133 | } | ||
1134 | |||
1135 | int IBootstrapperApplication.OnDetectUpdate(string wzUpdateLocation, long dw64Size, long dw64Version, string wzTitle, string wzSummary, string wzContentType, string wzContent, ref bool fCancel, ref bool fStopProcessingUpdates) | ||
1136 | { | ||
1137 | DetectUpdateEventArgs args = new DetectUpdateEventArgs(wzUpdateLocation, dw64Size, dw64Version, wzTitle, wzSummary, wzContentType, wzContent, fCancel, fStopProcessingUpdates); | ||
1138 | this.OnDetectUpdate(args); | ||
1139 | |||
1140 | fCancel = args.Cancel; | ||
1141 | fStopProcessingUpdates = args.StopProcessingUpdates; | ||
1142 | return args.HResult; | ||
1143 | } | ||
1144 | |||
1145 | int IBootstrapperApplication.OnDetectUpdateComplete(int hrStatus, ref bool fIgnoreError) | ||
1146 | { | ||
1147 | DetectUpdateCompleteEventArgs args = new DetectUpdateCompleteEventArgs(hrStatus, fIgnoreError); | ||
1148 | this.OnDetectUpdateComplete(args); | ||
1149 | |||
1150 | fIgnoreError = args.IgnoreError; | ||
1151 | return args.HResult; | ||
1152 | } | ||
1153 | |||
1154 | int IBootstrapperApplication.OnDetectRelatedBundle(string wzProductCode, RelationType relationType, string wzBundleTag, bool fPerMachine, long version, RelatedOperation operation, ref bool fCancel) | ||
1155 | { | ||
1156 | DetectRelatedBundleEventArgs args = new DetectRelatedBundleEventArgs(wzProductCode, relationType, wzBundleTag, fPerMachine, version, operation, fCancel); | ||
1157 | this.OnDetectRelatedBundle(args); | ||
1158 | |||
1159 | fCancel = args.Cancel; | ||
1160 | return args.HResult; | ||
1161 | } | ||
1162 | |||
1163 | int IBootstrapperApplication.OnDetectPackageBegin(string wzPackageId, ref bool fCancel) | ||
1164 | { | ||
1165 | DetectPackageBeginEventArgs args = new DetectPackageBeginEventArgs(wzPackageId, fCancel); | ||
1166 | this.OnDetectPackageBegin(args); | ||
1167 | |||
1168 | fCancel = args.Cancel; | ||
1169 | return args.HResult; | ||
1170 | } | ||
1171 | |||
1172 | int IBootstrapperApplication.OnDetectCompatibleMsiPackage(string wzPackageId, string wzCompatiblePackageId, long dw64CompatiblePackageVersion, ref bool fCancel) | ||
1173 | { | ||
1174 | DetectCompatibleMsiPackageEventArgs args = new DetectCompatibleMsiPackageEventArgs(wzPackageId, wzCompatiblePackageId, dw64CompatiblePackageVersion, fCancel); | ||
1175 | this.OnDetectCompatibleMsiPackage(args); | ||
1176 | |||
1177 | fCancel = args.Cancel; | ||
1178 | return args.HResult; | ||
1179 | } | ||
1180 | |||
1181 | int IBootstrapperApplication.OnDetectRelatedMsiPackage(string wzPackageId, string wzUpgradeCode, string wzProductCode, bool fPerMachine, long version, RelatedOperation operation, ref bool fCancel) | ||
1182 | { | ||
1183 | DetectRelatedMsiPackageEventArgs args = new DetectRelatedMsiPackageEventArgs(wzPackageId, wzUpgradeCode, wzProductCode, fPerMachine, version, operation, fCancel); | ||
1184 | this.OnDetectRelatedMsiPackage(args); | ||
1185 | |||
1186 | fCancel = args.Cancel; | ||
1187 | return args.HResult; | ||
1188 | } | ||
1189 | |||
1190 | int IBootstrapperApplication.OnDetectTargetMsiPackage(string wzPackageId, string wzProductCode, PackageState patchState, ref bool fCancel) | ||
1191 | { | ||
1192 | DetectTargetMsiPackageEventArgs args = new DetectTargetMsiPackageEventArgs(wzPackageId, wzProductCode, patchState, fCancel); | ||
1193 | this.OnDetectTargetMsiPackage(args); | ||
1194 | |||
1195 | fCancel = args.Cancel; | ||
1196 | return args.HResult; | ||
1197 | } | ||
1198 | |||
1199 | int IBootstrapperApplication.OnDetectMsiFeature(string wzPackageId, string wzFeatureId, FeatureState state, ref bool fCancel) | ||
1200 | { | ||
1201 | DetectMsiFeatureEventArgs args = new DetectMsiFeatureEventArgs(wzPackageId, wzFeatureId, state, fCancel); | ||
1202 | this.OnDetectMsiFeature(args); | ||
1203 | |||
1204 | fCancel = args.Cancel; | ||
1205 | return args.HResult; | ||
1206 | } | ||
1207 | |||
1208 | int IBootstrapperApplication.OnDetectPackageComplete(string wzPackageId, int hrStatus, PackageState state) | ||
1209 | { | ||
1210 | DetectPackageCompleteEventArgs args = new DetectPackageCompleteEventArgs(wzPackageId, hrStatus, state); | ||
1211 | this.OnDetectPackageComplete(args); | ||
1212 | |||
1213 | return args.HResult; | ||
1214 | } | ||
1215 | |||
1216 | int IBootstrapperApplication.OnDetectComplete(int hrStatus) | ||
1217 | { | ||
1218 | DetectCompleteEventArgs args = new DetectCompleteEventArgs(hrStatus); | ||
1219 | this.OnDetectComplete(args); | ||
1220 | |||
1221 | return args.HResult; | ||
1222 | } | ||
1223 | |||
1224 | int IBootstrapperApplication.OnPlanBegin(int cPackages, ref bool fCancel) | ||
1225 | { | ||
1226 | PlanBeginEventArgs args = new PlanBeginEventArgs(cPackages, fCancel); | ||
1227 | this.OnPlanBegin(args); | ||
1228 | |||
1229 | fCancel = args.Cancel; | ||
1230 | return args.HResult; | ||
1231 | } | ||
1232 | |||
1233 | int IBootstrapperApplication.OnPlanRelatedBundle(string wzBundleId, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) | ||
1234 | { | ||
1235 | PlanRelatedBundleEventArgs args = new PlanRelatedBundleEventArgs(wzBundleId, recommendedState, pRequestedState, fCancel); | ||
1236 | this.OnPlanRelatedBundle(args); | ||
1237 | |||
1238 | pRequestedState = args.State; | ||
1239 | fCancel = args.Cancel; | ||
1240 | return args.HResult; | ||
1241 | } | ||
1242 | |||
1243 | int IBootstrapperApplication.OnPlanPackageBegin(string wzPackageId, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) | ||
1244 | { | ||
1245 | PlanPackageBeginEventArgs args = new PlanPackageBeginEventArgs(wzPackageId, recommendedState, pRequestedState, fCancel); | ||
1246 | this.OnPlanPackageBegin(args); | ||
1247 | |||
1248 | pRequestedState = args.State; | ||
1249 | fCancel = args.Cancel; | ||
1250 | return args.HResult; | ||
1251 | } | ||
1252 | |||
1253 | int IBootstrapperApplication.OnPlanCompatibleMsiPackageBegin(string wzPackageId, string wzCompatiblePackageId, long dw64CompatiblePackageVersion, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) | ||
1254 | { | ||
1255 | PlanCompatibleMsiPackageBeginEventArgs args = new PlanCompatibleMsiPackageBeginEventArgs(wzPackageId, wzCompatiblePackageId, dw64CompatiblePackageVersion, recommendedState, pRequestedState, fCancel); | ||
1256 | this.OnPlanCompatibleMsiPackageBegin(args); | ||
1257 | |||
1258 | pRequestedState = args.State; | ||
1259 | fCancel = args.Cancel; | ||
1260 | return args.HResult; | ||
1261 | } | ||
1262 | |||
1263 | int IBootstrapperApplication.OnPlanCompatibleMsiPackageComplete(string wzPackageId, string wzCompatiblePackageId, int hrStatus, PackageState state, RequestState requested, ActionState execute, ActionState rollback) | ||
1264 | { | ||
1265 | PlanCompatibleMsiPackageCompleteEventArgs args = new PlanCompatibleMsiPackageCompleteEventArgs(wzPackageId, wzCompatiblePackageId, hrStatus, state, requested, execute, rollback); | ||
1266 | this.OnPlanCompatibleMsiPackageComplete(args); | ||
1267 | |||
1268 | return args.HResult; | ||
1269 | } | ||
1270 | |||
1271 | int IBootstrapperApplication.OnPlanTargetMsiPackage(string wzPackageId, string wzProductCode, RequestState recommendedState, ref RequestState pRequestedState, ref bool fCancel) | ||
1272 | { | ||
1273 | PlanTargetMsiPackageEventArgs args = new PlanTargetMsiPackageEventArgs(wzPackageId, wzProductCode, recommendedState, pRequestedState, fCancel); | ||
1274 | this.OnPlanTargetMsiPackage(args); | ||
1275 | |||
1276 | pRequestedState = args.State; | ||
1277 | fCancel = args.Cancel; | ||
1278 | return args.HResult; | ||
1279 | } | ||
1280 | |||
1281 | int IBootstrapperApplication.OnPlanMsiFeature(string wzPackageId, string wzFeatureId, FeatureState recommendedState, ref FeatureState pRequestedState, ref bool fCancel) | ||
1282 | { | ||
1283 | PlanMsiFeatureEventArgs args = new PlanMsiFeatureEventArgs(wzPackageId, wzFeatureId, recommendedState, pRequestedState, fCancel); | ||
1284 | this.OnPlanMsiFeature(args); | ||
1285 | |||
1286 | pRequestedState = args.State; | ||
1287 | fCancel = args.Cancel; | ||
1288 | return args.HResult; | ||
1289 | } | ||
1290 | |||
1291 | int IBootstrapperApplication.OnPlanPackageComplete(string wzPackageId, int hrStatus, PackageState state, RequestState requested, ActionState execute, ActionState rollback) | ||
1292 | { | ||
1293 | var args = new PlanPackageCompleteEventArgs(wzPackageId, hrStatus, state, requested, execute, rollback); | ||
1294 | this.OnPlanPackageComplete(args); | ||
1295 | |||
1296 | return args.HResult; | ||
1297 | } | ||
1298 | |||
1299 | int IBootstrapperApplication.OnPlanComplete(int hrStatus) | ||
1300 | { | ||
1301 | PlanCompleteEventArgs args = new PlanCompleteEventArgs(hrStatus); | ||
1302 | this.OnPlanComplete(args); | ||
1303 | |||
1304 | return args.HResult; | ||
1305 | } | ||
1306 | |||
1307 | int IBootstrapperApplication.OnApplyBegin(int dwPhaseCount, ref bool fCancel) | ||
1308 | { | ||
1309 | this.applying = true; | ||
1310 | |||
1311 | ApplyBeginEventArgs args = new ApplyBeginEventArgs(dwPhaseCount, fCancel); | ||
1312 | this.OnApplyBegin(args); | ||
1313 | |||
1314 | fCancel = args.Cancel; | ||
1315 | return args.HResult; | ||
1316 | } | ||
1317 | |||
1318 | int IBootstrapperApplication.OnElevateBegin(ref bool fCancel) | ||
1319 | { | ||
1320 | ElevateBeginEventArgs args = new ElevateBeginEventArgs(fCancel); | ||
1321 | this.OnElevateBegin(args); | ||
1322 | |||
1323 | fCancel = args.Cancel; | ||
1324 | return args.HResult; | ||
1325 | } | ||
1326 | |||
1327 | int IBootstrapperApplication.OnElevateComplete(int hrStatus) | ||
1328 | { | ||
1329 | ElevateCompleteEventArgs args = new ElevateCompleteEventArgs(hrStatus); | ||
1330 | this.OnElevateComplete(args); | ||
1331 | |||
1332 | return args.HResult; | ||
1333 | } | ||
1334 | |||
1335 | int IBootstrapperApplication.OnProgress(int dwProgressPercentage, int dwOverallPercentage, ref bool fCancel) | ||
1336 | { | ||
1337 | ProgressEventArgs args = new ProgressEventArgs(dwProgressPercentage, dwOverallPercentage, fCancel); | ||
1338 | this.OnProgress(args); | ||
1339 | |||
1340 | fCancel = args.Cancel; | ||
1341 | return args.HResult; | ||
1342 | } | ||
1343 | |||
1344 | int IBootstrapperApplication.OnError(ErrorType errorType, string wzPackageId, int dwCode, string wzError, int dwUIHint, int cData, string[] rgwzData, Result nRecommendation, ref Result pResult) | ||
1345 | { | ||
1346 | ErrorEventArgs args = new ErrorEventArgs(errorType, wzPackageId, dwCode, wzError, dwUIHint, rgwzData, nRecommendation, pResult); | ||
1347 | this.OnError(args); | ||
1348 | |||
1349 | pResult = args.Result; | ||
1350 | return args.HResult; | ||
1351 | } | ||
1352 | |||
1353 | int IBootstrapperApplication.OnRegisterBegin(ref bool fCancel) | ||
1354 | { | ||
1355 | RegisterBeginEventArgs args = new RegisterBeginEventArgs(fCancel); | ||
1356 | this.OnRegisterBegin(args); | ||
1357 | |||
1358 | fCancel = args.Cancel; | ||
1359 | return args.HResult; | ||
1360 | } | ||
1361 | |||
1362 | int IBootstrapperApplication.OnRegisterComplete(int hrStatus) | ||
1363 | { | ||
1364 | RegisterCompleteEventArgs args = new RegisterCompleteEventArgs(hrStatus); | ||
1365 | this.OnRegisterComplete(args); | ||
1366 | |||
1367 | return args.HResult; | ||
1368 | } | ||
1369 | |||
1370 | int IBootstrapperApplication.OnCacheBegin(ref bool fCancel) | ||
1371 | { | ||
1372 | CacheBeginEventArgs args = new CacheBeginEventArgs(fCancel); | ||
1373 | this.OnCacheBegin(args); | ||
1374 | |||
1375 | fCancel = args.Cancel; | ||
1376 | return args.HResult; | ||
1377 | } | ||
1378 | |||
1379 | int IBootstrapperApplication.OnCachePackageBegin(string wzPackageId, int cCachePayloads, long dw64PackageCacheSize, ref bool fCancel) | ||
1380 | { | ||
1381 | CachePackageBeginEventArgs args = new CachePackageBeginEventArgs(wzPackageId, cCachePayloads, dw64PackageCacheSize, fCancel); | ||
1382 | this.OnCachePackageBegin(args); | ||
1383 | |||
1384 | fCancel = args.Cancel; | ||
1385 | return args.HResult; | ||
1386 | } | ||
1387 | |||
1388 | int IBootstrapperApplication.OnCacheAcquireBegin(string wzPackageOrContainerId, string wzPayloadId, CacheOperation operation, string wzSource, ref bool fCancel) | ||
1389 | { | ||
1390 | CacheAcquireBeginEventArgs args = new CacheAcquireBeginEventArgs(wzPackageOrContainerId, wzPayloadId, operation, wzSource, fCancel); | ||
1391 | this.OnCacheAcquireBegin(args); | ||
1392 | |||
1393 | fCancel = args.Cancel; | ||
1394 | return args.HResult; | ||
1395 | } | ||
1396 | |||
1397 | int IBootstrapperApplication.OnCacheAcquireProgress(string wzPackageOrContainerId, string wzPayloadId, long dw64Progress, long dw64Total, int dwOverallPercentage, ref bool fCancel) | ||
1398 | { | ||
1399 | CacheAcquireProgressEventArgs args = new CacheAcquireProgressEventArgs(wzPackageOrContainerId, wzPayloadId, dw64Progress, dw64Total, dwOverallPercentage, fCancel); | ||
1400 | this.OnCacheAcquireProgress(args); | ||
1401 | |||
1402 | fCancel = args.Cancel; | ||
1403 | return args.HResult; | ||
1404 | } | ||
1405 | |||
1406 | int IBootstrapperApplication.OnResolveSource(string wzPackageOrContainerId, string wzPayloadId, string wzLocalSource, string wzDownloadSource, BOOTSTRAPPER_RESOLVESOURCE_ACTION recommendation, ref BOOTSTRAPPER_RESOLVESOURCE_ACTION action, ref bool fCancel) | ||
1407 | { | ||
1408 | ResolveSourceEventArgs args = new ResolveSourceEventArgs(wzPackageOrContainerId, wzPayloadId, wzLocalSource, wzDownloadSource, action, recommendation, fCancel); | ||
1409 | this.OnResolveSource(args); | ||
1410 | |||
1411 | action = args.Action; | ||
1412 | fCancel = args.Cancel; | ||
1413 | return args.HResult; | ||
1414 | } | ||
1415 | |||
1416 | int IBootstrapperApplication.OnCacheAcquireComplete(string wzPackageOrContainerId, string wzPayloadId, int hrStatus, BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION recommendation, ref BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION action) | ||
1417 | { | ||
1418 | CacheAcquireCompleteEventArgs args = new CacheAcquireCompleteEventArgs(wzPackageOrContainerId, wzPayloadId, hrStatus, recommendation, action); | ||
1419 | this.OnCacheAcquireComplete(args); | ||
1420 | |||
1421 | action = args.Action; | ||
1422 | return args.HResult; | ||
1423 | } | ||
1424 | |||
1425 | int IBootstrapperApplication.OnCacheVerifyBegin(string wzPackageId, string wzPayloadId, ref bool fCancel) | ||
1426 | { | ||
1427 | CacheVerifyBeginEventArgs args = new CacheVerifyBeginEventArgs(wzPackageId, wzPayloadId, fCancel); | ||
1428 | this.OnCacheVerifyBegin(args); | ||
1429 | |||
1430 | fCancel = args.Cancel; | ||
1431 | return args.HResult; | ||
1432 | } | ||
1433 | |||
1434 | int IBootstrapperApplication.OnCacheVerifyComplete(string wzPackageId, string wzPayloadId, int hrStatus, BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION recommendation, ref BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action) | ||
1435 | { | ||
1436 | CacheVerifyCompleteEventArgs args = new CacheVerifyCompleteEventArgs(wzPackageId, wzPayloadId, hrStatus, recommendation, action); | ||
1437 | this.OnCacheVerifyComplete(args); | ||
1438 | |||
1439 | action = args.Action; | ||
1440 | return args.HResult; | ||
1441 | } | ||
1442 | |||
1443 | int IBootstrapperApplication.OnCachePackageComplete(string wzPackageId, int hrStatus, BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION recommendation, ref BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION action) | ||
1444 | { | ||
1445 | CachePackageCompleteEventArgs args = new CachePackageCompleteEventArgs(wzPackageId, hrStatus, recommendation, action); | ||
1446 | this.OnCachePackageComplete(args); | ||
1447 | |||
1448 | action = args.Action; | ||
1449 | return args.HResult; | ||
1450 | } | ||
1451 | |||
1452 | int IBootstrapperApplication.OnCacheComplete(int hrStatus) | ||
1453 | { | ||
1454 | CacheCompleteEventArgs args = new CacheCompleteEventArgs(hrStatus); | ||
1455 | this.OnCacheComplete(args); | ||
1456 | |||
1457 | return args.HResult; | ||
1458 | } | ||
1459 | |||
1460 | int IBootstrapperApplication.OnExecuteBegin(int cExecutingPackages, ref bool fCancel) | ||
1461 | { | ||
1462 | ExecuteBeginEventArgs args = new ExecuteBeginEventArgs(cExecutingPackages, fCancel); | ||
1463 | this.OnExecuteBegin(args); | ||
1464 | |||
1465 | args.Cancel = fCancel; | ||
1466 | return args.HResult; | ||
1467 | } | ||
1468 | |||
1469 | int IBootstrapperApplication.OnExecutePackageBegin(string wzPackageId, bool fExecute, ref bool fCancel) | ||
1470 | { | ||
1471 | ExecutePackageBeginEventArgs args = new ExecutePackageBeginEventArgs(wzPackageId, fExecute, fCancel); | ||
1472 | this.OnExecutePackageBegin(args); | ||
1473 | |||
1474 | fCancel = args.Cancel; | ||
1475 | return args.HResult; | ||
1476 | } | ||
1477 | |||
1478 | int IBootstrapperApplication.OnExecutePatchTarget(string wzPackageId, string wzTargetProductCode, ref bool fCancel) | ||
1479 | { | ||
1480 | ExecutePatchTargetEventArgs args = new ExecutePatchTargetEventArgs(wzPackageId, wzTargetProductCode, fCancel); | ||
1481 | this.OnExecutePatchTarget(args); | ||
1482 | |||
1483 | fCancel = args.Cancel; | ||
1484 | return args.HResult; | ||
1485 | } | ||
1486 | |||
1487 | int IBootstrapperApplication.OnExecuteProgress(string wzPackageId, int dwProgressPercentage, int dwOverallPercentage, ref bool fCancel) | ||
1488 | { | ||
1489 | ExecuteProgressEventArgs args = new ExecuteProgressEventArgs(wzPackageId, dwProgressPercentage, dwOverallPercentage, fCancel); | ||
1490 | this.OnExecuteProgress(args); | ||
1491 | |||
1492 | fCancel = args.Cancel; | ||
1493 | return args.HResult; | ||
1494 | } | ||
1495 | |||
1496 | int IBootstrapperApplication.OnExecuteMsiMessage(string wzPackageId, InstallMessage messageType, int dwUIHint, string wzMessage, int cData, string[] rgwzData, Result nRecommendation, ref Result pResult) | ||
1497 | { | ||
1498 | ExecuteMsiMessageEventArgs args = new ExecuteMsiMessageEventArgs(wzPackageId, messageType, dwUIHint, wzMessage, rgwzData, nRecommendation, pResult); | ||
1499 | this.OnExecuteMsiMessage(args); | ||
1500 | |||
1501 | pResult = args.Result; | ||
1502 | return args.HResult; | ||
1503 | } | ||
1504 | |||
1505 | int IBootstrapperApplication.OnExecuteFilesInUse(string wzPackageId, int cFiles, string[] rgwzFiles, Result nRecommendation, ref Result pResult) | ||
1506 | { | ||
1507 | ExecuteFilesInUseEventArgs args = new ExecuteFilesInUseEventArgs(wzPackageId, rgwzFiles, nRecommendation, pResult); | ||
1508 | this.OnExecuteFilesInUse(args); | ||
1509 | |||
1510 | pResult = args.Result; | ||
1511 | return args.HResult; | ||
1512 | } | ||
1513 | |||
1514 | int IBootstrapperApplication.OnExecutePackageComplete(string wzPackageId, int hrStatus, ApplyRestart restart, BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION recommendation, ref BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION pAction) | ||
1515 | { | ||
1516 | ExecutePackageCompleteEventArgs args = new ExecutePackageCompleteEventArgs(wzPackageId, hrStatus, restart, recommendation, pAction); | ||
1517 | this.OnExecutePackageComplete(args); | ||
1518 | |||
1519 | pAction = args.Action; | ||
1520 | return args.HResult; | ||
1521 | } | ||
1522 | |||
1523 | int IBootstrapperApplication.OnExecuteComplete(int hrStatus) | ||
1524 | { | ||
1525 | ExecuteCompleteEventArgs args = new ExecuteCompleteEventArgs(hrStatus); | ||
1526 | this.OnExecuteComplete(args); | ||
1527 | |||
1528 | return args.HResult; | ||
1529 | } | ||
1530 | |||
1531 | int IBootstrapperApplication.OnUnregisterBegin(ref bool fCancel) | ||
1532 | { | ||
1533 | UnregisterBeginEventArgs args = new UnregisterBeginEventArgs(fCancel); | ||
1534 | this.OnUnregisterBegin(args); | ||
1535 | |||
1536 | fCancel = args.Cancel; | ||
1537 | return args.HResult; | ||
1538 | } | ||
1539 | |||
1540 | int IBootstrapperApplication.OnUnregisterComplete(int hrStatus) | ||
1541 | { | ||
1542 | UnregisterCompleteEventArgs args = new UnregisterCompleteEventArgs(hrStatus); | ||
1543 | this.OnUnregisterComplete(args); | ||
1544 | |||
1545 | return args.HResult; | ||
1546 | } | ||
1547 | |||
1548 | int IBootstrapperApplication.OnApplyComplete(int hrStatus, ApplyRestart restart, BOOTSTRAPPER_APPLYCOMPLETE_ACTION recommendation, ref BOOTSTRAPPER_APPLYCOMPLETE_ACTION pAction) | ||
1549 | { | ||
1550 | ApplyCompleteEventArgs args = new ApplyCompleteEventArgs(hrStatus, restart, recommendation, pAction); | ||
1551 | this.OnApplyComplete(args); | ||
1552 | |||
1553 | this.applying = false; | ||
1554 | |||
1555 | pAction = args.Action; | ||
1556 | return args.HResult; | ||
1557 | } | ||
1558 | |||
1559 | int IBootstrapperApplication.OnLaunchApprovedExeBegin(ref bool fCancel) | ||
1560 | { | ||
1561 | LaunchApprovedExeBeginArgs args = new LaunchApprovedExeBeginArgs(fCancel); | ||
1562 | this.OnLaunchApprovedExeBegin(args); | ||
1563 | |||
1564 | fCancel = args.Cancel; | ||
1565 | return args.HResult; | ||
1566 | } | ||
1567 | |||
1568 | int IBootstrapperApplication.OnLaunchApprovedExeComplete(int hrStatus, int processId) | ||
1569 | { | ||
1570 | LaunchApprovedExeCompleteArgs args = new LaunchApprovedExeCompleteArgs(hrStatus, processId); | ||
1571 | this.OnLaunchApprovedExeComplete(args); | ||
1572 | |||
1573 | return args.HResult; | ||
1574 | } | ||
1575 | |||
1576 | int IBootstrapperApplication.BAProc(BOOTSTRAPPER_APPLICATION_MESSAGE message, IntPtr pvArgs, IntPtr pvResults, IntPtr pvContext) | ||
1577 | { | ||
1578 | switch (message) | ||
1579 | { | ||
1580 | default: | ||
1581 | return NativeMethods.E_NOTIMPL; | ||
1582 | } | ||
1583 | } | ||
1584 | |||
1585 | void IBootstrapperApplication.BAProcFallback(BOOTSTRAPPER_APPLICATION_MESSAGE message, IntPtr pvArgs, IntPtr pvResults, ref int phr, IntPtr pvContext) | ||
1586 | { | ||
1587 | } | ||
1588 | |||
1589 | #endregion | ||
1590 | } | ||
1591 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperApplicationData.cs b/src/WixToolset.Mba.Core/BootstrapperApplicationData.cs new file mode 100644 index 00000000..a17f1a05 --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperApplicationData.cs | |||
@@ -0,0 +1,63 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.IO; | ||
7 | using System.Xml.XPath; | ||
8 | |||
9 | public class BootstrapperApplicationData : IBootstrapperApplicationData | ||
10 | { | ||
11 | public const string DefaultFileName = "BootstrapperApplicationData.xml"; | ||
12 | public const string XMLNamespace = "http://wixtoolset.org/schemas/v4/2010/BootstrapperApplicationData"; | ||
13 | |||
14 | public static readonly DirectoryInfo DefaultFolder; | ||
15 | public static readonly FileInfo DefaultFile; | ||
16 | |||
17 | static BootstrapperApplicationData() | ||
18 | { | ||
19 | DefaultFolder = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); | ||
20 | DefaultFile = new FileInfo(Path.Combine(DefaultFolder.FullName, DefaultFileName)); | ||
21 | } | ||
22 | |||
23 | public FileInfo BADataFile { get; private set; } | ||
24 | |||
25 | public IBundleInfo Bundle { get; private set; } | ||
26 | |||
27 | public BootstrapperApplicationData() : this(DefaultFile) { } | ||
28 | |||
29 | public BootstrapperApplicationData(FileInfo baDataFile) | ||
30 | { | ||
31 | this.BADataFile = baDataFile; | ||
32 | |||
33 | using (FileStream fs = this.BADataFile.OpenRead()) | ||
34 | { | ||
35 | this.Bundle = BundleInfo.ParseBundleFromStream(fs); | ||
36 | } | ||
37 | } | ||
38 | |||
39 | public static string GetAttribute(XPathNavigator node, string attributeName) | ||
40 | { | ||
41 | XPathNavigator attribute = node.SelectSingleNode("@" + attributeName); | ||
42 | |||
43 | if (attribute == null) | ||
44 | { | ||
45 | return null; | ||
46 | } | ||
47 | |||
48 | return attribute.Value; | ||
49 | } | ||
50 | |||
51 | public static bool? GetYesNoAttribute(XPathNavigator node, string attributeName) | ||
52 | { | ||
53 | string attributeValue = GetAttribute(node, attributeName); | ||
54 | |||
55 | if (attributeValue == null) | ||
56 | { | ||
57 | return null; | ||
58 | } | ||
59 | |||
60 | return attributeValue.Equals("yes", StringComparison.InvariantCulture); | ||
61 | } | ||
62 | } | ||
63 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperApplicationFactory.cs b/src/WixToolset.Mba.Core/BootstrapperApplicationFactory.cs new file mode 100644 index 00000000..28430bb8 --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperApplicationFactory.cs | |||
@@ -0,0 +1,86 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Configuration; | ||
7 | using System.Reflection; | ||
8 | using System.Runtime.InteropServices; | ||
9 | |||
10 | /// <summary> | ||
11 | /// Entry point for the MBA host to create and return the IBootstrapperApplication implementation to the engine. | ||
12 | /// </summary> | ||
13 | [ClassInterface(ClassInterfaceType.None)] | ||
14 | public sealed class BootstrapperApplicationFactory : MarshalByRefObject, IBootstrapperApplicationFactory | ||
15 | { | ||
16 | /// <summary> | ||
17 | /// Creates a new instance of the <see cref="BootstrapperApplicationFactory"/> class. | ||
18 | /// </summary> | ||
19 | public BootstrapperApplicationFactory() | ||
20 | { | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Loads the bootstrapper application assembly and creates an instance of the IBootstrapperApplication. | ||
25 | /// </summary> | ||
26 | /// <param name="pEngine">IBootstrapperEngine provided for the bootstrapper application.</param> | ||
27 | /// <param name="command">Command line for the bootstrapper application.</param> | ||
28 | /// <returns>Bootstrapper application via <see cref="IBootstrapperApplication"/> interface.</returns> | ||
29 | /// <exception cref="MissingAttributeException">The bootstrapper application assembly | ||
30 | /// does not define the <see cref="BootstrapperApplicationFactoryAttribute"/>.</exception> | ||
31 | public IBootstrapperApplication Create(IBootstrapperEngine pEngine, ref Command command) | ||
32 | { | ||
33 | // Get the wix.boostrapper section group to get the name of the bootstrapper application assembly to host. | ||
34 | var section = ConfigurationManager.GetSection("wix.bootstrapper/host") as HostSection; | ||
35 | if (null == section) | ||
36 | { | ||
37 | throw new MissingAttributeException(); // TODO: throw a more specific exception than this. | ||
38 | } | ||
39 | |||
40 | // Load the BA's IBootstrapperApplicationFactory. | ||
41 | var baFactoryType = BootstrapperApplicationFactory.GetBAFactoryTypeFromAssembly(section.AssemblyName); | ||
42 | var baFactory = (IBootstrapperApplicationFactory)Activator.CreateInstance(baFactoryType); | ||
43 | if (null == baFactory) | ||
44 | { | ||
45 | throw new InvalidBootstrapperApplicationFactoryException(); | ||
46 | } | ||
47 | |||
48 | var ba = baFactory.Create(pEngine, ref command); | ||
49 | return ba; | ||
50 | } | ||
51 | |||
52 | /// <summary> | ||
53 | /// Locates the <see cref="BootstrapperApplicationFactoryAttribute"/> and returns the specified type. | ||
54 | /// </summary> | ||
55 | /// <param name="assemblyName">The assembly that defines the IBootstrapperApplicationFactory implementation.</param> | ||
56 | /// <returns>The bootstrapper application factory <see cref="Type"/>.</returns> | ||
57 | private static Type GetBAFactoryTypeFromAssembly(string assemblyName) | ||
58 | { | ||
59 | Type baFactoryType = null; | ||
60 | |||
61 | // Load the requested assembly. | ||
62 | Assembly asm = AppDomain.CurrentDomain.Load(assemblyName); | ||
63 | |||
64 | // If an assembly was loaded and is not the current assembly, check for the required attribute. | ||
65 | // This is done to avoid using the BootstrapperApplicationFactoryAttribute which we use at build time | ||
66 | // to specify the BootstrapperApplicationFactory assembly in the manifest. | ||
67 | if (!Assembly.GetExecutingAssembly().Equals(asm)) | ||
68 | { | ||
69 | // There must be one and only one BootstrapperApplicationFactoryAttribute. | ||
70 | // The attribute prevents multiple declarations already. | ||
71 | var attrs = (BootstrapperApplicationFactoryAttribute[])asm.GetCustomAttributes(typeof(BootstrapperApplicationFactoryAttribute), false); | ||
72 | if (null != attrs) | ||
73 | { | ||
74 | baFactoryType = attrs[0].BootstrapperApplicationFactoryType; | ||
75 | } | ||
76 | } | ||
77 | |||
78 | if (null == baFactoryType) | ||
79 | { | ||
80 | throw new MissingAttributeException(); | ||
81 | } | ||
82 | |||
83 | return baFactoryType; | ||
84 | } | ||
85 | } | ||
86 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperApplicationFactoryAttribute.cs b/src/WixToolset.Mba.Core/BootstrapperApplicationFactoryAttribute.cs new file mode 100644 index 00000000..781d4ea1 --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperApplicationFactoryAttribute.cs | |||
@@ -0,0 +1,35 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | /// <summary> | ||
8 | /// Identifies the bootstrapper application factory class. | ||
9 | /// </summary> | ||
10 | /// <remarks> | ||
11 | /// This required assembly attribute identifies the bootstrapper application factory class. | ||
12 | /// </remarks> | ||
13 | [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] | ||
14 | public sealed class BootstrapperApplicationFactoryAttribute : Attribute | ||
15 | { | ||
16 | private Type bootstrapperApplicationFactoryType; | ||
17 | |||
18 | /// <summary> | ||
19 | /// Creates a new instance of the <see cref="BootstrapperApplicationFactoryAttribute"/> class. | ||
20 | /// </summary> | ||
21 | /// <param name="bootstrapperApplicationFactoryType">The <see cref="Type"/> of the BA factory.</param> | ||
22 | public BootstrapperApplicationFactoryAttribute(Type bootstrapperApplicationFactoryType) | ||
23 | { | ||
24 | this.bootstrapperApplicationFactoryType = bootstrapperApplicationFactoryType; | ||
25 | } | ||
26 | |||
27 | /// <summary> | ||
28 | /// Gets the type of the bootstrapper application factory class to create. | ||
29 | /// </summary> | ||
30 | public Type BootstrapperApplicationFactoryType | ||
31 | { | ||
32 | get { return this.bootstrapperApplicationFactoryType; } | ||
33 | } | ||
34 | } | ||
35 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperCommand.cs b/src/WixToolset.Mba.Core/BootstrapperCommand.cs new file mode 100644 index 00000000..bbd10e1d --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperCommand.cs | |||
@@ -0,0 +1,107 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.ComponentModel; | ||
7 | using System.Runtime.InteropServices; | ||
8 | |||
9 | public sealed class BootstrapperCommand : IBootstrapperCommand | ||
10 | { | ||
11 | private readonly string commandLine; | ||
12 | |||
13 | public BootstrapperCommand( | ||
14 | LaunchAction action, | ||
15 | Display display, | ||
16 | Restart restart, | ||
17 | string commandLine, | ||
18 | int cmdShow, | ||
19 | ResumeType resume, | ||
20 | IntPtr splashScreen, | ||
21 | RelationType relation, | ||
22 | bool passthrough, | ||
23 | string layoutDirectory) | ||
24 | { | ||
25 | this.Action = action; | ||
26 | this.Display = display; | ||
27 | this.Restart = restart; | ||
28 | this.commandLine = commandLine; | ||
29 | this.CmdShow = cmdShow; | ||
30 | this.Resume = resume; | ||
31 | this.SplashScreen = splashScreen; | ||
32 | this.Relation = relation; | ||
33 | this.Passthrough = passthrough; | ||
34 | this.LayoutDirectory = layoutDirectory; | ||
35 | } | ||
36 | |||
37 | public LaunchAction Action { get; } | ||
38 | |||
39 | public Display Display { get; } | ||
40 | |||
41 | public Restart Restart { get; } | ||
42 | |||
43 | public string[] CommandLineArgs => GetCommandLineArgs(this.commandLine); | ||
44 | |||
45 | public int CmdShow { get; } | ||
46 | |||
47 | public ResumeType Resume { get; } | ||
48 | |||
49 | public IntPtr SplashScreen { get; } | ||
50 | |||
51 | public RelationType Relation { get; } | ||
52 | |||
53 | public bool Passthrough { get; } | ||
54 | |||
55 | public string LayoutDirectory { get; } | ||
56 | |||
57 | /// <summary> | ||
58 | /// Gets the command line arguments as a string array. | ||
59 | /// </summary> | ||
60 | /// <returns> | ||
61 | /// Array of command line arguments. | ||
62 | /// </returns> | ||
63 | /// <exception type="Win32Exception">The command line could not be parsed into an array.</exception> | ||
64 | /// <remarks> | ||
65 | /// This method uses the same parsing as the operating system which handles quotes and spaces correctly. | ||
66 | /// </remarks> | ||
67 | public static string[] GetCommandLineArgs(string commandLine) | ||
68 | { | ||
69 | if (null == commandLine) | ||
70 | { | ||
71 | return new string[0]; | ||
72 | } | ||
73 | |||
74 | // Parse the filtered command line arguments into a native array. | ||
75 | int argc = 0; | ||
76 | |||
77 | // CommandLineToArgvW tries to treat the first argument as the path to the process, | ||
78 | // which fails pretty miserably if your first argument is something like | ||
79 | // FOO="C:\Program Files\My Company". So give it something harmless to play with. | ||
80 | IntPtr argv = NativeMethods.CommandLineToArgvW("ignored " + commandLine, out argc); | ||
81 | |||
82 | if (IntPtr.Zero == argv) | ||
83 | { | ||
84 | // Throw an exception with the last error. | ||
85 | throw new Win32Exception(); | ||
86 | } | ||
87 | |||
88 | // Marshal each native array pointer to a managed string. | ||
89 | try | ||
90 | { | ||
91 | // Skip "ignored" argument/hack. | ||
92 | string[] args = new string[argc - 1]; | ||
93 | for (int i = 1; i < argc; ++i) | ||
94 | { | ||
95 | IntPtr argvi = Marshal.ReadIntPtr(argv, i * IntPtr.Size); | ||
96 | args[i - 1] = Marshal.PtrToStringUni(argvi); | ||
97 | } | ||
98 | |||
99 | return args; | ||
100 | } | ||
101 | finally | ||
102 | { | ||
103 | NativeMethods.LocalFree(argv); | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | } | ||
diff --git a/src/WixToolset.Mba.Core/BootstrapperSectionGroup.cs b/src/WixToolset.Mba.Core/BootstrapperSectionGroup.cs new file mode 100644 index 00000000..7721c027 --- /dev/null +++ b/src/WixToolset.Mba.Core/BootstrapperSectionGroup.cs | |||
@@ -0,0 +1,29 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Configuration; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Handler for the wix.bootstrapper configuration section group. | ||
10 | /// </summary> | ||
11 | public class BootstrapperSectionGroup : ConfigurationSectionGroup | ||
12 | { | ||
13 | /// <summary> | ||
14 | /// Creates a new instance of the <see cref="BootstrapperSectionGroup"/> class. | ||
15 | /// </summary> | ||
16 | public BootstrapperSectionGroup() | ||
17 | { | ||
18 | } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Gets the <see cref="HostSection"/> handler for the mba configuration section. | ||
22 | /// </summary> | ||
23 | [ConfigurationProperty("host")] | ||
24 | public HostSection Host | ||
25 | { | ||
26 | get { return (HostSection)base.Sections["host"]; } | ||
27 | } | ||
28 | } | ||
29 | } | ||
diff --git a/src/WixToolset.Mba.Core/BundleInfo.cs b/src/WixToolset.Mba.Core/BundleInfo.cs new file mode 100644 index 00000000..51c2d268 --- /dev/null +++ b/src/WixToolset.Mba.Core/BundleInfo.cs | |||
@@ -0,0 +1,67 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.IO; | ||
8 | using System.Xml; | ||
9 | using System.Xml.XPath; | ||
10 | |||
11 | public class BundleInfo : IBundleInfo | ||
12 | { | ||
13 | public bool PerMachine { get; internal set; } | ||
14 | public string Name { get; internal set; } | ||
15 | public string LogVariable { get; internal set; } | ||
16 | public IDictionary<string, IPackageInfo> Packages { get; internal set; } | ||
17 | |||
18 | internal BundleInfo() | ||
19 | { | ||
20 | this.Packages = new Dictionary<string, IPackageInfo>(); | ||
21 | } | ||
22 | |||
23 | public void AddRelatedBundleAsPackage(DetectRelatedBundleEventArgs e) | ||
24 | { | ||
25 | var package = PackageInfo.GetRelatedBundleAsPackage(e.ProductCode, e.RelationType, e.PerMachine, e.Version); | ||
26 | this.Packages.Add(package.Id, package); | ||
27 | } | ||
28 | |||
29 | public static IBundleInfo ParseBundleFromStream(Stream stream) | ||
30 | { | ||
31 | XPathDocument manifest = new XPathDocument(stream); | ||
32 | XPathNavigator root = manifest.CreateNavigator(); | ||
33 | return ParseBundleFromXml(root); | ||
34 | } | ||
35 | |||
36 | public static IBundleInfo ParseBundleFromXml(XPathNavigator root) | ||
37 | { | ||
38 | BundleInfo bundle = new BundleInfo(); | ||
39 | |||
40 | XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable); | ||
41 | namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace); | ||
42 | XPathNavigator bundleNode = root.SelectSingleNode("/p:BootstrapperApplicationData/p:WixBundleProperties", namespaceManager); | ||
43 | |||
44 | if (bundleNode == null) | ||
45 | { | ||
46 | throw new Exception("Failed to select bundle information."); | ||
47 | } | ||
48 | |||
49 | bool? perMachine = BootstrapperApplicationData.GetYesNoAttribute(bundleNode, "PerMachine"); | ||
50 | if (perMachine.HasValue) | ||
51 | { | ||
52 | bundle.PerMachine = perMachine.Value; | ||
53 | } | ||
54 | |||
55 | bundle.Name = BootstrapperApplicationData.GetAttribute(bundleNode, "DisplayName"); | ||
56 | |||
57 | bundle.LogVariable = BootstrapperApplicationData.GetAttribute(bundleNode, "LogPathVariable"); | ||
58 | |||
59 | foreach (var package in PackageInfo.ParsePackagesFromXml(root)) | ||
60 | { | ||
61 | bundle.Packages.Add(package.Id, package); | ||
62 | } | ||
63 | |||
64 | return bundle; | ||
65 | } | ||
66 | } | ||
67 | } | ||
diff --git a/src/WixToolset.Mba.Core/Engine.cs b/src/WixToolset.Mba.Core/Engine.cs new file mode 100644 index 00000000..ad62134f --- /dev/null +++ b/src/WixToolset.Mba.Core/Engine.cs | |||
@@ -0,0 +1,516 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.ComponentModel; | ||
7 | using System.Runtime.InteropServices; | ||
8 | using System.Security; | ||
9 | using System.Text; | ||
10 | |||
11 | /// <summary> | ||
12 | /// Container class for the <see cref="IBootstrapperEngine"/> interface. | ||
13 | /// </summary> | ||
14 | public sealed class Engine : IEngine | ||
15 | { | ||
16 | // Burn errs on empty strings, so declare initial buffer size. | ||
17 | private const int InitialBufferSize = 80; | ||
18 | private static readonly string normalizeVersionFormatString = "{0} must be less than or equal to " + UInt16.MaxValue; | ||
19 | |||
20 | private IBootstrapperEngine engine; | ||
21 | private Variables<long> numericVariables; | ||
22 | private Variables<SecureString> secureStringVariables; | ||
23 | private Variables<string> stringVariables; | ||
24 | private Variables<Version> versionVariables; | ||
25 | |||
26 | /// <summary> | ||
27 | /// Creates a new instance of the <see cref="Engine"/> container class. | ||
28 | /// </summary> | ||
29 | /// <param name="engine">The <see cref="IBootstrapperEngine"/> to contain.</param> | ||
30 | internal Engine(IBootstrapperEngine engine) | ||
31 | { | ||
32 | this.engine = engine; | ||
33 | |||
34 | // Wrap the calls to get and set numeric variables. | ||
35 | this.numericVariables = new Variables<long>( | ||
36 | delegate(string name) | ||
37 | { | ||
38 | long value; | ||
39 | int ret = this.engine.GetVariableNumeric(name, out value); | ||
40 | if (NativeMethods.S_OK != ret) | ||
41 | { | ||
42 | throw new Win32Exception(ret); | ||
43 | } | ||
44 | |||
45 | return value; | ||
46 | }, | ||
47 | delegate(string name, long value) | ||
48 | { | ||
49 | this.engine.SetVariableNumeric(name, value); | ||
50 | }, | ||
51 | delegate(string name) | ||
52 | { | ||
53 | long value; | ||
54 | int ret = this.engine.GetVariableNumeric(name, out value); | ||
55 | |||
56 | return NativeMethods.E_NOTFOUND != ret; | ||
57 | } | ||
58 | ); | ||
59 | |||
60 | // Wrap the calls to get and set string variables using SecureStrings. | ||
61 | this.secureStringVariables = new Variables<SecureString>( | ||
62 | delegate(string name) | ||
63 | { | ||
64 | var pUniString = this.getStringVariable(name, out var length); | ||
65 | try | ||
66 | { | ||
67 | return this.convertToSecureString(pUniString, length); | ||
68 | } | ||
69 | finally | ||
70 | { | ||
71 | if (IntPtr.Zero != pUniString) | ||
72 | { | ||
73 | Marshal.FreeCoTaskMem(pUniString); | ||
74 | } | ||
75 | } | ||
76 | }, | ||
77 | delegate(string name, SecureString value) | ||
78 | { | ||
79 | IntPtr pValue = Marshal.SecureStringToCoTaskMemUnicode(value); | ||
80 | try | ||
81 | { | ||
82 | this.engine.SetVariableString(name, pValue); | ||
83 | } | ||
84 | finally | ||
85 | { | ||
86 | Marshal.FreeCoTaskMem(pValue); | ||
87 | } | ||
88 | }, | ||
89 | delegate(string name) | ||
90 | { | ||
91 | return this.containsVariable(name); | ||
92 | } | ||
93 | ); | ||
94 | |||
95 | // Wrap the calls to get and set string variables. | ||
96 | this.stringVariables = new Variables<string>( | ||
97 | delegate(string name) | ||
98 | { | ||
99 | int length; | ||
100 | IntPtr pUniString = this.getStringVariable(name, out length); | ||
101 | try | ||
102 | { | ||
103 | return Marshal.PtrToStringUni(pUniString, length); | ||
104 | } | ||
105 | finally | ||
106 | { | ||
107 | if (IntPtr.Zero != pUniString) | ||
108 | { | ||
109 | Marshal.FreeCoTaskMem(pUniString); | ||
110 | } | ||
111 | } | ||
112 | }, | ||
113 | delegate(string name, string value) | ||
114 | { | ||
115 | IntPtr pValue = Marshal.StringToCoTaskMemUni(value); | ||
116 | try | ||
117 | { | ||
118 | this.engine.SetVariableString(name, pValue); | ||
119 | } | ||
120 | finally | ||
121 | { | ||
122 | Marshal.FreeCoTaskMem(pValue); | ||
123 | } | ||
124 | }, | ||
125 | delegate(string name) | ||
126 | { | ||
127 | return this.containsVariable(name); | ||
128 | } | ||
129 | ); | ||
130 | |||
131 | // Wrap the calls to get and set version variables. | ||
132 | this.versionVariables = new Variables<Version>( | ||
133 | delegate(string name) | ||
134 | { | ||
135 | long value; | ||
136 | int ret = this.engine.GetVariableVersion(name, out value); | ||
137 | if (NativeMethods.S_OK != ret) | ||
138 | { | ||
139 | throw new Win32Exception(ret); | ||
140 | } | ||
141 | |||
142 | return LongToVersion(value); | ||
143 | }, | ||
144 | delegate(string name, Version value) | ||
145 | { | ||
146 | long version = VersionToLong(value); | ||
147 | this.engine.SetVariableVersion(name, version); | ||
148 | }, | ||
149 | delegate(string name) | ||
150 | { | ||
151 | long value; | ||
152 | int ret = this.engine.GetVariableVersion(name, out value); | ||
153 | |||
154 | return NativeMethods.E_NOTFOUND != ret; | ||
155 | } | ||
156 | ); | ||
157 | } | ||
158 | |||
159 | public IVariables<long> NumericVariables | ||
160 | { | ||
161 | get { return this.numericVariables; } | ||
162 | } | ||
163 | |||
164 | public int PackageCount | ||
165 | { | ||
166 | get | ||
167 | { | ||
168 | int count; | ||
169 | this.engine.GetPackageCount(out count); | ||
170 | |||
171 | return count; | ||
172 | } | ||
173 | } | ||
174 | |||
175 | public IVariables<SecureString> SecureStringVariables | ||
176 | { | ||
177 | get { return this.secureStringVariables; } | ||
178 | } | ||
179 | |||
180 | public IVariables<string> StringVariables | ||
181 | { | ||
182 | get { return this.stringVariables; } | ||
183 | } | ||
184 | |||
185 | public IVariables<Version> VersionVariables | ||
186 | { | ||
187 | get { return this.versionVariables; } | ||
188 | } | ||
189 | |||
190 | public void Apply(IntPtr hwndParent) | ||
191 | { | ||
192 | this.engine.Apply(hwndParent); | ||
193 | } | ||
194 | |||
195 | public void CloseSplashScreen() | ||
196 | { | ||
197 | this.engine.CloseSplashScreen(); | ||
198 | } | ||
199 | |||
200 | public void Detect() | ||
201 | { | ||
202 | this.Detect(IntPtr.Zero); | ||
203 | } | ||
204 | |||
205 | public void Detect(IntPtr hwndParent) | ||
206 | { | ||
207 | this.engine.Detect(hwndParent); | ||
208 | } | ||
209 | |||
210 | public bool Elevate(IntPtr hwndParent) | ||
211 | { | ||
212 | int ret = this.engine.Elevate(hwndParent); | ||
213 | |||
214 | if (NativeMethods.S_OK == ret || NativeMethods.E_ALREADYINITIALIZED == ret) | ||
215 | { | ||
216 | return true; | ||
217 | } | ||
218 | else if (NativeMethods.E_CANCELLED == ret) | ||
219 | { | ||
220 | return false; | ||
221 | } | ||
222 | else | ||
223 | { | ||
224 | throw new Win32Exception(ret); | ||
225 | } | ||
226 | } | ||
227 | |||
228 | public string EscapeString(string input) | ||
229 | { | ||
230 | int capacity = InitialBufferSize; | ||
231 | StringBuilder sb = new StringBuilder(capacity); | ||
232 | |||
233 | // Get the size of the buffer. | ||
234 | int ret = this.engine.EscapeString(input, sb, ref capacity); | ||
235 | if (NativeMethods.E_INSUFFICIENT_BUFFER == ret || NativeMethods.E_MOREDATA == ret) | ||
236 | { | ||
237 | sb.Capacity = ++capacity; // Add one for the null terminator. | ||
238 | ret = this.engine.EscapeString(input, sb, ref capacity); | ||
239 | } | ||
240 | |||
241 | if (NativeMethods.S_OK != ret) | ||
242 | { | ||
243 | throw new Win32Exception(ret); | ||
244 | } | ||
245 | |||
246 | return sb.ToString(); | ||
247 | } | ||
248 | |||
249 | public bool EvaluateCondition(string condition) | ||
250 | { | ||
251 | bool value; | ||
252 | this.engine.EvaluateCondition(condition, out value); | ||
253 | |||
254 | return value; | ||
255 | } | ||
256 | |||
257 | public string FormatString(string format) | ||
258 | { | ||
259 | int capacity = InitialBufferSize; | ||
260 | StringBuilder sb = new StringBuilder(capacity); | ||
261 | |||
262 | // Get the size of the buffer. | ||
263 | int ret = this.engine.FormatString(format, sb, ref capacity); | ||
264 | if (NativeMethods.E_INSUFFICIENT_BUFFER == ret || NativeMethods.E_MOREDATA == ret) | ||
265 | { | ||
266 | sb.Capacity = ++capacity; // Add one for the null terminator. | ||
267 | ret = this.engine.FormatString(format, sb, ref capacity); | ||
268 | } | ||
269 | |||
270 | if (NativeMethods.S_OK != ret) | ||
271 | { | ||
272 | throw new Win32Exception(ret); | ||
273 | } | ||
274 | |||
275 | return sb.ToString(); | ||
276 | } | ||
277 | |||
278 | public void LaunchApprovedExe(IntPtr hwndParent, string approvedExeForElevationId, string arguments) | ||
279 | { | ||
280 | this.LaunchApprovedExe(hwndParent, approvedExeForElevationId, arguments, 0); | ||
281 | } | ||
282 | |||
283 | public void LaunchApprovedExe(IntPtr hwndParent, string approvedExeForElevationId, string arguments, int waitForInputIdleTimeout) | ||
284 | { | ||
285 | this.engine.LaunchApprovedExe(hwndParent, approvedExeForElevationId, arguments, waitForInputIdleTimeout); | ||
286 | } | ||
287 | |||
288 | public void Log(LogLevel level, string message) | ||
289 | { | ||
290 | this.engine.Log(level, message); | ||
291 | } | ||
292 | |||
293 | public void Plan(LaunchAction action) | ||
294 | { | ||
295 | this.engine.Plan(action); | ||
296 | } | ||
297 | |||
298 | public void SetUpdate(string localSource, string downloadSource, long size, UpdateHashType hashType, byte[] hash) | ||
299 | { | ||
300 | this.engine.SetUpdate(localSource, downloadSource, size, hashType, hash, null == hash ? 0 : hash.Length); | ||
301 | } | ||
302 | |||
303 | public void SetLocalSource(string packageOrContainerId, string payloadId, string path) | ||
304 | { | ||
305 | this.engine.SetLocalSource(packageOrContainerId, payloadId, path); | ||
306 | } | ||
307 | |||
308 | public void SetDownloadSource(string packageOrContainerId, string payloadId, string url, string user, string password) | ||
309 | { | ||
310 | this.engine.SetDownloadSource(packageOrContainerId, payloadId, url, user, password); | ||
311 | } | ||
312 | |||
313 | public int SendEmbeddedError(int errorCode, string message, int uiHint) | ||
314 | { | ||
315 | int result = 0; | ||
316 | this.engine.SendEmbeddedError(errorCode, message, uiHint, out result); | ||
317 | return result; | ||
318 | } | ||
319 | |||
320 | public int SendEmbeddedProgress(int progressPercentage, int overallPercentage) | ||
321 | { | ||
322 | int result = 0; | ||
323 | this.engine.SendEmbeddedProgress(progressPercentage, overallPercentage, out result); | ||
324 | return result; | ||
325 | } | ||
326 | |||
327 | public void Quit(int exitCode) | ||
328 | { | ||
329 | this.engine.Quit(exitCode); | ||
330 | } | ||
331 | |||
332 | internal sealed class Variables<T> : IVariables<T> | ||
333 | { | ||
334 | // .NET 2.0 does not support Func<T, TResult> or Action<T1, T2>. | ||
335 | internal delegate T Getter<T>(string name); | ||
336 | internal delegate void Setter<T>(string name, T value); | ||
337 | |||
338 | private Getter<T> getter; | ||
339 | private Setter<T> setter; | ||
340 | private Predicate<string> contains; | ||
341 | |||
342 | internal Variables(Getter<T> getter, Setter<T> setter, Predicate<string> contains) | ||
343 | { | ||
344 | this.getter = getter; | ||
345 | this.setter = setter; | ||
346 | this.contains = contains; | ||
347 | } | ||
348 | |||
349 | public T this[string name] | ||
350 | { | ||
351 | get { return this.getter(name); } | ||
352 | set { this.setter(name, value); } | ||
353 | } | ||
354 | |||
355 | public bool Contains(string name) | ||
356 | { | ||
357 | return this.contains(name); | ||
358 | } | ||
359 | } | ||
360 | |||
361 | /// <summary> | ||
362 | /// Gets whether the variable given by <paramref name="name"/> exists. | ||
363 | /// </summary> | ||
364 | /// <param name="name">The name of the variable to check.</param> | ||
365 | /// <returns>True if the variable given by <paramref name="name"/> exists; otherwise, false.</returns> | ||
366 | internal bool containsVariable(string name) | ||
367 | { | ||
368 | int capacity = 0; | ||
369 | IntPtr pValue = IntPtr.Zero; | ||
370 | int ret = this.engine.GetVariableString(name, pValue, ref capacity); | ||
371 | |||
372 | return NativeMethods.E_NOTFOUND != ret; | ||
373 | } | ||
374 | |||
375 | /// <summary> | ||
376 | /// Gets the variable given by <paramref name="name"/> as a string. | ||
377 | /// </summary> | ||
378 | /// <param name="name">The name of the variable to get.</param> | ||
379 | /// <param name="length">The length of the Unicode string.</param> | ||
380 | /// <returns>The value by a pointer to a Unicode string. Must be freed by Marshal.FreeCoTaskMem.</returns> | ||
381 | /// <exception cref="Exception">An error occurred getting the variable.</exception> | ||
382 | internal IntPtr getStringVariable(string name, out int length) | ||
383 | { | ||
384 | int capacity = InitialBufferSize; | ||
385 | bool success = false; | ||
386 | IntPtr pValue = Marshal.AllocCoTaskMem(capacity * UnicodeEncoding.CharSize); | ||
387 | try | ||
388 | { | ||
389 | // Get the size of the buffer. | ||
390 | int ret = this.engine.GetVariableString(name, pValue, ref capacity); | ||
391 | if (NativeMethods.E_INSUFFICIENT_BUFFER == ret || NativeMethods.E_MOREDATA == ret) | ||
392 | { | ||
393 | // Don't need to add 1 for the null terminator, the engine already includes that. | ||
394 | pValue = Marshal.ReAllocCoTaskMem(pValue, capacity * UnicodeEncoding.CharSize); | ||
395 | ret = this.engine.GetVariableString(name, pValue, ref capacity); | ||
396 | } | ||
397 | |||
398 | if (NativeMethods.S_OK != ret) | ||
399 | { | ||
400 | throw Marshal.GetExceptionForHR(ret); | ||
401 | } | ||
402 | |||
403 | // The engine only returns the exact length of the string if the buffer was too small, so calculate it ourselves. | ||
404 | for (length = 0; length < capacity; ++length) | ||
405 | { | ||
406 | if(0 == Marshal.ReadInt16(pValue, length * UnicodeEncoding.CharSize)) | ||
407 | { | ||
408 | break; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | success = true; | ||
413 | return pValue; | ||
414 | } | ||
415 | finally | ||
416 | { | ||
417 | if (!success && IntPtr.Zero != pValue) | ||
418 | { | ||
419 | Marshal.FreeCoTaskMem(pValue); | ||
420 | } | ||
421 | } | ||
422 | } | ||
423 | |||
424 | /// <summary> | ||
425 | /// Initialize a SecureString with the given Unicode string. | ||
426 | /// </summary> | ||
427 | /// <param name="pUniString">Pointer to Unicode string.</param> | ||
428 | /// <param name="length">The string's length.</param> | ||
429 | internal SecureString convertToSecureString(IntPtr pUniString, int length) | ||
430 | { | ||
431 | if (IntPtr.Zero == pUniString) | ||
432 | { | ||
433 | return null; | ||
434 | } | ||
435 | |||
436 | SecureString value = new SecureString(); | ||
437 | short s; | ||
438 | char c; | ||
439 | for (int charIndex = 0; charIndex < length; charIndex++) | ||
440 | { | ||
441 | s = Marshal.ReadInt16(pUniString, charIndex * UnicodeEncoding.CharSize); | ||
442 | c = (char)s; | ||
443 | value.AppendChar(c); | ||
444 | s = 0; | ||
445 | c = (char)0; | ||
446 | } | ||
447 | return value; | ||
448 | } | ||
449 | |||
450 | public static long VersionToLong(Version version) | ||
451 | { | ||
452 | // In Windows, each version component has a max value of 65535, | ||
453 | // so we truncate the version before shifting it, which will overflow if invalid. | ||
454 | long major = (long)(ushort)version.Major << 48; | ||
455 | long minor = (long)(ushort)version.Minor << 32; | ||
456 | long build = (long)(ushort)version.Build << 16; | ||
457 | long revision = (long)(ushort)version.Revision; | ||
458 | |||
459 | return major | minor | build | revision; | ||
460 | } | ||
461 | |||
462 | public static Version LongToVersion(long version) | ||
463 | { | ||
464 | int major = (int)((version & ((long)0xffff << 48)) >> 48); | ||
465 | int minor = (int)((version & ((long)0xffff << 32)) >> 32); | ||
466 | int build = (int)((version & ((long)0xffff << 16)) >> 16); | ||
467 | int revision = (int)(version & 0xffff); | ||
468 | |||
469 | return new Version(major, minor, build, revision); | ||
470 | } | ||
471 | |||
472 | /// <summary> | ||
473 | /// Verifies that VersionVariables can pass on the given Version to the engine. | ||
474 | /// If the Build or Revision fields are undefined, they are set to zero. | ||
475 | /// </summary> | ||
476 | public static Version NormalizeVersion(Version version) | ||
477 | { | ||
478 | if (version == null) | ||
479 | { | ||
480 | throw new ArgumentNullException("version"); | ||
481 | } | ||
482 | |||
483 | int major = version.Major; | ||
484 | int minor = version.Minor; | ||
485 | int build = version.Build; | ||
486 | int revision = version.Revision; | ||
487 | |||
488 | if (major > UInt16.MaxValue) | ||
489 | { | ||
490 | throw new ArgumentOutOfRangeException("version", String.Format(normalizeVersionFormatString, "Major")); | ||
491 | } | ||
492 | if (minor > UInt16.MaxValue) | ||
493 | { | ||
494 | throw new ArgumentOutOfRangeException("version", String.Format(normalizeVersionFormatString, "Minor")); | ||
495 | } | ||
496 | if (build > UInt16.MaxValue) | ||
497 | { | ||
498 | throw new ArgumentOutOfRangeException("version", String.Format(normalizeVersionFormatString, "Build")); | ||
499 | } | ||
500 | if (build == -1) | ||
501 | { | ||
502 | build = 0; | ||
503 | } | ||
504 | if (revision > UInt16.MaxValue) | ||
505 | { | ||
506 | throw new ArgumentOutOfRangeException("version", String.Format(normalizeVersionFormatString, "Revision")); | ||
507 | } | ||
508 | if (revision == -1) | ||
509 | { | ||
510 | revision = 0; | ||
511 | } | ||
512 | |||
513 | return new Version(major, minor, build, revision); | ||
514 | } | ||
515 | } | ||
516 | } | ||
diff --git a/src/WixToolset.Mba.Core/EventArgs.cs b/src/WixToolset.Mba.Core/EventArgs.cs new file mode 100644 index 00000000..9e8e6ecc --- /dev/null +++ b/src/WixToolset.Mba.Core/EventArgs.cs | |||
@@ -0,0 +1,1903 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Collections.ObjectModel; | ||
8 | |||
9 | /// <summary> | ||
10 | /// Base class for BA <see cref="EventArgs"/> classes. | ||
11 | /// </summary> | ||
12 | [Serializable] | ||
13 | public abstract class HResultEventArgs : EventArgs | ||
14 | { | ||
15 | /// <summary> | ||
16 | /// Creates a new instance of the <see cref="HResultEventArgs"/> class. | ||
17 | /// </summary> | ||
18 | public HResultEventArgs() | ||
19 | { | ||
20 | } | ||
21 | |||
22 | /// <summary> | ||
23 | /// Gets or sets the <see cref="HResult"/> of the operation. This is passed back to the engine. | ||
24 | /// </summary> | ||
25 | public int HResult { get; set; } | ||
26 | } | ||
27 | |||
28 | /// <summary> | ||
29 | /// Base class for cancellable BA <see cref="EventArgs"/> classes. | ||
30 | /// </summary> | ||
31 | [Serializable] | ||
32 | public abstract class CancellableHResultEventArgs : HResultEventArgs | ||
33 | { | ||
34 | /// <summary> | ||
35 | /// Creates a new instance of the <see cref="CancellableHResultEventArgs"/> class. | ||
36 | /// </summary> | ||
37 | public CancellableHResultEventArgs(bool cancelRecommendation) | ||
38 | { | ||
39 | this.Cancel = cancelRecommendation; | ||
40 | } | ||
41 | |||
42 | /// <summary> | ||
43 | /// Gets or sets whether to cancel the operation. This is passed back to the engine. | ||
44 | /// </summary> | ||
45 | public bool Cancel { get; set; } | ||
46 | } | ||
47 | |||
48 | /// <summary> | ||
49 | /// Base class for <see cref="EventArgs"/> classes that must return a <see cref="Result"/>. | ||
50 | /// </summary> | ||
51 | [Serializable] | ||
52 | public abstract class ResultEventArgs : HResultEventArgs | ||
53 | { | ||
54 | /// <summary> | ||
55 | /// Creates a new instance of the <see cref="ResultEventArgs"/> class. | ||
56 | /// </summary> | ||
57 | /// <param name="recommendation">Recommended result from engine.</param> | ||
58 | /// <param name="result">The result to return to the engine.</param> | ||
59 | public ResultEventArgs(Result recommendation, Result result) | ||
60 | { | ||
61 | this.Recommendation = recommendation; | ||
62 | this.Result = result; | ||
63 | } | ||
64 | |||
65 | /// <summary> | ||
66 | /// Gets the recommended <see cref="Result"/> of the operation. | ||
67 | /// </summary> | ||
68 | public Result Recommendation { get; private set; } | ||
69 | |||
70 | /// <summary> | ||
71 | /// Gets or sets the <see cref="Result"/> of the operation. This is passed back to the engine. | ||
72 | /// </summary> | ||
73 | public Result Result { get; set; } | ||
74 | } | ||
75 | |||
76 | /// <summary> | ||
77 | /// Base class for <see cref="EventArgs"/> classes that receive status from the engine. | ||
78 | /// </summary> | ||
79 | [Serializable] | ||
80 | public abstract class StatusEventArgs : HResultEventArgs | ||
81 | { | ||
82 | /// <summary> | ||
83 | /// Creates a new instance of the <see cref="StatusEventArgs"/> class. | ||
84 | /// </summary> | ||
85 | /// <param name="hrStatus">The return code of the operation.</param> | ||
86 | public StatusEventArgs(int hrStatus) | ||
87 | { | ||
88 | this.Status = hrStatus; | ||
89 | } | ||
90 | |||
91 | /// <summary> | ||
92 | /// Gets the return code of the operation. | ||
93 | /// </summary> | ||
94 | public int Status { get; private set; } | ||
95 | } | ||
96 | |||
97 | /// <summary> | ||
98 | /// Base class for <see cref="EventArgs"/> classes that receive status from the engine and return an action. | ||
99 | /// </summary> | ||
100 | public abstract class ActionEventArgs<T> : StatusEventArgs | ||
101 | { | ||
102 | /// <summary> | ||
103 | /// </summary> | ||
104 | /// <param name="hrStatus">The return code of the operation.</param> | ||
105 | /// <param name="recommendation">Recommended action from engine.</param> | ||
106 | /// <param name="action">The action to perform.</param> | ||
107 | public ActionEventArgs(int hrStatus, T recommendation, T action) | ||
108 | : base(hrStatus) | ||
109 | { | ||
110 | this.Recommendation = recommendation; | ||
111 | this.Action = action; | ||
112 | } | ||
113 | |||
114 | /// <summary> | ||
115 | /// Gets the recommended action from the engine. | ||
116 | /// </summary> | ||
117 | public T Recommendation { get; private set; } | ||
118 | |||
119 | /// <summary> | ||
120 | /// Gets or sets the action to be performed. This is passed back to the engine. | ||
121 | /// </summary> | ||
122 | public T Action { get; set; } | ||
123 | } | ||
124 | |||
125 | /// <summary> | ||
126 | /// Additional arguments used when startup has begun. | ||
127 | /// </summary> | ||
128 | [Serializable] | ||
129 | public class StartupEventArgs : HResultEventArgs | ||
130 | { | ||
131 | /// <summary> | ||
132 | /// Creates a new instance of the <see cref="StartupEventArgs"/> class. | ||
133 | /// </summary> | ||
134 | public StartupEventArgs() | ||
135 | { | ||
136 | } | ||
137 | } | ||
138 | |||
139 | /// <summary> | ||
140 | /// Additional arguments used when shutdown has begun. | ||
141 | /// </summary> | ||
142 | [Serializable] | ||
143 | public class ShutdownEventArgs : HResultEventArgs | ||
144 | { | ||
145 | /// <summary> | ||
146 | /// Creates a new instance of the <see cref="ShutdownEventArgs"/> class. | ||
147 | /// </summary> | ||
148 | public ShutdownEventArgs(BOOTSTRAPPER_SHUTDOWN_ACTION action) | ||
149 | { | ||
150 | this.Action = action; | ||
151 | } | ||
152 | |||
153 | /// <summary> | ||
154 | /// The action for OnShutdown. | ||
155 | /// </summary> | ||
156 | public BOOTSTRAPPER_SHUTDOWN_ACTION Action { get; set; } | ||
157 | } | ||
158 | |||
159 | /// <summary> | ||
160 | /// Additional arguments used when the system is shutting down or the user is logging off. | ||
161 | /// </summary> | ||
162 | /// <remarks> | ||
163 | /// <para>To prevent shutting down or logging off, set <see cref="CancellableHResultEventArgs.Cancel"/> to | ||
164 | /// true; otherwise, set it to false.</para> | ||
165 | /// <para>By default setup will prevent shutting down or logging off between | ||
166 | /// <see cref="BootstrapperApplication.ApplyBegin"/> and <see cref="BootstrapperApplication.ApplyComplete"/>.</para> | ||
167 | /// <para>If <see cref="SystemShutdownEventArgs.Reasons"/> contains <see cref="EndSessionReasons.Critical"/> | ||
168 | /// the bootstrapper cannot prevent the shutdown and only has a few seconds to save state or perform any other | ||
169 | /// critical operations before being closed by the operating system.</para> | ||
170 | /// </remarks> | ||
171 | [Serializable] | ||
172 | public class SystemShutdownEventArgs : CancellableHResultEventArgs | ||
173 | { | ||
174 | /// <summary> | ||
175 | /// Creates a new instance of the <see cref="SystemShutdownEventArgs"/> class. | ||
176 | /// </summary> | ||
177 | /// <param name="reasons">The reason the application is requested to close or being closed.</param> | ||
178 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
179 | public SystemShutdownEventArgs(EndSessionReasons reasons, bool cancelRecommendation) | ||
180 | : base(cancelRecommendation) | ||
181 | { | ||
182 | this.Reasons = reasons; | ||
183 | } | ||
184 | |||
185 | /// <summary> | ||
186 | /// Gets the reason the application is requested to close or being closed. | ||
187 | /// </summary> | ||
188 | /// <remarks> | ||
189 | /// <para>To prevent shutting down or logging off, set <see cref="CancellableHResultEventArgs.Cancel"/> to | ||
190 | /// true; otherwise, set it to false.</para> | ||
191 | /// <para>If <see cref="SystemShutdownEventArgs.Reasons"/> contains <see cref="EndSessionReasons.Critical"/> | ||
192 | /// the bootstrapper cannot prevent the shutdown and only has a few seconds to save state or perform any other | ||
193 | /// critical operations before being closed by the operating system.</para> | ||
194 | /// </remarks> | ||
195 | public EndSessionReasons Reasons { get; private set; } | ||
196 | } | ||
197 | |||
198 | /// <summary> | ||
199 | /// Additional arguments used when the overall detection phase has begun. | ||
200 | /// </summary> | ||
201 | [Serializable] | ||
202 | public class DetectBeginEventArgs : CancellableHResultEventArgs | ||
203 | { | ||
204 | /// <summary> | ||
205 | /// Creates a new instance of the <see cref="DetectBeginEventArgs"/> class. | ||
206 | /// </summary> | ||
207 | /// <param name="installed">Specifies whether the bundle is installed.</param> | ||
208 | /// <param name="packageCount">The number of packages to detect.</param> | ||
209 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
210 | public DetectBeginEventArgs(bool installed, int packageCount, bool cancelRecommendation) | ||
211 | : base(cancelRecommendation) | ||
212 | { | ||
213 | this.Installed = installed; | ||
214 | this.PackageCount = packageCount; | ||
215 | } | ||
216 | |||
217 | /// <summary> | ||
218 | /// Gets whether the bundle is installed. | ||
219 | /// </summary> | ||
220 | public bool Installed { get; private set; } | ||
221 | |||
222 | /// <summary> | ||
223 | /// Gets the number of packages to detect. | ||
224 | /// </summary> | ||
225 | public int PackageCount { get; private set; } | ||
226 | } | ||
227 | |||
228 | /// <summary> | ||
229 | /// Additional arguments used when detected a forward compatible bundle. | ||
230 | /// </summary> | ||
231 | [Serializable] | ||
232 | public class DetectForwardCompatibleBundleEventArgs : CancellableHResultEventArgs | ||
233 | { | ||
234 | /// <summary> | ||
235 | /// Creates a new instance of the <see cref="DetectUpdateBeginEventArgs"/> class. | ||
236 | /// </summary> | ||
237 | /// <param name="bundleId">The identity of the forward compatible bundle.</param> | ||
238 | /// <param name="relationType">Relationship type for this forward compatible bundle.</param> | ||
239 | /// <param name="bundleTag">The tag of the forward compatible bundle.</param> | ||
240 | /// <param name="perMachine">Whether the detected forward compatible bundle is per machine.</param> | ||
241 | /// <param name="version">The version of the forward compatible bundle detected.</param> | ||
242 | /// <param name="cancelRecommendation">The cancel recommendation from the engine.</param> | ||
243 | /// <param name="ignoreBundleRecommendation">The ignore recommendation from the engine.</param> | ||
244 | public DetectForwardCompatibleBundleEventArgs(string bundleId, RelationType relationType, string bundleTag, bool perMachine, long version, bool cancelRecommendation, bool ignoreBundleRecommendation) | ||
245 | : base(cancelRecommendation) | ||
246 | { | ||
247 | this.BundleId = bundleId; | ||
248 | this.RelationType = relationType; | ||
249 | this.BundleTag = bundleTag; | ||
250 | this.PerMachine = perMachine; | ||
251 | this.Version = Engine.LongToVersion(version); | ||
252 | this.IgnoreBundle = ignoreBundleRecommendation; | ||
253 | } | ||
254 | |||
255 | /// <summary> | ||
256 | /// Gets the identity of the forward compatible bundle detected. | ||
257 | /// </summary> | ||
258 | public string BundleId { get; private set; } | ||
259 | |||
260 | /// <summary> | ||
261 | /// Gets the relationship type of the forward compatible bundle. | ||
262 | /// </summary> | ||
263 | public RelationType RelationType { get; private set; } | ||
264 | |||
265 | /// <summary> | ||
266 | /// Gets the tag of the forward compatible bundle. | ||
267 | /// </summary> | ||
268 | public string BundleTag { get; private set; } | ||
269 | |||
270 | /// <summary> | ||
271 | /// Gets whether the detected forward compatible bundle is per machine. | ||
272 | /// </summary> | ||
273 | public bool PerMachine { get; private set; } | ||
274 | |||
275 | /// <summary> | ||
276 | /// Gets the version of the forward compatible bundle detected. | ||
277 | /// </summary> | ||
278 | public Version Version { get; private set; } | ||
279 | |||
280 | /// <summary> | ||
281 | /// Instructs the engine whether to use the forward compatible bundle. | ||
282 | /// </summary> | ||
283 | public bool IgnoreBundle { get; set; } | ||
284 | } | ||
285 | |||
286 | /// <summary> | ||
287 | /// Additional arguments used when the detection for an update has begun. | ||
288 | /// </summary> | ||
289 | [Serializable] | ||
290 | public class DetectUpdateBeginEventArgs : CancellableHResultEventArgs | ||
291 | { | ||
292 | /// <summary> | ||
293 | /// Creates a new instance of the <see cref="DetectUpdateBeginEventArgs"/> class. | ||
294 | /// </summary> | ||
295 | /// <param name="updateLocation">The location to check for an updated bundle.</param> | ||
296 | /// <param name="cancelRecommendation">The cancel recommendation from the engine.</param> | ||
297 | /// <param name="skipRecommendation">The skip recommendation from the engine.</param> | ||
298 | public DetectUpdateBeginEventArgs(string updateLocation, bool cancelRecommendation, bool skipRecommendation) | ||
299 | : base(cancelRecommendation) | ||
300 | { | ||
301 | this.UpdateLocation = updateLocation; | ||
302 | } | ||
303 | |||
304 | /// <summary> | ||
305 | /// Gets the identity of the bundle to detect. | ||
306 | /// </summary> | ||
307 | public string UpdateLocation { get; private set; } | ||
308 | |||
309 | /// <summary> | ||
310 | /// Whether to skip checking for bundle updates. | ||
311 | /// </summary> | ||
312 | public bool Skip { get; set; } | ||
313 | } | ||
314 | |||
315 | /// <summary> | ||
316 | /// Additional arguments used when the detection for an update has begun. | ||
317 | /// </summary> | ||
318 | [Serializable] | ||
319 | public class DetectUpdateEventArgs : CancellableHResultEventArgs | ||
320 | { | ||
321 | /// <summary> | ||
322 | /// Creates a new instance of the <see cref="DetectUpdateBeginEventArgs"/> class. | ||
323 | /// </summary> | ||
324 | /// <param name="updateLocation">The location to check for an updated bundle.</param> | ||
325 | /// <param name="size">The expected size of the updated bundle.</param> | ||
326 | /// <param name="version">The expected version of the updated bundle.</param> | ||
327 | /// <param name="title">The title of the updated bundle.</param> | ||
328 | /// <param name="summary">The summary of the updated bundle.</param> | ||
329 | /// <param name="contentType">The content type of the content of the updated bundle.</param> | ||
330 | /// <param name="content">The content of the updated bundle.</param> | ||
331 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
332 | /// <param name="stopRecommendation">The recommendation from the engine.</param> | ||
333 | public DetectUpdateEventArgs(string updateLocation, long size, long version, string title, string summary, string contentType, string content, bool cancelRecommendation, bool stopRecommendation) | ||
334 | : base(cancelRecommendation) | ||
335 | { | ||
336 | this.UpdateLocation = updateLocation; | ||
337 | this.Size = size; | ||
338 | this.Version = Engine.LongToVersion(version); | ||
339 | this.Title = title; | ||
340 | this.Summary = summary; | ||
341 | this.ContentType = contentType; | ||
342 | this.Content = content; | ||
343 | this.StopProcessingUpdates = stopRecommendation; | ||
344 | } | ||
345 | |||
346 | /// <summary> | ||
347 | /// Gets the identity of the bundle to detect. | ||
348 | /// </summary> | ||
349 | public string UpdateLocation { get; private set; } | ||
350 | |||
351 | /// <summary> | ||
352 | /// Gets the size of the updated bundle. | ||
353 | /// </summary> | ||
354 | public long Size { get; private set; } | ||
355 | |||
356 | /// <summary> | ||
357 | /// Gets the version of the updated bundle. | ||
358 | /// </summary> | ||
359 | public Version Version { get; private set; } | ||
360 | |||
361 | /// <summary> | ||
362 | /// Gets the title of the the updated bundle. | ||
363 | /// </summary> | ||
364 | public string Title { get; private set; } | ||
365 | |||
366 | /// <summary> | ||
367 | /// Gets the summary of the updated bundle. | ||
368 | /// </summary> | ||
369 | public string Summary { get; private set; } | ||
370 | |||
371 | /// <summary> | ||
372 | /// Gets the content type of the content of the updated bundle. | ||
373 | /// </summary> | ||
374 | public string ContentType { get; private set; } | ||
375 | |||
376 | /// <summary> | ||
377 | /// Gets the content of the updated bundle. | ||
378 | /// </summary> | ||
379 | public string Content { get; private set; } | ||
380 | |||
381 | /// <summary> | ||
382 | /// Tells the engine to stop giving the rest of the updates found in the feed. | ||
383 | /// </summary> | ||
384 | public bool StopProcessingUpdates { get; set; } | ||
385 | } | ||
386 | |||
387 | /// <summary> | ||
388 | /// Additional arguments used when the detection for an update has completed. | ||
389 | /// </summary> | ||
390 | [Serializable] | ||
391 | public class DetectUpdateCompleteEventArgs : StatusEventArgs | ||
392 | { | ||
393 | /// <summary> | ||
394 | /// Creates a new instance of the <see cref="DetectUpdateCompleteEventArgs"/> class. | ||
395 | /// </summary> | ||
396 | /// <param name="hrStatus">The return code of the operation.</param> | ||
397 | /// <param name="ignoreRecommendation">The recommendation from the engine.</param> | ||
398 | public DetectUpdateCompleteEventArgs(int hrStatus, bool ignoreRecommendation) | ||
399 | : base(hrStatus) | ||
400 | { | ||
401 | this.IgnoreError = ignoreRecommendation; | ||
402 | } | ||
403 | |||
404 | /// <summary> | ||
405 | /// If Status is an error, then set this to true to ignore it and continue detecting. | ||
406 | /// </summary> | ||
407 | public bool IgnoreError { get; set; } | ||
408 | } | ||
409 | |||
410 | /// <summary> | ||
411 | /// Additional arguments used when a related bundle has been detected for a bundle. | ||
412 | /// </summary> | ||
413 | [Serializable] | ||
414 | public class DetectRelatedBundleEventArgs : CancellableHResultEventArgs | ||
415 | { | ||
416 | /// <summary> | ||
417 | /// Creates a new instance of the <see cref="DetectRelatedBundleEventArgs"/> class. | ||
418 | /// </summary> | ||
419 | /// <param name="productCode">The identity of the related package bundle.</param> | ||
420 | /// <param name="relationType">Relationship type for this related bundle.</param> | ||
421 | /// <param name="bundleTag">The tag of the related package bundle.</param> | ||
422 | /// <param name="perMachine">Whether the detected bundle is per machine.</param> | ||
423 | /// <param name="version">The version of the related bundle detected.</param> | ||
424 | /// <param name="operation">The operation that will be taken on the detected bundle.</param> | ||
425 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
426 | public DetectRelatedBundleEventArgs(string productCode, RelationType relationType, string bundleTag, bool perMachine, long version, RelatedOperation operation, bool cancelRecommendation) | ||
427 | : base(cancelRecommendation) | ||
428 | { | ||
429 | this.ProductCode = productCode; | ||
430 | this.RelationType = relationType; | ||
431 | this.BundleTag = bundleTag; | ||
432 | this.PerMachine = perMachine; | ||
433 | this.Version = Engine.LongToVersion(version); | ||
434 | this.Operation = operation; | ||
435 | } | ||
436 | |||
437 | /// <summary> | ||
438 | /// Gets the identity of the related bundle detected. | ||
439 | /// </summary> | ||
440 | public string ProductCode { get; private set; } | ||
441 | |||
442 | /// <summary> | ||
443 | /// Gets the relationship type of the related bundle. | ||
444 | /// </summary> | ||
445 | public RelationType RelationType { get; private set; } | ||
446 | |||
447 | /// <summary> | ||
448 | /// Gets the tag of the related package bundle. | ||
449 | /// </summary> | ||
450 | public string BundleTag { get; private set; } | ||
451 | |||
452 | /// <summary> | ||
453 | /// Gets whether the detected bundle is per machine. | ||
454 | /// </summary> | ||
455 | public bool PerMachine { get; private set; } | ||
456 | |||
457 | /// <summary> | ||
458 | /// Gets the version of the related bundle detected. | ||
459 | /// </summary> | ||
460 | public Version Version { get; private set; } | ||
461 | |||
462 | /// <summary> | ||
463 | /// Gets the operation that will be taken on the detected bundle. | ||
464 | /// </summary> | ||
465 | public RelatedOperation Operation { get; private set; } | ||
466 | } | ||
467 | |||
468 | /// <summary> | ||
469 | /// Additional arguments used when the detection for a specific package has begun. | ||
470 | /// </summary> | ||
471 | [Serializable] | ||
472 | public class DetectPackageBeginEventArgs : CancellableHResultEventArgs | ||
473 | { | ||
474 | /// <summary> | ||
475 | /// Creates a new instance of the <see cref="DetectPackageBeginEventArgs"/> class. | ||
476 | /// </summary> | ||
477 | /// <param name="packageId">The identity of the package to detect.</param> | ||
478 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
479 | public DetectPackageBeginEventArgs(string packageId, bool cancelRecommendation) | ||
480 | : base(cancelRecommendation) | ||
481 | { | ||
482 | this.PackageId = packageId; | ||
483 | } | ||
484 | |||
485 | /// <summary> | ||
486 | /// Gets the identity of the package to detect. | ||
487 | /// </summary> | ||
488 | public string PackageId { get; private set; } | ||
489 | } | ||
490 | |||
491 | /// <summary> | ||
492 | /// Additional arguments used when a package was not found but a newer package using the same provider key was. | ||
493 | /// </summary> | ||
494 | [Serializable] | ||
495 | public class DetectCompatibleMsiPackageEventArgs : CancellableHResultEventArgs | ||
496 | { | ||
497 | /// <summary> | ||
498 | /// Creates a new instance of the <see cref="DetectCompatibleMsiPackageEventArgs"/> class. | ||
499 | /// </summary> | ||
500 | /// <param name="packageId">The identity of the package that was not detected.</param> | ||
501 | /// <param name="compatiblePackageId">The identity of the compatible package that was detected.</param> | ||
502 | /// <param name="compatiblePackageVersion">The version of the compatible package that was detected.</param> | ||
503 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
504 | public DetectCompatibleMsiPackageEventArgs(string packageId, string compatiblePackageId, long compatiblePackageVersion, bool cancelRecommendation) | ||
505 | : base(cancelRecommendation) | ||
506 | { | ||
507 | this.PackageId = packageId; | ||
508 | this.CompatiblePackageId = compatiblePackageId; | ||
509 | this.CompatiblePackageVersion = Engine.LongToVersion(compatiblePackageVersion); | ||
510 | } | ||
511 | |||
512 | /// <summary> | ||
513 | /// Gets the identity of the package that was not detected. | ||
514 | /// </summary> | ||
515 | public string PackageId { get; private set; } | ||
516 | |||
517 | /// <summary> | ||
518 | /// Gets the identity of the compatible package that was detected. | ||
519 | /// </summary> | ||
520 | public string CompatiblePackageId { get; private set; } | ||
521 | |||
522 | /// <summary> | ||
523 | /// Gets the version of the compatible package that was detected. | ||
524 | /// </summary> | ||
525 | public Version CompatiblePackageVersion { get; private set; } | ||
526 | } | ||
527 | |||
528 | /// <summary> | ||
529 | /// Additional arguments used when a related MSI package has been detected for a package. | ||
530 | /// </summary> | ||
531 | [Serializable] | ||
532 | public class DetectRelatedMsiPackageEventArgs : CancellableHResultEventArgs | ||
533 | { | ||
534 | /// <summary> | ||
535 | /// Creates a new instance of the <see cref="DetectRelatedMsiPackageEventArgs"/> class. | ||
536 | /// </summary> | ||
537 | /// <param name="packageId">The identity of the package detecting.</param> | ||
538 | /// <param name="upgradeCode">The upgrade code of the related package detected.</param> | ||
539 | /// <param name="productCode">The identity of the related package detected.</param> | ||
540 | /// <param name="perMachine">Whether the detected package is per machine.</param> | ||
541 | /// <param name="version">The version of the related package detected.</param> | ||
542 | /// <param name="operation">The operation that will be taken on the detected package.</param> | ||
543 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
544 | public DetectRelatedMsiPackageEventArgs(string packageId, string upgradeCode, string productCode, bool perMachine, long version, RelatedOperation operation, bool cancelRecommendation) | ||
545 | : base(cancelRecommendation) | ||
546 | { | ||
547 | this.PackageId = packageId; | ||
548 | this.UpgradeCode = upgradeCode; | ||
549 | this.ProductCode = productCode; | ||
550 | this.PerMachine = perMachine; | ||
551 | this.Version = Engine.LongToVersion(version); | ||
552 | this.Operation = operation; | ||
553 | } | ||
554 | |||
555 | /// <summary> | ||
556 | /// Gets the identity of the product's package detected. | ||
557 | /// </summary> | ||
558 | public string PackageId { get; private set; } | ||
559 | |||
560 | /// <summary> | ||
561 | /// Gets the upgrade code of the related package detected. | ||
562 | /// </summary> | ||
563 | public string UpgradeCode { get; private set; } | ||
564 | |||
565 | /// <summary> | ||
566 | /// Gets the identity of the related package detected. | ||
567 | /// </summary> | ||
568 | public string ProductCode { get; private set; } | ||
569 | |||
570 | /// <summary> | ||
571 | /// Gets whether the detected package is per machine. | ||
572 | /// </summary> | ||
573 | public bool PerMachine { get; private set; } | ||
574 | |||
575 | /// <summary> | ||
576 | /// Gets the version of the related package detected. | ||
577 | /// </summary> | ||
578 | public Version Version { get; private set; } | ||
579 | |||
580 | /// <summary> | ||
581 | /// Gets the operation that will be taken on the detected package. | ||
582 | /// </summary> | ||
583 | public RelatedOperation Operation { get; private set; } | ||
584 | } | ||
585 | |||
586 | /// <summary> | ||
587 | /// Additional arguments used when a target MSI package has been detected. | ||
588 | /// </summary> | ||
589 | public class DetectTargetMsiPackageEventArgs : CancellableHResultEventArgs | ||
590 | { | ||
591 | /// <summary> | ||
592 | /// Creates a new instance of the <see cref="DetectMsiFeatureEventArgs"/> class. | ||
593 | /// </summary> | ||
594 | /// <param name="packageId">Detected package identifier.</param> | ||
595 | /// <param name="productCode">Detected product code.</param> | ||
596 | /// <param name="state">Package state detected.</param> | ||
597 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
598 | public DetectTargetMsiPackageEventArgs(string packageId, string productCode, PackageState state, bool cancelRecommendation) | ||
599 | : base(cancelRecommendation) | ||
600 | { | ||
601 | this.PackageId = packageId; | ||
602 | this.ProductCode = productCode; | ||
603 | this.State = state; | ||
604 | } | ||
605 | |||
606 | /// <summary> | ||
607 | /// Gets the identity of the target's package detected. | ||
608 | /// </summary> | ||
609 | public string PackageId { get; private set; } | ||
610 | |||
611 | /// <summary> | ||
612 | /// Gets the product code of the target MSI detected. | ||
613 | /// </summary> | ||
614 | public string ProductCode { get; private set; } | ||
615 | |||
616 | /// <summary> | ||
617 | /// Gets the detected patch package state. | ||
618 | /// </summary> | ||
619 | public PackageState State { get; private set; } | ||
620 | } | ||
621 | |||
622 | /// <summary> | ||
623 | /// Additional arguments used when a feature in an MSI package has been detected. | ||
624 | /// </summary> | ||
625 | public class DetectMsiFeatureEventArgs : CancellableHResultEventArgs | ||
626 | { | ||
627 | /// <summary> | ||
628 | /// Creates a new instance of the <see cref="DetectMsiFeatureEventArgs"/> class. | ||
629 | /// </summary> | ||
630 | /// <param name="packageId">Detected package identifier.</param> | ||
631 | /// <param name="featureId">Detected feature identifier.</param> | ||
632 | /// <param name="state">Feature state detected.</param> | ||
633 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
634 | public DetectMsiFeatureEventArgs(string packageId, string featureId, FeatureState state, bool cancelRecommendation) | ||
635 | : base(cancelRecommendation) | ||
636 | { | ||
637 | this.PackageId = packageId; | ||
638 | this.FeatureId = featureId; | ||
639 | this.State = state; | ||
640 | } | ||
641 | |||
642 | /// <summary> | ||
643 | /// Gets the identity of the feature's package detected. | ||
644 | /// </summary> | ||
645 | public string PackageId { get; private set; } | ||
646 | |||
647 | /// <summary> | ||
648 | /// Gets the identity of the feature detected. | ||
649 | /// </summary> | ||
650 | public string FeatureId { get; private set; } | ||
651 | |||
652 | /// <summary> | ||
653 | /// Gets the detected feature state. | ||
654 | /// </summary> | ||
655 | public FeatureState State { get; private set; } | ||
656 | } | ||
657 | |||
658 | /// <summary> | ||
659 | /// Additional arguments used when the detection for a specific package has completed. | ||
660 | /// </summary> | ||
661 | [Serializable] | ||
662 | public class DetectPackageCompleteEventArgs : StatusEventArgs | ||
663 | { | ||
664 | /// <summary> | ||
665 | /// Creates a new instance of the <see cref="DetectPackageCompleteEventArgs"/> class. | ||
666 | /// </summary> | ||
667 | /// <param name="packageId">The identity of the package detected.</param> | ||
668 | /// <param name="hrStatus">The return code of the operation.</param> | ||
669 | /// <param name="state">The state of the specified package.</param> | ||
670 | public DetectPackageCompleteEventArgs(string packageId, int hrStatus, PackageState state) | ||
671 | : base(hrStatus) | ||
672 | { | ||
673 | this.PackageId = packageId; | ||
674 | this.State = state; | ||
675 | } | ||
676 | |||
677 | /// <summary> | ||
678 | /// Gets the identity of the package detected. | ||
679 | /// </summary> | ||
680 | public string PackageId { get; private set; } | ||
681 | |||
682 | /// <summary> | ||
683 | /// Gets the state of the specified package. | ||
684 | /// </summary> | ||
685 | public PackageState State { get; private set; } | ||
686 | } | ||
687 | |||
688 | /// <summary> | ||
689 | /// Additional arguments used when the detection phase has completed. | ||
690 | /// </summary> | ||
691 | [Serializable] | ||
692 | public class DetectCompleteEventArgs : StatusEventArgs | ||
693 | { | ||
694 | /// <summary> | ||
695 | /// Creates a new instance of the <see cref="DetectCompleteEventArgs"/> class. | ||
696 | /// </summary> | ||
697 | /// <param name="hrStatus">The return code of the operation.</param> | ||
698 | public DetectCompleteEventArgs(int hrStatus) | ||
699 | : base(hrStatus) | ||
700 | { | ||
701 | } | ||
702 | } | ||
703 | |||
704 | /// <summary> | ||
705 | /// Additional arguments used when the engine has begun planning the installation. | ||
706 | /// </summary> | ||
707 | [Serializable] | ||
708 | public class PlanBeginEventArgs : CancellableHResultEventArgs | ||
709 | { | ||
710 | /// <summary> | ||
711 | /// Creates a new instance of the <see cref="PlanBeginEventArgs"/> class. | ||
712 | /// </summary> | ||
713 | /// <param name="packageCount">The number of packages to plan for.</param> | ||
714 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
715 | public PlanBeginEventArgs(int packageCount, bool cancelRecommendation) | ||
716 | : base(cancelRecommendation) | ||
717 | { | ||
718 | this.PackageCount = packageCount; | ||
719 | } | ||
720 | |||
721 | /// <summary> | ||
722 | /// Gets the number of packages to plan for. | ||
723 | /// </summary> | ||
724 | public int PackageCount { get; private set; } | ||
725 | } | ||
726 | |||
727 | /// <summary> | ||
728 | /// Additional arguments used when the engine has begun planning for a related bundle. | ||
729 | /// </summary> | ||
730 | [Serializable] | ||
731 | public class PlanRelatedBundleEventArgs : CancellableHResultEventArgs | ||
732 | { | ||
733 | /// <summary> | ||
734 | /// Creates a new instance of the <see cref="PlanRelatedBundleEventArgs"/> class. | ||
735 | /// </summary> | ||
736 | /// <param name="bundleId">The identity of the bundle to plan for.</param> | ||
737 | /// <param name="recommendedState">The recommended requested state for the bundle.</param> | ||
738 | /// <param name="state">The requested state for the bundle.</param> | ||
739 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
740 | public PlanRelatedBundleEventArgs(string bundleId, RequestState recommendedState, RequestState state, bool cancelRecommendation) | ||
741 | : base(cancelRecommendation) | ||
742 | { | ||
743 | this.BundleId = bundleId; | ||
744 | this.RecommendedState = recommendedState; | ||
745 | this.State = state; | ||
746 | } | ||
747 | |||
748 | /// <summary> | ||
749 | /// Gets the identity of the bundle to plan for. | ||
750 | /// </summary> | ||
751 | public string BundleId { get; private set; } | ||
752 | |||
753 | /// <summary> | ||
754 | /// Gets the recommended requested state for the bundle. | ||
755 | /// </summary> | ||
756 | public RequestState RecommendedState { get; private set; } | ||
757 | |||
758 | /// <summary> | ||
759 | /// Gets or sets the requested state for the bundle. | ||
760 | /// </summary> | ||
761 | public RequestState State { get; set; } | ||
762 | } | ||
763 | |||
764 | /// <summary> | ||
765 | /// Additional arguments used when the engine has begun planning the installation of a specific package. | ||
766 | /// </summary> | ||
767 | [Serializable] | ||
768 | public class PlanPackageBeginEventArgs : CancellableHResultEventArgs | ||
769 | { | ||
770 | /// <summary> | ||
771 | /// Creates a new instance of the <see cref="PlanPackageBeginEventArgs"/> class. | ||
772 | /// </summary> | ||
773 | /// <param name="packageId">The identity of the package to plan for.</param> | ||
774 | /// <param name="recommendedState">The recommended requested state for the package.</param> | ||
775 | /// <param name="state">The requested state for the package.</param> | ||
776 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
777 | public PlanPackageBeginEventArgs(string packageId, RequestState recommendedState, RequestState state, bool cancelRecommendation) | ||
778 | : base(cancelRecommendation) | ||
779 | { | ||
780 | this.PackageId = packageId; | ||
781 | this.RecommendedState = recommendedState; | ||
782 | this.State = state; | ||
783 | } | ||
784 | |||
785 | /// <summary> | ||
786 | /// Gets the identity of the package to plan for. | ||
787 | /// </summary> | ||
788 | public string PackageId { get; private set; } | ||
789 | |||
790 | /// <summary> | ||
791 | /// Gets the recommended requested state for the package. | ||
792 | /// </summary> | ||
793 | public RequestState RecommendedState { get; private set; } | ||
794 | |||
795 | /// <summary> | ||
796 | /// Gets or sets the requested state for the package. | ||
797 | /// </summary> | ||
798 | public RequestState State { get; set; } | ||
799 | } | ||
800 | |||
801 | /// <summary> | ||
802 | /// Additional arguments used when the engine is about to plan a newer package using the same provider key. | ||
803 | /// </summary> | ||
804 | [Serializable] | ||
805 | public class PlanCompatibleMsiPackageBeginEventArgs : CancellableHResultEventArgs | ||
806 | { | ||
807 | /// <summary> | ||
808 | /// Creates a new instance of the <see cref="PlanCompatibleMsiPackageBeginEventArgs"/> class. | ||
809 | /// </summary> | ||
810 | /// <param name="packageId">The identity of the package that was not detected.</param> | ||
811 | /// <param name="compatiblePackageId">The identity of the compatible package that was detected.</param> | ||
812 | /// <param name="compatiblePackageVersion">The version of the compatible package that was detected.</param> | ||
813 | /// <param name="recommendedState">The recommended request state for the compatible package.</param> | ||
814 | /// <param name="state">The requested state for the compatible package.</param> | ||
815 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
816 | public PlanCompatibleMsiPackageBeginEventArgs(string packageId, string compatiblePackageId, long compatiblePackageVersion, RequestState recommendedState, RequestState state, bool cancelRecommendation) | ||
817 | : base(cancelRecommendation) | ||
818 | { | ||
819 | this.PackageId = packageId; | ||
820 | this.CompatiblePackageId = compatiblePackageId; | ||
821 | this.CompatiblePackageVersion = Engine.LongToVersion(compatiblePackageVersion); | ||
822 | this.RecommendedState = recommendedState; | ||
823 | this.State = state; | ||
824 | } | ||
825 | |||
826 | /// <summary> | ||
827 | /// Gets the identity of the package that was not detected. | ||
828 | /// </summary> | ||
829 | public string PackageId { get; private set; } | ||
830 | |||
831 | /// <summary> | ||
832 | /// Gets the identity of the compatible package detected. | ||
833 | /// </summary> | ||
834 | public string CompatiblePackageId { get; private set; } | ||
835 | |||
836 | /// <summary> | ||
837 | /// Gets the version of the compatible package detected. | ||
838 | /// </summary> | ||
839 | public Version CompatiblePackageVersion { get; private set; } | ||
840 | |||
841 | /// <summary> | ||
842 | /// Gets the recommended state to use for the compatible package for planning. | ||
843 | /// </summary> | ||
844 | public RequestState RecommendedState { get; private set; } | ||
845 | |||
846 | /// <summary> | ||
847 | /// Gets or sets the state to use for the compatible package for planning. | ||
848 | /// </summary> | ||
849 | public RequestState State { get; set; } | ||
850 | } | ||
851 | |||
852 | /// <summary> | ||
853 | /// Additional arguments used when the engine has completed planning the installation of a specific package. | ||
854 | /// </summary> | ||
855 | [Serializable] | ||
856 | public class PlanCompatibleMsiPackageCompleteEventArgs : StatusEventArgs | ||
857 | { | ||
858 | /// <summary> | ||
859 | /// Creates a new instance of the <see cref="PlanCompatibleMsiPackageCompleteEventArgs"/> class. | ||
860 | /// </summary> | ||
861 | /// <param name="packageId">The identity of the package planned for.</param> | ||
862 | /// <param name="compatiblePackageId">The identity of the compatible package that was detected.</param> | ||
863 | /// <param name="hrStatus">The return code of the operation.</param> | ||
864 | /// <param name="state">The current state of the package.</param> | ||
865 | /// <param name="requested">The requested state for the package</param> | ||
866 | /// <param name="execute">The execution action to take.</param> | ||
867 | /// <param name="rollback">The rollback action to take.</param> | ||
868 | public PlanCompatibleMsiPackageCompleteEventArgs(string packageId, string compatiblePackageId, int hrStatus, PackageState state, RequestState requested, ActionState execute, ActionState rollback) | ||
869 | : base(hrStatus) | ||
870 | { | ||
871 | this.PackageId = packageId; | ||
872 | this.CompatiblePackageId = compatiblePackageId; | ||
873 | this.State = state; | ||
874 | this.Requested = requested; | ||
875 | this.Execute = execute; | ||
876 | this.Rollback = rollback; | ||
877 | } | ||
878 | |||
879 | /// <summary> | ||
880 | /// Gets the identity of the package planned for. | ||
881 | /// </summary> | ||
882 | public string PackageId { get; private set; } | ||
883 | |||
884 | /// <summary> | ||
885 | /// Gets the identity of the compatible package detected. | ||
886 | /// </summary> | ||
887 | public string CompatiblePackageId { get; private set; } | ||
888 | |||
889 | /// <summary> | ||
890 | /// Gets the current state of the package. | ||
891 | /// </summary> | ||
892 | public PackageState State { get; private set; } | ||
893 | |||
894 | /// <summary> | ||
895 | /// Gets the requested state for the package. | ||
896 | /// </summary> | ||
897 | public RequestState Requested { get; private set; } | ||
898 | |||
899 | /// <summary> | ||
900 | /// Gets the execution action to take. | ||
901 | /// </summary> | ||
902 | public ActionState Execute { get; private set; } | ||
903 | |||
904 | /// <summary> | ||
905 | /// Gets the rollback action to take. | ||
906 | /// </summary> | ||
907 | public ActionState Rollback { get; private set; } | ||
908 | } | ||
909 | |||
910 | /// <summary> | ||
911 | /// Additional arguments used when engine is about to plan a MSP applied to a target MSI package. | ||
912 | /// </summary> | ||
913 | [Serializable] | ||
914 | public class PlanTargetMsiPackageEventArgs : CancellableHResultEventArgs | ||
915 | { | ||
916 | /// <summary> | ||
917 | /// Creates a new instance of the <see cref="PlanMsiFeatureEventArgs"/> class. | ||
918 | /// </summary> | ||
919 | /// <param name="packageId">Package identifier of the patch being planned.</param> | ||
920 | /// <param name="productCode">Product code identifier being planned.</param> | ||
921 | /// <param name="recommendedState">Recommended package state of the patch being planned.</param> | ||
922 | /// <param name="state">Package state of the patch being planned.</param> | ||
923 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
924 | public PlanTargetMsiPackageEventArgs(string packageId, string productCode, RequestState recommendedState, RequestState state, bool cancelRecommendation) | ||
925 | : base(cancelRecommendation) | ||
926 | { | ||
927 | this.PackageId = packageId; | ||
928 | this.ProductCode = productCode; | ||
929 | this.RecommendedState = recommendedState; | ||
930 | this.State = state; | ||
931 | } | ||
932 | |||
933 | /// <summary> | ||
934 | /// Gets the identity of the patch package to plan. | ||
935 | /// </summary> | ||
936 | public string PackageId { get; private set; } | ||
937 | |||
938 | /// <summary> | ||
939 | /// Gets the identity of the patch's target MSI to plan. | ||
940 | /// </summary> | ||
941 | public string ProductCode { get; private set; } | ||
942 | |||
943 | /// <summary> | ||
944 | /// Gets the recommended state of the patch to use by planning. | ||
945 | /// </summary> | ||
946 | public RequestState RecommendedState { get; private set; } | ||
947 | |||
948 | /// <summary> | ||
949 | /// Gets or sets the state of the patch to use by planning. | ||
950 | /// </summary> | ||
951 | public RequestState State { get; set; } | ||
952 | } | ||
953 | |||
954 | /// <summary> | ||
955 | /// Additional arguments used when engine is about to plan a feature in an MSI package. | ||
956 | /// </summary> | ||
957 | [Serializable] | ||
958 | public class PlanMsiFeatureEventArgs : CancellableHResultEventArgs | ||
959 | { | ||
960 | /// <summary> | ||
961 | /// Creates a new instance of the <see cref="PlanMsiFeatureEventArgs"/> class. | ||
962 | /// </summary> | ||
963 | /// <param name="packageId">Package identifier being planned.</param> | ||
964 | /// <param name="featureId">Feature identifier being planned.</param> | ||
965 | /// <param name="recommendedState">Recommended feature state being planned.</param> | ||
966 | /// <param name="state">Feature state being planned.</param> | ||
967 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
968 | public PlanMsiFeatureEventArgs(string packageId, string featureId, FeatureState recommendedState, FeatureState state, bool cancelRecommendation) | ||
969 | : base(cancelRecommendation) | ||
970 | { | ||
971 | this.PackageId = packageId; | ||
972 | this.FeatureId = featureId; | ||
973 | this.RecommendedState = recommendedState; | ||
974 | this.State = state; | ||
975 | } | ||
976 | |||
977 | /// <summary> | ||
978 | /// Gets the identity of the feature's package to plan. | ||
979 | /// </summary> | ||
980 | public string PackageId { get; private set; } | ||
981 | |||
982 | /// <summary> | ||
983 | /// Gets the identity of the feature to plan. | ||
984 | /// </summary> | ||
985 | public string FeatureId { get; private set; } | ||
986 | |||
987 | /// <summary> | ||
988 | /// Gets the recommended feature state to use by planning. | ||
989 | /// </summary> | ||
990 | public FeatureState RecommendedState { get; private set; } | ||
991 | |||
992 | /// <summary> | ||
993 | /// Gets or sets the feature state to use by planning. | ||
994 | /// </summary> | ||
995 | public FeatureState State { get; set; } | ||
996 | } | ||
997 | |||
998 | /// <summary> | ||
999 | /// Additional arguments used when then engine has completed planning the installation of a specific package. | ||
1000 | /// </summary> | ||
1001 | [Serializable] | ||
1002 | public class PlanPackageCompleteEventArgs : StatusEventArgs | ||
1003 | { | ||
1004 | /// <summary> | ||
1005 | /// Creates a new instance of the <see cref="PlanPackageCompleteEventArgs"/> class. | ||
1006 | /// </summary> | ||
1007 | /// <param name="packageId">The identity of the package planned for.</param> | ||
1008 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1009 | /// <param name="state">The current state of the package.</param> | ||
1010 | /// <param name="requested">The requested state for the package</param> | ||
1011 | /// <param name="execute">The execution action to take.</param> | ||
1012 | /// <param name="rollback">The rollback action to take.</param> | ||
1013 | public PlanPackageCompleteEventArgs(string packageId, int hrStatus, PackageState state, RequestState requested, ActionState execute, ActionState rollback) | ||
1014 | : base(hrStatus) | ||
1015 | { | ||
1016 | this.PackageId = packageId; | ||
1017 | this.State = state; | ||
1018 | this.Requested = requested; | ||
1019 | this.Execute = execute; | ||
1020 | this.Rollback = rollback; | ||
1021 | } | ||
1022 | |||
1023 | /// <summary> | ||
1024 | /// Gets the identity of the package planned for. | ||
1025 | /// </summary> | ||
1026 | public string PackageId { get; private set; } | ||
1027 | |||
1028 | /// <summary> | ||
1029 | /// Gets the current state of the package. | ||
1030 | /// </summary> | ||
1031 | public PackageState State { get; private set; } | ||
1032 | |||
1033 | /// <summary> | ||
1034 | /// Gets the requested state for the package. | ||
1035 | /// </summary> | ||
1036 | public RequestState Requested { get; private set; } | ||
1037 | |||
1038 | /// <summary> | ||
1039 | /// Gets the execution action to take. | ||
1040 | /// </summary> | ||
1041 | public ActionState Execute { get; private set; } | ||
1042 | |||
1043 | /// <summary> | ||
1044 | /// Gets the rollback action to take. | ||
1045 | /// </summary> | ||
1046 | public ActionState Rollback { get; private set; } | ||
1047 | } | ||
1048 | |||
1049 | /// <summary> | ||
1050 | /// Additional arguments used when the engine has completed planning the installation. | ||
1051 | /// </summary> | ||
1052 | [Serializable] | ||
1053 | public class PlanCompleteEventArgs : StatusEventArgs | ||
1054 | { | ||
1055 | /// <summary> | ||
1056 | /// Creates a new instance of the <see cref="PlanCompleteEventArgs"/> class. | ||
1057 | /// </summary> | ||
1058 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1059 | public PlanCompleteEventArgs(int hrStatus) | ||
1060 | : base(hrStatus) | ||
1061 | { | ||
1062 | } | ||
1063 | } | ||
1064 | |||
1065 | /// <summary> | ||
1066 | /// Additional arguments used when the engine has begun installing the bundle. | ||
1067 | /// </summary> | ||
1068 | [Serializable] | ||
1069 | public class ApplyBeginEventArgs : CancellableHResultEventArgs | ||
1070 | { | ||
1071 | /// <summary> | ||
1072 | /// Creates a new instance of the <see cref="ApplyBeginEventArgs"/> class. | ||
1073 | /// </summary> | ||
1074 | /// <param name="phaseCount">The number of phases during apply.</param> | ||
1075 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1076 | public ApplyBeginEventArgs(int phaseCount, bool cancelRecommendation) | ||
1077 | : base(cancelRecommendation) | ||
1078 | { | ||
1079 | this.PhaseCount = phaseCount; | ||
1080 | } | ||
1081 | |||
1082 | /// <summary> | ||
1083 | /// Gets the number of phases that the engine will go through in apply. | ||
1084 | /// There are currently two possible phases: cache and execute. | ||
1085 | /// </summary> | ||
1086 | public int PhaseCount { get; private set; } | ||
1087 | } | ||
1088 | |||
1089 | /// <summary> | ||
1090 | /// Additional arguments used when the engine is about to start the elevated process. | ||
1091 | /// </summary> | ||
1092 | [Serializable] | ||
1093 | public class ElevateBeginEventArgs : CancellableHResultEventArgs | ||
1094 | { | ||
1095 | /// <summary> | ||
1096 | /// Creates a new instance of the <see cref="ElevateBeginEventArgs"/> class. | ||
1097 | /// </summary> | ||
1098 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1099 | public ElevateBeginEventArgs(bool cancelRecommendation) | ||
1100 | : base(cancelRecommendation) | ||
1101 | { | ||
1102 | } | ||
1103 | } | ||
1104 | |||
1105 | /// <summary> | ||
1106 | /// Additional arguments used when the engine has completed starting the elevated process. | ||
1107 | /// </summary> | ||
1108 | [Serializable] | ||
1109 | public class ElevateCompleteEventArgs : StatusEventArgs | ||
1110 | { | ||
1111 | /// <summary> | ||
1112 | /// Creates a new instance of the <see cref="ElevateCompleteEventArgs"/> class. | ||
1113 | /// </summary> | ||
1114 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1115 | public ElevateCompleteEventArgs(int hrStatus) | ||
1116 | : base(hrStatus) | ||
1117 | { | ||
1118 | } | ||
1119 | } | ||
1120 | |||
1121 | /// <summary> | ||
1122 | /// Additional arguments used when the engine has changed progress for the bundle installation. | ||
1123 | /// </summary> | ||
1124 | [Serializable] | ||
1125 | public class ProgressEventArgs : CancellableHResultEventArgs | ||
1126 | { | ||
1127 | /// <summary> | ||
1128 | /// Creates an new instance of the <see cref="ProgressEventArgs"/> class. | ||
1129 | /// </summary> | ||
1130 | /// <param name="progressPercentage">The percentage from 0 to 100 completed for a package.</param> | ||
1131 | /// <param name="overallPercentage">The percentage from 0 to 100 completed for the bundle.</param> | ||
1132 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1133 | public ProgressEventArgs(int progressPercentage, int overallPercentage, bool cancelRecommendation) | ||
1134 | : base(cancelRecommendation) | ||
1135 | { | ||
1136 | this.ProgressPercentage = progressPercentage; | ||
1137 | this.OverallPercentage = overallPercentage; | ||
1138 | } | ||
1139 | |||
1140 | /// <summary> | ||
1141 | /// Gets the percentage from 0 to 100 completed for a package. | ||
1142 | /// </summary> | ||
1143 | public int ProgressPercentage { get; private set; } | ||
1144 | |||
1145 | /// <summary> | ||
1146 | /// Gets the percentage from 0 to 100 completed for the bundle. | ||
1147 | /// </summary> | ||
1148 | public int OverallPercentage { get; private set; } | ||
1149 | } | ||
1150 | |||
1151 | /// <summary> | ||
1152 | /// Additional arguments used when the engine has encountered an error. | ||
1153 | /// </summary> | ||
1154 | [Serializable] | ||
1155 | public class ErrorEventArgs : ResultEventArgs | ||
1156 | { | ||
1157 | /// <summary> | ||
1158 | /// Creates a new instance of the <see cref="ErrorEventArgs"/> class. | ||
1159 | /// </summary> | ||
1160 | /// <param name="errorType">The error type.</param> | ||
1161 | /// <param name="packageId">The identity of the package that yielded the error.</param> | ||
1162 | /// <param name="errorCode">The error code.</param> | ||
1163 | /// <param name="errorMessage">The error message.</param> | ||
1164 | /// <param name="dwUIHint">Recommended display flags for an error dialog.</param> | ||
1165 | /// <param name="data">The exteded data for the error.</param> | ||
1166 | /// <param name="recommendation">Recommended result from engine.</param> | ||
1167 | /// <param name="result">The result to return to the engine.</param> | ||
1168 | public ErrorEventArgs(ErrorType errorType, string packageId, int errorCode, string errorMessage, int dwUIHint, string[] data, Result recommendation, Result result) | ||
1169 | : base(recommendation, result) | ||
1170 | { | ||
1171 | this.ErrorType = errorType; | ||
1172 | this.PackageId = packageId; | ||
1173 | this.ErrorCode = errorCode; | ||
1174 | this.ErrorMessage = errorMessage; | ||
1175 | this.UIHint = dwUIHint; | ||
1176 | this.Data = new ReadOnlyCollection<string>(data ?? new string[] { }); | ||
1177 | } | ||
1178 | |||
1179 | /// <summary> | ||
1180 | /// Gets the type of error that occurred. | ||
1181 | /// </summary> | ||
1182 | public ErrorType ErrorType { get; private set; } | ||
1183 | |||
1184 | /// <summary> | ||
1185 | /// Gets the identity of the package that yielded the error. | ||
1186 | /// </summary> | ||
1187 | public string PackageId { get; private set; } | ||
1188 | |||
1189 | /// <summary> | ||
1190 | /// Gets the error code. | ||
1191 | /// </summary> | ||
1192 | public int ErrorCode { get; private set; } | ||
1193 | |||
1194 | /// <summary> | ||
1195 | /// Gets the error message. | ||
1196 | /// </summary> | ||
1197 | public string ErrorMessage { get; private set; } | ||
1198 | |||
1199 | /// <summary> | ||
1200 | /// Gets the recommended display flags for an error dialog. | ||
1201 | /// </summary> | ||
1202 | public int UIHint { get; private set; } | ||
1203 | |||
1204 | /// <summary> | ||
1205 | /// Gets the extended data for the error. | ||
1206 | /// </summary> | ||
1207 | public IList<string> Data { get; private set; } | ||
1208 | } | ||
1209 | |||
1210 | /// <summary> | ||
1211 | /// Additional arguments used when the engine has begun registering the location and visibility of the bundle. | ||
1212 | /// </summary> | ||
1213 | [Serializable] | ||
1214 | public class RegisterBeginEventArgs : CancellableHResultEventArgs | ||
1215 | { | ||
1216 | /// <summary> | ||
1217 | /// Creates a new instance of the <see cref="RegisterBeginEventArgs"/> class. | ||
1218 | /// </summary> | ||
1219 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1220 | public RegisterBeginEventArgs(bool cancelRecommendation) | ||
1221 | : base(cancelRecommendation) | ||
1222 | { | ||
1223 | } | ||
1224 | } | ||
1225 | |||
1226 | /// <summary> | ||
1227 | /// Additional arguments used when the engine has completed registering the location and visilibity of the bundle. | ||
1228 | /// </summary> | ||
1229 | [Serializable] | ||
1230 | public class RegisterCompleteEventArgs : StatusEventArgs | ||
1231 | { | ||
1232 | /// <summary> | ||
1233 | /// Creates a new instance of the <see cref="RegisterCompleteEventArgs"/> class. | ||
1234 | /// </summary> | ||
1235 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1236 | public RegisterCompleteEventArgs(int hrStatus) | ||
1237 | : base(hrStatus) | ||
1238 | { | ||
1239 | } | ||
1240 | } | ||
1241 | |||
1242 | /// <summary> | ||
1243 | /// Additional arguments used when the engine has begun removing the registration for the location and visibility of the bundle. | ||
1244 | /// </summary> | ||
1245 | [Serializable] | ||
1246 | public class UnregisterBeginEventArgs : CancellableHResultEventArgs | ||
1247 | { | ||
1248 | /// <summary> | ||
1249 | /// Creates a new instance of the <see cref="UnregisterBeginEventArgs"/> class. | ||
1250 | /// </summary> | ||
1251 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1252 | public UnregisterBeginEventArgs(bool cancelRecommendation) | ||
1253 | : base(cancelRecommendation) | ||
1254 | { | ||
1255 | } | ||
1256 | } | ||
1257 | |||
1258 | /// <summary> | ||
1259 | /// Additional arguments used when the engine has completed removing the registration for the location and visibility of the bundle. | ||
1260 | /// </summary> | ||
1261 | [Serializable] | ||
1262 | public class UnregisterCompleteEventArgs : StatusEventArgs | ||
1263 | { | ||
1264 | /// <summary> | ||
1265 | /// Creates a new instance of the <see cref="UnregisterCompleteEventArgs"/> class. | ||
1266 | /// </summary> | ||
1267 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1268 | public UnregisterCompleteEventArgs(int hrStatus) | ||
1269 | : base(hrStatus) | ||
1270 | { | ||
1271 | } | ||
1272 | } | ||
1273 | |||
1274 | /// <summary> | ||
1275 | /// Additional arguments used when the engine has begun caching the installation sources. | ||
1276 | /// </summary> | ||
1277 | [Serializable] | ||
1278 | public class CacheBeginEventArgs : CancellableHResultEventArgs | ||
1279 | { | ||
1280 | /// <summary> | ||
1281 | /// Creates a new instance of the <see cref="CacheBeginEventArgs"/> class. | ||
1282 | /// </summary> | ||
1283 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1284 | public CacheBeginEventArgs(bool cancelRecommendation) | ||
1285 | : base(cancelRecommendation) | ||
1286 | { | ||
1287 | } | ||
1288 | } | ||
1289 | |||
1290 | /// <summary> | ||
1291 | /// Additional arguments used when the engine begins to acquire containers or payloads. | ||
1292 | /// </summary> | ||
1293 | [Serializable] | ||
1294 | public class CacheAcquireBeginEventArgs : CancellableHResultEventArgs | ||
1295 | { | ||
1296 | /// <summary> | ||
1297 | /// Creates a new instance of the <see cref="CacheAcquireBeginEventArgs"/> class. | ||
1298 | /// </summary> | ||
1299 | public CacheAcquireBeginEventArgs(string packageOrContainerId, string payloadId, CacheOperation operation, string source, bool cancelRecommendation) | ||
1300 | : base(cancelRecommendation) | ||
1301 | { | ||
1302 | this.PackageOrContainerId = packageOrContainerId; | ||
1303 | this.PayloadId = payloadId; | ||
1304 | this.Operation = operation; | ||
1305 | this.Source = source; | ||
1306 | } | ||
1307 | |||
1308 | /// <summary> | ||
1309 | /// Gets the identifier of the container or package. | ||
1310 | /// </summary> | ||
1311 | public string PackageOrContainerId { get; private set; } | ||
1312 | |||
1313 | /// <summary> | ||
1314 | /// Gets the identifier of the payload (if acquiring a payload). | ||
1315 | /// </summary> | ||
1316 | public string PayloadId { get; private set; } | ||
1317 | |||
1318 | /// <summary> | ||
1319 | /// Gets the cache acquire operation. | ||
1320 | /// </summary> | ||
1321 | public CacheOperation Operation { get; private set; } | ||
1322 | |||
1323 | /// <summary> | ||
1324 | /// Gets the source of the container or payload. | ||
1325 | /// </summary> | ||
1326 | public string Source { get; private set; } | ||
1327 | } | ||
1328 | |||
1329 | /// <summary> | ||
1330 | /// Additional arguments used when the engine acquires some part of a container or payload. | ||
1331 | /// </summary> | ||
1332 | [Serializable] | ||
1333 | public class CacheAcquireProgressEventArgs : CancellableHResultEventArgs | ||
1334 | { | ||
1335 | /// <summary> | ||
1336 | /// Creates a new instance of the <see cref="CacheAcquireBeginEventArgs"/> class. | ||
1337 | /// </summary> | ||
1338 | public CacheAcquireProgressEventArgs(string packageOrContainerId, string payloadId, long progress, long total, int overallPercentage, bool cancelRecommendation) | ||
1339 | : base(cancelRecommendation) | ||
1340 | { | ||
1341 | this.PackageOrContainerId = packageOrContainerId; | ||
1342 | this.PayloadId = payloadId; | ||
1343 | this.Progress = progress; | ||
1344 | this.Total = total; | ||
1345 | this.OverallPercentage = overallPercentage; | ||
1346 | } | ||
1347 | |||
1348 | /// <summary> | ||
1349 | /// Gets the identifier of the container or package. | ||
1350 | /// </summary> | ||
1351 | public string PackageOrContainerId { get; private set; } | ||
1352 | |||
1353 | /// <summary> | ||
1354 | /// Gets the identifier of the payload (if acquiring a payload). | ||
1355 | /// </summary> | ||
1356 | public string PayloadId { get; private set; } | ||
1357 | |||
1358 | /// <summary> | ||
1359 | /// Gets the number of bytes cached thus far. | ||
1360 | /// </summary> | ||
1361 | public long Progress { get; private set; } | ||
1362 | |||
1363 | /// <summary> | ||
1364 | /// Gets the total bytes to cache. | ||
1365 | /// </summary> | ||
1366 | public long Total { get; private set; } | ||
1367 | |||
1368 | /// <summary> | ||
1369 | /// Gets the overall percentage of progress of caching. | ||
1370 | /// </summary> | ||
1371 | public int OverallPercentage { get; private set; } | ||
1372 | } | ||
1373 | |||
1374 | /// <summary> | ||
1375 | /// Additional arguments used when the engine completes the acquisition of a container or payload. | ||
1376 | /// </summary> | ||
1377 | [Serializable] | ||
1378 | public class CacheAcquireCompleteEventArgs : ActionEventArgs<BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION> | ||
1379 | { | ||
1380 | /// <summary> | ||
1381 | /// Creates a new instance of the <see cref="CacheAcquireCompleteEventArgs"/> class. | ||
1382 | /// </summary> | ||
1383 | public CacheAcquireCompleteEventArgs(string packageOrContainerId, string payloadId, int hrStatus, BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION recommendation, BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION action) | ||
1384 | : base(hrStatus, recommendation, action) | ||
1385 | { | ||
1386 | this.PackageOrContainerId = packageOrContainerId; | ||
1387 | this.PayloadId = payloadId; | ||
1388 | } | ||
1389 | |||
1390 | /// <summary> | ||
1391 | /// Gets the identifier of the container or package. | ||
1392 | /// </summary> | ||
1393 | public string PackageOrContainerId { get; private set; } | ||
1394 | |||
1395 | /// <summary> | ||
1396 | /// Gets the identifier of the payload (if acquiring a payload). | ||
1397 | /// </summary> | ||
1398 | public string PayloadId { get; private set; } | ||
1399 | } | ||
1400 | |||
1401 | /// <summary> | ||
1402 | /// Additional arguments used when the engine starts the verification of a payload. | ||
1403 | /// </summary> | ||
1404 | [Serializable] | ||
1405 | public class CacheVerifyBeginEventArgs : CancellableHResultEventArgs | ||
1406 | { | ||
1407 | /// <summary> | ||
1408 | /// Creates a new instance of the <see cref="CacheVerifyBeginEventArgs"/> class. | ||
1409 | /// </summary> | ||
1410 | public CacheVerifyBeginEventArgs(string packageId, string payloadId, bool cancelRecommendation) | ||
1411 | : base(cancelRecommendation) | ||
1412 | { | ||
1413 | this.PackageId = packageId; | ||
1414 | this.PayloadId = payloadId; | ||
1415 | } | ||
1416 | |||
1417 | /// <summary> | ||
1418 | /// Gets the identifier of the package. | ||
1419 | /// </summary> | ||
1420 | public string PackageId { get; private set; } | ||
1421 | |||
1422 | /// <summary> | ||
1423 | /// Gets the identifier of the payload. | ||
1424 | /// </summary> | ||
1425 | public string PayloadId { get; private set; } | ||
1426 | } | ||
1427 | |||
1428 | /// <summary> | ||
1429 | /// Additional arguments used when the engine completes the verification of a payload. | ||
1430 | /// </summary> | ||
1431 | [Serializable] | ||
1432 | public class CacheVerifyCompleteEventArgs : ActionEventArgs<BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION> | ||
1433 | { | ||
1434 | /// <summary> | ||
1435 | /// Creates a new instance of the <see cref="CacheVerifyCompleteEventArgs"/> class. | ||
1436 | /// </summary> | ||
1437 | public CacheVerifyCompleteEventArgs(string packageId, string payloadId, int hrStatus, BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION recommendation, BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION action) | ||
1438 | : base(hrStatus, recommendation, action) | ||
1439 | { | ||
1440 | this.PackageId = packageId; | ||
1441 | this.PayloadId = payloadId; | ||
1442 | } | ||
1443 | |||
1444 | /// <summary> | ||
1445 | /// Gets the identifier of the package. | ||
1446 | /// </summary> | ||
1447 | public string PackageId { get; private set; } | ||
1448 | |||
1449 | /// <summary> | ||
1450 | /// Gets the identifier of the payload. | ||
1451 | /// </summary> | ||
1452 | public string PayloadId { get; private set; } | ||
1453 | } | ||
1454 | |||
1455 | /// <summary> | ||
1456 | /// Additional arguments used after the engine has cached the installation sources. | ||
1457 | /// </summary> | ||
1458 | [Serializable] | ||
1459 | public class CacheCompleteEventArgs : StatusEventArgs | ||
1460 | { | ||
1461 | /// <summary> | ||
1462 | /// Creates a new instance of the <see cref="CacheCompleteEventArgs"/> class. | ||
1463 | /// </summary> | ||
1464 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1465 | public CacheCompleteEventArgs(int hrStatus) | ||
1466 | : base(hrStatus) | ||
1467 | { | ||
1468 | } | ||
1469 | } | ||
1470 | |||
1471 | /// <summary> | ||
1472 | /// Additional arguments used when the engine has begun installing packages. | ||
1473 | /// </summary> | ||
1474 | [Serializable] | ||
1475 | public class ExecuteBeginEventArgs : CancellableHResultEventArgs | ||
1476 | { | ||
1477 | /// <summary> | ||
1478 | /// Creates a new instance of the <see cref="ExecuteBeginEventArgs"/> class. | ||
1479 | /// </summary> | ||
1480 | /// <param name="packageCount">The number of packages to act on.</param> | ||
1481 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1482 | public ExecuteBeginEventArgs(int packageCount, bool cancelRecommendation) | ||
1483 | : base(cancelRecommendation) | ||
1484 | { | ||
1485 | this.PackageCount = packageCount; | ||
1486 | } | ||
1487 | |||
1488 | /// <summary> | ||
1489 | /// Gets the number of packages to act on. | ||
1490 | /// </summary> | ||
1491 | public int PackageCount { get; private set; } | ||
1492 | } | ||
1493 | |||
1494 | /// <summary> | ||
1495 | /// Additional arguments used when the engine has begun installing a specific package. | ||
1496 | /// </summary> | ||
1497 | [Serializable] | ||
1498 | public class ExecutePackageBeginEventArgs : CancellableHResultEventArgs | ||
1499 | { | ||
1500 | /// <summary> | ||
1501 | /// Creates a new instance of the <see cref="ExecutePackageBeginEventArgs"/> class. | ||
1502 | /// </summary> | ||
1503 | /// <param name="packageId">The identity of the package to act on.</param> | ||
1504 | /// <param name="shouldExecute">Whether the package should really be acted on.</param> | ||
1505 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1506 | public ExecutePackageBeginEventArgs(string packageId, bool shouldExecute, bool cancelRecommendation) | ||
1507 | : base(cancelRecommendation) | ||
1508 | { | ||
1509 | this.PackageId = packageId; | ||
1510 | this.ShouldExecute = shouldExecute; | ||
1511 | } | ||
1512 | |||
1513 | /// <summary> | ||
1514 | /// Gets the identity of the package to act on. | ||
1515 | /// </summary> | ||
1516 | public string PackageId { get; private set; } | ||
1517 | |||
1518 | /// <summary> | ||
1519 | /// Gets whether the package should really be acted on. | ||
1520 | /// </summary> | ||
1521 | public bool ShouldExecute { get; private set; } | ||
1522 | } | ||
1523 | |||
1524 | /// <summary> | ||
1525 | /// Additional arguments used when the engine executes one or more patches targeting a product. | ||
1526 | /// </summary> | ||
1527 | [Serializable] | ||
1528 | public class ExecutePatchTargetEventArgs : CancellableHResultEventArgs | ||
1529 | { | ||
1530 | /// <summary> | ||
1531 | /// Creates a new instance of the <see cref="ExecutePatchTargetEventArgs"/> class. | ||
1532 | /// </summary> | ||
1533 | /// <param name="packageId">The identity of the package to act on.</param> | ||
1534 | /// <param name="targetProductCode">The product code of the target of the patch.</param> | ||
1535 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1536 | public ExecutePatchTargetEventArgs(string packageId, string targetProductCode, bool cancelRecommendation) | ||
1537 | : base(cancelRecommendation) | ||
1538 | { | ||
1539 | this.PackageId = packageId; | ||
1540 | this.TargetProductCode = targetProductCode; | ||
1541 | } | ||
1542 | |||
1543 | /// <summary> | ||
1544 | /// Gets the identity of the package to act on. | ||
1545 | /// </summary> | ||
1546 | public string PackageId { get; private set; } | ||
1547 | |||
1548 | /// <summary> | ||
1549 | /// Gets the product code being targeted. | ||
1550 | /// </summary> | ||
1551 | public string TargetProductCode { get; private set; } | ||
1552 | } | ||
1553 | |||
1554 | /// <summary> | ||
1555 | /// Additional arguments used when Windows Installer sends an installation message. | ||
1556 | /// </summary> | ||
1557 | [Serializable] | ||
1558 | public class ExecuteMsiMessageEventArgs : ResultEventArgs | ||
1559 | { | ||
1560 | /// <summary> | ||
1561 | /// Creates a new instance of the <see cref="ExecuteMsiMessageEventArgs"/> class. | ||
1562 | /// </summary> | ||
1563 | /// <param name="packageId">The identity of the package that yielded this message.</param> | ||
1564 | /// <param name="messageType">The type of this message.</param> | ||
1565 | /// <param name="dwUIHint">Recommended display flags for this message.</param> | ||
1566 | /// <param name="message">The message.</param> | ||
1567 | /// <param name="data">The extended data for the message.</param> | ||
1568 | /// <param name="recommendation">Recommended result from engine.</param> | ||
1569 | /// <param name="result">The result to return to the engine.</param> | ||
1570 | public ExecuteMsiMessageEventArgs(string packageId, InstallMessage messageType, int dwUIHint, string message, string[] data, Result recommendation, Result result) | ||
1571 | : base(recommendation, result) | ||
1572 | { | ||
1573 | this.PackageId = packageId; | ||
1574 | this.MessageType = messageType; | ||
1575 | this.UIHint = dwUIHint; | ||
1576 | this.Message = message; | ||
1577 | this.Data = new ReadOnlyCollection<string>(data ?? new string[] { }); | ||
1578 | } | ||
1579 | |||
1580 | /// <summary> | ||
1581 | /// Gets the identity of the package that yielded this message. | ||
1582 | /// </summary> | ||
1583 | public string PackageId { get; private set; } | ||
1584 | |||
1585 | /// <summary> | ||
1586 | /// Gets the type of this message. | ||
1587 | /// </summary> | ||
1588 | public InstallMessage MessageType { get; private set; } | ||
1589 | |||
1590 | /// <summary> | ||
1591 | /// Gets the recommended display flags for this message. | ||
1592 | /// </summary> | ||
1593 | public int UIHint { get; private set; } | ||
1594 | |||
1595 | /// <summary> | ||
1596 | /// Gets the message. | ||
1597 | /// </summary> | ||
1598 | public string Message { get; private set; } | ||
1599 | |||
1600 | /// <summary> | ||
1601 | /// Gets the extended data for the message. | ||
1602 | /// </summary> | ||
1603 | public IList<string> Data { get; private set; } | ||
1604 | } | ||
1605 | |||
1606 | /// <summary> | ||
1607 | /// Additional arugments used for file in use installation messages. | ||
1608 | /// </summary> | ||
1609 | [Serializable] | ||
1610 | public class ExecuteFilesInUseEventArgs : ResultEventArgs | ||
1611 | { | ||
1612 | /// <summary> | ||
1613 | /// Creates a new instance of the <see cref="ExecuteFilesInUseEventArgs"/> class. | ||
1614 | /// </summary> | ||
1615 | /// <param name="packageId">The identity of the package that yielded the files in use message.</param> | ||
1616 | /// <param name="files">The list of files in use.</param> | ||
1617 | /// <param name="recommendation">Recommended result from engine.</param> | ||
1618 | /// <param name="result">The result to return to the engine.</param> | ||
1619 | public ExecuteFilesInUseEventArgs(string packageId, string[] files, Result recommendation, Result result) | ||
1620 | : base(recommendation, result) | ||
1621 | { | ||
1622 | this.PackageId = packageId; | ||
1623 | this.Files = new ReadOnlyCollection<string>(files ?? new string[] { }); | ||
1624 | } | ||
1625 | |||
1626 | /// <summary> | ||
1627 | /// Gets the identity of the package that yielded the files in use message. | ||
1628 | /// </summary> | ||
1629 | public string PackageId { get; private set; } | ||
1630 | |||
1631 | /// <summary> | ||
1632 | /// Gets the list of files in use. | ||
1633 | /// </summary> | ||
1634 | public IList<string> Files { get; private set; } | ||
1635 | } | ||
1636 | |||
1637 | /// <summary> | ||
1638 | /// Additional arguments used when the engine has completed installing a specific package. | ||
1639 | /// </summary> | ||
1640 | [Serializable] | ||
1641 | public class ExecutePackageCompleteEventArgs : ActionEventArgs<BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION> | ||
1642 | { | ||
1643 | /// <summary> | ||
1644 | /// Creates a new instance of the <see cref="ExecutePackageCompleteEventArgs"/> class. | ||
1645 | /// </summary> | ||
1646 | /// <param name="packageId">The identity of the package that was acted on.</param> | ||
1647 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1648 | /// <param name="restart">Whether a restart is required.</param> | ||
1649 | /// <param name="recommendation">Recommended action from engine.</param> | ||
1650 | /// <param name="action">The action to perform.</param> | ||
1651 | public ExecutePackageCompleteEventArgs(string packageId, int hrStatus, ApplyRestart restart, BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION recommendation, BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION action) | ||
1652 | : base(hrStatus, recommendation, action) | ||
1653 | { | ||
1654 | this.PackageId = packageId; | ||
1655 | this.Restart = restart; | ||
1656 | } | ||
1657 | |||
1658 | /// <summary> | ||
1659 | /// Gets the identity of the package that was acted on. | ||
1660 | /// </summary> | ||
1661 | public string PackageId { get; private set; } | ||
1662 | |||
1663 | /// <summary> | ||
1664 | /// Gets the package restart state after being applied. | ||
1665 | /// </summary> | ||
1666 | public ApplyRestart Restart { get; private set; } | ||
1667 | } | ||
1668 | |||
1669 | /// <summary> | ||
1670 | /// Additional arguments used when the engine has completed installing packages. | ||
1671 | /// </summary> | ||
1672 | [Serializable] | ||
1673 | public class ExecuteCompleteEventArgs : StatusEventArgs | ||
1674 | { | ||
1675 | /// <summary> | ||
1676 | /// Creates a new instance of the <see cref="ExecuteCompleteEventArgs"/> class. | ||
1677 | /// </summary> | ||
1678 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1679 | public ExecuteCompleteEventArgs(int hrStatus) | ||
1680 | : base(hrStatus) | ||
1681 | { | ||
1682 | } | ||
1683 | } | ||
1684 | |||
1685 | /// <summary> | ||
1686 | /// Additional arguments used when the engine has completed installing the bundle. | ||
1687 | /// </summary> | ||
1688 | [Serializable] | ||
1689 | public class ApplyCompleteEventArgs : ActionEventArgs<BOOTSTRAPPER_APPLYCOMPLETE_ACTION> | ||
1690 | { | ||
1691 | /// <summary> | ||
1692 | /// Creates a new instance of the <see cref="ApplyCompleteEventArgs"/> clas. | ||
1693 | /// </summary> | ||
1694 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1695 | /// <param name="restart">Whether a restart is required.</param> | ||
1696 | /// <param name="recommendation">Recommended action from engine.</param> | ||
1697 | /// <param name="action">The action to perform.</param> | ||
1698 | public ApplyCompleteEventArgs(int hrStatus, ApplyRestart restart, BOOTSTRAPPER_APPLYCOMPLETE_ACTION recommendation, BOOTSTRAPPER_APPLYCOMPLETE_ACTION action) | ||
1699 | : base(hrStatus, recommendation, action) | ||
1700 | { | ||
1701 | this.Restart = restart; | ||
1702 | } | ||
1703 | |||
1704 | /// <summary> | ||
1705 | /// Gets the apply restart state when complete. | ||
1706 | /// </summary> | ||
1707 | public ApplyRestart Restart { get; private set; } | ||
1708 | } | ||
1709 | |||
1710 | /// <summary> | ||
1711 | /// Additional arguments used by the engine to allow the BA to change the source | ||
1712 | /// using <see cref="Engine.SetLocalSource"/> or <see cref="Engine.SetDownloadSource"/>. | ||
1713 | /// </summary> | ||
1714 | [Serializable] | ||
1715 | public class ResolveSourceEventArgs : CancellableHResultEventArgs | ||
1716 | { | ||
1717 | /// <summary> | ||
1718 | /// Creates a new instance of the <see cref="ResolveSourceEventArgs"/> class. | ||
1719 | /// </summary> | ||
1720 | /// <param name="packageOrContainerId">The identity of the package or container that requires source.</param> | ||
1721 | /// <param name="payloadId">The identity of the payload that requires source.</param> | ||
1722 | /// <param name="localSource">The current path used for source resolution.</param> | ||
1723 | /// <param name="downloadSource">Optional URL to download container or payload.</param> | ||
1724 | /// <param name="recommendation">The recommended action from the engine.</param> | ||
1725 | /// <param name="action">The action to perform.</param> | ||
1726 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1727 | public ResolveSourceEventArgs(string packageOrContainerId, string payloadId, string localSource, string downloadSource, BOOTSTRAPPER_RESOLVESOURCE_ACTION recommendation, BOOTSTRAPPER_RESOLVESOURCE_ACTION action, bool cancelRecommendation) | ||
1728 | : base(cancelRecommendation) | ||
1729 | { | ||
1730 | this.PackageOrContainerId = packageOrContainerId; | ||
1731 | this.PayloadId = payloadId; | ||
1732 | this.LocalSource = localSource; | ||
1733 | this.DownloadSource = downloadSource; | ||
1734 | this.Recommendation = recommendation; | ||
1735 | this.Action = action; | ||
1736 | } | ||
1737 | |||
1738 | /// <summary> | ||
1739 | /// Gets the identity of the package or container that requires source. | ||
1740 | /// </summary> | ||
1741 | public string PackageOrContainerId { get; private set; } | ||
1742 | |||
1743 | /// <summary> | ||
1744 | /// Gets the identity of the payload that requires source. | ||
1745 | /// </summary> | ||
1746 | public string PayloadId { get; private set; } | ||
1747 | |||
1748 | /// <summary> | ||
1749 | /// Gets the current path used for source resolution. | ||
1750 | /// </summary> | ||
1751 | public string LocalSource { get; private set; } | ||
1752 | |||
1753 | /// <summary> | ||
1754 | /// Gets the optional URL to download container or payload. | ||
1755 | /// </summary> | ||
1756 | public string DownloadSource { get; private set; } | ||
1757 | |||
1758 | /// <summary> | ||
1759 | /// Gets the recommended action from the engine. | ||
1760 | /// </summary> | ||
1761 | public BOOTSTRAPPER_RESOLVESOURCE_ACTION Recommendation { get; private set; } | ||
1762 | |||
1763 | /// <summary> | ||
1764 | /// Gets or sets the action to perform. | ||
1765 | /// </summary> | ||
1766 | public BOOTSTRAPPER_RESOLVESOURCE_ACTION Action { get; set; } | ||
1767 | } | ||
1768 | |||
1769 | /// <summary> | ||
1770 | /// Additional arguments used by the engine when it has begun caching a specific package. | ||
1771 | /// </summary> | ||
1772 | [Serializable] | ||
1773 | public class CachePackageBeginEventArgs : CancellableHResultEventArgs | ||
1774 | { | ||
1775 | /// <summary> | ||
1776 | /// Creates a new instance of the <see cref="CachePackageBeginEventArgs"/> class. | ||
1777 | /// </summary> | ||
1778 | /// <param name="packageId">The identity of the package that is being cached.</param> | ||
1779 | /// <param name="cachePayloads">Number of payloads to be cached.</param> | ||
1780 | /// <param name="packageCacheSize">The size on disk required by the specific package.</param> | ||
1781 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1782 | public CachePackageBeginEventArgs(string packageId, int cachePayloads, long packageCacheSize, bool cancelRecommendation) | ||
1783 | : base(cancelRecommendation) | ||
1784 | { | ||
1785 | this.PackageId = packageId; | ||
1786 | this.CachePayloads = cachePayloads; | ||
1787 | this.PackageCacheSize = packageCacheSize; | ||
1788 | } | ||
1789 | |||
1790 | /// <summary> | ||
1791 | /// Gets the identity of the package that is being cached. | ||
1792 | /// </summary> | ||
1793 | public string PackageId { get; private set; } | ||
1794 | |||
1795 | /// <summary> | ||
1796 | /// Gets number of payloads to be cached. | ||
1797 | /// </summary> | ||
1798 | public long CachePayloads { get; private set; } | ||
1799 | |||
1800 | /// <summary> | ||
1801 | /// Gets the size on disk required by the specific package. | ||
1802 | /// </summary> | ||
1803 | public long PackageCacheSize { get; private set; } | ||
1804 | } | ||
1805 | |||
1806 | /// <summary> | ||
1807 | /// Additional arguments passed by the engine when it has completed caching a specific package. | ||
1808 | /// </summary> | ||
1809 | [Serializable] | ||
1810 | public class CachePackageCompleteEventArgs : ActionEventArgs<BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION> | ||
1811 | { | ||
1812 | /// <summary> | ||
1813 | /// Creates a new instance of the <see cref="CachePackageCompleteEventArgs"/> class. | ||
1814 | /// </summary> | ||
1815 | /// <param name="packageId">The identity of the package that was cached.</param> | ||
1816 | /// <param name="hrStatus">The return code of the operation.</param> | ||
1817 | /// <param name="recommendation">Recommended action from engine.</param> | ||
1818 | /// <param name="action">The action to perform.</param> | ||
1819 | public CachePackageCompleteEventArgs(string packageId, int hrStatus, BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION recommendation, BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION action) | ||
1820 | : base(hrStatus, recommendation, action) | ||
1821 | { | ||
1822 | this.PackageId = packageId; | ||
1823 | } | ||
1824 | |||
1825 | /// <summary> | ||
1826 | /// Gets the identity of the package that was cached. | ||
1827 | /// </summary> | ||
1828 | public string PackageId { get; private set; } | ||
1829 | } | ||
1830 | |||
1831 | /// <summary> | ||
1832 | /// Additional arguments passed by the engine while executing on payload. | ||
1833 | /// </summary> | ||
1834 | [Serializable] | ||
1835 | public class ExecuteProgressEventArgs : CancellableHResultEventArgs | ||
1836 | { | ||
1837 | /// <summary> | ||
1838 | /// Creates a new instance of the <see cref="ExecuteProgressEventArgs"/> class. | ||
1839 | /// </summary> | ||
1840 | /// <param name="packageId">The identifier of the package being executed.</param> | ||
1841 | /// <param name="progressPercentage">The percentage from 0 to 100 of the execution progress for a single payload.</param> | ||
1842 | /// <param name="overallPercentage">The percentage from 0 to 100 of the execution progress for all payload.</param> | ||
1843 | /// <param name="cancelRecommendation">The recommendation from the engine.</param> | ||
1844 | public ExecuteProgressEventArgs(string packageId, int progressPercentage, int overallPercentage, bool cancelRecommendation) | ||
1845 | : base(cancelRecommendation) | ||
1846 | { | ||
1847 | this.PackageId = packageId; | ||
1848 | this.ProgressPercentage = progressPercentage; | ||
1849 | this.OverallPercentage = overallPercentage; | ||
1850 | } | ||
1851 | |||
1852 | /// <summary> | ||
1853 | /// Gets the identity of the package that was executed. | ||
1854 | /// </summary> | ||
1855 | public string PackageId { get; private set; } | ||
1856 | |||
1857 | /// <summary> | ||
1858 | /// Gets the percentage from 0 to 100 of the execution progress for a single payload. | ||
1859 | /// </summary> | ||
1860 | public int ProgressPercentage { get; private set; } | ||
1861 | |||
1862 | /// <summary> | ||
1863 | /// Gets the percentage from 0 to 100 of the execution progress for all payloads. | ||
1864 | /// </summary> | ||
1865 | public int OverallPercentage { get; private set; } | ||
1866 | } | ||
1867 | |||
1868 | /// <summary> | ||
1869 | /// Additional arguments passed by the engine before it tries to launch the preapproved executable. | ||
1870 | /// </summary> | ||
1871 | [Serializable] | ||
1872 | public class LaunchApprovedExeBeginArgs : CancellableHResultEventArgs | ||
1873 | { | ||
1874 | public LaunchApprovedExeBeginArgs(bool cancelRecommendation) | ||
1875 | : base(cancelRecommendation) | ||
1876 | { | ||
1877 | } | ||
1878 | } | ||
1879 | |||
1880 | /// <summary> | ||
1881 | /// Additional arguments passed by the engine after it finished trying to launch the preapproved executable. | ||
1882 | /// </summary> | ||
1883 | [Serializable] | ||
1884 | public class LaunchApprovedExeCompleteArgs : StatusEventArgs | ||
1885 | { | ||
1886 | private int processId; | ||
1887 | |||
1888 | public LaunchApprovedExeCompleteArgs(int hrStatus, int processId) | ||
1889 | : base(hrStatus) | ||
1890 | { | ||
1891 | this.processId = processId; | ||
1892 | } | ||
1893 | |||
1894 | /// <summary> | ||
1895 | /// Gets the ProcessId of the process that was launched. | ||
1896 | /// This is only valid if the status reports success. | ||
1897 | /// </summary> | ||
1898 | public int ProcessId | ||
1899 | { | ||
1900 | get { return this.processId; } | ||
1901 | } | ||
1902 | } | ||
1903 | } | ||
diff --git a/src/WixToolset.Mba.Core/Exceptions.cs b/src/WixToolset.Mba.Core/Exceptions.cs new file mode 100644 index 00000000..360b360d --- /dev/null +++ b/src/WixToolset.Mba.Core/Exceptions.cs | |||
@@ -0,0 +1,145 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Runtime.Serialization; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Base class for exception returned to the bootstrapper application host. | ||
10 | /// </summary> | ||
11 | [Serializable] | ||
12 | public abstract class BootstrapperException : Exception | ||
13 | { | ||
14 | /// <summary> | ||
15 | /// Creates an instance of the <see cref="BootstrapperException"/> base class with the given HRESULT. | ||
16 | /// </summary> | ||
17 | /// <param name="hr">The HRESULT for the exception that is used by the bootstrapper application host.</param> | ||
18 | public BootstrapperException(int hr) | ||
19 | { | ||
20 | this.HResult = hr; | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Initializes a new instance of the <see cref="BootstrapperException"/> class. | ||
25 | /// </summary> | ||
26 | /// <param name="message">Exception message.</param> | ||
27 | public BootstrapperException(string message) | ||
28 | : base(message) | ||
29 | { | ||
30 | } | ||
31 | |||
32 | /// <summary> | ||
33 | /// Initializes a new instance of the <see cref="BootstrapperException"/> class. | ||
34 | /// </summary> | ||
35 | /// <param name="message">Exception message</param> | ||
36 | /// <param name="innerException">Inner exception associated with this one</param> | ||
37 | public BootstrapperException(string message, Exception innerException) | ||
38 | : base(message, innerException) | ||
39 | { | ||
40 | } | ||
41 | |||
42 | /// <summary> | ||
43 | /// Initializes a new instance of the <see cref="BootstrapperException"/> class. | ||
44 | /// </summary> | ||
45 | /// <param name="info">Serialization information for this exception</param> | ||
46 | /// <param name="context">Streaming context to serialize to</param> | ||
47 | protected BootstrapperException(SerializationInfo info, StreamingContext context) | ||
48 | : base(info, context) | ||
49 | { | ||
50 | } | ||
51 | } | ||
52 | |||
53 | /// <summary> | ||
54 | /// The bootstrapper application assembly loaded by the host does not contain exactly one instance of the | ||
55 | /// <see cref="BootstrapperApplicationFactoryAttribute"/> class. | ||
56 | /// </summary> | ||
57 | /// <seealso cref="BootstrapperApplicationFactoryAttribute"/> | ||
58 | [Serializable] | ||
59 | public class MissingAttributeException : BootstrapperException | ||
60 | { | ||
61 | /// <summary> | ||
62 | /// Creates a new instance of the <see cref="MissingAttributeException"/> class. | ||
63 | /// </summary> | ||
64 | public MissingAttributeException() | ||
65 | : base(NativeMethods.E_NOTFOUND) | ||
66 | { | ||
67 | } | ||
68 | |||
69 | /// <summary> | ||
70 | /// Initializes a new instance of the <see cref="MissingAttributeException"/> class. | ||
71 | /// </summary> | ||
72 | /// <param name="message">Exception message.</param> | ||
73 | public MissingAttributeException(string message) | ||
74 | : base(message) | ||
75 | { | ||
76 | } | ||
77 | |||
78 | /// <summary> | ||
79 | /// Initializes a new instance of the <see cref="MissingAttributeException"/> class. | ||
80 | /// </summary> | ||
81 | /// <param name="message">Exception message</param> | ||
82 | /// <param name="innerException">Inner exception associated with this one</param> | ||
83 | public MissingAttributeException(string message, Exception innerException) | ||
84 | : base(message, innerException) | ||
85 | { | ||
86 | } | ||
87 | |||
88 | /// <summary> | ||
89 | /// Initializes a new instance of the <see cref="MissingAttributeException"/> class. | ||
90 | /// </summary> | ||
91 | /// <param name="info">Serialization information for this exception</param> | ||
92 | /// <param name="context">Streaming context to serialize to</param> | ||
93 | protected MissingAttributeException(SerializationInfo info, StreamingContext context) | ||
94 | : base(info, context) | ||
95 | { | ||
96 | } | ||
97 | } | ||
98 | |||
99 | /// <summary> | ||
100 | /// The bootstrapper application factory specified by the <see cref="BootstrapperApplicationFactoryAttribute"/> | ||
101 | /// does not extend the <see cref="IBootstrapperApplicationFactory"/> base class. | ||
102 | /// </summary> | ||
103 | /// <seealso cref="BaseBootstrapperApplicationFactory"/> | ||
104 | /// <seealso cref="BootstrapperApplicationFactoryAttribute"/> | ||
105 | [Serializable] | ||
106 | public class InvalidBootstrapperApplicationFactoryException : BootstrapperException | ||
107 | { | ||
108 | /// <summary> | ||
109 | /// Creates a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class. | ||
110 | /// </summary> | ||
111 | public InvalidBootstrapperApplicationFactoryException() | ||
112 | : base(NativeMethods.E_UNEXPECTED) | ||
113 | { | ||
114 | } | ||
115 | |||
116 | /// <summary> | ||
117 | /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class. | ||
118 | /// </summary> | ||
119 | /// <param name="message">Exception message.</param> | ||
120 | public InvalidBootstrapperApplicationFactoryException(string message) | ||
121 | : base(message) | ||
122 | { | ||
123 | } | ||
124 | |||
125 | /// <summary> | ||
126 | /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class. | ||
127 | /// </summary> | ||
128 | /// <param name="message">Exception message</param> | ||
129 | /// <param name="innerException">Inner exception associated with this one</param> | ||
130 | public InvalidBootstrapperApplicationFactoryException(string message, Exception innerException) | ||
131 | : base(message, innerException) | ||
132 | { | ||
133 | } | ||
134 | |||
135 | /// <summary> | ||
136 | /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class. | ||
137 | /// </summary> | ||
138 | /// <param name="info">Serialization information for this exception</param> | ||
139 | /// <param name="context">Streaming context to serialize to</param> | ||
140 | protected InvalidBootstrapperApplicationFactoryException(SerializationInfo info, StreamingContext context) | ||
141 | : base(info, context) | ||
142 | { | ||
143 | } | ||
144 | } | ||
145 | } | ||
diff --git a/src/WixToolset.Mba.Core/HostSection.cs b/src/WixToolset.Mba.Core/HostSection.cs new file mode 100644 index 00000000..e5b7ea64 --- /dev/null +++ b/src/WixToolset.Mba.Core/HostSection.cs | |||
@@ -0,0 +1,47 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Configuration; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Handler for the Host configuration section. | ||
10 | /// </summary> | ||
11 | public sealed class HostSection : ConfigurationSection | ||
12 | { | ||
13 | private static readonly ConfigurationProperty assemblyNameProperty = new ConfigurationProperty("assemblyName", typeof(string), null, ConfigurationPropertyOptions.IsRequired); | ||
14 | private static readonly ConfigurationProperty supportedFrameworksProperty = new ConfigurationProperty("", typeof(SupportedFrameworkElementCollection), null, ConfigurationPropertyOptions.IsDefaultCollection); | ||
15 | |||
16 | /// <summary> | ||
17 | /// Creates a new instance of the <see cref="HostSection"/> class. | ||
18 | /// </summary> | ||
19 | public HostSection() | ||
20 | { | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Gets the name of the assembly that contians the <see cref="BootstrapperApplication"/> child class. | ||
25 | /// </summary> | ||
26 | /// <remarks> | ||
27 | /// The assembly specified by this name must contain the <see cref="BootstrapperApplicationFactoryAttribute"/> to identify | ||
28 | /// the type of the <see cref="BootstrapperApplication"/> child class. | ||
29 | /// </remarks> | ||
30 | [ConfigurationProperty("assemblyName", IsRequired = true)] | ||
31 | public string AssemblyName | ||
32 | { | ||
33 | get { return (string)base[assemblyNameProperty]; } | ||
34 | set { base[assemblyNameProperty] = value; } | ||
35 | } | ||
36 | |||
37 | /// <summary> | ||
38 | /// Gets the <see cref="SupportedFrameworkElementCollection"/> of supported frameworks for the host configuration. | ||
39 | /// </summary> | ||
40 | [ConfigurationProperty("", IsDefaultCollection = true)] | ||
41 | [ConfigurationCollection(typeof(SupportedFrameworkElement))] | ||
42 | public SupportedFrameworkElementCollection SupportedFrameworks | ||
43 | { | ||
44 | get { return (SupportedFrameworkElementCollection)base[supportedFrameworksProperty]; } | ||
45 | } | ||
46 | } | ||
47 | } | ||
diff --git a/src/WixToolset.Mba.Core/IBootstrapperApplicationData.cs b/src/WixToolset.Mba.Core/IBootstrapperApplicationData.cs new file mode 100644 index 00000000..c8c6e6e3 --- /dev/null +++ b/src/WixToolset.Mba.Core/IBootstrapperApplicationData.cs | |||
@@ -0,0 +1,12 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System.IO; | ||
6 | |||
7 | public interface IBootstrapperApplicationData | ||
8 | { | ||
9 | FileInfo BADataFile { get; } | ||
10 | IBundleInfo Bundle { get; } | ||
11 | } | ||
12 | } \ No newline at end of file | ||
diff --git a/src/WixToolset.Mba.Core/IBootstrapperApplicationFactory.cs b/src/WixToolset.Mba.Core/IBootstrapperApplicationFactory.cs new file mode 100644 index 00000000..414d28ed --- /dev/null +++ b/src/WixToolset.Mba.Core/IBootstrapperApplicationFactory.cs | |||
@@ -0,0 +1,52 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.CodeDom.Compiler; | ||
7 | using System.Runtime.InteropServices; | ||
8 | |||
9 | [ComVisible(true)] | ||
10 | [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
11 | [Guid("2965A12F-AC7B-43A0-85DF-E4B2168478A4")] | ||
12 | [GeneratedCodeAttribute("WixToolset.Bootstrapper.InteropCodeGenerator", "1.0.0.0")] | ||
13 | public interface IBootstrapperApplicationFactory | ||
14 | { | ||
15 | IBootstrapperApplication Create( | ||
16 | [MarshalAs(UnmanagedType.Interface)] IBootstrapperEngine pEngine, | ||
17 | ref Command command | ||
18 | ); | ||
19 | } | ||
20 | |||
21 | [Serializable] | ||
22 | [StructLayout(LayoutKind.Sequential)] | ||
23 | [GeneratedCodeAttribute("WixToolset.Bootstrapper.InteropCodeGenerator", "1.0.0.0")] | ||
24 | public struct Command | ||
25 | { | ||
26 | [MarshalAs(UnmanagedType.U4)] private readonly LaunchAction action; | ||
27 | [MarshalAs(UnmanagedType.U4)] private readonly Display display; | ||
28 | [MarshalAs(UnmanagedType.U4)] private readonly Restart restart; | ||
29 | [MarshalAs(UnmanagedType.LPWStr)] private readonly string wzCommandLine; | ||
30 | [MarshalAs(UnmanagedType.I4)] private readonly int nCmdShow; | ||
31 | [MarshalAs(UnmanagedType.U4)] private readonly ResumeType resume; | ||
32 | private readonly IntPtr hwndSplashScreen; | ||
33 | [MarshalAs(UnmanagedType.I4)] private readonly RelationType relation; | ||
34 | [MarshalAs(UnmanagedType.Bool)] private readonly bool passthrough; | ||
35 | [MarshalAs(UnmanagedType.LPWStr)] private readonly string wzLayoutDirectory; | ||
36 | |||
37 | public IBootstrapperCommand GetBootstrapperCommand() | ||
38 | { | ||
39 | return new BootstrapperCommand( | ||
40 | this.action, | ||
41 | this.display, | ||
42 | this.restart, | ||
43 | this.wzCommandLine, | ||
44 | this.nCmdShow, | ||
45 | this.resume, | ||
46 | this.hwndSplashScreen, | ||
47 | this.relation, | ||
48 | this.passthrough, | ||
49 | this.wzLayoutDirectory); | ||
50 | } | ||
51 | } | ||
52 | } | ||
diff --git a/src/WixToolset.Mba.Core/IBootstrapperCommand.cs b/src/WixToolset.Mba.Core/IBootstrapperCommand.cs new file mode 100644 index 00000000..332b4c3b --- /dev/null +++ b/src/WixToolset.Mba.Core/IBootstrapperCommand.cs | |||
@@ -0,0 +1,63 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | /// <summary> | ||
8 | /// Command information passed from the engine for the BA to perform. | ||
9 | /// </summary> | ||
10 | public interface IBootstrapperCommand | ||
11 | { | ||
12 | /// <summary> | ||
13 | /// Gets the action for the BA to perform. | ||
14 | /// </summary> | ||
15 | LaunchAction Action { get; } | ||
16 | |||
17 | /// <summary> | ||
18 | /// Gets the display level for the BA. | ||
19 | /// </summary> | ||
20 | Display Display { get; } | ||
21 | |||
22 | /// <summary> | ||
23 | /// Gets the action to perform if a reboot is required. | ||
24 | /// </summary> | ||
25 | Restart Restart { get; } | ||
26 | |||
27 | /// <summary> | ||
28 | /// Gets the command line arguments as a string array. | ||
29 | /// </summary> | ||
30 | /// <returns> | ||
31 | /// Array of command line arguments not handled by the engine. | ||
32 | /// </returns> | ||
33 | /// <exception type="Win32Exception">The command line could not be parsed into an array.</exception> | ||
34 | string[] CommandLineArgs { get; } | ||
35 | |||
36 | int CmdShow { get; } | ||
37 | |||
38 | /// <summary> | ||
39 | /// Gets the method of how the engine was resumed from a previous installation step. | ||
40 | /// </summary> | ||
41 | ResumeType Resume { get; } | ||
42 | |||
43 | /// <summary> | ||
44 | /// Gets the handle to the splash screen window. If no splash screen was displayed this value will be IntPtr.Zero. | ||
45 | /// </summary> | ||
46 | IntPtr SplashScreen { get; } | ||
47 | |||
48 | /// <summary> | ||
49 | /// If this was run from a related bundle, specifies the relation type. | ||
50 | /// </summary> | ||
51 | RelationType Relation { get; } | ||
52 | |||
53 | /// <summary> | ||
54 | /// If this was run from a backward compatible bundle. | ||
55 | /// </summary> | ||
56 | bool Passthrough { get; } | ||
57 | |||
58 | /// <summary> | ||
59 | /// Gets layout directory. | ||
60 | /// </summary> | ||
61 | string LayoutDirectory { get; } | ||
62 | } | ||
63 | } | ||
diff --git a/src/WixToolset.Mba.Core/IBundleInfo.cs b/src/WixToolset.Mba.Core/IBundleInfo.cs new file mode 100644 index 00000000..a5f4b9c7 --- /dev/null +++ b/src/WixToolset.Mba.Core/IBundleInfo.cs | |||
@@ -0,0 +1,16 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System.Collections.Generic; | ||
6 | |||
7 | public interface IBundleInfo | ||
8 | { | ||
9 | string LogVariable { get; } | ||
10 | string Name { get; } | ||
11 | IDictionary<string, IPackageInfo> Packages { get; } | ||
12 | bool PerMachine { get; } | ||
13 | |||
14 | void AddRelatedBundleAsPackage(DetectRelatedBundleEventArgs e); | ||
15 | } | ||
16 | } \ No newline at end of file | ||
diff --git a/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs new file mode 100644 index 00000000..ccbe84db --- /dev/null +++ b/src/WixToolset.Mba.Core/IDefaultBootstrapperApplication.cs | |||
@@ -0,0 +1,65 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | public interface IDefaultBootstrapperApplication : IBootstrapperApplication | ||
8 | { | ||
9 | event EventHandler<ApplyBeginEventArgs> ApplyBegin; | ||
10 | event EventHandler<ApplyCompleteEventArgs> ApplyComplete; | ||
11 | event EventHandler<CacheAcquireBeginEventArgs> CacheAcquireBegin; | ||
12 | event EventHandler<CacheAcquireCompleteEventArgs> CacheAcquireComplete; | ||
13 | event EventHandler<CacheAcquireProgressEventArgs> CacheAcquireProgress; | ||
14 | event EventHandler<CacheBeginEventArgs> CacheBegin; | ||
15 | event EventHandler<CacheCompleteEventArgs> CacheComplete; | ||
16 | event EventHandler<CachePackageBeginEventArgs> CachePackageBegin; | ||
17 | event EventHandler<CachePackageCompleteEventArgs> CachePackageComplete; | ||
18 | event EventHandler<CacheVerifyBeginEventArgs> CacheVerifyBegin; | ||
19 | event EventHandler<CacheVerifyCompleteEventArgs> CacheVerifyComplete; | ||
20 | event EventHandler<DetectBeginEventArgs> DetectBegin; | ||
21 | event EventHandler<DetectCompatibleMsiPackageEventArgs> DetectCompatibleMsiPackage; | ||
22 | event EventHandler<DetectCompleteEventArgs> DetectComplete; | ||
23 | event EventHandler<DetectForwardCompatibleBundleEventArgs> DetectForwardCompatibleBundle; | ||
24 | event EventHandler<DetectMsiFeatureEventArgs> DetectMsiFeature; | ||
25 | event EventHandler<DetectPackageBeginEventArgs> DetectPackageBegin; | ||
26 | event EventHandler<DetectPackageCompleteEventArgs> DetectPackageComplete; | ||
27 | event EventHandler<DetectRelatedBundleEventArgs> DetectRelatedBundle; | ||
28 | event EventHandler<DetectRelatedMsiPackageEventArgs> DetectRelatedMsiPackage; | ||
29 | event EventHandler<DetectTargetMsiPackageEventArgs> DetectTargetMsiPackage; | ||
30 | event EventHandler<DetectUpdateEventArgs> DetectUpdate; | ||
31 | event EventHandler<DetectUpdateBeginEventArgs> DetectUpdateBegin; | ||
32 | event EventHandler<DetectUpdateCompleteEventArgs> DetectUpdateComplete; | ||
33 | event EventHandler<ElevateBeginEventArgs> ElevateBegin; | ||
34 | event EventHandler<ElevateCompleteEventArgs> ElevateComplete; | ||
35 | event EventHandler<ErrorEventArgs> Error; | ||
36 | event EventHandler<ExecuteBeginEventArgs> ExecuteBegin; | ||
37 | event EventHandler<ExecuteCompleteEventArgs> ExecuteComplete; | ||
38 | event EventHandler<ExecuteFilesInUseEventArgs> ExecuteFilesInUse; | ||
39 | event EventHandler<ExecuteMsiMessageEventArgs> ExecuteMsiMessage; | ||
40 | event EventHandler<ExecutePackageBeginEventArgs> ExecutePackageBegin; | ||
41 | event EventHandler<ExecutePackageCompleteEventArgs> ExecutePackageComplete; | ||
42 | event EventHandler<ExecutePatchTargetEventArgs> ExecutePatchTarget; | ||
43 | event EventHandler<ExecuteProgressEventArgs> ExecuteProgress; | ||
44 | event EventHandler<LaunchApprovedExeBeginArgs> LaunchApprovedExeBegin; | ||
45 | event EventHandler<LaunchApprovedExeCompleteArgs> LaunchApprovedExeComplete; | ||
46 | event EventHandler<PlanBeginEventArgs> PlanBegin; | ||
47 | event EventHandler<PlanCompatibleMsiPackageBeginEventArgs> PlanCompatibleMsiPackageBegin; | ||
48 | event EventHandler<PlanCompatibleMsiPackageCompleteEventArgs> PlanCompatibleMsiPackageComplete; | ||
49 | event EventHandler<PlanCompleteEventArgs> PlanComplete; | ||
50 | event EventHandler<PlanMsiFeatureEventArgs> PlanMsiFeature; | ||
51 | event EventHandler<PlanPackageBeginEventArgs> PlanPackageBegin; | ||
52 | event EventHandler<PlanPackageCompleteEventArgs> PlanPackageComplete; | ||
53 | event EventHandler<PlanRelatedBundleEventArgs> PlanRelatedBundle; | ||
54 | event EventHandler<PlanTargetMsiPackageEventArgs> PlanTargetMsiPackage; | ||
55 | event EventHandler<ProgressEventArgs> Progress; | ||
56 | event EventHandler<RegisterBeginEventArgs> RegisterBegin; | ||
57 | event EventHandler<RegisterCompleteEventArgs> RegisterComplete; | ||
58 | event EventHandler<ResolveSourceEventArgs> ResolveSource; | ||
59 | event EventHandler<ShutdownEventArgs> Shutdown; | ||
60 | event EventHandler<StartupEventArgs> Startup; | ||
61 | event EventHandler<SystemShutdownEventArgs> SystemShutdown; | ||
62 | event EventHandler<UnregisterBeginEventArgs> UnregisterBegin; | ||
63 | event EventHandler<UnregisterCompleteEventArgs> UnregisterComplete; | ||
64 | } | ||
65 | } \ No newline at end of file | ||
diff --git a/src/WixToolset.Mba.Core/IEngine.cs b/src/WixToolset.Mba.Core/IEngine.cs new file mode 100644 index 00000000..46b8158a --- /dev/null +++ b/src/WixToolset.Mba.Core/IEngine.cs | |||
@@ -0,0 +1,176 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.ComponentModel; | ||
7 | using System.Security; | ||
8 | |||
9 | public interface IEngine | ||
10 | { | ||
11 | /// <summary> | ||
12 | /// Gets or sets numeric variables for the engine. | ||
13 | /// </summary> | ||
14 | IVariables<long> NumericVariables { get; } | ||
15 | |||
16 | /// <summary> | ||
17 | /// Gets the number of packages in the bundle. | ||
18 | /// </summary> | ||
19 | int PackageCount { get; } | ||
20 | |||
21 | /// <summary> | ||
22 | /// Gets or sets string variables for the engine using SecureStrings. | ||
23 | /// </summary> | ||
24 | IVariables<SecureString> SecureStringVariables { get; } | ||
25 | |||
26 | /// <summary> | ||
27 | /// Gets or sets string variables for the engine. | ||
28 | /// </summary> | ||
29 | IVariables<string> StringVariables { get; } | ||
30 | |||
31 | /// <summary> | ||
32 | /// Gets or sets <see cref="Version"/> variables for the engine. | ||
33 | /// | ||
34 | /// The <see cref="Version"/> class can keep track of when the build and revision fields are undefined, but the engine can't. | ||
35 | /// Therefore, the build and revision fields must be defined when setting a <see cref="Version"/> variable. | ||
36 | /// Use the NormalizeVersion method to make sure the engine can accept the Version. | ||
37 | /// | ||
38 | /// To keep track of versions without build or revision fields, use StringVariables instead. | ||
39 | /// </summary> | ||
40 | /// <exception cref="OverflowException">The given <see cref="Version"/> was invalid.</exception> | ||
41 | IVariables<Version> VersionVariables { get; } | ||
42 | |||
43 | /// <summary> | ||
44 | /// Install the packages. | ||
45 | /// </summary> | ||
46 | /// <param name="hwndParent">The parent window for the installation user interface.</param> | ||
47 | void Apply(IntPtr hwndParent); | ||
48 | |||
49 | /// <summary> | ||
50 | /// Close the splash screen if it is still open. Does nothing if the splash screen is not or | ||
51 | /// never was opened. | ||
52 | /// </summary> | ||
53 | void CloseSplashScreen(); | ||
54 | |||
55 | /// <summary> | ||
56 | /// Determine if all installation conditions are fulfilled. | ||
57 | /// </summary> | ||
58 | void Detect(); | ||
59 | |||
60 | /// <summary> | ||
61 | /// Determine if all installation conditions are fulfilled. | ||
62 | /// </summary> | ||
63 | /// <param name="hwndParent">The parent window for the installation user interface.</param> | ||
64 | void Detect(IntPtr hwndParent); | ||
65 | |||
66 | /// <summary> | ||
67 | /// Elevate the install. | ||
68 | /// </summary> | ||
69 | /// <param name="hwndParent">The parent window of the elevation dialog.</param> | ||
70 | /// <returns>true if elevation succeeded; otherwise, false if the user cancelled.</returns> | ||
71 | /// <exception cref="Win32Exception">A Win32 error occurred.</exception> | ||
72 | bool Elevate(IntPtr hwndParent); | ||
73 | |||
74 | /// <summary> | ||
75 | /// Escapes the input string. | ||
76 | /// </summary> | ||
77 | /// <param name="input">The string to escape.</param> | ||
78 | /// <returns>The escaped string.</returns> | ||
79 | /// <exception cref="Win32Exception">A Win32 error occurred.</exception> | ||
80 | string EscapeString(string input); | ||
81 | |||
82 | /// <summary> | ||
83 | /// Evaluates the <paramref name="condition"/> string. | ||
84 | /// </summary> | ||
85 | /// <param name="condition">The string representing the condition to evaluate.</param> | ||
86 | /// <returns>Whether the condition evaluated to true or false.</returns> | ||
87 | bool EvaluateCondition(string condition); | ||
88 | |||
89 | /// <summary> | ||
90 | /// Formats the input string. | ||
91 | /// </summary> | ||
92 | /// <param name="format">The string to format.</param> | ||
93 | /// <returns>The formatted string.</returns> | ||
94 | /// <exception cref="Win32Exception">A Win32 error occurred.</exception> | ||
95 | string FormatString(string format); | ||
96 | |||
97 | /// <summary> | ||
98 | /// Launches a preapproved executable elevated. As long as the engine already elevated, there will be no UAC prompt. | ||
99 | /// </summary> | ||
100 | /// <param name="hwndParent">The parent window of the elevation dialog (if the engine hasn't elevated yet).</param> | ||
101 | /// <param name="approvedExeForElevationId">Id of the ApprovedExeForElevation element specified when the bundle was authored.</param> | ||
102 | /// <param name="arguments">Optional arguments.</param> | ||
103 | void LaunchApprovedExe(IntPtr hwndParent, string approvedExeForElevationId, string arguments); | ||
104 | |||
105 | /// <summary> | ||
106 | /// Launches a preapproved executable elevated. As long as the engine already elevated, there will be no UAC prompt. | ||
107 | /// </summary> | ||
108 | /// <param name="hwndParent">The parent window of the elevation dialog (if the engine hasn't elevated yet).</param> | ||
109 | /// <param name="approvedExeForElevationId">Id of the ApprovedExeForElevation element specified when the bundle was authored.</param> | ||
110 | /// <param name="arguments">Optional arguments.</param> | ||
111 | /// <param name="waitForInputIdleTimeout">Timeout in milliseconds. When set to something other than zero, the engine will call WaitForInputIdle for the new process with this timeout before calling OnLaunchApprovedExeComplete.</param> | ||
112 | void LaunchApprovedExe(IntPtr hwndParent, string approvedExeForElevationId, string arguments, int waitForInputIdleTimeout); | ||
113 | |||
114 | /// <summary> | ||
115 | /// Logs the <paramref name="message"/>. | ||
116 | /// </summary> | ||
117 | /// <param name="level">The logging level.</param> | ||
118 | /// <param name="message">The message to log.</param> | ||
119 | void Log(LogLevel level, string message); | ||
120 | |||
121 | /// <summary> | ||
122 | /// Determine the installation sequencing and costing. | ||
123 | /// </summary> | ||
124 | /// <param name="action">The action to perform when planning.</param> | ||
125 | void Plan(LaunchAction action); | ||
126 | |||
127 | /// <summary> | ||
128 | /// Set the update information for a bundle. | ||
129 | /// </summary> | ||
130 | /// <param name="localSource">Optional local source path for the update. Default is "update\[OriginalNameOfBundle].exe".</param> | ||
131 | /// <param name="downloadSource">Optional download source for the update.</param> | ||
132 | /// <param name="size">Size of the expected update.</param> | ||
133 | /// <param name="hashType">Type of the hash expected on the update.</param> | ||
134 | /// <param name="hash">Optional hash expected for the update.</param> | ||
135 | void SetUpdate(string localSource, string downloadSource, long size, UpdateHashType hashType, byte[] hash); | ||
136 | |||
137 | /// <summary> | ||
138 | /// Set the local source for a package or container. | ||
139 | /// </summary> | ||
140 | /// <param name="packageOrContainerId">The id that uniquely identifies the package or container.</param> | ||
141 | /// <param name="payloadId">The id that uniquely identifies the payload.</param> | ||
142 | /// <param name="path">The new source path.</param> | ||
143 | void SetLocalSource(string packageOrContainerId, string payloadId, string path); | ||
144 | |||
145 | /// <summary> | ||
146 | /// Set the new download URL for a package or container. | ||
147 | /// </summary> | ||
148 | /// <param name="packageOrContainerId">The id that uniquely identifies the package or container.</param> | ||
149 | /// <param name="payloadId">The id that uniquely identifies the payload.</param> | ||
150 | /// <param name="url">The new url.</param> | ||
151 | /// <param name="user">The user name for proxy authentication.</param> | ||
152 | /// <param name="password">The password for proxy authentication.</param> | ||
153 | void SetDownloadSource(string packageOrContainerId, string payloadId, string url, string user, string password); | ||
154 | |||
155 | /// <summary> | ||
156 | /// Sends error message when embedded. | ||
157 | /// </summary> | ||
158 | /// <param name="errorCode">Error code.</param> | ||
159 | /// <param name="message">Error message.</param> | ||
160 | /// <param name="uiHint">UI buttons to show on error dialog.</param> | ||
161 | int SendEmbeddedError(int errorCode, string message, int uiHint); | ||
162 | |||
163 | /// <summary> | ||
164 | /// Sends progress percentages when embedded. | ||
165 | /// </summary> | ||
166 | /// <param name="progressPercentage">Percentage completed thus far.</param> | ||
167 | /// <param name="overallPercentage">Overall percentage completed.</param> | ||
168 | int SendEmbeddedProgress(int progressPercentage, int overallPercentage); | ||
169 | |||
170 | /// <summary> | ||
171 | /// Shuts down the engine. | ||
172 | /// </summary> | ||
173 | /// <param name="exitCode">Exit code indicating reason for shut down.</param> | ||
174 | void Quit(int exitCode); | ||
175 | } | ||
176 | } | ||
diff --git a/src/WixToolset.Mba.Core/IPackageInfo.cs b/src/WixToolset.Mba.Core/IPackageInfo.cs new file mode 100644 index 00000000..f4c7c558 --- /dev/null +++ b/src/WixToolset.Mba.Core/IPackageInfo.cs | |||
@@ -0,0 +1,20 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | public interface IPackageInfo | ||
6 | { | ||
7 | CacheType CacheType { get; } | ||
8 | string Description { get; } | ||
9 | bool DisplayInternalUI { get; } | ||
10 | string DisplayName { get; } | ||
11 | string Id { get; } | ||
12 | string InstallCondition { get; } | ||
13 | bool Permanent { get; } | ||
14 | string ProductCode { get; } | ||
15 | PackageType Type { get; } | ||
16 | string UpgradeCode { get; } | ||
17 | string Version { get; } | ||
18 | bool Vital { get; } | ||
19 | } | ||
20 | } \ No newline at end of file | ||
diff --git a/src/WixToolset.Mba.Core/IVariables.cs b/src/WixToolset.Mba.Core/IVariables.cs new file mode 100644 index 00000000..15da4c84 --- /dev/null +++ b/src/WixToolset.Mba.Core/IVariables.cs | |||
@@ -0,0 +1,27 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | |||
7 | /// <summary> | ||
8 | /// An accessor for numeric, string, and version variables for the engine. | ||
9 | /// </summary> | ||
10 | public interface IVariables<T> | ||
11 | { | ||
12 | /// <summary> | ||
13 | /// Gets or sets the variable given by <paramref name="name"/>. | ||
14 | /// </summary> | ||
15 | /// <param name="name">The name of the variable to get/set.</param> | ||
16 | /// <returns>The value of the given variable.</returns> | ||
17 | /// <exception cref="Exception">An error occurred getting the variable.</exception> | ||
18 | T this[string name] { get; set; } | ||
19 | |||
20 | /// <summary> | ||
21 | /// Gets whether the variable given by <paramref name="name"/> exists. | ||
22 | /// </summary> | ||
23 | /// <param name="name">The name of the variable to check.</param> | ||
24 | /// <returns>True if the variable given by <paramref name="name"/> exists; otherwise, false.</returns> | ||
25 | bool Contains(string name); | ||
26 | } | ||
27 | } | ||
diff --git a/src/WixToolset.Mba.Core/NativeMethods.cs b/src/WixToolset.Mba.Core/NativeMethods.cs new file mode 100644 index 00000000..1964cb45 --- /dev/null +++ b/src/WixToolset.Mba.Core/NativeMethods.cs | |||
@@ -0,0 +1,37 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Runtime.InteropServices; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Contains native constants, functions, and structures for this assembly. | ||
10 | /// </summary> | ||
11 | internal static class NativeMethods | ||
12 | { | ||
13 | #region Error Constants | ||
14 | internal const int S_OK = 0; | ||
15 | internal const int E_MOREDATA = unchecked((int)0x800700ea); | ||
16 | internal const int E_INSUFFICIENT_BUFFER = unchecked((int)0x8007007a); | ||
17 | internal const int E_CANCELLED = unchecked((int)0x800704c7); | ||
18 | internal const int E_ALREADYINITIALIZED = unchecked((int)0x800704df); | ||
19 | internal const int E_NOTFOUND = unchecked((int)0x80070490); | ||
20 | internal const int E_NOTIMPL = unchecked((int)0x80004001); | ||
21 | internal const int E_UNEXPECTED = unchecked((int)0x8000ffff); | ||
22 | #endregion | ||
23 | |||
24 | #region Functions | ||
25 | [DllImport("shell32.dll", ExactSpelling = true, SetLastError = true)] | ||
26 | internal static extern IntPtr CommandLineToArgvW( | ||
27 | [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, | ||
28 | out int pNumArgs | ||
29 | ); | ||
30 | |||
31 | [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true)] | ||
32 | internal static extern IntPtr LocalFree( | ||
33 | IntPtr hMem | ||
34 | ); | ||
35 | #endregion | ||
36 | } | ||
37 | } | ||
diff --git a/src/WixToolset.Mba.Core/PackageInfo.cs b/src/WixToolset.Mba.Core/PackageInfo.cs new file mode 100644 index 00000000..99ebb33a --- /dev/null +++ b/src/WixToolset.Mba.Core/PackageInfo.cs | |||
@@ -0,0 +1,181 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Collections.Generic; | ||
7 | using System.Xml; | ||
8 | using System.Xml.XPath; | ||
9 | |||
10 | public enum CacheType | ||
11 | { | ||
12 | No, | ||
13 | Yes, | ||
14 | Always, | ||
15 | } | ||
16 | |||
17 | public enum PackageType | ||
18 | { | ||
19 | Unknown, | ||
20 | Exe, | ||
21 | Msi, | ||
22 | Msp, | ||
23 | Msu, | ||
24 | UpgradeBundle, | ||
25 | AddonBundle, | ||
26 | PatchBundle, | ||
27 | } | ||
28 | |||
29 | public class PackageInfo : IPackageInfo | ||
30 | { | ||
31 | public string Id { get; internal set; } | ||
32 | public string DisplayName { get; internal set; } | ||
33 | public string Description { get; internal set; } | ||
34 | public PackageType Type { get; internal set; } | ||
35 | public bool Permanent { get; internal set; } | ||
36 | public bool Vital { get; internal set; } | ||
37 | public bool DisplayInternalUI { get; internal set; } | ||
38 | public string ProductCode { get; internal set; } | ||
39 | public string UpgradeCode { get; internal set; } | ||
40 | public string Version { get; internal set; } | ||
41 | public string InstallCondition { get; internal set; } | ||
42 | public CacheType CacheType { get; internal set; } | ||
43 | |||
44 | internal PackageInfo() { } | ||
45 | |||
46 | public static IEnumerable<IPackageInfo> ParsePackagesFromXml(XPathNavigator root) | ||
47 | { | ||
48 | XmlNamespaceManager namespaceManager = new XmlNamespaceManager(root.NameTable); | ||
49 | namespaceManager.AddNamespace("p", BootstrapperApplicationData.XMLNamespace); | ||
50 | XPathNodeIterator nodes = root.Select("/p:BootstrapperApplicationData/p:WixPackageProperties", namespaceManager); | ||
51 | |||
52 | foreach (XPathNavigator node in nodes) | ||
53 | { | ||
54 | var package = new PackageInfo(); | ||
55 | |||
56 | string id = BootstrapperApplicationData.GetAttribute(node, "Package"); | ||
57 | if (id == null) | ||
58 | { | ||
59 | throw new Exception("Failed to get package identifier for package."); | ||
60 | } | ||
61 | package.Id = id; | ||
62 | |||
63 | package.DisplayName = BootstrapperApplicationData.GetAttribute(node, "DisplayName"); | ||
64 | |||
65 | package.Description = BootstrapperApplicationData.GetAttribute(node, "Description"); | ||
66 | |||
67 | PackageType? packageType = GetPackageTypeAttribute(node, "PackageType"); | ||
68 | if (!packageType.HasValue) | ||
69 | { | ||
70 | throw new Exception("Failed to get package type for package."); | ||
71 | } | ||
72 | package.Type = packageType.Value; | ||
73 | |||
74 | bool? permanent = BootstrapperApplicationData.GetYesNoAttribute(node, "Permanent"); | ||
75 | if (!permanent.HasValue) | ||
76 | { | ||
77 | throw new Exception("Failed to get permanent settings for package."); | ||
78 | } | ||
79 | package.Permanent = permanent.Value; | ||
80 | |||
81 | bool? vital = BootstrapperApplicationData.GetYesNoAttribute(node, "Vital"); | ||
82 | if (!vital.HasValue) | ||
83 | { | ||
84 | throw new Exception("Failed to get vital setting for package."); | ||
85 | } | ||
86 | package.Vital = vital.Value; | ||
87 | |||
88 | bool? displayInternalUI = BootstrapperApplicationData.GetYesNoAttribute(node, "DisplayInternalUI"); | ||
89 | package.DisplayInternalUI = displayInternalUI.HasValue && displayInternalUI.Value; | ||
90 | |||
91 | package.ProductCode = BootstrapperApplicationData.GetAttribute(node, "ProductCode"); | ||
92 | |||
93 | package.UpgradeCode = BootstrapperApplicationData.GetAttribute(node, "UpgradeCode"); | ||
94 | |||
95 | package.Version = BootstrapperApplicationData.GetAttribute(node, "Version"); | ||
96 | |||
97 | package.InstallCondition = BootstrapperApplicationData.GetAttribute(node, "InstallCondition"); | ||
98 | |||
99 | yield return package; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | public static CacheType? GetCacheTypeAttribute(XPathNavigator node, string attributeName) | ||
104 | { | ||
105 | string attributeValue = BootstrapperApplicationData.GetAttribute(node, attributeName); | ||
106 | |||
107 | if (attributeValue == null) | ||
108 | { | ||
109 | return null; | ||
110 | } | ||
111 | |||
112 | if (attributeValue.Equals("yes", StringComparison.InvariantCulture)) | ||
113 | { | ||
114 | return CacheType.Yes; | ||
115 | } | ||
116 | else if (attributeValue.Equals("always", StringComparison.InvariantCulture)) | ||
117 | { | ||
118 | return CacheType.Always; | ||
119 | } | ||
120 | else | ||
121 | { | ||
122 | return CacheType.No; | ||
123 | } | ||
124 | } | ||
125 | |||
126 | public static PackageType? GetPackageTypeAttribute(XPathNavigator node, string attributeName) | ||
127 | { | ||
128 | string attributeValue = BootstrapperApplicationData.GetAttribute(node, attributeName); | ||
129 | |||
130 | if (attributeValue == null) | ||
131 | { | ||
132 | return null; | ||
133 | } | ||
134 | |||
135 | if (attributeValue.Equals("Exe", StringComparison.InvariantCulture)) | ||
136 | { | ||
137 | return PackageType.Exe; | ||
138 | } | ||
139 | else if (attributeValue.Equals("Msi", StringComparison.InvariantCulture)) | ||
140 | { | ||
141 | return PackageType.Msi; | ||
142 | } | ||
143 | else if (attributeValue.Equals("Msp", StringComparison.InvariantCulture)) | ||
144 | { | ||
145 | return PackageType.Msp; | ||
146 | } | ||
147 | else if (attributeValue.Equals("Msu", StringComparison.InvariantCulture)) | ||
148 | { | ||
149 | return PackageType.Msu; | ||
150 | } | ||
151 | else | ||
152 | { | ||
153 | return PackageType.Unknown; | ||
154 | } | ||
155 | } | ||
156 | |||
157 | public static PackageInfo GetRelatedBundleAsPackage(string id, RelationType relationType, bool perMachine, Version version) | ||
158 | { | ||
159 | PackageInfo package = new PackageInfo(); | ||
160 | package.Id = id; | ||
161 | package.Version = version.ToString(); | ||
162 | |||
163 | switch (relationType) | ||
164 | { | ||
165 | case RelationType.Addon: | ||
166 | package.Type = PackageType.AddonBundle; | ||
167 | break; | ||
168 | case RelationType.Patch: | ||
169 | package.Type = PackageType.PatchBundle; | ||
170 | break; | ||
171 | case RelationType.Upgrade: | ||
172 | package.Type = PackageType.UpgradeBundle; | ||
173 | break; | ||
174 | default: | ||
175 | throw new Exception(string.Format("Unknown related bundle type: {0}", relationType)); | ||
176 | } | ||
177 | |||
178 | return package; | ||
179 | } | ||
180 | } | ||
181 | } | ||
diff --git a/src/WixToolset.Mba.Core/SupportedFrameworkElement.cs b/src/WixToolset.Mba.Core/SupportedFrameworkElement.cs new file mode 100644 index 00000000..37a31b69 --- /dev/null +++ b/src/WixToolset.Mba.Core/SupportedFrameworkElement.cs | |||
@@ -0,0 +1,47 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Configuration; | ||
7 | |||
8 | /// <summary> | ||
9 | /// Handler for the supportedFramework configuration section. | ||
10 | /// </summary> | ||
11 | public sealed class SupportedFrameworkElement : ConfigurationElement | ||
12 | { | ||
13 | private static readonly ConfigurationProperty versionProperty = new ConfigurationProperty("version", typeof(string), null, ConfigurationPropertyOptions.IsRequired); | ||
14 | private static readonly ConfigurationProperty runtimeVersionProperty = new ConfigurationProperty("runtimeVersion", typeof(string)); | ||
15 | |||
16 | /// <summary> | ||
17 | /// Creates a new instance of the <see cref="SupportedFrameworkElement"/> class. | ||
18 | /// </summary> | ||
19 | public SupportedFrameworkElement() | ||
20 | { | ||
21 | } | ||
22 | |||
23 | /// <summary> | ||
24 | /// Gets the version of the supported framework. | ||
25 | /// </summary> | ||
26 | /// <remarks> | ||
27 | /// The assembly specified by this name must contain a value matching the NETFX version registry key under | ||
28 | /// "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP". | ||
29 | /// </remarks> | ||
30 | [ConfigurationProperty("version", IsRequired = true)] | ||
31 | public string Version | ||
32 | { | ||
33 | get { return (string)base[versionProperty]; } | ||
34 | set { base[versionProperty] = value; } | ||
35 | } | ||
36 | |||
37 | /// <summary> | ||
38 | /// Gets the runtime version required by this supported framework. | ||
39 | /// </summary> | ||
40 | [ConfigurationProperty("runtimeVersion", IsRequired = false)] | ||
41 | public string RuntimeVersion | ||
42 | { | ||
43 | get { return (string)base[runtimeVersionProperty]; } | ||
44 | set { base[runtimeVersionProperty] = value; } | ||
45 | } | ||
46 | } | ||
47 | } | ||
diff --git a/src/WixToolset.Mba.Core/SupportedFrameworkElementCollection.cs b/src/WixToolset.Mba.Core/SupportedFrameworkElementCollection.cs new file mode 100644 index 00000000..1a5aa2de --- /dev/null +++ b/src/WixToolset.Mba.Core/SupportedFrameworkElementCollection.cs | |||
@@ -0,0 +1,36 @@ | |||
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 | namespace WixToolset.BootstrapperCore | ||
4 | { | ||
5 | using System; | ||
6 | using System.Configuration; | ||
7 | using System.Diagnostics.CodeAnalysis; | ||
8 | |||
9 | /// <summary> | ||
10 | /// Handler for the supportedFramework collection. | ||
11 | /// </summary> | ||
12 | [SuppressMessage("Microsoft.Design", "CA1010:CollectionsShouldImplementGenericInterface")] | ||
13 | [ConfigurationCollection(typeof(SupportedFrameworkElement), AddItemName = "supportedFramework", CollectionType = ConfigurationElementCollectionType.BasicMap)] | ||
14 | public sealed class SupportedFrameworkElementCollection : ConfigurationElementCollection | ||
15 | { | ||
16 | public override ConfigurationElementCollectionType CollectionType | ||
17 | { | ||
18 | get { return ConfigurationElementCollectionType.BasicMap; } | ||
19 | } | ||
20 | |||
21 | protected override string ElementName | ||
22 | { | ||
23 | get { return "supportedFramework"; } | ||
24 | } | ||
25 | |||
26 | protected override ConfigurationElement CreateNewElement() | ||
27 | { | ||
28 | return new SupportedFrameworkElement(); | ||
29 | } | ||
30 | |||
31 | protected override object GetElementKey(ConfigurationElement element) | ||
32 | { | ||
33 | return (element as SupportedFrameworkElement).Version; | ||
34 | } | ||
35 | } | ||
36 | } | ||
diff --git a/src/WixToolset.Mba.Core/WixToolset.BootstrapperCore.config b/src/WixToolset.Mba.Core/WixToolset.BootstrapperCore.config new file mode 100644 index 00000000..1e284001 --- /dev/null +++ b/src/WixToolset.Mba.Core/WixToolset.BootstrapperCore.config | |||
@@ -0,0 +1,26 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" ?> | ||
2 | <!-- 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. --> | ||
3 | |||
4 | |||
5 | <configuration> | ||
6 | <configSections> | ||
7 | <sectionGroup name="wix.bootstrapper" type="WixToolset.BootstrapperCore.BootstrapperSectionGroup, WixToolset.BootstrapperCore"> | ||
8 | <section name="host" type="WixToolset.BootstrapperCore.HostSection, WixToolset.BootstrapperCore" /> | ||
9 | </sectionGroup> | ||
10 | </configSections> | ||
11 | <startup useLegacyV2RuntimeActivationPolicy="true"> | ||
12 | <supportedRuntime version="v4.0" /> | ||
13 | <supportedRuntime version="v2.0.50727" /> | ||
14 | </startup> | ||
15 | <wix.bootstrapper> | ||
16 | <!-- Example only. Use only if the startup/supportedRuntime above cannot discern supported frameworks. --> | ||
17 | <!-- | ||
18 | <supportedFramework version="v4\Client" /> | ||
19 | <supportedFramework version="v3.5" /> | ||
20 | <supportedFramework version="v3.0" /> | ||
21 | --> | ||
22 | |||
23 | <!-- Example only. Replace the host/@assemblyName attribute with assembly that implements BootstrapperApplication. --> | ||
24 | <host assemblyName="AssemblyWithClassThatInheritsFromBootstrapperApplication" /> | ||
25 | </wix.bootstrapper> | ||
26 | </configuration> | ||
diff --git a/src/balutil/inc/IBootstrapperApplicationFactory.h b/src/balutil/inc/IBootstrapperApplicationFactory.h new file mode 100644 index 00000000..e29c23bc --- /dev/null +++ b/src/balutil/inc/IBootstrapperApplicationFactory.h | |||
@@ -0,0 +1,14 @@ | |||
1 | #pragma once | ||
2 | // 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. | ||
3 | |||
4 | |||
5 | #include "precomp.h" | ||
6 | |||
7 | DECLARE_INTERFACE_IID_(IBootstrapperApplicationFactory, IUnknown, "2965A12F-AC7B-43A0-85DF-E4B2168478A4") | ||
8 | { | ||
9 | STDMETHOD(Create)( | ||
10 | __in IBootstrapperEngine* pEngine, | ||
11 | __in const BOOTSTRAPPER_COMMAND *pCommand, | ||
12 | __out IBootstrapperApplication **ppApplication | ||
13 | ); | ||
14 | }; | ||