aboutsummaryrefslogtreecommitdiff
path: root/src/api/burn/balutil/inc/BootstrapperApplicationBase.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/burn/balutil/inc/BootstrapperApplicationBase.h')
-rw-r--r--src/api/burn/balutil/inc/BootstrapperApplicationBase.h1235
1 files changed, 1235 insertions, 0 deletions
diff --git a/src/api/burn/balutil/inc/BootstrapperApplicationBase.h b/src/api/burn/balutil/inc/BootstrapperApplicationBase.h
new file mode 100644
index 00000000..a3a3643f
--- /dev/null
+++ b/src/api/burn/balutil/inc/BootstrapperApplicationBase.h
@@ -0,0 +1,1235 @@
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 "IBootstrapperApplication.h"
7
8#include "balutil.h"
9#include "balinfo.h"
10#include "balretry.h"
11
12#define CBalBaseBootstrapperApplication CBootstrapperApplicationBase
13
14class CBootstrapperApplicationBase : 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 )
69 {
70 return E_NOTIMPL;
71 }
72
73 virtual STDMETHODIMP_(void) BAProcFallback(
74 __in BOOTSTRAPPER_APPLICATION_MESSAGE /*message*/,
75 __in const LPVOID /*pvArgs*/,
76 __inout LPVOID /*pvResults*/,
77 __inout HRESULT* /*phr*/
78 )
79 {
80 }
81
82 virtual STDMETHODIMP OnCreate(
83 __in IBootstrapperEngine* pEngine,
84 __in BOOTSTRAPPER_COMMAND* pCommand
85 )
86 {
87 HRESULT hr = S_OK;
88
89 m_commandDisplay = pCommand->display;
90
91 hr = BalInfoParseCommandLine(&m_BalInfoCommand, pCommand);
92 BalExitOnFailure(hr, "Failed to parse command line with balutil.");
93
94 pEngine->AddRef();
95 m_pEngine = pEngine;
96
97 LExit:
98 return hr;
99 }
100
101 virtual STDMETHODIMP OnDestroy(
102 __in BOOL /*fReload*/
103 )
104 {
105 return S_OK;
106 }
107
108 virtual STDMETHODIMP OnStartup()
109 {
110 return S_OK;
111 }
112
113 virtual STDMETHODIMP OnShutdown(
114 __inout BOOTSTRAPPER_SHUTDOWN_ACTION* /*pAction*/
115 )
116 {
117 return S_OK;
118 }
119
120 virtual STDMETHODIMP OnDetectBegin(
121 __in BOOL /*fCached*/,
122 __in BOOTSTRAPPER_REGISTRATION_TYPE /*registrationType*/,
123 __in DWORD /*cPackages*/,
124 __inout BOOL* pfCancel
125 )
126 {
127 *pfCancel |= CheckCanceled();
128 return S_OK;
129 }
130
131 virtual STDMETHODIMP OnDetectForwardCompatibleBundle(
132 __in_z LPCWSTR /*wzBundleId*/,
133 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
134 __in_z LPCWSTR /*wzBundleTag*/,
135 __in BOOL /*fPerMachine*/,
136 __in_z LPCWSTR /*wzVersion*/,
137 __in BOOL /*fMissingFromCache*/,
138 __inout BOOL* pfCancel
139 )
140 {
141 *pfCancel |= CheckCanceled();
142 return S_OK;
143 }
144
145 virtual STDMETHODIMP OnDetectUpdateBegin(
146 __in_z LPCWSTR /*wzUpdateLocation*/,
147 __inout BOOL* pfCancel,
148 __inout BOOL* /*pfSkip*/
149 )
150 {
151 *pfCancel |= CheckCanceled();
152 return S_OK;
153 }
154
155 virtual STDMETHODIMP OnDetectUpdate(
156 __in_z LPCWSTR /*wzUpdateLocation*/,
157 __in DWORD64 /*dw64Size*/,
158 __in_z_opt LPCWSTR /*wzHash*/,
159 __in BOOTSTRAPPER_UPDATE_HASH_TYPE /*hashAlgorithm*/,
160 __in_z LPCWSTR /*wzVersion*/,
161 __in_z LPCWSTR /*wzTitle*/,
162 __in_z LPCWSTR /*wzSummary*/,
163 __in_z LPCWSTR /*wzContentType*/,
164 __in_z LPCWSTR /*wzContent*/,
165 __inout BOOL* pfCancel,
166 __inout BOOL* /*pfStopProcessingUpdates*/
167 )
168 {
169 *pfCancel |= CheckCanceled();
170 return S_OK;
171 }
172
173 virtual STDMETHODIMP OnDetectUpdateComplete(
174 __in HRESULT /*hrStatus*/,
175 __inout BOOL* /*pfIgnoreError*/
176 )
177 {
178 return S_OK;
179 }
180
181 virtual STDMETHODIMP OnDetectRelatedBundle(
182 __in_z LPCWSTR /*wzBundleId*/,
183 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
184 __in_z LPCWSTR /*wzBundleTag*/,
185 __in BOOL /*fPerMachine*/,
186 __in_z LPCWSTR /*wzVersion*/,
187 __in BOOL /*fMissingFromCache*/,
188 __inout BOOL* pfCancel
189 )
190 {
191 *pfCancel |= CheckCanceled();
192 return S_OK;
193 }
194
195 virtual STDMETHODIMP OnDetectPackageBegin(
196 __in_z LPCWSTR /*wzPackageId*/,
197 __inout BOOL* pfCancel
198 )
199 {
200 *pfCancel |= CheckCanceled();
201 return S_OK;
202 }
203
204 virtual STDMETHODIMP OnDetectCompatibleMsiPackage(
205 __in_z LPCWSTR /*wzPackageId*/,
206 __in_z LPCWSTR /*wzCompatiblePackageId*/,
207 __in_z LPCWSTR /*wzCompatiblePackageVersion*/,
208 __inout BOOL* pfCancel
209 )
210 {
211 *pfCancel |= CheckCanceled();
212 return S_OK;
213 }
214
215 virtual STDMETHODIMP OnDetectRelatedMsiPackage(
216 __in_z LPCWSTR /*wzPackageId*/,
217 __in_z LPCWSTR /*wzUpgradeCode*/,
218 __in_z LPCWSTR /*wzProductCode*/,
219 __in BOOL /*fPerMachine*/,
220 __in_z LPCWSTR /*wzVersion*/,
221 __in BOOTSTRAPPER_RELATED_OPERATION /*operation*/,
222 __inout BOOL* pfCancel
223 )
224 {
225 *pfCancel |= CheckCanceled();
226 return S_OK;
227 }
228
229 virtual STDMETHODIMP OnDetectPatchTarget(
230 __in_z LPCWSTR /*wzPackageId*/,
231 __in_z LPCWSTR /*wzProductCode*/,
232 __in BOOTSTRAPPER_PACKAGE_STATE /*patchState*/,
233 __inout BOOL* pfCancel
234 )
235 {
236 *pfCancel |= CheckCanceled();
237 return S_OK;
238 }
239
240 virtual STDMETHODIMP OnDetectMsiFeature(
241 __in_z LPCWSTR /*wzPackageId*/,
242 __in_z LPCWSTR /*wzFeatureId*/,
243 __in BOOTSTRAPPER_FEATURE_STATE /*state*/,
244 __inout BOOL* pfCancel
245 )
246 {
247 *pfCancel |= CheckCanceled();
248 return S_OK;
249 }
250
251 virtual STDMETHODIMP OnDetectPackageComplete(
252 __in_z LPCWSTR /*wzPackageId*/,
253 __in HRESULT /*hrStatus*/,
254 __in BOOTSTRAPPER_PACKAGE_STATE /*state*/,
255 __in BOOL /*fCached*/
256 )
257 {
258 return S_OK;
259 }
260
261 virtual STDMETHODIMP OnDetectComplete(
262 __in HRESULT /*hrStatus*/,
263 __in BOOL /*fEligibleForCleanup*/
264 )
265 {
266 return S_OK;
267 }
268
269 virtual STDMETHODIMP OnPlanBegin(
270 __in DWORD /*cPackages*/,
271 __inout BOOL* pfCancel
272 )
273 {
274 *pfCancel |= CheckCanceled();
275 return S_OK;
276 }
277
278 virtual STDMETHODIMP OnPlanRelatedBundle(
279 __in_z LPCWSTR /*wzBundleId*/,
280 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
281 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/,
282 __inout BOOL* pfCancel
283 )
284 {
285 *pfCancel |= CheckCanceled();
286 return S_OK;
287 }
288
289 virtual STDMETHODIMP OnPlanRollbackBoundary(
290 __in_z LPCWSTR /*wzRollbackBoundaryId*/,
291 __in BOOL /*fRecommendedTransaction*/,
292 __inout BOOL* /*pfTransaction*/,
293 __inout BOOL* pfCancel
294 )
295 {
296 *pfCancel |= CheckCanceled();
297 return S_OK;
298 }
299
300 virtual STDMETHODIMP OnPlanPackageBegin(
301 __in_z LPCWSTR /*wzPackageId*/,
302 __in BOOTSTRAPPER_PACKAGE_STATE /*state*/,
303 __in BOOL /*fCached*/,
304 __in BOOTSTRAPPER_PACKAGE_CONDITION_RESULT /*installCondition*/,
305 __in BOOTSTRAPPER_PACKAGE_CONDITION_RESULT /*repairCondition*/,
306 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
307 __in BOOTSTRAPPER_CACHE_TYPE /*recommendedCacheType*/,
308 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestState*/,
309 __inout BOOTSTRAPPER_CACHE_TYPE* /*pRequestedCacheType*/,
310 __inout BOOL* pfCancel
311 )
312 {
313 *pfCancel |= CheckCanceled();
314 return S_OK;
315 }
316
317 virtual STDMETHODIMP OnPlanCompatibleMsiPackageBegin(
318 __in_z LPCWSTR /*wzPackageId*/,
319 __in_z LPCWSTR /*wzCompatiblePackageId*/,
320 __in_z LPCWSTR /*wzCompatiblePackageVersion*/,
321 __in BOOL /*fRecommendedRemove*/,
322 __inout BOOL* /*pfRequestRemove*/,
323 __inout BOOL* pfCancel
324 )
325 {
326 *pfCancel |= CheckCanceled();
327 return S_OK;
328 }
329
330 virtual STDMETHODIMP OnPlanCompatibleMsiPackageComplete(
331 __in_z LPCWSTR /*wzPackageId*/,
332 __in_z LPCWSTR /*wzCompatiblePackageId*/,
333 __in HRESULT /*hrStatus*/,
334 __in BOOL /*fRequestedRemove*/
335 )
336 {
337 return S_OK;
338 }
339
340 virtual STDMETHODIMP OnPlanPatchTarget(
341 __in_z LPCWSTR /*wzPackageId*/,
342 __in_z LPCWSTR /*wzProductCode*/,
343 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
344 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/,
345 __inout BOOL* pfCancel
346 )
347 {
348 *pfCancel |= CheckCanceled();
349 return S_OK;
350 }
351
352 virtual STDMETHODIMP OnPlanMsiFeature(
353 __in_z LPCWSTR /*wzPackageId*/,
354 __in_z LPCWSTR /*wzFeatureId*/,
355 __in BOOTSTRAPPER_FEATURE_STATE /*recommendedState*/,
356 __inout BOOTSTRAPPER_FEATURE_STATE* /*pRequestedState*/,
357 __inout BOOL* pfCancel
358 )
359 {
360 *pfCancel |= CheckCanceled();
361 return S_OK;
362 }
363
364 virtual STDMETHODIMP OnPlanMsiPackage(
365 __in_z LPCWSTR /*wzPackageId*/,
366 __in BOOL /*fExecute*/,
367 __in BOOTSTRAPPER_ACTION_STATE /*action*/,
368 __in BOOTSTRAPPER_MSI_FILE_VERSIONING /*recommendedFileVersioning*/,
369 __inout BOOL* pfCancel,
370 __inout BURN_MSI_PROPERTY* /*pActionMsiProperty*/,
371 __inout INSTALLUILEVEL* /*pUiLevel*/,
372 __inout BOOL* /*pfDisableExternalUiHandler*/,
373 __inout BOOTSTRAPPER_MSI_FILE_VERSIONING* /*pFileVersioning*/
374 )
375 {
376 *pfCancel |= CheckCanceled();
377 return S_OK;
378 }
379
380 virtual STDMETHODIMP OnPlanPackageComplete(
381 __in_z LPCWSTR /*wzPackageId*/,
382 __in HRESULT /*hrStatus*/,
383 __in BOOTSTRAPPER_REQUEST_STATE /*requested*/
384 )
385 {
386 return S_OK;
387 }
388
389 virtual STDMETHODIMP OnPlannedCompatiblePackage(
390 __in_z LPCWSTR /*wzPackageId*/,
391 __in_z LPCWSTR /*wzCompatiblePackageId*/,
392 __in BOOL /*fRemove*/
393 )
394 {
395 return S_OK;
396 }
397
398 virtual STDMETHODIMP OnPlannedPackage(
399 __in_z LPCWSTR /*wzPackageId*/,
400 __in BOOTSTRAPPER_ACTION_STATE /*execute*/,
401 __in BOOTSTRAPPER_ACTION_STATE /*rollback*/,
402 __in BOOL /*fPlannedCache*/,
403 __in BOOL /*fPlannedUncache*/
404 )
405 {
406 return S_OK;
407 }
408
409 virtual STDMETHODIMP OnPlanComplete(
410 __in HRESULT /*hrStatus*/
411 )
412 {
413 return S_OK;
414 }
415
416 virtual STDMETHODIMP OnApplyBegin(
417 __in DWORD /*dwPhaseCount*/,
418 __inout BOOL* pfCancel
419 )
420 {
421 m_dwProgressPercentage = 0;
422 m_dwOverallProgressPercentage = 0;
423
424 *pfCancel |= CheckCanceled();
425 return S_OK;
426 }
427
428 virtual STDMETHODIMP OnElevateBegin(
429 __inout BOOL* pfCancel
430 )
431 {
432 *pfCancel |= CheckCanceled();
433 return S_OK;
434 }
435
436 virtual STDMETHODIMP OnElevateComplete(
437 __in HRESULT /*hrStatus*/
438 )
439 {
440 return S_OK;
441 }
442
443 virtual STDMETHODIMP OnProgress(
444 __in DWORD dwProgressPercentage,
445 __in DWORD dwOverallProgressPercentage,
446 __inout BOOL* pfCancel
447 )
448 {
449 HRESULT hr = S_OK;
450 int nResult = IDNOACTION;
451
452 m_dwProgressPercentage = dwProgressPercentage;
453 m_dwOverallProgressPercentage = dwOverallProgressPercentage;
454
455 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_commandDisplay)
456 {
457 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
458 BalExitOnFailure(hr, "Failed to send embedded overall progress.");
459
460 if (IDERROR == nResult)
461 {
462 hr = E_FAIL;
463 }
464 else if (IDCANCEL == nResult)
465 {
466 *pfCancel = TRUE;
467 }
468 }
469
470 LExit:
471 *pfCancel |= CheckCanceled();
472 return hr;
473 }
474
475 virtual STDMETHODIMP OnError(
476 __in BOOTSTRAPPER_ERROR_TYPE errorType,
477 __in_z LPCWSTR wzPackageId,
478 __in DWORD dwCode,
479 __in_z LPCWSTR wzError,
480 __in DWORD dwUIHint,
481 __in DWORD /*cData*/,
482 __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/,
483 __in int /*nRecommendation*/,
484 __inout int* pResult
485 )
486 {
487 BalRetryErrorOccurred(wzPackageId, dwCode);
488
489 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_commandDisplay)
490 {
491 HRESULT hr = m_pEngine->SendEmbeddedError(dwCode, wzError, dwUIHint, pResult);
492 if (FAILED(hr))
493 {
494 *pResult = IDERROR;
495 }
496 }
497 else if (CheckCanceled())
498 {
499 *pResult = IDCANCEL;
500 }
501 else if (BOOTSTRAPPER_DISPLAY_FULL == m_commandDisplay)
502 {
503 if (BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_SERVER == errorType || BOOTSTRAPPER_ERROR_TYPE_HTTP_AUTH_PROXY == errorType)
504 {
505 *pResult = IDTRYAGAIN;
506 }
507 }
508
509 return S_OK;
510 }
511
512 virtual STDMETHODIMP OnRegisterBegin(
513 __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/,
514 __inout BOOL* pfCancel,
515 __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/
516 )
517 {
518 *pfCancel |= CheckCanceled();
519 return S_OK;
520 }
521
522 virtual STDMETHODIMP OnRegisterComplete(
523 __in HRESULT /*hrStatus*/
524 )
525 {
526 return S_OK;
527 }
528
529 virtual STDMETHODIMP OnCacheBegin(
530 __inout BOOL* pfCancel
531 )
532 {
533 *pfCancel |= CheckCanceled();
534 return S_OK;
535 }
536
537 virtual STDMETHODIMP OnCachePackageBegin(
538 __in_z LPCWSTR /*wzPackageId*/,
539 __in DWORD /*cCachePayloads*/,
540 __in DWORD64 /*dw64PackageCacheSize*/,
541 __in BOOL /*fVital*/,
542 __inout BOOL* pfCancel
543 )
544 {
545 *pfCancel |= CheckCanceled();
546 return S_OK;
547 }
548
549 virtual STDMETHODIMP OnCacheAcquireBegin(
550 __in_z_opt LPCWSTR wzPackageOrContainerId,
551 __in_z_opt LPCWSTR wzPayloadId,
552 __in_z LPCWSTR /*wzSource*/,
553 __in_z_opt LPCWSTR /*wzDownloadUrl*/,
554 __in_z_opt LPCWSTR /*wzPayloadContainerId*/,
555 __in BOOTSTRAPPER_CACHE_OPERATION /*recommendation*/,
556 __inout BOOTSTRAPPER_CACHE_OPERATION* /*pAction*/,
557 __inout BOOL* pfCancel
558 )
559 {
560 BalRetryStartContainerOrPayload(wzPackageOrContainerId, wzPayloadId);
561 *pfCancel |= CheckCanceled();
562 return S_OK;
563 }
564
565 virtual STDMETHODIMP OnCacheAcquireProgress(
566 __in_z LPCWSTR /*wzPackageOrContainerId*/,
567 __in_z_opt LPCWSTR /*wzPayloadId*/,
568 __in DWORD64 /*dw64Progress*/,
569 __in DWORD64 /*dw64Total*/,
570 __in DWORD /*dwOverallPercentage*/,
571 __inout BOOL* pfCancel
572 )
573 {
574 HRESULT hr = S_OK;
575 int nResult = IDNOACTION;
576
577 // Send progress even though we don't update the numbers to at least give the caller an opportunity
578 // to cancel.
579 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_commandDisplay)
580 {
581 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
582 BalExitOnFailure(hr, "Failed to send embedded cache progress.");
583
584 if (IDERROR == nResult)
585 {
586 hr = E_FAIL;
587 }
588 else if (IDCANCEL == nResult)
589 {
590 *pfCancel = TRUE;
591 }
592 }
593
594 LExit:
595 *pfCancel |= CheckCanceled();
596 return hr;
597 }
598
599 virtual STDMETHODIMP OnCacheAcquireResolving(
600 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
601 __in_z_opt LPCWSTR /*wzPayloadId*/,
602 __in_z LPCWSTR* /*rgSearchPaths*/,
603 __in DWORD /*cSearchPaths*/,
604 __in BOOL /*fFoundLocal*/,
605 __in DWORD /*dwRecommendedSearchPath*/,
606 __in_z_opt LPCWSTR /*wzDownloadUrl*/,
607 __in_z_opt LPCWSTR /*wzPayloadContainerId*/,
608 __in BOOTSTRAPPER_CACHE_RESOLVE_OPERATION /*recommendation*/,
609 __inout DWORD* /*pdwChosenSearchPath*/,
610 __inout BOOTSTRAPPER_CACHE_RESOLVE_OPERATION* /*pAction*/,
611 __inout BOOL* pfCancel
612 )
613 {
614 *pfCancel |= CheckCanceled();
615 return S_OK;
616 }
617
618 virtual STDMETHODIMP OnCacheAcquireComplete(
619 __in_z LPCWSTR wzPackageOrContainerId,
620 __in_z_opt LPCWSTR wzPayloadId,
621 __in HRESULT hrStatus,
622 __in BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION /*recommendation*/,
623 __inout BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION* pAction
624 )
625 {
626 HRESULT hr = S_OK;
627 BOOL fRetry = FALSE;
628
629 if (CheckCanceled())
630 {
631 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
632 }
633
634 hr = BalRetryEndContainerOrPayload(wzPackageOrContainerId, wzPayloadId, hrStatus, &fRetry);
635 ExitOnFailure(hr, "BalRetryEndPackage for cache failed");
636
637 if (fRetry)
638 {
639 *pAction = BOOTSTRAPPER_CACHEACQUIRECOMPLETE_ACTION_RETRY;
640 }
641
642 LExit:
643 return hr;
644 }
645
646 virtual STDMETHODIMP OnCacheVerifyBegin(
647 __in_z LPCWSTR /*wzPackageOrContainerId*/,
648 __in_z LPCWSTR /*wzPayloadId*/,
649 __inout BOOL* pfCancel
650 )
651 {
652 *pfCancel |= CheckCanceled();
653 return S_OK;
654 }
655
656 virtual STDMETHODIMP OnCacheVerifyProgress(
657 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
658 __in_z_opt LPCWSTR /*wzPayloadId*/,
659 __in DWORD64 /*dw64Progress*/,
660 __in DWORD64 /*dw64Total*/,
661 __in DWORD /*dwOverallPercentage*/,
662 __in BOOTSTRAPPER_CACHE_VERIFY_STEP /*verifyStep*/,
663 __inout BOOL* pfCancel
664 )
665 {
666 *pfCancel |= CheckCanceled();
667 return S_OK;
668 }
669
670 virtual STDMETHODIMP OnCacheVerifyComplete(
671 __in_z LPCWSTR /*wzPackageOrContainerId*/,
672 __in_z LPCWSTR /*wzPayloadId*/,
673 __in HRESULT /*hrStatus*/,
674 __in BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION /*recommendation*/,
675 __inout BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION* pAction
676 )
677 {
678 if (CheckCanceled())
679 {
680 *pAction = BOOTSTRAPPER_CACHEVERIFYCOMPLETE_ACTION_NONE;
681 }
682
683 return S_OK;
684 }
685
686 virtual STDMETHODIMP OnCachePackageComplete(
687 __in_z LPCWSTR /*wzPackageId*/,
688 __in HRESULT /*hrStatus*/,
689 __in BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION /*recommendation*/,
690 __inout BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION* pAction
691 )
692 {
693 if (CheckCanceled())
694 {
695 *pAction = BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_NONE;
696 }
697
698 return S_OK;
699 }
700
701 virtual STDMETHODIMP OnCacheComplete(
702 __in HRESULT /*hrStatus*/
703 )
704 {
705 return S_OK;
706 }
707
708 virtual STDMETHODIMP OnExecuteBegin(
709 __in DWORD /*cExecutingPackages*/,
710 __inout BOOL* pfCancel
711 )
712 {
713 *pfCancel |= CheckCanceled();
714 return S_OK;
715 }
716
717 virtual STDMETHODIMP OnExecutePackageBegin(
718 __in_z LPCWSTR wzPackageId,
719 __in BOOL fExecute,
720 __in BOOTSTRAPPER_ACTION_STATE /*action*/,
721 __in INSTALLUILEVEL /*uiLevel*/,
722 __in BOOL /*fDisableExternalUiHandler*/,
723 __inout BOOL* pfCancel
724 )
725 {
726 // Only track retry on execution (not rollback).
727 if (fExecute)
728 {
729 BalRetryStartPackage(wzPackageId);
730 }
731
732 m_fRollingBack = !fExecute;
733 *pfCancel |= CheckCanceled();
734 return S_OK;
735 }
736
737 virtual STDMETHODIMP OnExecutePatchTarget(
738 __in_z LPCWSTR /*wzPackageId*/,
739 __in_z LPCWSTR /*wzTargetProductCode*/,
740 __inout BOOL* pfCancel
741 )
742 {
743 *pfCancel |= CheckCanceled();
744 return S_OK;
745 }
746
747 virtual STDMETHODIMP OnExecuteProgress(
748 __in_z LPCWSTR /*wzPackageId*/,
749 __in DWORD /*dwProgressPercentage*/,
750 __in DWORD /*dwOverallProgressPercentage*/,
751 __inout BOOL* pfCancel
752 )
753 {
754 HRESULT hr = S_OK;
755 int nResult = IDNOACTION;
756
757 // Send progress even though we don't update the numbers to at least give the caller an opportunity
758 // to cancel.
759 if (BOOTSTRAPPER_DISPLAY_EMBEDDED == m_commandDisplay)
760 {
761 hr = m_pEngine->SendEmbeddedProgress(m_dwProgressPercentage, m_dwOverallProgressPercentage, &nResult);
762 BalExitOnFailure(hr, "Failed to send embedded execute progress.");
763
764 if (IDERROR == nResult)
765 {
766 hr = E_FAIL;
767 }
768 else if (IDCANCEL == nResult)
769 {
770 *pfCancel = TRUE;
771 }
772 }
773
774 LExit:
775 *pfCancel |= CheckCanceled();
776 return hr;
777 }
778
779 virtual STDMETHODIMP OnExecuteMsiMessage(
780 __in_z LPCWSTR /*wzPackageId*/,
781 __in INSTALLMESSAGE /*messageType*/,
782 __in DWORD /*dwUIHint*/,
783 __in_z LPCWSTR /*wzMessage*/,
784 __in DWORD /*cData*/,
785 __in_ecount_z_opt(cData) LPCWSTR* /*rgwzData*/,
786 __in int /*nRecommendation*/,
787 __inout int* pResult
788 )
789 {
790 if (CheckCanceled())
791 {
792 *pResult = IDCANCEL;
793 }
794
795 return S_OK;
796 }
797
798 virtual STDMETHODIMP OnExecuteFilesInUse(
799 __in_z LPCWSTR /*wzPackageId*/,
800 __in DWORD /*cFiles*/,
801 __in_ecount_z(cFiles) LPCWSTR* /*rgwzFiles*/,
802 __in int /*nRecommendation*/,
803 __in BOOTSTRAPPER_FILES_IN_USE_TYPE /*source*/,
804 __inout int* pResult
805 )
806 {
807 if (CheckCanceled())
808 {
809 *pResult = IDCANCEL;
810 }
811
812 return S_OK;
813 }
814
815 virtual STDMETHODIMP OnExecutePackageComplete(
816 __in_z LPCWSTR wzPackageId,
817 __in HRESULT hrStatus,
818 __in BOOTSTRAPPER_APPLY_RESTART /*restart*/,
819 __in BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION /*recommendation*/,
820 __inout BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION* pAction
821 )
822 {
823 HRESULT hr = S_OK;
824 BOOL fRetry = FALSE;
825
826 if (CheckCanceled())
827 {
828 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
829 }
830
831 hr = BalRetryEndPackage(wzPackageId, hrStatus, &fRetry);
832 ExitOnFailure(hr, "BalRetryEndPackage for execute failed");
833
834 if (fRetry)
835 {
836 *pAction = BOOTSTRAPPER_EXECUTEPACKAGECOMPLETE_ACTION_RETRY;
837 }
838
839 LExit:
840 return hr;
841 }
842
843 virtual STDMETHODIMP OnExecuteComplete(
844 __in HRESULT /*hrStatus*/
845 )
846 {
847 return S_OK;
848 }
849
850 virtual STDMETHODIMP OnUnregisterBegin(
851 __in BOOTSTRAPPER_REGISTRATION_TYPE /*recommendedRegistrationType*/,
852 __inout BOOTSTRAPPER_REGISTRATION_TYPE* /*pRegistrationType*/
853 )
854 {
855 return S_OK;
856 }
857
858 virtual STDMETHODIMP OnUnregisterComplete(
859 __in HRESULT /*hrStatus*/
860 )
861 {
862 return S_OK;
863 }
864
865 virtual STDMETHODIMP OnApplyComplete(
866 __in HRESULT /*hrStatus*/,
867 __in BOOTSTRAPPER_APPLY_RESTART restart,
868 __in BOOTSTRAPPER_APPLYCOMPLETE_ACTION /*recommendation*/,
869 __inout BOOTSTRAPPER_APPLYCOMPLETE_ACTION* pAction
870 )
871 {
872 HRESULT hr = S_OK;
873 BOOL fRestartRequired = BOOTSTRAPPER_APPLY_RESTART_REQUIRED == restart;
874 BOOL fShouldBlockRestart = BOOTSTRAPPER_DISPLAY_FULL <= m_commandDisplay && BAL_INFO_RESTART_PROMPT >= m_BalInfoCommand.restart;
875
876 if (fRestartRequired && !fShouldBlockRestart)
877 {
878 *pAction = BOOTSTRAPPER_APPLYCOMPLETE_ACTION_RESTART;
879 }
880
881 return hr;
882 }
883
884 virtual STDMETHODIMP OnLaunchApprovedExeBegin(
885 __inout BOOL* pfCancel
886 )
887 {
888 *pfCancel |= CheckCanceled();
889 return S_OK;
890 }
891
892 virtual STDMETHODIMP OnLaunchApprovedExeComplete(
893 __in HRESULT /*hrStatus*/,
894 __in DWORD /*dwProcessId*/
895 )
896 {
897 return S_OK;
898 }
899
900 virtual STDMETHODIMP OnBeginMsiTransactionBegin(
901 __in_z LPCWSTR /*wzTransactionId*/,
902 __inout BOOL* pfCancel
903 )
904 {
905 *pfCancel |= CheckCanceled();
906 return S_OK;
907 }
908
909 virtual STDMETHODIMP OnBeginMsiTransactionComplete(
910 __in_z LPCWSTR /*wzTransactionId*/,
911 __in HRESULT /*hrStatus*/
912 )
913 {
914 return S_OK;
915 }
916
917 virtual STDMETHODIMP OnCommitMsiTransactionBegin(
918 __in_z LPCWSTR /*wzTransactionId*/,
919 __inout BOOL* pfCancel
920 )
921 {
922 *pfCancel |= CheckCanceled();
923 return S_OK;
924 }
925
926 virtual STDMETHODIMP OnCommitMsiTransactionComplete(
927 __in_z LPCWSTR /*wzTransactionId*/,
928 __in HRESULT /*hrStatus*/,
929 __in BOOTSTRAPPER_APPLY_RESTART /*restart*/,
930 __in BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION /*recommendation*/,
931 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION* /*pAction*/
932 )
933 {
934 HRESULT hr = S_OK;
935
936 if (CheckCanceled())
937 {
938 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
939 }
940
941 LExit:
942 return hr;
943 }
944
945 virtual STDMETHODIMP OnRollbackMsiTransactionBegin(
946 __in_z LPCWSTR /*wzTransactionId*/
947 )
948 {
949 return S_OK;
950 }
951
952 virtual STDMETHODIMP OnRollbackMsiTransactionComplete(
953 __in_z LPCWSTR /*wzTransactionId*/,
954 __in HRESULT /*hrStatus*/,
955 __in BOOTSTRAPPER_APPLY_RESTART /*restart*/,
956 __in BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION /*recommendation*/,
957 __inout BOOTSTRAPPER_EXECUTEMSITRANSACTIONCOMPLETE_ACTION* /*pAction*/
958 )
959 {
960 HRESULT hr = S_OK;
961
962 if (CheckCanceled())
963 {
964 ExitFunction1(hr = HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT));
965 }
966
967 LExit:
968 return hr;
969 }
970
971 virtual STDMETHODIMP OnPauseAutomaticUpdatesBegin(
972 )
973 {
974 return S_OK;
975 }
976
977 virtual STDMETHODIMP OnPauseAutomaticUpdatesComplete(
978 __in HRESULT /*hrStatus*/
979 )
980 {
981 return S_OK;
982 }
983
984 virtual STDMETHODIMP OnSystemRestorePointBegin(
985 )
986 {
987 return S_OK;
988 }
989
990 virtual STDMETHODIMP OnSystemRestorePointComplete(
991 __in HRESULT /*hrStatus*/
992 )
993 {
994 return S_OK;
995 }
996
997 virtual STDMETHODIMP OnPlanForwardCompatibleBundle(
998 __in_z LPCWSTR /*wzBundleId*/,
999 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
1000 __in_z LPCWSTR /*wzBundleTag*/,
1001 __in BOOL /*fPerMachine*/,
1002 __in_z LPCWSTR /*wzVersion*/,
1003 __in BOOL /*fRecommendedIgnoreBundle*/,
1004 __inout BOOL* pfCancel,
1005 __inout BOOL* /*pfIgnoreBundle*/
1006 )
1007 {
1008 *pfCancel |= CheckCanceled();
1009 return S_OK;
1010 }
1011
1012 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyBegin(
1013 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1014 __in_z_opt LPCWSTR /*wzPayloadId*/,
1015 __inout BOOL* pfCancel
1016 )
1017 {
1018 *pfCancel |= CheckCanceled();
1019 return S_OK;
1020 }
1021
1022 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyProgress(
1023 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1024 __in_z_opt LPCWSTR /*wzPayloadId*/,
1025 __in DWORD64 /*dw64Progress*/,
1026 __in DWORD64 /*dw64Total*/,
1027 __in DWORD /*dwOverallPercentage*/,
1028 __inout BOOL* pfCancel
1029 )
1030 {
1031 *pfCancel |= CheckCanceled();
1032 return S_OK;
1033 }
1034
1035 virtual STDMETHODIMP OnCacheContainerOrPayloadVerifyComplete(
1036 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1037 __in_z_opt LPCWSTR /*wzPayloadId*/,
1038 __in HRESULT /*hrStatus*/
1039 )
1040 {
1041 return S_OK;
1042 }
1043
1044 virtual STDMETHODIMP OnCachePayloadExtractBegin(
1045 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1046 __in_z_opt LPCWSTR /*wzPayloadId*/,
1047 __inout BOOL* pfCancel
1048 )
1049 {
1050 *pfCancel |= CheckCanceled();
1051 return S_OK;
1052 }
1053
1054 virtual STDMETHODIMP OnCachePayloadExtractProgress(
1055 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1056 __in_z_opt LPCWSTR /*wzPayloadId*/,
1057 __in DWORD64 /*dw64Progress*/,
1058 __in DWORD64 /*dw64Total*/,
1059 __in DWORD /*dwOverallPercentage*/,
1060 __inout BOOL* pfCancel
1061 )
1062 {
1063 *pfCancel |= CheckCanceled();
1064 return S_OK;
1065 }
1066
1067 virtual STDMETHODIMP OnCachePayloadExtractComplete(
1068 __in_z_opt LPCWSTR /*wzPackageOrContainerId*/,
1069 __in_z_opt LPCWSTR /*wzPayloadId*/,
1070 __in HRESULT /*hrStatus*/
1071 )
1072 {
1073 return S_OK;
1074 }
1075
1076 virtual STDMETHODIMP OnPlanRestoreRelatedBundle(
1077 __in_z LPCWSTR /*wzBundleId*/,
1078 __in BOOTSTRAPPER_REQUEST_STATE /*recommendedState*/,
1079 __inout BOOTSTRAPPER_REQUEST_STATE* /*pRequestedState*/,
1080 __inout BOOL* pfCancel
1081 )
1082 {
1083 *pfCancel |= CheckCanceled();
1084 return S_OK;
1085 }
1086
1087 virtual STDMETHODIMP OnPlanRelatedBundleType(
1088 __in_z LPCWSTR /*wzBundleId*/,
1089 __in BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE /*recommendedType*/,
1090 __inout BOOTSTRAPPER_RELATED_BUNDLE_PLAN_TYPE* /*pRequestedType*/,
1091 __inout BOOL* pfCancel
1092 )
1093 {
1094 *pfCancel |= CheckCanceled();
1095 return S_OK;
1096 }
1097
1098 virtual STDMETHODIMP OnApplyDowngrade(
1099 __in HRESULT /*hrRecommended*/,
1100 __in HRESULT* /*phrStatus*/
1101 )
1102 {
1103 return S_OK;
1104 }
1105
1106 virtual STDMETHODIMP OnExecuteProcessCancel(
1107 __in_z LPCWSTR /*wzPackageId*/,
1108 __in DWORD /*dwProcessId*/,
1109 __in BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION /*recommendation*/,
1110 __inout BOOTSTRAPPER_EXECUTEPROCESSCANCEL_ACTION* /*pAction*/
1111 )
1112 {
1113 return S_OK;
1114 }
1115
1116 virtual STDMETHODIMP OnDetectRelatedBundlePackage(
1117 __in_z LPCWSTR /*wzPackageId*/,
1118 __in_z LPCWSTR /*wzBundleId*/,
1119 __in BOOTSTRAPPER_RELATION_TYPE /*relationType*/,
1120 __in BOOL /*fPerMachine*/,
1121 __in_z LPCWSTR /*wzVersion*/,
1122 __inout BOOL* pfCancel
1123 )
1124 {
1125 *pfCancel |= CheckCanceled();
1126 return S_OK;
1127 }
1128
1129 virtual STDMETHODIMP OnCachePackageNonVitalValidationFailure(
1130 __in_z LPCWSTR /*wzPackageId*/,
1131 __in HRESULT /*hrStatus*/,
1132 __in BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION /*recommendation*/,
1133 __inout BOOTSTRAPPER_CACHEPACKAGENONVITALVALIDATIONFAILURE_ACTION* /*pAction*/
1134 )
1135 {
1136 return S_OK;
1137 }
1138
1139protected:
1140 //
1141 // PromptCancel - prompts the user to close (if not forced).
1142 //
1143 virtual BOOL PromptCancel(
1144 __in HWND hWnd,
1145 __in BOOL fForceCancel,
1146 __in_z_opt LPCWSTR wzMessage,
1147 __in_z_opt LPCWSTR wzCaption
1148 )
1149 {
1150 ::EnterCriticalSection(&m_csCanceled);
1151
1152 // Only prompt the user to close if we have not canceled already.
1153 if (!m_fCanceled)
1154 {
1155 if (fForceCancel)
1156 {
1157 m_fCanceled = TRUE;
1158 }
1159 else
1160 {
1161 m_fCanceled = (IDYES == ::MessageBoxW(hWnd, wzMessage, wzCaption, MB_YESNO | MB_ICONEXCLAMATION));
1162 }
1163 }
1164
1165 ::LeaveCriticalSection(&m_csCanceled);
1166
1167 return m_fCanceled;
1168 }
1169
1170 //
1171 // CheckCanceled - waits if the cancel dialog is up and checks to see if the user canceled the operation.
1172 //
1173 BOOL CheckCanceled()
1174 {
1175 ::EnterCriticalSection(&m_csCanceled);
1176 ::LeaveCriticalSection(&m_csCanceled);
1177 return m_fRollingBack ? FALSE : m_fCanceled;
1178 }
1179
1180 BOOL IsRollingBack()
1181 {
1182 return m_fRollingBack;
1183 }
1184
1185 BOOL IsCanceled()
1186 {
1187 return m_fCanceled;
1188 }
1189
1190 CBootstrapperApplicationBase(
1191 __in DWORD dwRetryCount = 0,
1192 __in DWORD dwRetryTimeout = 1000
1193 )
1194 {
1195 m_cReferences = 1;
1196 m_commandDisplay = BOOTSTRAPPER_DISPLAY_UNKNOWN;
1197
1198 m_pEngine = NULL;
1199
1200 ::InitializeCriticalSection(&m_csCanceled);
1201 m_fCanceled = FALSE;
1202 m_BalInfoCommand = { };
1203 m_fRollingBack = FALSE;
1204
1205 m_dwProgressPercentage = 0;
1206 m_dwOverallProgressPercentage = 0;
1207
1208 BalRetryInitialize(dwRetryCount, dwRetryTimeout);
1209 }
1210
1211 virtual ~CBootstrapperApplicationBase()
1212 {
1213 BalInfoUninitializeCommandLine(&m_BalInfoCommand);
1214 BalRetryUninitialize();
1215 ::DeleteCriticalSection(&m_csCanceled);
1216
1217 ReleaseNullObject(m_pEngine);
1218 }
1219
1220protected:
1221 CRITICAL_SECTION m_csCanceled;
1222 BOOL m_fCanceled;
1223
1224 IBootstrapperEngine* m_pEngine;
1225 BAL_INFO_COMMAND m_BalInfoCommand;
1226
1227private:
1228 long m_cReferences;
1229 BOOTSTRAPPER_DISPLAY m_commandDisplay;
1230
1231 BOOL m_fRollingBack;
1232
1233 DWORD m_dwProgressPercentage;
1234 DWORD m_dwOverallProgressPercentage;
1235};