diff options
Diffstat (limited to 'src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h')
-rw-r--r-- | src/api/burn/balutil/inc/BalBaseBootstrapperApplication.h | 1076 |
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 | |||
14 | class CBalBaseBootstrapperApplication : public IBootstrapperApplication | ||
15 | { | ||
16 | public: // 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 | |||
63 | public: // 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 | |||
977 | protected: | ||
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 | |||
1061 | protected: | ||
1062 | CRITICAL_SECTION m_csCanceled; | ||
1063 | BOOL m_fCanceled; | ||
1064 | |||
1065 | private: | ||
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 | }; | ||