aboutsummaryrefslogtreecommitdiff
path: root/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2021-04-22 05:46:03 -0700
committerRob Mensching <rob@firegiant.com>2021-04-29 16:41:44 -0700
commitc00516901e6b67e398396b14fe7682d0376f8643 (patch)
treeb0d62089a1c5700c7f2c3e3790750bf2d8ea33c0 /src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
parent8eb98efd2175d9ece2e4639d43081667af9a4990 (diff)
downloadwix-c00516901e6b67e398396b14fe7682d0376f8643.tar.gz
wix-c00516901e6b67e398396b14fe7682d0376f8643.tar.bz2
wix-c00516901e6b67e398396b14fe7682d0376f8643.zip
Move balutil into API/burn
Diffstat (limited to 'src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h')
-rw-r--r--src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h1076
1 files changed, 1076 insertions, 0 deletions
diff --git a/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
new file mode 100644
index 00000000..bf21c4a5
--- /dev/null
+++ b/src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h
@@ -0,0 +1,1076 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include <windows.h>
4#include <msiquery.h>
5
6#include "BootstrapperEngine.h"
7#include "BootstrapperApplication.h"
8#include "IBootstrapperEngine.h"
9#include "IBootstrapperApplication.h"
10
11#include "balutil.h"
12#include "balretry.h"
13
14class CBalBaseBootstrapperApplication : public IBootstrapperApplication
15{
16public: // IUnknown
17 virtual STDMETHODIMP QueryInterface(
18 __in REFIID riid,
19 __out LPVOID *ppvObject
20 )
21 {
22 if (!ppvObject)
23 {
24 return E_INVALIDARG;
25 }
26
27 *ppvObject = NULL;
28
29 if (::IsEqualIID(__uuidof(IBootstrapperApplication), riid))
30 {
31 *ppvObject = static_cast<IBootstrapperApplication*>(this);
32 }
33 else if (::IsEqualIID(IID_IUnknown, riid))
34 {
35 *ppvObject = static_cast<IUnknown*>(this);
36 }
37 else // no interface for requested iid
38 {
39 return E_NOINTERFACE;
40 }
41
42 AddRef();
43 return S_OK;
44 }
45
46 virtual STDMETHODIMP_(ULONG) AddRef()
47 {
48 return ::InterlockedIncrement(&this->m_cReferences);
49 }
50
51 virtual STDMETHODIMP_(ULONG) Release()
52 {
53 long l = ::InterlockedDecrement(&this->m_cReferences);
54 if (0 < l)
55 {
56 return l;
57 }
58
59 delete this;
60 return 0;
61 }
62
63public: // IBootstrapperApplication
64 virtual STDMETHODIMP_(HRESULT) BAProc(
65 __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/,
66 __in const LPVOID /*pvArgs*/,
67 __inout LPVOID /*pvResults*/,
68 __in_opt LPVOID /*pvContext*/
69 )
70 {
71 return E_NOTIMPL;
72 }
73
74 virtual STDMETHODIMP_(void) BAProcFallback(
75 __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/,
76 __in const LPVOID /*pvArgs*/,
77 __inout LPVOID /*pvResults*/,
78 __inout HRESULT* /*phr*/,
79 __in_opt LPVOID /*pvContext*/
80 )
81 {
82 }
83
84 virtual STDMETHODIMP OnStartup()
85 {
86 return S_OK;
87 }
88
89 virtual STDMETHODIMP OnShutdown(
90 __inout BOOTSTRAPPER_SHUTDOWN_ACTION* /*pAction*/
91 )
92 {
93 return S_OK;
94 }
95
96 virtual STDMETHODIMP OnSystemShutdown(
97 __in DWORD dwEndSession,
98 __inout BOOL* pfCancel
99 )
100 {
101 HRESULT hr = S_OK;
102
103 // Allow requests to shut down when critical or not applying.
104 *pfCancel = !(ENDSESSION_CRITICAL & dwEndSession || !m_fApplying);
105
106 return hr;
107 }
108
109 virtual STDMETHODIMP OnDetectBegin(
110 __in BOOL /*fCached*/,
111 __in BOOL /*fInstalled*/,
112 __in DWORD /*cPackages*/,
113 __inout BOOL* pfCancel
114 )
115 {
116 *pfCancel |= CheckCanceled();
117 return S_OK;
118 }
119
120 virtual STDMETHODIMP OnDetectForwardCompatibleBundle(
121 __in_z LPCWSTR /*wzBundleId*/,
122 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
123 __in_z LPCWSTR /*wzBundleTag*/,
124 __in BOOL /*fPerMachine*/,
125 __in LPCWSTR /*wzVersion*/,
126 __in BOOL /*fMissingFromCache*/,
127 __inout BOOL* pfCancel
128 )
129 {
130 *pfCancel |= CheckCanceled();
131 return S_OK;
132 }
133
134 virtual STDMETHODIMP OnDetectUpdateBegin(
135 __in_z LPCWSTR /*wzUpdateLocation*/,
136 __inout BOOL* pfCancel,
137 __inout BOOL* /*pfSkip*/
138 )
139 {
140 *pfCancel |= CheckCanceled();
141 return S_OK;
142 }
143
144 virtual STDMETHODIMP OnDetectUpdate(
145 __in_z LPCWSTR /*wzUpdateLocation*/,
146 __in DWORD64 /*dw64Size*/,
147 __in LPCWSTR /*wzVersion*/,
148 __in_z LPCWSTR /*wzTitle*/,
149 __in_z LPCWSTR /*wzSummary*/,
150 __in_z LPCWSTR /*wzContentType*/,
151 __in_z LPCWSTR /*wzContent*/,
152 __inout BOOL* pfCancel,
153 __inout BOOL* /*pfStopProcessingUpdates*/
154 )
155 {
156 *pfCancel |= CheckCanceled();
157 return S_OK;
158 }
159
160 virtual STDMETHODIMP OnDetectUpdateComplete(
161 __in HRESULT /*hrStatus*/,
162 __inout BOOL* /*pfIgnoreError*/
163 )
164 {
165 return S_OK;
166 }
167
168 virtual STDMETHODIMP OnDetectRelatedBundle(
169 __in_z LPCWSTR /*wzBundleId*/,
170 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
171 __in_z LPCWSTR /*wzBundleTag*/,
172 __in BOOL /*fPerMachine*/,
173 __in LPCWSTR /*wzVersion*/,
174 __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/,
175 __in BOOL /*fMissingFromCache*/,
176 __inout BOOL* pfCancel
177 )
178 {
179 *pfCancel |= CheckCanceled();
180 return S_OK;
181 }
182
183 virtual STDMETHODIMP OnDetectPackageBegin(
184 __in_z LPCWSTR /*wzPackageId*/,
185 __inout BOOL* pfCancel
186 )
187 {
188 *pfCancel |= CheckCanceled();
189 return S_OK;
190 }
191
192 virtual STDMETHODIMP OnDetectRelatedMsiPackage(
193 __in_z LPCWSTR /*wzPackageId*/,
194 __in_z LPCWSTR /*wzUpgradeCode*/,
195 __in_z LPCWSTR /*wzProductCode*/,
196 __in BOOL /*fPerMachine*/,
197 __in LPCWSTR /*wzVersion*/,
198 __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/,
199 __inout BOOL* pfCancel
200 )
201 {
202 *pfCancel |= CheckCanceled();
203 return S_OK;
204 }
205
206 virtual STDMETHODIMP OnDetectPatchTarget(
207 __in_z LPCWSTR /*wzPackageId*/,
208 __in_z LPCWSTR /*wzProductCode*/,
209 __in BOOTSTRAPPER_PACKAGE_STATE /*patchState*/,
210 __inout BOOL* pfCancel
211 )
212 {
213 *pfCancel |= CheckCanceled();
214 return S_OK;
215 }
216
217 virtual STDMETHODIMP OnDetectMsiFeature(
218 __in_z LPCWSTR /*wzPackageId*/,
219 __in_z LPCWSTR /*wzFeatureId*/,
220 __in BOOTSTRAPPER_FEATURE_STATE /*state*/,
221 __inout BOOL* pfCancel
222 )
223 {
224 *pfCancel |= CheckCanceled();
225 return S_OK;
226 }
227
228 virtual STDMETHODIMP OnDetectPackageComplete(
229 __in_z LPCWSTR /*wzPackageId*/,
230 __in HRESULT /*hrStatus*/,
231 __in BOOTSTRAPPER_PACKAGE_STATE /*state*/,
232 __in BOOL /*fCached*/
233 )
234 {
235 return S_OK;
236 }
237
238 virtual STDMETHODIMP OnDetectComplete(
239 __in HRESULT /*hrStatus*/,
240 __in BOOL /*fEligibleForCleanup*/
241 )
242 {
243 return S_OK;
244 }
245
246 virtual STDMETHODIMP OnPlanBegin(
247 __in DWORD /*cPackages*/,
248 __inout BOOL* pfCancel
249 )
250 {
251 *pfCancel |= CheckCanceled();
252 return S_OK;
253 }
254
255 virtual STDMETHODIMP OnPlanRelatedBundle(
256 __in_z LPCWSTR /*wzBundleId*/,
257 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
258 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/,
259 __inout BOOL* pfCancel
260 )
261 {
262 *pfCancel |= CheckCanceled();
263 return S_OK;
264 }
265
266 virtual STDMETHODIMP OnPlanPackageBegin(
267 __in_z LPCWSTR /*wzPackageId*/,
268 __in BOOTSTRAPPER_PACKAGE_STATE /*state*/,
269 __in BOOL /*fCached*/,
270 __in BOOTSTRAPPER_PACKAGE_CONDITION_RESULT /*installCondition*/,
271 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
272 __in BOOTSTRAPPER_CACHE_TYPE /*recommendedCacheType*/,
273 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestState*/,
274 __inout BOOTSTRAPPER_CACHE_TYPE* /*pRequestedCacheType*/,
275 __inout BOOL* pfCancel
276 )
277 {
278 *pfCancel |= CheckCanceled();
279 return S_OK;
280 }
281
282 virtual STDMETHODIMP OnPlanPatchTarget(
283 __in_z LPCWSTR /*wzPackageId*/,
284 __in_z LPCWSTR /*wzProductCode*/,
285 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
286 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/,
287 __inout BOOL* pfCancel
288 )
289 {
290 *pfCancel |= CheckCanceled();
291 return S_OK;
292 }
293
294 virtual STDMETHODIMP OnPlanMsiFeature(
295 __in_z LPCWSTR /*wzPackageId*/,
296 __in_z LPCWSTR /*wzFeatureId*/,
297 __in BOOTSTRAPPER_FEATURE_STATE /*recommendedState*/,
298 __inout BOOTSTRAPPER_FEATURE_STATE* /*pRequestedState*/,
299 __inout BOOL* pfCancel
300 )
301 {
302 *pfCancel |= CheckCanceled();
303 return S_OK;
304 }
305
306 virtual STDMETHODIMP OnPlanMsiPackage(
307 __in_z LPCWSTR /*wzPackageId*/,
308 __in BOOL /*fExecute*/,
309 __in BOOTSTRAPPER_ACTION_STATE /*action*/,
310 __inout BOOL* pfCancel,
311 __inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/,
312 __inout INSTALLUILEVEL* /*pUiLevel*/,
313 __inout BOOL* /*pfDisableExternalUiHandler*/
314 )
315 {
316 *pfCancel |= CheckCanceled();
317 return S_OK;
318 }
319
320 virtual STDMETHODIMP OnPlanPackageComplete(
321 __in_z LPCWSTR /*wzPackageId*/,
322 __in HRESULT /*hrStatus*/,
323 __in BOOTSTRAPPER_REQUEST_STATE /*requested*/
324 )
325 {
326 return S_OK;
327 }
328
329 virtual STDMETHODIMP OnPlannedPackage(
330 __in_z LPCWSTR /*wzPackageId*/,
331 __in BOOTSTRAPPER_ACTION_STATE /*execute*/,
332 __in BOOTSTRAPPER_ACTION_STATE /*rollback*/,
333 __in BOOL /*fPlannedCache*/,
334 __in BOOL /*fPlannedUncache*/
335 )
336 {
337 return S_OK;
338 }
339
340 virtual STDMETHODIMP OnPlanComplete(
341 __in HRESULT /*hrStatus*/
342 )
343 {
344 return S_OK;
345 }
346
347 virtual STDMETHODIMP OnApplyBegin(
348 __in DWORD /*dwPhaseCount*/,
349 __inout BOOL* pfCancel
350 )
351 {
352 m_fApplying = TRUE;
353
354 m_dwProgressPercentage = 0;
355 m_dwOverallProgressPercentage = 0;
356
357 *pfCancel |= CheckCanceled();
358 return S_OK;
359 }
360
361 virtual STDMETHODIMP OnElevateBegin(
362 __inout BOOL* pfCancel
363 )
364 {
365 *pfCancel |= CheckCanceled();
366 return S_OK;
367 }
368
369 virtual STDMETHODIMP OnElevateComplete(
370 __in HRESULT /*hrStatus*/
371 )
372 {
373 return S_OK;
374 }
375
376 virtual STDMETHODIMP OnProgress(
377 __in DWORD dwProgressPercentage,
378 __in DWORD dwOverallProgressPercentage,
379 __inout BOOL* pfCancel
380 )
381 {
382 HRESULT hr = S_OK;
383 int nResult = IDNOACTION;
384
385 m_dwProgressPercentage = dwProgressPercentage;
386 m_dwOverallProgressPercentage = dwOverallProgressPercentage;
387
388 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display)
389 {
390 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
391 BalExitOnFailure(hr, "Failed to send embedded overall progress.");
392
393 if (IDERROR == nResult)
394 {
395 hr = E_FAIL;
396 }
397 else if (IDCANCEL == nResult)
398 {
399 *pfCancel = TRUE;
400 }
401 }
402
403 LExit:
404 *pfCancel |= CheckCanceled();
405 return hr;
406 }
407
408 virtual STDMETHODIMP OnError(
409 __in BOOTSTRAPPER_ERROR_TYPE errorType,
410 __in_z LPCWSTR wzPackageId,
411 __in DWORD dwCode,
412 __in_z LPCWSTR /*wzError*/,
413 __in DWORD /*dwUIHint*/,
414 __in DWORD /*cData*/,
415 __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/,
416 __in int /*nRecommendation*/,
417 __inout int* pResult
418 )
419 {
420 BalRetryErrorOccurred(wzPackageId, dwCode);
421
422 if (CheckCanceled())
423 {
424 *pResult = IDCANCEL;
425 }
426 else if (BOOTSTRAPPER_DISPLAY_FULL == m_display)
427 {
428 if (BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER == errorType || BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY == errorType)
429 {
430 *pResult = IDTRYAGAIN;
431 }
432 }
433
434 return S_OK;
435 }
436
437 virtual STDMETHODIMP OnRegisterBegin(
438 __inout BOOL* pfCancel
439 )
440 {
441 *pfCancel |= CheckCanceled();
442 return S_OK;
443 }
444
445 virtual STDMETHODIMP OnRegisterComplete(
446 __in HRESULT /*hrStatus*/
447 )
448 {
449 return S_OK;
450 }
451
452 virtual STDMETHODIMP OnCacheBegin(
453 __inout BOOL* pfCancel
454 )
455 {
456 *pfCancel |= CheckCanceled();
457 return S_OK;
458 }
459
460 virtual STDMETHODIMP OnCachePackageBegin(
461 __in_z LPCWSTR /*wzPackageId*/,
462 __in DWORD /*cCachePayloads*/,
463 __in DWORD64 /*dw64PackageCacheSize*/,
464 __inout BOOL* pfCancel
465 )
466 {
467 *pfCancel |= CheckCanceled();
468 return S_OK;
469 }
470
471 virtual STDMETHODIMP OnCacheAcquireBegin(
472 __in_z_opt LPCWSTR wzPackageOrContainerId,
473 __in_z_opt LPCWSTR wzPayloadId,
474 __in_z LPCWSTR /*wzSource*/,
475 __in_z_opt LPCWSTR /*wzDownloadUrl*/,
476 __in_z_opt LPCWSTR /*wzPayloadContainerId*/,
477 __in BOOTSTRAPPER_CACHE_OPERATION /*recommendation*/,
478 __inout BOOTSTRAPPER_CACHE_OPERATION* /*pAction*/,
479 __inout BOOL* pfCancel
480 )
481 {
482 BalRetryStartContainerOrPayload(wzPackageOrContainerId, wzPayloadId);
483 *pfCancel |= CheckCanceled();
484 return S_OK;
485 }
486
487 virtual STDMETHODIMP OnCacheAcquireProgress(
488 __in_z LPCWSTR /*wzPackageOrContainerId*/,
489 __in_z_opt LPCWSTR /*wzPayloadId*/,
490 __in DWORD64 /*dw64Progress*/,
491 __in DWORD64 /*dw64Total*/,
492 __in DWORD /*dwOverallPercentage*/,
493 __inout BOOL* pfCancel
494 )
495 {
496 HRESULT hr = S_OK;
497 int nResult = IDNOACTION;
498
499 // Send progress even though we don't update the numbers to at least give the caller an opportunity
500 // to cancel.
501 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display)
502 {
503 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
504 BalExitOnFailure(hr, "Failed to send embedded cache progress.");
505
506 if (IDERROR == nResult)
507 {
508 hr = E_FAIL;
509 }
510 else if (IDCANCEL == nResult)
511 {
512 *pfCancel = TRUE;
513 }
514 }
515
516 LExit:
517 *pfCancel |= CheckCanceled();
518 return hr;
519 }
520
521 virtual STDMETHODIMP OnCacheAcquireResolving(
522 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
523 __in_z_opt LPCWSTR /*wzPayloadId*/,
524 __in_z LPCWSTR* /*rgSearchPaths*/,
525 __in DWORD /*cSearchPaths*/,
526 __in BOOL /*fFoundLocal*/,
527 __in DWORD /*dwRecommendedSearchPath*/,
528 __in_z_opt LPCWSTR /*wzDownloadUrl*/,
529 __in_z_opt LPCWSTR /*wzPayloadContainerId*/,
530 __in BOOTSTRAPPER_CACHE_RESOLVE_OPERATION /*recommendation*/,
531 __inout DWORD* /*pdwChosenSearchPath*/,
532 __inout BOOTSTRAPPER_CACHE_RESOLVE_OPERATION* /*pAction*/,
533 __inout BOOL* pfCancel
534 )
535 {
536 *pfCancel |= CheckCanceled();
537 return S_OK;
538 }
539
540 virtual STDMETHODIMP OnCacheAcquireComplete(
541 __in_z LPCWSTR wzPackageOrContainerId,
542 __in_z_opt LPCWSTR wzPayloadId,
543 __in HRESULT hrStatus,
544 __in BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION /*recommendation*/,
545 __inout BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION* pAction
546 )
547 {
548 HRESULT hr = S_OK;
549 BOOL fRetry = FALSE;
550
551 if (CheckCanceled())
552 {
553 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
554 }
555
556 hr = BalRetryEndContainerOrPayload(wzPackageOrContainerId, wzPayloadId, hrStatus, &fRetry);
557 ExitOnFailure(hr, "BalRetryEndPackage for cache failed");
558
559 if (fRetry)
560 {
561 *pAction = BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION_RETRY;
562 }
563
564 LExit:
565 return hr;
566 }
567
568 virtual STDMETHODIMP OnCacheVerifyBegin(
569 __in_z LPCWSTR /*wzPackageOrContainerId*/,
570 __in_z LPCWSTR /*wzPayloadId*/,
571 __inout BOOL* pfCancel
572 )
573 {
574 *pfCancel |= CheckCanceled();
575 return S_OK;
576 }
577
578 virtual STDMETHODIMP OnCacheVerifyProgress(
579 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
580 __in_z_opt LPCWSTR /*wzPayloadId*/,
581 __in DWORD64 /*dw64Progress*/,
582 __in DWORD64 /*dw64Total*/,
583 __in DWORD /*dwOverallPercentage*/,
584 __in BOOTSTRAPPER_CACHE_VERIFY_STEP /*verifyStep*/,
585 __inout BOOL* pfCancel
586 )
587 {
588 *pfCancel |= CheckCanceled();
589 return S_OK;
590 }
591
592 virtual STDMETHODIMP OnCacheVerifyComplete(
593 __in_z LPCWSTR /*wzPackageOrContainerId*/,
594 __in_z LPCWSTR /*wzPayloadId*/,
595 __in HRESULT /*hrStatus*/,
596 __in BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION /*recommendation*/,
597 __inout BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION* pAction
598 )
599 {
600 if (CheckCanceled())
601 {
602 *pAction = BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE;
603 }
604
605 return S_OK;
606 }
607
608 virtual STDMETHODIMP OnCachePackageComplete(
609 __in_z LPCWSTR /*wzPackageId*/,
610 __in HRESULT /*hrStatus*/,
611 __in BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION /*recommendation*/,
612 __inout BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION* pAction
613 )
614 {
615 if (CheckCanceled())
616 {
617 *pAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE;
618 }
619
620 return S_OK;
621 }
622
623 virtual STDMETHODIMP OnCacheComplete(
624 __in HRESULT /*hrStatus*/
625 )
626 {
627 return S_OK;
628 }
629
630 virtual STDMETHODIMP OnExecuteBegin(
631 __in DWORD /*cExecutingPackages*/,
632 __inout BOOL* pfCancel
633 )
634 {
635 *pfCancel |= CheckCanceled();
636 return S_OK;
637 }
638
639 virtual STDMETHODIMP OnExecutePackageBegin(
640 __in_z LPCWSTR wzPackageId,
641 __in BOOL fExecute,
642 __in BOOTSTRAPPER_ACTION_STATE /*action*/,
643 __in INSTALLUILEVEL /*uiLevel*/,
644 __in BOOL /*fDisableExternalUiHandler*/,
645 __inout BOOL* pfCancel
646 )
647 {
648 // Only track retry on execution (not rollback).
649 if (fExecute)
650 {
651 BalRetryStartPackage(wzPackageId);
652 }
653
654 m_fRollingBack = !fExecute;
655 *pfCancel |= CheckCanceled();
656 return S_OK;
657 }
658
659 virtual STDMETHODIMP OnExecutePatchTarget(
660 __in_z LPCWSTR /*wzPackageId*/,
661 __in_z LPCWSTR /*wzTargetProductCode*/,
662 __inout BOOL* pfCancel
663 )
664 {
665 *pfCancel |= CheckCanceled();
666 return S_OK;
667 }
668
669 virtual STDMETHODIMP OnExecuteProgress(
670 __in_z LPCWSTR /*wzPackageId*/,
671 __in DWORD /*dwProgressPercentage*/,
672 __in DWORD /*dwOverallProgressPercentage*/,
673 __inout BOOL* pfCancel
674 )
675 {
676 HRESULT hr = S_OK;
677 int nResult = IDNOACTION;
678
679 // Send progress even though we don't update the numbers to at least give the caller an opportunity
680 // to cancel.
681 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_display)
682 {
683 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
684 BalExitOnFailure(hr, "Failed to send embedded execute progress.");
685
686 if (IDERROR == nResult)
687 {
688 hr = E_FAIL;
689 }
690 else if (IDCANCEL == nResult)
691 {
692 *pfCancel = TRUE;
693 }
694 }
695
696 LExit:
697 *pfCancel |= CheckCanceled();
698 return hr;
699 }
700
701 virtual STDMETHODIMP OnExecuteMsiMessage(
702 __in_z LPCWSTR /*wzPackageId*/,
703 __in INSTALLMESSAGE /*messageType*/,
704 __in DWORD /*dwUIHint*/,
705 __in_z LPCWSTR /*wzMessage*/,
706 __in DWORD /*cData*/,
707 __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/,
708 __in int /*nRecommendation*/,
709 __inout int* pResult
710 )
711 {
712 if (CheckCanceled())
713 {
714 *pResult = IDCANCEL;
715 }
716
717 return S_OK;
718 }
719
720 virtual STDMETHODIMP OnExecuteFilesInUse(
721 __in_z LPCWSTR /*wzPackageId*/,
722 __in DWORD /*cFiles*/,
723 __in_ecount_z(cFiles) LPCWSTR* /*rgwzFiles*/,
724 __in int /*nRecommendation*/,
725 __inout int* pResult
726 )
727 {
728 if (CheckCanceled())
729 {
730 *pResult = IDCANCEL;
731 }
732
733 return S_OK;
734 }
735
736 virtual STDMETHODIMP OnExecutePackageComplete(
737 __in_z LPCWSTR wzPackageId,
738 __in HRESULT hrStatus,
739 __in BOOTSTRAPPER_APPLY_RESTART /*restart*/,
740 __in BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION /*recommendation*/,
741 __inout BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION* pAction
742 )
743 {
744 HRESULT hr = S_OK;
745 BOOL fRetry = FALSE;
746
747 if (CheckCanceled())
748 {
749 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
750 }
751
752 hr = BalRetryEndPackage(wzPackageId, hrStatus, &fRetry);
753 ExitOnFailure(hr, "BalRetryEndPackage for execute failed");
754
755 if (fRetry)
756 {
757 *pAction = BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY;
758 }
759
760 LExit:
761 return hr;
762 }
763
764 virtual STDMETHODIMP OnExecuteComplete(
765 __in HRESULT /*hrStatus*/
766 )
767 {
768 return S_OK;
769 }
770
771 virtual STDMETHODIMP OnUnregisterBegin(
772 __in BOOL /*fKeepRegistration*/,
773 __inout BOOL* /*pfForceKeepRegistration*/
774 )
775 {
776 return S_OK;
777 }
778
779 virtual STDMETHODIMP OnUnregisterComplete(
780 __in HRESULT /*hrStatus*/
781 )
782 {
783 return S_OK;
784 }
785
786 virtual STDMETHODIMP OnApplyComplete(
787 __in HRESULT /*hrStatus*/,
788 __in BOOTSTRAPPER_APPLY_RESTART restart,
789 __in BOOTSTRAPPER_APPLYCOMPLETE_ACTION /*recommendation*/,
790 __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction
791 )
792 {
793 HRESULT hr = S_OK;
794 BOOL fRestartRequired = BOOTSTRAPPER_APPLY_RESTART_REQUIRED == restart;
795 BOOL fShouldBlockRestart = BOOTSTRAPPER_DISPLAY_FULL <= m_display && BOOTSTRAPPER_RESTART_PROMPT >= m_restart;
796
797 if (fRestartRequired && !fShouldBlockRestart)
798 {
799 *pAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART;
800 }
801
802 m_fApplying = FALSE;
803
804 return hr;
805 }
806
807 virtual STDMETHODIMP OnLaunchApprovedExeBegin(
808 __inout BOOL* pfCancel
809 )
810 {
811 *pfCancel |= CheckCanceled();
812 return S_OK;
813 }
814
815 virtual STDMETHODIMP OnLaunchApprovedExeComplete(
816 __in HRESULT /*hrStatus*/,
817 __in DWORD /*dwProcessId*/
818 )
819 {
820 return S_OK;
821 }
822
823 virtual STDMETHODIMP OnBeginMsiTransactionBegin(
824 __in_z LPCWSTR /*wzTransactionId*/,
825 __inout BOOL* pfCancel
826 )
827 {
828 *pfCancel |= CheckCanceled();
829 return S_OK;
830 }
831
832 virtual STDMETHODIMP OnBeginMsiTransactionComplete(
833 __in_z LPCWSTR /*wzTransactionId*/,
834 __in HRESULT /*hrStatus*/
835 )
836 {
837 return S_OK;
838 }
839
840 virtual STDMETHODIMP OnCommitMsiTransactionBegin(
841 __in_z LPCWSTR /*wzTransactionId*/,
842 __inout BOOL* pfCancel
843 )
844 {
845 *pfCancel |= CheckCanceled();
846 return S_OK;
847 }
848
849 virtual STDMETHODIMP OnCommitMsiTransactionComplete(
850 __in_z LPCWSTR /*wzTransactionId*/,
851 __in HRESULT /*hrStatus*/
852 )
853 {
854 return S_OK;
855 }
856
857 virtual STDMETHODIMP OnRollbackMsiTransactionBegin(
858 __in_z LPCWSTR /*wzTransactionId*/
859 )
860 {
861 return S_OK;
862 }
863
864 virtual STDMETHODIMP OnRollbackMsiTransactionComplete(
865 __in_z LPCWSTR /*wzTransactionId*/,
866 __in HRESULT /*hrStatus*/
867 )
868 {
869 return S_OK;
870 }
871
872 virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin(
873 )
874 {
875 return S_OK;
876 }
877
878 virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete(
879 __in HRESULT /*hrStatus*/
880 )
881 {
882 return S_OK;
883 }
884
885 virtual STDMETHODIMP OnSystemRestorePointBegin(
886 )
887 {
888 return S_OK;
889 }
890
891 virtual STDMETHODIMP OnSystemRestorePointComplete(
892 __in HRESULT /*hrStatus*/
893 )
894 {
895 return S_OK;
896 }
897
898 virtual STDMETHODIMP OnPlanForwardCompatibleBundle(
899 __in_z LPCWSTR /*wzBundleId*/,
900 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
901 __in_z LPCWSTR /*wzBundleTag*/,
902 __in BOOL /*fPerMachine*/,
903 __in LPCWSTR /*wzVersion*/,
904 __in BOOL /*fRecommendedIgnoreBundle*/,
905 __inout BOOL* pfCancel,
906 __inout BOOL* /*pfIgnoreBundle*/
907 )
908 {
909 *pfCancel |= CheckCanceled();
910 return S_OK;
911 }
912
913 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyBegin(
914 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
915 __in_z_opt LPCWSTR /*wzPayloadId*/,
916 __inout BOOL* pfCancel
917 )
918 {
919 *pfCancel |= CheckCanceled();
920 return S_OK;
921 }
922
923 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyProgress(
924 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
925 __in_z_opt LPCWSTR /*wzPayloadId*/,
926 __in DWORD64 /*dw64Progress*/,
927 __in DWORD64 /*dw64Total*/,
928 __in DWORD /*dwOverallPercentage*/,
929 __inout BOOL* pfCancel
930 )
931 {
932 *pfCancel |= CheckCanceled();
933 return S_OK;
934 }
935
936 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyComplete(
937 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
938 __in_z_opt LPCWSTR /*wzPayloadId*/,
939 __in HRESULT /*hrStatus*/
940 )
941 {
942 return S_OK;
943 }
944
945 virtual STDMETHODIMP OnCachePayloadExtractBegin(
946 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
947 __in_z_opt LPCWSTR /*wzPayloadId*/,
948 __inout BOOL* pfCancel
949 )
950 {
951 *pfCancel |= CheckCanceled();
952 return S_OK;
953 }
954
955 virtual STDMETHODIMP OnCachePayloadExtractProgress(
956 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
957 __in_z_opt LPCWSTR /*wzPayloadId*/,
958 __in DWORD64 /*dw64Progress*/,
959 __in DWORD64 /*dw64Total*/,
960 __in DWORD /*dwOverallPercentage*/,
961 __inout BOOL* pfCancel
962 )
963 {
964 *pfCancel |= CheckCanceled();
965 return S_OK;
966 }
967
968 virtual STDMETHODIMP OnCachePayloadExtractComplete(
969 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
970 __in_z_opt LPCWSTR /*wzPayloadId*/,
971 __in HRESULT /*hrStatus*/
972 )
973 {
974 return S_OK;
975 }
976
977protected:
978 //
979 // PromptCancel - prompts the user to close (if not forced).
980 //
981 virtual BOOL PromptCancel(
982 __in HWND hWnd,
983 __in BOOL fForceCancel,
984 __in_z_opt LPCWSTR wzMessage,
985 __in_z_opt LPCWSTR wzCaption
986 )
987 {
988 ::EnterCriticalSection(&m_csCanceled);
989
990 // Only prompt the user to close if we have not canceled already.
991 if (!m_fCanceled)
992 {
993 if (fForceCancel)
994 {
995 m_fCanceled = TRUE;
996 }
997 else
998 {
999 m_fCanceled = (IDYES == ::MessageBoxW(hWnd, wzMessage, wzCaption, MB_YESNO | MB_ICONEXCLAMATION));
1000 }
1001 }
1002
1003 ::LeaveCriticalSection(&m_csCanceled);
1004
1005 return m_fCanceled;
1006 }
1007
1008 //
1009 // CheckCanceled - waits if the cancel dialog is up and checks to see if the user canceled the operation.
1010 //
1011 BOOL CheckCanceled()
1012 {
1013 ::EnterCriticalSection(&m_csCanceled);
1014 ::LeaveCriticalSection(&m_csCanceled);
1015 return m_fRollingBack ? FALSE : m_fCanceled;
1016 }
1017
1018 BOOL IsRollingBack()
1019 {
1020 return m_fRollingBack;
1021 }
1022
1023 BOOL IsCanceled()
1024 {
1025 return m_fCanceled;
1026 }
1027
1028 CBalBaseBootstrapperApplication(
1029 __in IBootstrapperEngine* pEngine,
1030 __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
1031 __in DWORD dwRetryCount = 0,
1032 __in DWORD dwRetryTimeout = 1000
1033 )
1034 {
1035 m_cReferences = 1;
1036 m_display = pArgs->pCommand->display;
1037 m_restart = pArgs->pCommand->restart;
1038
1039 pEngine->AddRef();
1040 m_pEngine = pEngine;
1041
1042 ::InitializeCriticalSection(&m_csCanceled);
1043 m_fCanceled = FALSE;
1044 m_fApplying = FALSE;
1045 m_fRollingBack = FALSE;
1046
1047 m_dwProgressPercentage = 0;
1048 m_dwOverallProgressPercentage = 0;
1049
1050 BalRetryInitialize(dwRetryCount, dwRetryTimeout);
1051 }
1052
1053 virtual ~CBalBaseBootstrapperApplication()
1054 {
1055 BalRetryUninitialize();
1056 ::DeleteCriticalSection(&m_csCanceled);
1057
1058 ReleaseNullObject(m_pEngine);
1059 }
1060
1061protected:
1062 CRITICAL_SECTION m_csCanceled;
1063 BOOL m_fCanceled;
1064
1065private:
1066 long m_cReferences;
1067 BOOTSTRAPPER_DISPLAY m_display;
1068 BOOTSTRAPPER_RESTART m_restart;
1069 IBootstrapperEngine* m_pEngine;
1070
1071 BOOL m_fApplying;
1072 BOOL m_fRollingBack;
1073
1074 DWORD m_dwProgressPercentage;
1075 DWORD m_dwOverallProgressPercentage;
1076};