diff options
author | George Hazan <ghazan@miranda.im> | 2021-04-06 14:05:39 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2021-04-06 14:05:39 +0300 |
commit | 6f9ab7bba86fcd3014adb4002bb70f0d4958fb26 (patch) | |
tree | 784ed7456abd35cc4b5e673b69485045c769df92 /plugins | |
parent | 8add0353064ecdeb4d814eb4b2b08b362f9c6594 (diff) |
fixes #2792 (Plugin Updater does not respect "every X days" setting)
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/PluginUpdater/res/Resource.rc | 6 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/DlgUpdate.cpp | 108 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/Events.cpp | 13 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/Options.cpp | 10 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/PluginUpdater.cpp | 67 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/stdafx.h | 26 |
6 files changed, 88 insertions, 142 deletions
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<int> &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 <m_autobackups.h>
#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<CMPlugin>
{
+ 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<bool> bUpdateOnStartup, bUpdateOnPeriod, bOnlyOnceADay, bSilentMode, bBackup, bChangePlatform, bUseHttps, bAutoRestart;
CMOption<int> iPeriod, iPeriodMeasure, iNumberBackups;
+ CMOption<DWORD> dwLastUpdate;
// popup options
CMOption<BYTE> PopupDefColors, PopupLeftClickAction, PopupRightClickAction;
CMOption<DWORD> 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);
|