Skip to content

Commit

Permalink
improve error handling in custom action
Browse files Browse the repository at this point in the history
  • Loading branch information
stefankueng committed Nov 20, 2021
1 parent 48429f9 commit 9024029
Showing 1 changed file with 43 additions and 31 deletions.
74 changes: 43 additions & 31 deletions src/Setup/CustomActions/CustomActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,21 +73,20 @@ UINT __stdcall RegisterSparsePackage(MSIHANDLE hModule)
options.ExternalLocationUri(externalUri);
auto deploymentOperation = manager.AddPackageByUriAsync(packageUri, options);

auto deployResult = deploymentOperation.get();
auto deployResult = deploymentOperation.get();

if (!SUCCEEDED(deployResult.ExtendedErrorCode()))
{
// Deployment failed
std::wstring text = sparseExtPath.get();
text += L"\r\n";
text += sparsePackageFile.get();
text += L"\r\n";
text += deployResult.ErrorText();
return deployResult.ExtendedErrorCode();
PMSIHANDLE hRecord = MsiCreateRecord(0);
std::wstring error = L"AddPackageByUriAsync failed (Errorcode: ";
error += std::to_wstring(deployResult.ExtendedErrorCode());
error += L"):\n";
error += deployResult.ErrorText();
MsiRecordSetStringW(hRecord, 0, error.c_str());
MsiProcessMessage(hModule, INSTALLMESSAGE_ERROR, hRecord);
MsiCloseHandle(hRecord);
}
std::wstring text = sparseExtPath.get();
text += L"\r\n";
text += sparsePackageFile.get();
return ERROR_SUCCESS;
}

Expand All @@ -100,31 +99,44 @@ UINT __stdcall UnregisterSparsePackage(MSIHANDLE hModule)
len += 1;
MsiGetPropertyW(hModule, L"SPARSEPACKAGENAME", sparsePackageName.get(), &len);

PackageManager packageManager;

auto packages = packageManager.FindPackages();
winrt::hstring fullName = sparsePackageName.get();
std::wstring s1, s2, s3;
for (const auto& package : packages)
PackageManager packageManager;
Collections::IIterable<winrt::Windows::ApplicationModel::Package> packages;
try
{
packages = packageManager.FindPackagesForUser(L"");
}
catch (winrt::hresult_error const& ex)
{
s1 += L"\r\n";
s1 += package.Id().Publisher();
s2 += L"\r\n";
s2 += package.Id().PublisherId();
s3 += L"\r\n";
s3 += package.Id().Name();
if (package.Id().Name() == sparsePackageName.get())
fullName = package.Id().FullName();
PMSIHANDLE hRecord = MsiCreateRecord(0);
std::wstring error = L"FindPackagesForUser failed (Errorcode: ";
error += std::to_wstring(ex.code().value);
error += L"):\n";
error += ex.message();
MsiRecordSetStringW(hRecord, 0, error.c_str());
MsiProcessMessage(hModule, INSTALLMESSAGE_ERROR, hRecord);
MsiCloseHandle(hRecord);
}

auto deploymentOperation = packageManager.RemovePackageAsync(fullName, RemovalOptions::None);
auto deployResult = deploymentOperation.get();
if (!SUCCEEDED(deployResult.ExtendedErrorCode()))
for (const auto& package : packages)
{
// Deployment failed
std::wstring text = L"unregistered failed\r\n";
text += deployResult.ErrorText();
return deployResult.ExtendedErrorCode();
if (package.Id().Name() != sparsePackageName.get())
continue;

winrt::hstring fullName = package.Id().FullName();
auto deploymentOperation = packageManager.RemovePackageAsync(fullName, RemovalOptions::None);
auto deployResult = deploymentOperation.get();
if (SUCCEEDED(deployResult.ExtendedErrorCode()))
break;

// Undeployment failed
PMSIHANDLE hRecord = MsiCreateRecord(0);
std::wstring error = L"RemovePackageAsync failed (Errorcode: ";
error += std::to_wstring(deployResult.ExtendedErrorCode());
error += L"):\n";
error += deployResult.ErrorText();
MsiRecordSetStringW(hRecord, 0, error.c_str());
MsiProcessMessage(hModule, INSTALLMESSAGE_ERROR, hRecord);
MsiCloseHandle(hRecord);
}

return ERROR_SUCCESS;
Expand Down

0 comments on commit 9024029

Please sign in to comment.