DWORD WINAPI InstallerThread(LPVOID data) { gGlobalData.success = false; if (!CreateInstallationDirectory()) goto Error; ProgressStep(); if (!InstallCopyFiles()) goto Error; if (gGlobalData.registerAsDefault) { // need to sublaunch SumatraPDF.exe instead of replicating the code // because registration uses translated strings ScopedMem<WCHAR> installedExePath(GetInstalledExePath()); CreateProcessHelper(installedExePath, L"-register-for-pdf"); } if (gGlobalData.installBrowserPlugin) InstallBrowserPlugin(); else if (IsBrowserPluginInstalled()) UninstallBrowserPlugin(); if (gGlobalData.installPdfFilter) InstallPdfFilter(); else if (IsPdfFilterInstalled()) UninstallPdfFilter(); if (gGlobalData.installPdfPreviewer) InstallPdfPreviewer(); else if (IsPdfPreviewerInstalled()) UninstallPdfPreviewer(); if (!CreateAppShortcut(true) && !CreateAppShortcut(false)) { NotifyFailed(_TR("Failed to create a shortcut")); goto Error; } // consider installation a success from here on // (still warn, if we've failed to create the uninstaller, though) gGlobalData.success = true; if (!WriteUninstallerRegistryInfo(HKEY_LOCAL_MACHINE) && !WriteUninstallerRegistryInfo(HKEY_CURRENT_USER)) { NotifyFailed(_TR("Failed to write the uninstallation information to the registry")); } if (!WriteExtendedFileExtensionInfo(HKEY_LOCAL_MACHINE) && !WriteExtendedFileExtensionInfo(HKEY_CURRENT_USER)) { NotifyFailed(_TR("Failed to write the extended file extension information to the registry")); } ProgressStep(); Error: // TODO: roll back installation on failure (restore previous installation!) if (gHwndFrame && !gGlobalData.silent) { Sleep(500); // allow a glimpse of the completed progress bar before hiding it PostMessage(gHwndFrame, WM_APP_INSTALLATION_FINISHED, 0, 0); } return 0; }
DWORD WINAPI UninstallerThread(LPVOID data) { // also kill the original uninstaller, if it's just spawned // a DELETE_ON_CLOSE copy from the temp directory WCHAR *exePath = GetUninstallerPath(); if (!path::IsSame(exePath, GetOwnPath())) KillProcess(exePath, TRUE); free(exePath); if (!RemoveUninstallerRegistryInfo(HKEY_LOCAL_MACHINE) && !RemoveUninstallerRegistryInfo(HKEY_CURRENT_USER)) { NotifyFailed(L"Failed to delete uninstaller registry keys"); } if (!RemoveShortcut(true) && !RemoveShortcut(false)) NotifyFailed(L"Couldn't remove the shortcut"); UninstallBrowserPlugin(); UninstallPdfFilter(); UninstallPdfPreviewer(); RemoveOwnRegistryKeys(); if (!RemoveInstalledFiles()) NotifyFailed(L"Couldn't remove installation directory"); // always succeed, even for partial uninstallations gGlobalData.success = true; if (!gGlobalData.silent) PostMessage(gHwndFrame, WM_APP_INSTALLATION_FINISHED, 0, 0); return 0; }