2020-04-21 15:30:12 +08:00
|
|
|
#include "pch.h"
|
|
|
|
|
2020-10-23 00:02:59 +08:00
|
|
|
#include <common/common.h>
|
|
|
|
#include "Generated Files/resource.h"
|
|
|
|
|
2020-04-21 15:30:12 +08:00
|
|
|
#include "action_runner_utils.h"
|
|
|
|
#include "update_state.h"
|
|
|
|
#include "update_utils.h"
|
|
|
|
|
|
|
|
#include <common/timeutil.h>
|
2020-11-20 16:34:34 +08:00
|
|
|
#include <common/updating/installer.h>
|
2020-04-21 15:30:12 +08:00
|
|
|
#include <common/updating/updating.h>
|
2020-12-11 00:05:43 +08:00
|
|
|
#include <common/updating/notifications.h>
|
2020-04-21 15:30:12 +08:00
|
|
|
#include <runner/general_settings.h>
|
|
|
|
|
2020-10-23 00:02:59 +08:00
|
|
|
extern "C" IMAGE_DOS_HEADER __ImageBase;
|
|
|
|
|
2020-11-13 20:57:01 +08:00
|
|
|
auto Strings = create_notifications_strings();
|
2020-10-23 00:02:59 +08:00
|
|
|
|
2020-04-21 15:30:12 +08:00
|
|
|
bool start_msi_uninstallation_sequence()
|
|
|
|
{
|
|
|
|
const auto package_path = updating::get_msi_package_path();
|
|
|
|
|
|
|
|
if (package_path.empty())
|
|
|
|
{
|
|
|
|
// No MSI version detected
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-10-23 00:02:59 +08:00
|
|
|
if (!updating::offer_msi_uninstallation(Strings))
|
2020-04-21 15:30:12 +08:00
|
|
|
{
|
|
|
|
// User declined to uninstall or opted for "Don't show again"
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
auto sei = launch_action_runner(L"-uninstall_msi");
|
|
|
|
|
|
|
|
WaitForSingleObject(sei.hProcess, INFINITE);
|
|
|
|
DWORD exit_code = 0;
|
|
|
|
GetExitCodeProcess(sei.hProcess, &exit_code);
|
|
|
|
CloseHandle(sei.hProcess);
|
|
|
|
return exit_code == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void github_update_worker()
|
|
|
|
{
|
|
|
|
const int64_t update_check_period_minutes = 60 * 24;
|
|
|
|
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
auto state = UpdateState::read();
|
|
|
|
int64_t sleep_minutes_till_next_update = 0;
|
|
|
|
if (state.github_update_last_checked_date.has_value())
|
|
|
|
{
|
|
|
|
int64_t last_checked_minutes_ago = timeutil::diff::in_minutes(timeutil::now(), *state.github_update_last_checked_date);
|
|
|
|
if (last_checked_minutes_ago < 0)
|
|
|
|
{
|
|
|
|
last_checked_minutes_ago = update_check_period_minutes;
|
|
|
|
}
|
|
|
|
sleep_minutes_till_next_update = max(0, update_check_period_minutes - last_checked_minutes_ago);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::minutes(sleep_minutes_till_next_update));
|
|
|
|
const bool download_updates_automatically = get_general_settings().downloadUpdatesAutomatically;
|
|
|
|
try
|
|
|
|
{
|
2020-10-23 00:02:59 +08:00
|
|
|
updating::try_autoupdate(download_updates_automatically, Strings).get();
|
2020-04-21 15:30:12 +08:00
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
// Couldn't autoupdate
|
|
|
|
}
|
|
|
|
UpdateState::store([](UpdateState& state) {
|
|
|
|
state.github_update_last_checked_date.emplace(timeutil::now());
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-11 00:05:43 +08:00
|
|
|
std::optional<updating::new_version_download_info> check_for_updates()
|
2020-06-23 20:53:02 +08:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2020-12-11 00:05:43 +08:00
|
|
|
const auto new_version = updating::get_new_github_version_info_async(Strings).get();
|
|
|
|
if (!new_version)
|
|
|
|
{
|
|
|
|
updating::notifications::show_unavailable(Strings, std::move(new_version.error()));
|
|
|
|
return std::nullopt;
|
|
|
|
}
|
|
|
|
|
|
|
|
updating::notifications::show_available(new_version.value(), Strings);
|
|
|
|
return std::move(new_version.value());
|
2020-06-23 20:53:02 +08:00
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
// Couldn't autoupdate
|
|
|
|
}
|
2020-12-11 00:05:43 +08:00
|
|
|
return std::nullopt;
|
2020-06-23 20:53:02 +08:00
|
|
|
}
|
|
|
|
|
2020-04-21 15:30:12 +08:00
|
|
|
bool launch_pending_update()
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
auto update_state = UpdateState::read();
|
|
|
|
if (update_state.pending_update)
|
|
|
|
{
|
|
|
|
UpdateState::store([](UpdateState& state) {
|
|
|
|
state.pending_update = false;
|
2020-06-18 18:43:09 +08:00
|
|
|
state.pending_installer_filename = {};
|
2020-04-21 15:30:12 +08:00
|
|
|
});
|
2020-06-18 18:43:09 +08:00
|
|
|
std::wstring args{ UPDATE_NOW_LAUNCH_STAGE1_START_PT_CMDARG };
|
|
|
|
args += L' ';
|
|
|
|
args += update_state.pending_installer_filename;
|
|
|
|
|
|
|
|
launch_action_runner(args.c_str());
|
2020-04-21 15:30:12 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|