aboutsummaryrefslogtreecommitdiff
path: root/src/engine/apply.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/apply.cpp')
-rw-r--r--src/engine/apply.cpp61
1 files changed, 44 insertions, 17 deletions
diff --git a/src/engine/apply.cpp b/src/engine/apply.cpp
index 0eb8a710..bd294dfa 100644
--- a/src/engine/apply.cpp
+++ b/src/engine/apply.cpp
@@ -100,7 +100,7 @@ static HRESULT ApplyLayoutContainer(
100static HRESULT ApplyProcessPayload( 100static HRESULT ApplyProcessPayload(
101 __in BURN_CACHE_CONTEXT* pContext, 101 __in BURN_CACHE_CONTEXT* pContext,
102 __in_opt BURN_PACKAGE* pPackage, 102 __in_opt BURN_PACKAGE* pPackage,
103 __in BURN_PAYLOAD* pPayload 103 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
104 ); 104 );
105static HRESULT ApplyCacheVerifyContainerOrPayload( 105static HRESULT ApplyCacheVerifyContainerOrPayload(
106 __in BURN_CACHE_CONTEXT* pContext, 106 __in BURN_CACHE_CONTEXT* pContext,
@@ -132,8 +132,7 @@ static HRESULT LayoutOrCacheContainerOrPayload(
132 __in BURN_CACHE_CONTEXT* pContext, 132 __in BURN_CACHE_CONTEXT* pContext,
133 __in_opt BURN_CONTAINER* pContainer, 133 __in_opt BURN_CONTAINER* pContainer,
134 __in_opt BURN_PACKAGE* pPackage, 134 __in_opt BURN_PACKAGE* pPackage,
135 __in_opt BURN_PAYLOAD* pPayload, 135 __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem,
136 __in BOOL fMove,
137 __in DWORD cTryAgainAttempts, 136 __in DWORD cTryAgainAttempts,
138 __out BOOL* pfRetry 137 __out BOOL* pfRetry
139 ); 138 );
@@ -805,14 +804,14 @@ static HRESULT ApplyCachePackage(
805 804
806 for (;;) 805 for (;;)
807 { 806 {
808 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cPayloads, pPackage->payloads.qwTotalSize); 807 hr = UserExperienceOnCachePackageBegin(pContext->pUX, pPackage->sczId, pPackage->payloads.cItems, pPackage->payloads.qwTotalSize);
809 LogExitOnFailure(hr, MSG_USER_CANCELED, "Cancel during cache: %ls: %ls", L"begin cache package", pPackage->sczId); 808 LogExitOnFailure(hr, MSG_USER_CANCELED, "Cancel during cache: %ls: %ls", L"begin cache package", pPackage->sczId);
810 809
811 for (DWORD i = 0; i < pPackage->payloads.cPayloads; ++i) 810 for (DWORD i = 0; i < pPackage->payloads.cItems; ++i)
812 { 811 {
813 BURN_PAYLOAD* pPayload = pPackage->payloads.rgpPayloads[i]; 812 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPackage->payloads.rgItems + i;
814 813
815 hr = ApplyProcessPayload(pContext, pPackage, pPayload); 814 hr = ApplyProcessPayload(pContext, pPackage, pPayloadGroupItem);
816 if (FAILED(hr)) 815 if (FAILED(hr))
817 { 816 {
818 break; 817 break;
@@ -831,6 +830,16 @@ static HRESULT ApplyCachePackage(
831 if (BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_RETRY == cachePackageCompleteAction) 830 if (BOOTSTRAPPER_CACHEPACKAGECOMPLETE_ACTION_RETRY == cachePackageCompleteAction)
832 { 831 {
833 // TODO: the progress needs to account for the payloads (potentially) being recached. 832 // TODO: the progress needs to account for the payloads (potentially) being recached.
833 for (DWORD i = 0; i < pPackage->payloads.cItems; ++i)
834 {
835 BURN_PAYLOAD_GROUP_ITEM* pItem = pPackage->payloads.rgItems + i;
836 if (pItem->fCached)
837 {
838 pItem->pPayload->cRemainingInstances += 1;
839 pItem->fCached = FALSE;
840 }
841 }
842
834 LogErrorId(hr, MSG_APPLY_RETRYING_PACKAGE, pPackage->sczId, NULL, NULL); 843 LogErrorId(hr, MSG_APPLY_RETRYING_PACKAGE, pPackage->sczId, NULL, NULL);
835 844
836 continue; 845 continue;
@@ -891,12 +900,12 @@ static HRESULT ApplyLayoutBundle(
891 hr = LayoutBundle(pContext, wzExecutableName, wzUnverifiedPath, qwBundleSize); 900 hr = LayoutBundle(pContext, wzExecutableName, wzUnverifiedPath, qwBundleSize);
892 ExitOnFailure(hr, "Failed to layout bundle."); 901 ExitOnFailure(hr, "Failed to layout bundle.");
893 902
894 for (DWORD i = 0; i < pPayloads->cPayloads; ++i) 903 for (DWORD i = 0; i < pPayloads->cItems; ++i)
895 { 904 {
896 BURN_PAYLOAD* pPayload = pPayloads->rgpPayloads[i]; 905 BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem = pPayloads->rgItems + i;
897 906
898 hr = ApplyProcessPayload(pContext, NULL, pPayload); 907 hr = ApplyProcessPayload(pContext, NULL, pPayloadGroupItem);
899 ExitOnFailure(hr, "Failed to layout bundle payload: %ls", pPayload->sczKey); 908 ExitOnFailure(hr, "Failed to layout bundle payload: %ls", pPayloadGroupItem->pPayload->sczKey);
900 } 909 }
901 910
902LExit: 911LExit:
@@ -927,7 +936,7 @@ static HRESULT ApplyLayoutContainer(
927 hr = ApplyAcquireContainerOrPayload(pContext, pContainer, NULL, NULL); 936 hr = ApplyAcquireContainerOrPayload(pContext, pContainer, NULL, NULL);
928 LogExitOnFailure(hr, MSG_FAILED_ACQUIRE_CONTAINER, "Failed to acquire container: %ls to working path: %ls", pContainer->sczId, pContainer->sczUnverifiedPath); 937 LogExitOnFailure(hr, MSG_FAILED_ACQUIRE_CONTAINER, "Failed to acquire container: %ls to working path: %ls", pContainer->sczId, pContainer->sczUnverifiedPath);
929 938
930 hr = LayoutOrCacheContainerOrPayload(pContext, pContainer, NULL, NULL, TRUE, cTryAgainAttempts, &fRetry); 939 hr = LayoutOrCacheContainerOrPayload(pContext, pContainer, NULL, NULL, cTryAgainAttempts, &fRetry);
931 if (SUCCEEDED(hr)) 940 if (SUCCEEDED(hr))
932 { 941 {
933 break; 942 break;
@@ -957,12 +966,13 @@ LExit:
957static HRESULT ApplyProcessPayload( 966static HRESULT ApplyProcessPayload(
958 __in BURN_CACHE_CONTEXT* pContext, 967 __in BURN_CACHE_CONTEXT* pContext,
959 __in_opt BURN_PACKAGE* pPackage, 968 __in_opt BURN_PACKAGE* pPackage,
960 __in BURN_PAYLOAD* pPayload 969 __in BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem
961 ) 970 )
962{ 971{
963 HRESULT hr = S_OK; 972 HRESULT hr = S_OK;
964 DWORD cTryAgainAttempts = 0; 973 DWORD cTryAgainAttempts = 0;
965 BOOL fRetry = FALSE; 974 BOOL fRetry = FALSE;
975 BURN_PAYLOAD* pPayload = pPayloadGroupItem->pPayload;
966 976
967 Assert(pContext->pPayloads && pPackage || pContext->wzLayoutDirectory); 977 Assert(pContext->pPayloads && pPackage || pContext->wzLayoutDirectory);
968 978
@@ -984,8 +994,7 @@ static HRESULT ApplyProcessPayload(
984 hr = ApplyAcquireContainerOrPayload(pContext, NULL, pPackage, pPayload); 994 hr = ApplyAcquireContainerOrPayload(pContext, NULL, pPackage, pPayload);
985 LogExitOnFailure(hr, MSG_FAILED_ACQUIRE_PAYLOAD, "Failed to acquire payload: %ls to working path: %ls", pPayload->sczKey, pPayload->sczUnverifiedPath); 995 LogExitOnFailure(hr, MSG_FAILED_ACQUIRE_PAYLOAD, "Failed to acquire payload: %ls to working path: %ls", pPayload->sczKey, pPayload->sczUnverifiedPath);
986 996
987 // TODO: set fMove to TRUE appropriately 997 hr = LayoutOrCacheContainerOrPayload(pContext, NULL, pPackage, pPayloadGroupItem, cTryAgainAttempts, &fRetry);
988 hr = LayoutOrCacheContainerOrPayload(pContext, NULL, pPackage, pPayload, FALSE, cTryAgainAttempts, &fRetry);
989 if (SUCCEEDED(hr)) 998 if (SUCCEEDED(hr))
990 { 999 {
991 break; 1000 break;
@@ -1426,18 +1435,30 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1426 __in BURN_CACHE_CONTEXT* pContext, 1435 __in BURN_CACHE_CONTEXT* pContext,
1427 __in_opt BURN_CONTAINER* pContainer, 1436 __in_opt BURN_CONTAINER* pContainer,
1428 __in_opt BURN_PACKAGE* pPackage, 1437 __in_opt BURN_PACKAGE* pPackage,
1429 __in_opt BURN_PAYLOAD* pPayload, 1438 __in_opt BURN_PAYLOAD_GROUP_ITEM* pPayloadGroupItem,
1430 __in BOOL fMove,
1431 __in DWORD cTryAgainAttempts, 1439 __in DWORD cTryAgainAttempts,
1432 __out BOOL* pfRetry 1440 __out BOOL* pfRetry
1433 ) 1441 )
1434{ 1442{
1435 HRESULT hr = S_OK; 1443 HRESULT hr = S_OK;
1444 BURN_PAYLOAD* pPayload = pPayloadGroupItem ? pPayloadGroupItem->pPayload : NULL;
1436 LPCWSTR wzPackageOrContainerId = pContainer ? pContainer->sczId : pPackage ? pPackage->sczId : L""; 1445 LPCWSTR wzPackageOrContainerId = pContainer ? pContainer->sczId : pPackage ? pPackage->sczId : L"";
1437 LPCWSTR wzUnverifiedPath = pContainer ? pContainer->sczUnverifiedPath : pPayload->sczUnverifiedPath; 1446 LPCWSTR wzUnverifiedPath = pContainer ? pContainer->sczUnverifiedPath : pPayload->sczUnverifiedPath;
1438 LPCWSTR wzPayloadId = pPayload ? pPayload->sczKey : L""; 1447 LPCWSTR wzPayloadId = pPayload ? pPayload->sczKey : L"";
1439 BOOL fCanAffectRegistration = FALSE; 1448 BOOL fCanAffectRegistration = FALSE;
1440 BURN_CACHE_PROGRESS_CONTEXT progress = { }; 1449 BURN_CACHE_PROGRESS_CONTEXT progress = { };
1450 BOOL fMove = !pPayload || 1 == pPayload->cRemainingInstances;
1451
1452 if (pContainer)
1453 {
1454 Assert(!pPayloadGroupItem);
1455 }
1456 else
1457 {
1458 Assert(pPayload);
1459 AssertSz(0 < pPayload->cRemainingInstances, "Laying out payload more times than planned.");
1460 AssertSz(!pPayloadGroupItem->fCached, "Laying out payload group item that was already cached.");
1461 }
1441 1462
1442 if (!pContext->wzLayoutDirectory) 1463 if (!pContext->wzLayoutDirectory)
1443 { 1464 {
@@ -1501,6 +1522,12 @@ static HRESULT LayoutOrCacheContainerOrPayload(
1501 } 1522 }
1502 } while (S_FALSE == hr); 1523 } while (S_FALSE == hr);
1503 1524
1525 if (SUCCEEDED(hr) && pPayloadGroupItem)
1526 {
1527 pPayload->cRemainingInstances -= 1;
1528 pPayloadGroupItem->fCached = TRUE;
1529 }
1530
1504LExit: 1531LExit:
1505 return hr; 1532 return hr;
1506} 1533}