From 6d84c2d0b9af7eb020ac5e4fd5553efd91b63e95 Mon Sep 17 00:00:00 2001 From: mataes2007 Date: Tue, 8 May 2012 09:16:28 +0000 Subject: PackUpdater: added checking schedule (Unsane patch) git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@298 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- PackUpdater/Src/Common.h | 17 +++++-- PackUpdater/Src/Events.cpp | 11 ++++- PackUpdater/Src/Options.cpp | 109 ++++++++++++++++++++++++++++++++++++-------- PackUpdater/Src/Utils.cpp | 64 +++++++++++++++++++++++++- 4 files changed, 176 insertions(+), 25 deletions(-) (limited to 'PackUpdater/Src') diff --git a/PackUpdater/Src/Common.h b/PackUpdater/Src/Common.h index 49cf294..1222439 100644 --- a/PackUpdater/Src/Common.h +++ b/PackUpdater/Src/Common.h @@ -21,8 +21,10 @@ Boston, MA 02111-1307, USA. #define MIRANDA_CUSTOM_LP // Windows Header Files: +#include #include #include +#include #include #include "Wininet.h" #include "Urlmon.h" @@ -96,7 +98,11 @@ struct PackUpdaterIconList }; #define DEFAULT_REMINDER 1 -#define DEFAULT_AUTOUPDATE 1 +#define DEFAULT_UPDATEONSTARTUP 1 +#define DEFAULT_ONLYONCEADAY 0 +#define DEFAULT_UPDATEONPERIOD 0 +#define DEFAULT_PERIOD 1 +#define DEFAULT_PERIODMEASURE 1 #define DEFAULT_FILECOUNT 0 #define DEFAULT_FILETYPE 0 //0 - not defined, 1 - pack, 2 - plugin, 3 - icon, 4 - files in miranda root (e.g. langpack, dbtool), 5 - same as 4 without restart @@ -108,9 +114,9 @@ using std::wstring; using namespace std; extern HINSTANCE hInst; -extern INT FileCount, CurrentFile, Number, UpdatesCount; +extern INT FileCount, CurrentFile, Number, UpdatesCount, Period; extern BOOL Silent, DlgDld; -extern BYTE Reminder, AutoUpdate; +extern BYTE Reminder, UpdateOnStartup, UpdateOnPeriod, OnlyOnceADay, PeriodMeasure; extern TCHAR tszRoot[MAX_PATH], tszDialogMsg[2048]; extern FILEINFO* pFileInfo; extern FILEURL* pFileUrl; @@ -118,6 +124,7 @@ extern HANDLE CheckThread, hOnPreShutdown, hOptHook, hLoadHook; extern MYOPTIONS MyOptions; extern aPopups PopupsList[POPUPS]; extern LPCTSTR Title, Text; +extern HANDLE Timer; VOID InitPopupList(); VOID LoadOptions(); @@ -136,4 +143,6 @@ VOID DlgDownloadProc(); INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK DlgMsgPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void __stdcall ExitMe(void*); -void __stdcall RestartMe(void*); \ No newline at end of file +void __stdcall RestartMe(void*); +BOOL AllowUpdateOnStartup(); +VOID InitTimer(); \ No newline at end of file diff --git a/PackUpdater/Src/Events.cpp b/PackUpdater/Src/Events.cpp index 1967b07..3993fbb 100644 --- a/PackUpdater/Src/Events.cpp +++ b/PackUpdater/Src/Events.cpp @@ -19,6 +19,7 @@ Boston, MA 02111-1307, USA. #include "common.h" +HANDLE Timer; BOOL Silent; int ModulesLoaded(WPARAM wParam, LPARAM lParam) @@ -36,7 +37,12 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) hkd.lParam = FALSE; CallService(MS_HOTKEY_REGISTER, 0, (LPARAM)&hkd); - DoCheck(AutoUpdate, (int)CheckThread); + if(AllowUpdateOnStartup()) + DoCheck(UpdateOnStartup, (int)CheckThread); + + Timer = CreateWaitableTimer(NULL, FALSE, NULL); + InitTimer(); + return 0; } @@ -67,6 +73,9 @@ INT_PTR EmptyFolder(WPARAM wParam,LPARAM lParam) INT OnPreShutdown(WPARAM wParam, LPARAM lParam) { + CancelWaitableTimer(Timer); + CloseHandle(Timer); + UnhookEvent(hOptHook); UnhookEvent(hOnPreShutdown); return 0; diff --git a/PackUpdater/Src/Options.cpp b/PackUpdater/Src/Options.cpp index 645a2ca..56e7def 100644 --- a/PackUpdater/Src/Options.cpp +++ b/PackUpdater/Src/Options.cpp @@ -19,6 +19,19 @@ Boston, MA 02111-1307, USA. #include "common.h" +WNDPROC g_pOldProc; + +LRESULT CALLBACK MyEditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_KEYDOWN: + SendMessage(GetParent(GetParent(hwnd)), PSM_CHANGED, 0, 0); + break; + } + return CallWindowProc (g_pOldProc, hwnd, message, wParam, lParam); +} + INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WORD i = 0; @@ -26,34 +39,72 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA switch (msg) { case WM_INITDIALOG: - TranslateDialogDefault(hwndDlg); - CheckDlgButton(hwndDlg, IDC_ENABLEUPDATES, (int)AutoUpdate); - CheckDlgButton(hwndDlg, IDC_REMINDER, (int)Reminder); - if (ServiceExists(MS_POPUP_ADDPOPUP)) - { - ShowWindow(GetDlgItem(hwndDlg, IDC_NOTIFY2), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_MSG_BOXES2), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_ERRORS2), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_INFO_MESSAGES2), SW_HIDE); - ShowWindow(GetDlgItem(hwndDlg, IDC_PROGR_DLG2), SW_HIDE); - } - else { - for (i = 1; i < POPUPS; i++) + TranslateDialogDefault(hwndDlg); + CheckDlgButton(hwndDlg, IDC_UPDATEONSTARTUP, (int)UpdateOnStartup); + CheckDlgButton(hwndDlg, IDC_ONLYONCEADAY, (int)OnlyOnceADay); + EnableWindow(GetDlgItem(hwndDlg, IDC_ONLYONCEADAY), UpdateOnStartup); + CheckDlgButton(hwndDlg, IDC_UPDATEONPERIOD, (int)UpdateOnPeriod); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIOD), UpdateOnPeriod); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODSPIN), UpdateOnPeriod); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), UpdateOnPeriod); + + SendDlgItemMessage(hwndDlg, IDC_PERIODSPIN, UDM_SETRANGE, 0, MAKELONG(99, 1)); + SendDlgItemMessage(hwndDlg, IDC_PERIODSPIN, UDM_SETPOS, 0, (LPARAM)Period); + + Edit_LimitText(GetDlgItem(hwndDlg, IDC_PERIOD), 2); + g_pOldProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndDlg, IDC_PERIOD), GWL_WNDPROC, (LONG)MyEditProc); + + ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 0, TranslateT("hours")); + ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 1, TranslateT("days")); + ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), PeriodMeasure); + + CheckDlgButton(hwndDlg, IDC_REMINDER, (int)Reminder); + if (ServiceExists(MS_POPUP_ADDPOPUP)) { - mir_snprintf(str, SIZEOF(str), "Popups%dM", i); - CheckDlgButton(hwndDlg, (i+1029), (DBGetContactSettingByte(NULL, MODNAME, str, DEFAULT_MESSAGE_ENABLED)) ? BST_CHECKED: BST_UNCHECKED); + ShowWindow(GetDlgItem(hwndDlg, IDC_NOTIFY2), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_MSG_BOXES2), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_ERRORS2), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_INFO_MESSAGES2), SW_HIDE); + ShowWindow(GetDlgItem(hwndDlg, IDC_PROGR_DLG2), SW_HIDE); + } + else + { + for (i = 1; i < POPUPS; i++) + { + mir_snprintf(str, SIZEOF(str), "Popups%dM", i); + CheckDlgButton(hwndDlg, (i+1029), (DBGetContactSettingByte(NULL, MODNAME, str, DEFAULT_MESSAGE_ENABLED)) ? BST_CHECKED: BST_UNCHECKED); + } } + return TRUE; } - return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)) { - case IDC_ENABLEUPDATES: + case IDC_UPDATEONSTARTUP: + { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + EnableWindow(GetDlgItem(hwndDlg, IDC_ONLYONCEADAY), IsDlgButtonChecked(hwndDlg, IDC_UPDATEONSTARTUP)); + } + break; + case IDC_ONLYONCEADAY: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; + case IDC_UPDATEONPERIOD: + { + BOOL value = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONPERIOD); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIOD), value); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODSPIN), value); + EnableWindow(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), value); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } + break; + case IDC_PERIODMEASURE: + if (HIWORD(wParam) == CBN_SELCHANGE) + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; case IDC_REMINDER: SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; @@ -79,10 +130,30 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA case WM_NOTIFY: { NMHDR *hdr = (NMHDR *)lParam; + if(hdr && hdr->code == UDN_DELTAPOS) + { + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + } if (hdr && hdr->code == PSN_APPLY) { - AutoUpdate = IsDlgButtonChecked(hwndDlg, IDC_ENABLEUPDATES); - DBWriteContactSettingByte(NULL, MODNAME, "AutoUpdate", AutoUpdate); + UpdateOnStartup = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONSTARTUP); + OnlyOnceADay = IsDlgButtonChecked(hwndDlg, IDC_ONLYONCEADAY); + + UpdateOnPeriod = IsDlgButtonChecked(hwndDlg, IDC_UPDATEONPERIOD); + + char buffer[3] = {0}; + Edit_GetText(GetDlgItem(hwndDlg, IDC_PERIOD), (LPWSTR)&buffer, 2); + Period = atoi(buffer); + + PeriodMeasure = ComboBox_GetCurSel(GetDlgItem(hwndDlg, IDC_PERIODMEASURE)); + + InitTimer(); + + DBWriteContactSettingByte(NULL, MODNAME, "UpdateOnStartup", UpdateOnStartup); + DBWriteContactSettingByte(NULL, MODNAME, "OnlyOnceADay", OnlyOnceADay); + DBWriteContactSettingByte(NULL, MODNAME, "UpdateOnPeriod", UpdateOnPeriod); + DBWriteContactSettingDword(NULL, MODNAME, "Period", Period); + DBWriteContactSettingByte(NULL, MODNAME, "PeriodMeasure", PeriodMeasure); Reminder = IsDlgButtonChecked(hwndDlg, IDC_REMINDER); DBWriteContactSettingByte(NULL, MODNAME, "Reminder", Reminder); if (!ServiceExists(MS_POPUP_ADDPOPUP)) diff --git a/PackUpdater/Src/Utils.cpp b/PackUpdater/Src/Utils.cpp index 3665fdb..28571da 100644 --- a/PackUpdater/Src/Utils.cpp +++ b/PackUpdater/Src/Utils.cpp @@ -23,6 +23,8 @@ vector Files; BOOL DlgDld; INT FileCount = 0, CurrentFile = 0, Number = 0; BYTE Reminder, AutoUpdate; +BYTE UpdateOnStartup, UpdateOnPeriod, OnlyOnceADay, PeriodMeasure; +INT Period; TCHAR tszDialogMsg[2048] = {0}; FILEINFO* pFileInfo = NULL; FILEURL* pFileUrl = NULL; @@ -112,7 +114,11 @@ VOID LoadOptions() MyOptions.LeftClickAction= DBGetContactSettingByte(NULL, MODNAME, "LeftClickAction", DEFAULT_POPUP_LCLICK); MyOptions.RightClickAction = DBGetContactSettingByte(NULL, MODNAME, "RightClickAction", DEFAULT_POPUP_RCLICK); MyOptions.Timeout = DBGetContactSettingDword(NULL, MODNAME, "Timeout", DEFAULT_TIMEOUT_VALUE); - AutoUpdate = DBGetContactSettingByte(NULL, MODNAME, "AutoUpdate", DEFAULT_AUTOUPDATE); + UpdateOnStartup = DBGetContactSettingByte(NULL, MODNAME, "UpdateOnStartup", DEFAULT_UPDATEONSTARTUP); + OnlyOnceADay = DBGetContactSettingByte(NULL, MODNAME, "OnlyOnceADay", DEFAULT_ONLYONCEADAY); + UpdateOnPeriod = DBGetContactSettingByte(NULL, MODNAME, "UpdateOnPeriod", DEFAULT_UPDATEONPERIOD); + Period = DBGetContactSettingDword(NULL, MODNAME, "Period", DEFAULT_PERIOD); + PeriodMeasure = DBGetContactSettingByte(NULL, MODNAME, "PeriodMeasure", DEFAULT_PERIODMEASURE); Reminder = DBGetContactSettingByte(NULL, MODNAME, "Reminder", DEFAULT_REMINDER); FileCount = DBGetContactSettingDword(NULL, MODNAME, "FileCount", DEFAULT_FILECOUNT); } @@ -424,5 +430,61 @@ void DoCheck(int iFlag, int iFlag2) else if (iFlag) { CheckThread = mir_forkthread(CheckUpdates, 0); + DBWriteContactSettingDword(NULL, MODNAME, "LastUpdate", time(NULL)); + } +} + +BOOL AllowUpdateOnStartup() +{ + if(OnlyOnceADay) + { + time_t now = time(NULL); + time_t was = DBGetContactSettingDword(NULL, MODNAME, "LastUpdate", 0); + + if((now - was) < 86400) + return FALSE; + } + return TRUE; +} + +LONG PeriodToMilliseconds(const INT period, BYTE& periodMeasure) +{ + LONG result = period * 1000; + switch(periodMeasure) + { + case 1: + // day + result *= 60 * 60 * 24; + break; + + default: + // hour + if(periodMeasure != 0) + periodMeasure = 0; + result *= 60 * 60; + break; + } + return result; +} + +VOID CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue) +{ + DoCheck(1, (int)CheckThread); +} + +VOID InitTimer() +{ + CancelWaitableTimer(Timer); + if(UpdateOnPeriod) + { + LONG interval = PeriodToMilliseconds(Period, PeriodMeasure); + + _int64 qwDueTime = -10000i64 * interval; + + LARGE_INTEGER li = {0}; + li.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF ); + li.HighPart = (LONG) ( qwDueTime >> 32 ); + + SetWaitableTimer(Timer, &li, interval, TimerAPCProc, NULL, 0); } } \ No newline at end of file -- cgit v1.2.3