From 6f9ab7bba86fcd3014adb4002bb70f0d4958fb26 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 6 Apr 2021 14:05:39 +0300 Subject: fixes #2792 (Plugin Updater does not respect "every X days" setting) --- plugins/PluginUpdater/res/Resource.rc | 6 +- plugins/PluginUpdater/src/DlgUpdate.cpp | 108 +++++++--------------------- plugins/PluginUpdater/src/Events.cpp | 13 ++-- plugins/PluginUpdater/src/Options.cpp | 10 +-- plugins/PluginUpdater/src/PluginUpdater.cpp | 67 +++++++---------- plugins/PluginUpdater/src/stdafx.h | 26 +++++-- 6 files changed, 88 insertions(+), 142 deletions(-) (limited to 'plugins/PluginUpdater') diff --git a/plugins/PluginUpdater/res/Resource.rc b/plugins/PluginUpdater/res/Resource.rc index 93ab74cba8..6787f70a2f 100644 --- a/plugins/PluginUpdater/res/Resource.rc +++ b/plugins/PluginUpdater/res/Resource.rc @@ -64,11 +64,11 @@ BEGIN GROUPBOX "Update options",IDC_STATIC,1,3,285,99 CONTROL "On startup",IDC_UPDATEONSTARTUP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,18,73,10 CONTROL "(but only once a day)",IDC_ONLYONCEADAY,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,92,18,186,10 - CONTROL "Every",IDC_UPDATEONPERIOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,32,52,10 - EDITTEXT IDC_PERIOD,82,30,28,14,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED + CONTROL "Every",IDC_UPDATEONPERIOD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,31,52,10 + EDITTEXT IDC_PERIOD,82,30,28,13,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED CONTROL "",IDC_PERIODSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_DISABLED,104,30,10,14 COMBOBOX IDC_PERIODMEASURE,114,30,58,30,CBS_DROPDOWNLIST | CBS_SORT | WS_DISABLED | WS_VSCROLL | WS_TABSTOP - CONTROL "Silent mode",IDC_SILENTMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,46,267,10 + CONTROL "Silent mode",IDC_SILENTMODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,45,267,10 CONTROL "Restart Miranda automatically",IDC_AUTORESTART,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,11,58,267,10 CONTROL "Backup database before update (requires Db_autobackups plugin)",IDC_BACKUP, "Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,11,70,272,10 diff --git a/plugins/PluginUpdater/src/DlgUpdate.cpp b/plugins/PluginUpdater/src/DlgUpdate.cpp index 9ead0a0ba2..b34306bed1 100644 --- a/plugins/PluginUpdater/src/DlgUpdate.cpp +++ b/plugins/PluginUpdater/src/DlgUpdate.cpp @@ -832,14 +832,17 @@ static void CheckUpdates(void *) else CallFunctionAsync(LaunchDialog, UpdateFiles); } - } - CallFunctionAsync(InitTimer, (success ? nullptr : (void*)2)); + // reset timer to next update + g_plugin.dwLastUpdate = time(0); + g_plugin.InitTimer(0); + } + else g_plugin.InitTimer(1); // update failed, postpone the timer hashes.destroy(); } -static void DoCheck(bool bSilent = true) +void DoCheck(bool bSilent) { if (dwCheckThreadId) ShowPopup(TranslateT("Plugin Updater"), TranslateT("Update checking already started!"), POPUP_TYPE_INFO); @@ -850,8 +853,6 @@ static void DoCheck(bool bSilent = true) } else { g_plugin.bSilent = bSilent; - g_plugin.setDword(DB_SETTING_LAST_UPDATE, time(0)); - mir_forkthread(CheckUpdates); } } @@ -864,29 +865,13 @@ void UninitCheck() DestroyWindow(hwndDialog); } -// menu item command -static INT_PTR MenuCommand(WPARAM, LPARAM) -{ - Netlib_LogfW(hNetlibUser, L"Update started manually!"); - DoCheck(false); - return 0; -} - -void InitCheck() -{ - CreateServiceFunction(MS_PU_CHECKUPDATES, MenuCommand); -} - void CALLBACK CheckUpdateOnStartup() { if (g_plugin.bUpdateOnStartup) { - if (g_plugin.bOnlyOnceADay) { - time_t now = time(0), - was = g_plugin.getDword(DB_SETTING_LAST_UPDATE, 0); - - if ((now - was) < 86400) + if (g_plugin.bOnlyOnceADay) + if (time(0) - g_plugin.dwLastUpdate < 86400) return; - } + Netlib_LogfW(hNetlibUser, L"Update on startup started!"); DoCheck(); } @@ -894,69 +879,28 @@ void CALLBACK CheckUpdateOnStartup() ///////////////////////////////////////////////////////////////////////////////////////// -static void CALLBACK TimerAPCProc(void *, DWORD, DWORD) +void CMPlugin::Impl::onTimer(CTimer*) { - DoCheck(); + if (g_plugin.iNextCheck) + if (time(0) >= g_plugin.iNextCheck) + DoCheck(); } -static LONGLONG PeriodToMilliseconds(const int period, CMOption &periodMeasure) +void CMPlugin::InitTimer(int type) { - LONGLONG result = period * 1000LL; - switch (periodMeasure) { - case 1: - // day - result *= 60 * 60 * 24; - break; - - default: - // hour - if (periodMeasure != 0) - periodMeasure = 0; - result *= 60 * 60; - } - return result; -} - -void __stdcall InitTimer(void *type) -{ - if (!g_plugin.bUpdateOnPeriod) + if (!bUpdateOnPeriod) { + iNextCheck = 0; return; - - LONGLONG interval; - - switch ((INT_PTR)type) { - case 0: // default, plan next check relative to last check - { - time_t now = time(0); - time_t was = g_plugin.getDword(DB_SETTING_LAST_UPDATE, 0); - - interval = PeriodToMilliseconds(g_plugin.iPeriod, g_plugin.iPeriodMeasure); - interval -= (now - was) * 1000; - if (interval <= 0) - interval = 1000; // no last update or too far in the past -> do it now - } - break; - - case 2: // failed last check, check again in two hours - interval = 1000 * 60 * 60 * 2; - break; - - default: // options changed, use set interval from now - interval = PeriodToMilliseconds(g_plugin.iPeriod, g_plugin.iPeriodMeasure); } - FILETIME ft; - GetSystemTimeAsFileTime(&ft); - - LARGE_INTEGER li; - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - li.QuadPart += interval * 10000LL; - SetWaitableTimer(hTimer, &li, 0, TimerAPCProc, nullptr, 0); -} - -void CreateTimer() -{ - hTimer = CreateWaitableTimer(nullptr, FALSE, nullptr); - InitTimer(0); + // normal timer reset; + if (type == 0) { + iNextCheck = dwLastUpdate; + if (iPeriodMeasure == 1) + iNextCheck += g_plugin.iPeriod * 86400; // day + else + iNextCheck += g_plugin.iPeriod * 3600; // hour + } + else // failed last check, check again in two hours + iNextCheck += 60 * 60 * 2; } diff --git a/plugins/PluginUpdater/src/Events.cpp b/plugins/PluginUpdater/src/Events.cpp index 245bd11a81..7f2abf8d6c 100644 --- a/plugins/PluginUpdater/src/Events.cpp +++ b/plugins/PluginUpdater/src/Events.cpp @@ -19,9 +19,11 @@ Boston, MA 02111-1307, USA. #include "stdafx.h" -HANDLE hPluginUpdaterFolder; +int OptInit(WPARAM, LPARAM); -int OnFoldersChanged(WPARAM, LPARAM) +static HANDLE hPluginUpdaterFolder; + +static int OnFoldersChanged(WPARAM, LPARAM) { FoldersGetCustomPathW(hPluginUpdaterFolder, g_wszRoot, MAX_PATH, L""); size_t len = wcslen(g_wszRoot); @@ -30,7 +32,7 @@ int OnFoldersChanged(WPARAM, LPARAM) return 0; } -int ModulesLoaded(WPARAM, LPARAM) +static int ModulesLoaded(WPARAM, LPARAM) { if (hPluginUpdaterFolder = FoldersRegisterCustomPathW(MODULEA, LPGEN("Plugin Updater"), MIRANDA_PATHW L"\\" DEFAULT_UPDATES_FOLDER)) { HookEvent(ME_FOLDERS_PATH_CHANGED, OnFoldersChanged); @@ -46,12 +48,10 @@ int ModulesLoaded(WPARAM, LPARAM) db_set_b(0, "Compatibility", MODULENAME, 1); DeleteDirectoryTreeW(CMStringW(g_wszRoot) + L"\\Backups"); } - - CreateTimer(); return 0; } -int OnPreShutdown(WPARAM, LPARAM) +static int OnPreShutdown(WPARAM, LPARAM) { UninitCheck(); UninitListNew(); @@ -62,6 +62,7 @@ void InitEvents() { Miranda_WaitOnHandle(CheckUpdateOnStartup); + HookEvent(ME_OPT_INITIALISE, OptInit); HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); HookEvent(ME_SYSTEM_PRESHUTDOWN, OnPreShutdown); } diff --git a/plugins/PluginUpdater/src/Options.cpp b/plugins/PluginUpdater/src/Options.cpp index 08b6c86a9a..8a44851cac 100644 --- a/plugins/PluginUpdater/src/Options.cpp +++ b/plugins/PluginUpdater/src/Options.cpp @@ -223,13 +223,13 @@ public: bool OnApply() override { - g_plugin.iPeriodMeasure = cmbPeriod.GetCurSel(); + g_plugin.iPeriodMeasure = cmbPeriod.GetItemData(cmbPeriod.GetCurSel()); wchar_t buffer[3] = { 0 }; Edit_GetText(GetDlgItem(m_hwnd, IDC_PERIOD), buffer, _countof(buffer)); g_plugin.iPeriod = _wtoi(buffer); - InitTimer((void *)1); + g_plugin.InitTimer(0); int iNewMode; bool bNoSymbols = false; @@ -289,8 +289,10 @@ public: RemoveBackupFolders(); // if user tried to change the channel, run the update dialog immediately - if (bStartUpdate) - CallService(MS_PU_CHECKUPDATES, 0, 0); + if (bStartUpdate) { + Netlib_Log(hNetlibUser, "Platform changed, let's check for updates"); + DoCheck(false); + } return true; } diff --git a/plugins/PluginUpdater/src/PluginUpdater.cpp b/plugins/PluginUpdater/src/PluginUpdater.cpp index 176844452a..f2573eba88 100644 --- a/plugins/PluginUpdater/src/PluginUpdater.cpp +++ b/plugins/PluginUpdater/src/PluginUpdater.cpp @@ -60,14 +60,25 @@ CMPlugin::CMPlugin() : // other settings iPeriod(MODULENAME, "Period", 1), iPeriodMeasure(MODULENAME, "PeriodMeasure", 1), - iNumberBackups(MODULENAME, "NumberOfBackups", 3) + iNumberBackups(MODULENAME, "NumberOfBackups", 3), + dwLastUpdate(MODULENAME, "LastUpdate", 0) { } ///////////////////////////////////////////////////////////////////////////////////////// +static INT_PTR MenuCommand(WPARAM, LPARAM) +{ + Netlib_LogfW(hNetlibUser, L"Update started manually!"); + DoCheck(false); + return 0; +} + int CMPlugin::Load() { + m_impl.m_timer.Start(60 * 1000); + InitTimer(0); + g_plugin.setByte(DB_SETTING_NEED_RESTART, 0); DWORD dwLen = GetTempPath(_countof(g_wszTempPath), g_wszTempPath); @@ -78,17 +89,24 @@ int CMPlugin::Load() InitNetlib(); InitIcoLib(); - // Add cheking update menu item - InitCheck(); + // Add hotkey + HOTKEYDESC hkd = {}; + hkd.pszName = "Check for updates"; + hkd.szDescription.a = "Check for updates"; + hkd.szSection.a = "Plugin Updater"; + hkd.pszService = "PluginUpdater/CheckUpdates"; + hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL, VK_F10) | HKF_MIRANDA_LOCAL; + g_plugin.addHotkey(&hkd); + // Add cheking update menu item CMenuItem mi(&g_plugin); - SET_UID(mi, 0xfa2cbe01, 0x3b37, 0x4a4c, 0xa6, 0x97, 0xe4, 0x6f, 0x31, 0xa9, 0xfc, 0x33); mi.name.a = LPGEN("Check for updates"); mi.hIcolibItem = iconList[0].hIcolib; mi.position = 400010000; - mi.pszService = MS_PU_CHECKUPDATES; + mi.pszService = hkd.pszService; Menu_AddMainMenuItem(&mi); + CreateServiceFunction(mi.pszService, MenuCommand); InitListNew(); @@ -99,45 +117,12 @@ int CMPlugin::Load() mi.pszService = MS_PU_SHOWLIST; Menu_AddMainMenuItem(&mi); - // initialize options - HookEvent(ME_OPT_INITIALISE, OptInit); - - // Add hotkey - HOTKEYDESC hkd = {}; - hkd.pszName = "Check for updates"; - hkd.szDescription.a = "Check for updates"; - hkd.szSection.a = "Plugin Updater"; - hkd.pszService = MS_PU_CHECKUPDATES; - hkd.DefHotKey = HOTKEYCODE(HOTKEYF_CONTROL, VK_F10) | HKF_MIRANDA_LOCAL; - hkd.lParam = FALSE; - g_plugin.addHotkey(&hkd); - + // initialize event hooks InitEvents(); // add sounds + g_plugin.addSound("updatefailed", LPGENW("Plugin Updater"), LPGENW("Update failed")); g_plugin.addSound("updatecompleted", LPGENW("Plugin Updater"), LPGENW("Update completed")); - g_plugin.addSound("updatefailed", LPGENW("Plugin Updater"), LPGENW("Update failed")); - - // Upgrade old settings - if (-1 == g_plugin.getByte(DB_SETTING_UPDATE_MODE, -1)) { - ptrW dbvUpdateURL(g_plugin.getWStringA(DB_SETTING_UPDATE_URL)); - if (dbvUpdateURL) { - if (!wcscmp(dbvUpdateURL, _A2W(DEFAULT_UPDATE_URL_OLD))) { - g_plugin.setByte(DB_SETTING_UPDATE_MODE, UPDATE_MODE_STABLE); - g_plugin.delSetting(DB_SETTING_UPDATE_URL); - } - else if (!wcscmp(dbvUpdateURL, _A2W(DEFAULT_UPDATE_URL_TRUNK_OLD))) { - g_plugin.setByte(DB_SETTING_UPDATE_MODE, UPDATE_MODE_TRUNK); - g_plugin.delSetting(DB_SETTING_UPDATE_URL); - } - else if (!wcscmp(dbvUpdateURL, _A2W(DEFAULT_UPDATE_URL_TRUNK_SYMBOLS_OLD) L"/")) { - g_plugin.setByte(DB_SETTING_UPDATE_MODE, UPDATE_MODE_TRUNK_SYMBOLS); - g_plugin.delSetting(DB_SETTING_UPDATE_URL); - } - else g_plugin.setByte(DB_SETTING_UPDATE_MODE, UPDATE_MODE_CUSTOM); - } - } - return 0; } @@ -145,6 +130,8 @@ int CMPlugin::Load() int CMPlugin::Unload() { + m_impl.m_timer.Stop(); + UnloadListNew(); UnloadNetlib(); return 0; diff --git a/plugins/PluginUpdater/src/stdafx.h b/plugins/PluginUpdater/src/stdafx.h index 41c5d38590..190fb1ee17 100644 --- a/plugins/PluginUpdater/src/stdafx.h +++ b/plugins/PluginUpdater/src/stdafx.h @@ -56,7 +56,6 @@ extern "C" #include #define MS_PU_SHOWLIST "PluginUpdater/ShowList" -#define MS_PU_CHECKUPDATES "PluginUpdater/CheckUpdates" #include "Notifications.h" @@ -135,7 +134,6 @@ enum #define DB_SETTING_UPDATE_MODE "UpdateMode" #define DB_SETTING_UPDATE_URL "UpdateURL" #define DB_SETTING_NEED_RESTART "NeedRestart" -#define DB_SETTING_LAST_UPDATE "LastUpdate" #define DB_SETTING_DONT_SWITCH_TO_STABLE "DontSwitchToStable" #define DB_SETTING_CHANGEPLATFORM "ChangePlatform" @@ -158,27 +156,44 @@ extern IconItem iconList[]; struct CMPlugin : public PLUGIN { + struct Impl + { + Impl() : + m_timer(Miranda_GetSystemWindow(), LPARAM(this)) + { + m_timer.OnEvent = Callback(this, &Impl::onTimer); + } + + CTimer m_timer; + void onTimer(CTimer *); + } + m_impl; + CMPlugin(); int Load() override; int Unload() override; + void InitTimer(int mode); + + // variables + time_t iNextCheck = 0; bool bForceRedownload = false, bSilent; // not a db options // common options CMOption bUpdateOnStartup, bUpdateOnPeriod, bOnlyOnceADay, bSilentMode, bBackup, bChangePlatform, bUseHttps, bAutoRestart; CMOption iPeriod, iPeriodMeasure, iNumberBackups; + CMOption dwLastUpdate; // popup options CMOption PopupDefColors, PopupLeftClickAction, PopupRightClickAction; CMOption PopupTimeout; }; +void DoCheck(bool bSilent = true); void UninitCheck(void); void UninitListNew(void); -int OptInit(WPARAM, LPARAM); - class ThreadWatch { DWORD &pId; @@ -226,8 +241,6 @@ void InitNetlib(); void InitIcoLib(); void InitEvents(); void InitListNew(); -void InitCheck(); -void CreateTimer(); void UnloadListNew(); void UnloadNetlib(); @@ -244,7 +257,6 @@ wchar_t* GetDefaultUrl(); bool DownloadFile(FILEURL *pFileURL, HNETLIBCONN &nlc); void ShowPopup(LPCTSTR Title, LPCTSTR Text, int Number); -void __stdcall InitTimer(void *type); int unzip(const wchar_t *pwszZipFile, wchar_t *pwszDestPath, wchar_t *pwszBackPath, bool ch); -- cgit v1.2.3