diff options
Diffstat (limited to 'src/engine/apply.cpp')
-rw-r--r-- | src/engine/apply.cpp | 61 |
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( | |||
100 | static HRESULT ApplyProcessPayload( | 100 | static 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 | ); |
105 | static HRESULT ApplyCacheVerifyContainerOrPayload( | 105 | static 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 | ||
902 | LExit: | 911 | LExit: |
@@ -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: | |||
957 | static HRESULT ApplyProcessPayload( | 966 | static 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 | |||
1504 | LExit: | 1531 | LExit: |
1505 | return hr; | 1532 | return hr; |
1506 | } | 1533 | } |