From e54b4cd7f0c6fd272437e410f17238a6c94b1547 Mon Sep 17 00:00:00 2001 From: Tobias Weimer Date: Sat, 26 Jul 2014 22:51:26 +0000 Subject: PluginUpdater: -Now the custom URL is remembered when changing the update mode in Options -Cleaned up popup Options -Fixed Restart MessageBox after silent update -code reordering git-svn-id: http://svn.miranda-ng.org/main/trunk@9958 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj | 1 + .../PluginUpdaterIM_10.vcxproj.filters | 3 + plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj | 1 + .../PluginUpdaterIM_12.vcxproj.filters | 3 + plugins/PluginUpdater/res/Resource.rc | 54 +++-- plugins/PluginUpdater/src/Common.h | 24 +- plugins/PluginUpdater/src/Compat/compat.cpp | 101 ++++++++ plugins/PluginUpdater/src/Compat/compat.h | 22 +- plugins/PluginUpdater/src/DlgListNew.cpp | 154 +++++------- plugins/PluginUpdater/src/DlgUpdate.cpp | 266 +++++++++++---------- plugins/PluginUpdater/src/Events.cpp | 5 +- plugins/PluginUpdater/src/Notifications.cpp | 264 ++++++-------------- plugins/PluginUpdater/src/Notifications.h | 16 +- plugins/PluginUpdater/src/Options.cpp | 90 ++++--- plugins/PluginUpdater/src/PluginUpdater.cpp | 25 ++ plugins/PluginUpdater/src/Utils.cpp | 221 +++++++---------- plugins/PluginUpdater/src/unzipfile.cpp | 9 +- 17 files changed, 610 insertions(+), 649 deletions(-) create mode 100644 plugins/PluginUpdater/src/Compat/compat.cpp diff --git a/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj b/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj index 71fa37158e..429a9623a6 100644 --- a/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj +++ b/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj @@ -192,6 +192,7 @@ + diff --git a/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj.filters b/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj.filters index eca3d5543c..a684e48e85 100644 --- a/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj.filters +++ b/plugins/PluginUpdater/PluginUpdaterIM_10.vcxproj.filters @@ -94,6 +94,9 @@ Source Files + + Source Files + diff --git a/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj b/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj index 348c13bc30..3cd6030e91 100644 --- a/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj +++ b/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj @@ -184,6 +184,7 @@ + diff --git a/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj.filters b/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj.filters index eca3d5543c..a684e48e85 100644 --- a/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj.filters +++ b/plugins/PluginUpdater/PluginUpdaterIM_12.vcxproj.filters @@ -94,6 +94,9 @@ Source Files + + Source Files + diff --git a/plugins/PluginUpdater/res/Resource.rc b/plugins/PluginUpdater/res/Resource.rc index 12236bac66..df10e0ac9a 100644 --- a/plugins/PluginUpdater/res/Resource.rc +++ b/plugins/PluginUpdater/res/Resource.rc @@ -43,7 +43,7 @@ CAPTION "Updates found!" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CTEXT "PluginUpdater has detected updated versions of some Miranda components. Click on Details button to view more information.",IDC_UPDATETEXT,9,7,223,24 - DEFPUSHBUTTON "Update",IDOK,32,36,50,14 + DEFPUSHBUTTON "Update",IDOK,32,36,50,14,WS_DISABLED PUSHBUTTON "Details >>",IDC_DETAILS,95,36,50,14,NOT WS_TABSTOP PUSHBUTTON "Cancel",IDCANCEL,157,36,50,14 CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,1,58,236,1 @@ -84,48 +84,43 @@ BEGIN CTEXT "Some component(s) was updated.\nYou need to restart your Miranda to apply installed updates.",IDC_NEEDRESTARTLABEL,11,193,247,15,NOT WS_VISIBLE END -IDD_POPUP DIALOGEX 0, 0, 316, 182 +IDD_POPUP DIALOGEX 0, 0, 316, 138 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Notifications",IDC_NOTIFY,1,0,172,79 - CONTROL "Message boxes (*)",IDC_MSG_BOXES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,79,10 - CONTROL "Errors",IDC_ERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,57,10 - CONTROL "Info messages",IDC_INFO_MESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,45,80,10 - CONTROL "Progress dialogs",IDC_PROGR_DLG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,59,80,10 + GROUPBOX "Notifications",IDC_NOTIFY,1,0,172,63 + CONTROL "Restart",IDC_MSG_BOXES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,19,79,10 + CONTROL "Errors",IDC_ERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,32,79,10 + CONTROL "Info messages",IDC_INFO_MESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,45,79,10 CTEXT "Back",IDC_STATIC,90,8,24,8 CTEXT "Text",IDC_STATIC,116,8,24,8 CONTROL "",IDC_MSG_BOXES_BG,"ColourPicker",WS_TABSTOP,90,17,24,12 CONTROL "",IDC_MSG_BOXES_TX,"ColourPicker",WS_TABSTOP,116,17,24,12 + CONTROL "",IDC_MSG_BOXES_MSG,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,153,19,8,10 CONTROL "",IDC_ERR_BG,"ColourPicker",WS_TABSTOP,90,31,24,12 CONTROL "",IDC_ERR_TX,"ColourPicker",WS_TABSTOP,116,31,24,12 + CONTROL "",IDC_ERRORS_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,32,8,10 CONTROL "",IDC_INFO_MESSAGES_BG,"ColourPicker",WS_TABSTOP,90,44,24,12 CONTROL "",IDC_INFO_MESSAGES_TX,"ColourPicker",WS_TABSTOP,116,44,24,12 - CONTROL "",IDC_PROGR_DLG_BG,"ColourPicker",WS_TABSTOP,90,58,24,12 - CONTROL "",IDC_PROGR_DLG_TX,"ColourPicker",WS_TABSTOP,116,58,24,12 + CONTROL "",IDC_INFO_MESSAGES_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,45,8,10 GROUPBOX "Colors",IDC_COLORS,178,0,133,44,WS_GROUP CONTROL "Use cus&tom colors",IDC_USEOWNCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,8,122,13 CONTROL "Use &Windows colors",IDC_USEWINCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,30,121,13 CONTROL "Use Pop&up colors",IDC_USEPOPUPCOLORS,"Button",BS_AUTORADIOBUTTON | BS_MULTILINE | BS_NOTIFY,186,19,102,13 PUSHBUTTON "Preview",IDC_PREVIEW,189,104,57,12 - GROUPBOX "Click action",IDC_STATIC,1,83,145,67,WS_GROUP - COMBOBOX IDC_LC,6,103,127,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - COMBOBOX IDC_RC,6,130,127,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "On left click",IDC_STATIC,8,94,121,8 - LTEXT "On right click",IDC_STATIC,8,120,121,8 + GROUPBOX "Click action",IDC_STATIC,1,67,172,67,WS_GROUP + LTEXT "On left click",IDC_STATIC,8,78,161,8 + COMBOBOX IDC_LC,6,87,163,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "On right click",IDC_STATIC,8,104,161,8 + COMBOBOX IDC_RC,6,114,163,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP GROUPBOX "Timeout",IDC_STATIC,178,45,133,51 EDITTEXT IDC_TIMEOUT_VALUE,194,59,32,12,ES_RIGHT | ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_TIMEOUT_VALUE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,215,59,12,12 CTEXT "0 = Default",IDC_STATIC_DEFAULT,250,56,55,8 CTEXT "-1 = Infinite",IDC_STATIC_INFINITE,249,66,54,8 LTEXT "Sec",IDC_STATIC_SEC,230,61,17,8 - LTEXT "* Needs popup actions to be enabled",IDC_STATIC,4,156,190,8 - LTEXT "Not sets for ""Message boxes""",IDC_STATIC,185,80,123,8 - CONTROL "",IDC_MSG_BOXES_MSG,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,153,19,8,10 - CONTROL "",IDC_ERRORS_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,32,8,10 - CONTROL "",IDC_INFO_MESSAGES_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,45,8,10 - CONTROL "",IDC_PROGR_DLG_MSG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,153,59,8,10 + LTEXT "Not set for ""Restart""",IDC_STATIC,185,80,123,8 CTEXT "Boxes",IDC_STATIC,146,8,23,8 CTEXT "Popups",IDC_STATIC,7,9,79,8 END @@ -137,7 +132,7 @@ CAPTION "Component list" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CTEXT "Here is the complete list of missing Miranda NG components. Check components that you want to download.\n\nClick on info icon to view component info page.",IDC_UPDATETEXT,9,9,223,44 - DEFPUSHBUTTON "Download",IDOK,175,218,60,14 + DEFPUSHBUTTON "Download",IDOK,175,218,60,14,WS_DISABLED CONTROL "",IDC_STATIC,"Static",SS_ETCHEDHORZ,1,58,236,1 CONTROL "",IDC_LIST_UPDATES,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,6,64,229,149 PUSHBUTTON "Select &none",IDC_SELNONE,109,218,60,14,NOT WS_TABSTOP @@ -194,6 +189,23 @@ BEGIN BOTTOMMARGIN, 214 END + IDD_POPUP, DIALOG + BEGIN + VERTGUIDE, 1 + VERTGUIDE, 7 + VERTGUIDE, 86 + VERTGUIDE, 90 + VERTGUIDE, 114 + VERTGUIDE, 116 + VERTGUIDE, 140 + VERTGUIDE, 153 + VERTGUIDE, 169 + VERTGUIDE, 173 + VERTGUIDE, 178 + VERTGUIDE, 186 + VERTGUIDE, 311 + END + IDD_LIST, DIALOG BEGIN VERTGUIDE, 6 diff --git a/plugins/PluginUpdater/src/Common.h b/plugins/PluginUpdater/src/Common.h index c5c192d63f..a56212c9e9 100644 --- a/plugins/PluginUpdater/src/Common.h +++ b/plugins/PluginUpdater/src/Common.h @@ -48,7 +48,6 @@ Boston, MA 02111-1307, USA. #include "resource.h" #if MIRANDA_VER < 0x0A00 -#include #include "compat.h" #endif @@ -107,16 +106,24 @@ struct PlugOptions #define DEFAULT_PERIODMEASURE 1 #if MIRANDA_VER < 0x0A00 - #define DEFAULT_UPDATEICONS 1 #define DEFAULT_ONLYONCEADAY 0 #else - #define DEFAULT_UPDATEICONS 0 #define DEFAULT_ONLYONCEADAY 1 #endif #define DEFAULT_UPDATE_URL "http://miranda-ng.org/distr/stable/x%platform%" #define DEFAULT_UPDATE_URL_TRUNK "http://miranda-ng.org/distr/x%platform%" -#define DEFAULT_UPDATE_URL_TRUNK_SYMBOLS "http://miranda-ng.now.im/pdb_x%platform%/" +#define DEFAULT_UPDATE_URL_TRUNK_SYMBOLS "http://miranda-ng.now.im/pdb_x%platform%" + +#define UPDATE_MODE_CUSTOM 0 +#define UPDATE_MODE_STABLE 1 +#define UPDATE_MODE_TRUNK 2 +#define UPDATE_MODE_TRUNK_SYMBOLS 3 + +#define POPUP_TYPE_MSG 0 +#define POPUP_TYPE_ERROR 1 +#define POPUP_TYPE_INFO 2 +#define POPUP_TYPE_PROGRESS 2 #define MAX_RETRIES 3 @@ -133,7 +140,7 @@ extern FILEINFO *pFileInfo; extern PlugOptions opts; extern POPUP_OPTIONS PopupOptions; extern aPopups PopupsList[POPUPS]; -extern HANDLE Timer, hPipe; +extern HANDLE Timer, hPipe, hNetlibUser; void DoCheck(); @@ -202,10 +209,10 @@ int CompareHashes(const ServListEntry *p1, const ServListEntry *p2); TCHAR* GetDefaultUrl(); bool DownloadFile(FILEURL *pFileURL, HANDLE &nlc); -void ShowPopup(HWND hDlg, LPCTSTR Title, LPCTSTR Text, int Number, int ActType, bool NoMessageBox = false); +void ShowPopup(LPCTSTR Title, LPCTSTR Text, int Number); void __stdcall RestartMe(void*); void __stdcall OpenPluginOptions(void*); -BOOL AllowUpdateOnStartup(); +void CheckUpdateOnStartup(); void InitTimer(void *type); INT_PTR EmptyFolder(WPARAM,LPARAM); @@ -214,14 +221,13 @@ INT_PTR CALLBACK DlgMsgPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); int ImageList_AddIconFromIconLib(HIMAGELIST hIml, const char *name); -bool unzip(const TCHAR *ptszZipFile, TCHAR *ptszDestPath, TCHAR *ptszBackPath,bool ch); +bool unzip(const TCHAR *ptszZipFile, TCHAR *ptszDestPath, TCHAR *ptszBackPath); void strdel(TCHAR *parBuffer, int len); /////////////////////////////////////////////////////////////////////////////// int CalculateModuleHash(const TCHAR *tszFileName, char *dest); -BOOL IsRunAsAdmin(); BOOL IsProcessElevated(); bool PrepareEscalation(); diff --git a/plugins/PluginUpdater/src/Compat/compat.cpp b/plugins/PluginUpdater/src/Compat/compat.cpp new file mode 100644 index 0000000000..25fdcf27e0 --- /dev/null +++ b/plugins/PluginUpdater/src/Compat/compat.cpp @@ -0,0 +1,101 @@ +/* +Copyright (C) 2010 Mataes + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. + + This file contains some compatibility functions for Miranda IM +*/ + +static char szHexTable[] = "0123456789abcdef"; + +char *bin2hex(const void *pData, size_t len, char *dest) +{ + const BYTE *p = (const BYTE*)pData; + char *d = dest; + + for (size_t i=0; i < len; i++, p++) { + *d++ = szHexTable[*p >> 4]; + *d++ = szHexTable[*p & 0x0F]; + } + *d = 0; + + return dest; +} + +char *rtrim(char *str) +{ + if (str == NULL) + return NULL; + + char *p = strchr(str, 0); + while (--p >= str) { + switch (*p) { + case ' ': case '\t': case '\n': case '\r': + *p = 0; break; + default: + return str; + } + } + return str; +} + +void CreatePathToFileT(TCHAR *tszFilePath) +{ + TCHAR *pszLastBackslash = _tcsrchr(tszFilePath, '\\'); + if (pszLastBackslash != NULL){ + *pszLastBackslash = '\0'; + CreateDirectoryTreeT(tszFilePath); + *pszLastBackslash = '\\'; + } +} + +int wildcmpit(const WCHAR *name, const WCHAR *mask) +{ + if (name == NULL || mask == NULL) + return false; + + const WCHAR* last = NULL; + for (;; mask++, name++) { + if (*mask != '?' && _qtoupper(*mask) != _qtoupper(*name)) break; + if (*name == '\0') return ((BOOL)!*mask); + } + if (*mask != '*') return FALSE; + for (;; mask++, name++) { + while(*mask == '*') { + last = mask++; + if (*mask == '\0') return ((BOOL)!*mask); /* true */ + } + if (*name == '\0') return ((BOOL)!*mask); /* *mask == EOS */ + if (*mask != '?' && _qtoupper(*mask) != _qtoupper(*name)) name -= (size_t)(mask - last) - 1, mask = last; + } +} + + +void __stdcall RestartMe(void*) +{ + TCHAR mirandaPath[MAX_PATH], cmdLine[MAX_PATH]; + GetModuleFileName(NULL, mirandaPath, SIZEOF(mirandaPath)); + + TCHAR *profilename = Utils_ReplaceVarsT(_T("%miranda_profilename%")); + mir_sntprintf(cmdLine, SIZEOF(cmdLine), _T("\"%s\" /restart:%d /profile=%s"), mirandaPath, GetCurrentProcessId(), profilename); + mir_free(profilename); + + CallService("CloseAction", 0, 0); + + PROCESS_INFORMATION pi; + STARTUPINFO si = { sizeof(si) }; + CreateProcess(mirandaPath, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); +} diff --git a/plugins/PluginUpdater/src/Compat/compat.h b/plugins/PluginUpdater/src/Compat/compat.h index 6afc901e17..26e807f478 100644 --- a/plugins/PluginUpdater/src/Compat/compat.h +++ b/plugins/PluginUpdater/src/Compat/compat.h @@ -76,9 +76,10 @@ __forceinline INT_PTR Options_AddPage(WPARAM wParam, OPTIONSDIALOGPAGE *odp) return CallService("Opt/AddPage", wParam, (LPARAM)odp); } -char* bin2hex(const void *pData, size_t len, char *dest); +char *bin2hex(const void *pData, size_t len, char *dest); char *rtrim(char *str); int CreatePathToFileT(const TCHAR *ptszPath); +int wildcmpit(const WCHAR *name, const WCHAR *mask); #define NEWTSTR_ALLOCA(A) (A == NULL)?NULL:_tcscpy((TCHAR*)alloca((_tcslen(A)+1) *sizeof(TCHAR)), A) @@ -124,23 +125,4 @@ int __forceinline PUDeletePopup(HWND hWndPopup) #define _qtoupper(_c) (((_c) >= 'a' && (_c) <= 'z')?((_c)-('a'+'A')):(_c)) -int __forceinline wildcmpit(const WCHAR *name, const WCHAR *mask) -{ - if (name == NULL || mask == NULL) - return false; - const WCHAR* last = NULL; - for (;; mask++, name++) { - if (*mask != '?' && _qtoupper(*mask) != _qtoupper(*name)) break; - if (*name == '\0') return ((BOOL)!*mask); - } - if (*mask != '*') return FALSE; - for (;; mask++, name++) { - while(*mask == '*') { - last = mask++; - if (*mask == '\0') return ((BOOL)!*mask); /* true */ - } - if (*name == '\0') return ((BOOL)!*mask); /* *mask == EOS */ - if (*mask != '?' && _qtoupper(*mask) != _qtoupper(*name)) name -= (size_t)(mask - last) - 1, mask = last; - } -} diff --git a/plugins/PluginUpdater/src/DlgListNew.cpp b/plugins/PluginUpdater/src/DlgListNew.cpp index 45cd3ddb64..5f181cbce4 100644 --- a/plugins/PluginUpdater/src/DlgListNew.cpp +++ b/plugins/PluginUpdater/src/DlgListNew.cpp @@ -51,7 +51,7 @@ static void ApplyDownloads(void *param) AutoHandle pipe(hPipe); HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES); OBJLIST &todo = *(OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); - TCHAR tszBuff[2048], tszFileTemp[MAX_PATH], tszFileBack[MAX_PATH]; + TCHAR tszFileTemp[MAX_PATH], tszFileBack[MAX_PATH]; mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot); SafeCreateDirectory(tszFileBack); @@ -59,68 +59,35 @@ static void ApplyDownloads(void *param) mir_sntprintf(tszFileTemp, SIZEOF(tszFileTemp), _T("%s\\Temp"), tszRoot); SafeCreateDirectory(tszFileTemp); + TCHAR *tszMirandaPath = Utils_ReplaceVarsT(_T("%miranda_path%")); + HANDLE nlc = NULL; for (int i=0; i < todo.getCount(); ++i) { ListView_EnsureVisible(hwndList, i, FALSE); - if (!todo[i].bEnabled) { - ListView_SetItemText(hwndList, i, 2, TranslateT("Skipped.")); - continue; - } - - // download update - ListView_SetItemText(hwndList, i, 2, TranslateT("Downloading...")); - - FILEURL *pFileUrl = &todo[i].File; - if (!DownloadFile(pFileUrl, nlc)) { - ListView_SetItemText(hwndList, i, 2, TranslateT("Failed!")); + if (todo[i].bEnabled) { + // download update + ListView_SetItemText(hwndList, i, 2, TranslateT("Downloading...")); + + if (DownloadFile(&todo[i].File, nlc)) { + ListView_SetItemText(hwndList, i, 2, TranslateT("Succeeded.")); + if (unzip(todo[i].File.tszDiskPath, tszMirandaPath, tszFileBack)) + SafeDeleteFile(todo[i].File.tszDiskPath); // remove .zip after successful update + } + else + ListView_SetItemText(hwndList, i, 2, TranslateT("Failed!")); } else - ListView_SetItemText(hwndList, i, 2, TranslateT("Succeeded.")); + ListView_SetItemText(hwndList, i, 2, TranslateT("Skipped.")); } Netlib_CloseHandle(nlc); - if (todo.getCount() > 0) { - ShowPopup(0, LPGENT("Plugin Updater"), TranslateT("Download complete"), 2, 0); - - TCHAR *tszMirandaPath = Utils_ReplaceVarsT(_T("%miranda_path%")); - - for (int i = 0; i < todo.getCount(); i++) { - if (!todo[i].bEnabled) - continue; - - TCHAR tszBackFile[MAX_PATH]; - FILEINFO& p = todo[i]; - if (p.bDeleteOnly) { // we need only to backup the old file - TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1; - mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); - BackupFile(p.tszNewName, tszBackFile); - continue; - } - - // if file name differs, we also need to backup the old file here - // otherwise it would be replaced by unzip - if ( _tcsicmp(p.tszOldName, p.tszNewName)) { - TCHAR tszSrcPath[MAX_PATH]; - mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); - mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); - BackupFile(tszSrcPath, tszBackFile); - } - - if ( unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack,false)) - SafeDeleteFile(p.File.tszDiskPath); // remove .zip after successful update - } - } + ShowPopup(TranslateT("Plugin Updater"), TranslateT("Download complete"), POPUP_TYPE_INFO); - PopupDataText temp; - temp.Title = TranslateT("Plugin Updater"); - temp.Text = tszBuff; - lstrcpyn(tszBuff, TranslateT("Download complete. Do you want to go to plugins option page?"), SIZEOF(tszBuff)); - int rc = MessageBox(hDlg, temp.Text, temp.Title, MB_YESNO | MB_ICONQUESTION); + int rc = MessageBox(hDlg, TranslateT("Download complete. Do you want to go to plugins option page?"), TranslateT("Plugin Updater"), MB_YESNO | MB_ICONQUESTION); if (rc == IDYES) CallFunctionAsync(OpenPluginOptions, 0); PostMessage(hDlg, WM_CLOSE, 0, 0); - return; } ///////////////////////////////////////////////////////////////////////////////////////// @@ -174,7 +141,6 @@ INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) switch (message) { case WM_INITDIALOG: - hwndDialog = hDlg; TranslateDialogDefault( hDlg ); oldWndProc = (WNDPROC)SetWindowLongPtr(hwndList, GWLP_WNDPROC, (LONG_PTR)PluginListWndProc); @@ -275,10 +241,7 @@ INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) ListView_SetItem(hwndList, &lvi); } } - todo[i].bEnabled = false; } - HWND hwOk = GetDlgItem(hDlg, IDOK); - EnableWindow(hwOk, false); } // do this after filling list - enables 'ITEMCHANGED' below @@ -292,16 +255,16 @@ INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) case LVN_ITEMCHANGED: if (GetWindowLongPtr(hDlg, GWLP_USERDATA)) { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; - - LVITEM lvI = {0}; - lvI.iItem = nmlv->iItem; - lvI.iSubItem = 0; - lvI.mask = LVIF_PARAM; - ListView_GetItem(hwndList, &lvI); - - OBJLIST &todo = *(OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); if ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK) { - todo[lvI.iItem].bEnabled = ListView_GetCheckState(hwndList, nmlv->iItem); + LVITEM lvI = {0}; + lvI.iItem = nmlv->iItem; + lvI.iSubItem = 0; + lvI.mask = LVIF_PARAM; + ListView_GetItem(hwndList, &lvI); + + OBJLIST &todo = *(OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); + FILEINFO *p = (FILEINFO*)lvI.lParam; + p->bEnabled = ListView_GetCheckState(hwndList, nmlv->iItem); bool enableOk = false; for (int i=0; i < todo.getCount(); ++i) { @@ -310,8 +273,7 @@ INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) break; } } - HWND hwOk = GetDlgItem(hDlg, IDOK); - EnableWindow(hwOk, enableOk ? TRUE : FALSE); + EnableWindow(GetDlgItem(hDlg, IDOK), enableOk ? TRUE : FALSE); } } break; @@ -381,7 +343,7 @@ INT_PTR CALLBACK DlgList(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) static void __stdcall LaunchListDialog(void *param) { - CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_LIST), GetDesktopWindow(), DlgList, (LPARAM)param); + hwndDialog = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_LIST), GetDesktopWindow(), DlgList, (LPARAM)param); } ///////////////////////////////////////////////////////////////////////////////////////// @@ -412,30 +374,32 @@ static void GetList(void *) TCHAR tszPath[MAX_PATH]; mir_sntprintf(tszPath, SIZEOF(tszPath), _T("%s\\%s"), dirname, hash.m_name); - if (GetFileAttributes(tszPath) != DWORD(-1)) - continue; - - FILEINFO *FileInfo = new FILEINFO; - FileInfo->bDeleteOnly = FALSE; - _tcscpy(FileInfo->tszOldName, hash.m_name); // copy the relative old name - _tcscpy(FileInfo->tszNewName, hash.m_name); - - TCHAR tszFileName[MAX_PATH]; - _tcscpy(tszFileName, _tcsrchr(tszPath, L'\\') + 1); - TCHAR *tp = _tcschr(tszFileName, L'.'); *tp = 0; - - TCHAR tszRelFileName[MAX_PATH]; - _tcscpy(tszRelFileName, hash.m_name); - tp = _tcsrchr(tszRelFileName, L'.'); if (tp) *tp = 0; - tp = _tcschr(tszRelFileName, L'\\'); if (tp) tp++; else tp = tszRelFileName; - _tcslwr(tp); - - mir_sntprintf(FileInfo->File.tszDiskPath, SIZEOF(FileInfo->File.tszDiskPath), _T("%s\\Temp\\%s.zip"), tszRoot, tszFileName); - mir_sntprintf(FileInfo->File.tszDownloadURL, SIZEOF(FileInfo->File.tszDownloadURL), _T("%s/%s.zip"), baseUrl, tszRelFileName); - for (tp = _tcschr(FileInfo->File.tszDownloadURL, '\\'); tp != 0; tp = _tcschr(tp, '\\')) - *tp++ = '/'; - FileInfo->File.CRCsum = hash.m_crc; - UpdateFiles->insert(FileInfo); + if (GetFileAttributes(tszPath) == INVALID_FILE_ATTRIBUTES) { + FILEINFO *FileInfo = new FILEINFO; + FileInfo->bDeleteOnly = FALSE; + // copy the relative old name + _tcsncpy(FileInfo->tszOldName, hash.m_name, SIZEOF(FileInfo->tszOldName)); + _tcsncpy(FileInfo->tszNewName, hash.m_name, SIZEOF(FileInfo->tszNewName)); + + TCHAR tszFileName[MAX_PATH]; + _tcsncpy(tszFileName, _tcsrchr(tszPath, L'\\') + 1, SIZEOF(tszFileName)); + TCHAR *tp = _tcschr(tszFileName, L'.'); *tp = 0; + + TCHAR tszRelFileName[MAX_PATH]; + _tcsncpy(tszRelFileName, hash.m_name, MAX_PATH); + tp = _tcsrchr(tszRelFileName, L'.'); if (tp) *tp = 0; + tp = _tcschr(tszRelFileName, L'\\'); if (tp) tp++; else tp = tszRelFileName; + _tcslwr(tp); + + mir_sntprintf(FileInfo->File.tszDiskPath, SIZEOF(FileInfo->File.tszDiskPath), _T("%s\\Temp\\%s.zip"), tszRoot, tszFileName); + mir_sntprintf(FileInfo->File.tszDownloadURL, SIZEOF(FileInfo->File.tszDownloadURL), _T("%s/%s.zip"), baseUrl, tszRelFileName); + for (tp = _tcschr(FileInfo->File.tszDownloadURL, '\\'); tp != 0; tp = _tcschr(tp, '\\')) + *tp++ = '/'; + FileInfo->File.CRCsum = hash.m_crc; + // Deselect all plugins by default + FileInfo->bEnabled = false; + UpdateFiles->insert(FileInfo); + } } mir_free(dirname); @@ -443,7 +407,7 @@ static void GetList(void *) // Show dialog if (UpdateFiles->getCount() == 0) { if (!opts.bSilent) - ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("List is empty."), 2, 0); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("List is empty."), POPUP_TYPE_INFO); delete UpdateFiles; } else CallFunctionAsync(LaunchListDialog, UpdateFiles); @@ -451,16 +415,16 @@ static void GetList(void *) hListThread = NULL; } -void DoGetList(int iFlag) +void DoGetList() { if (hListThread) - ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("List loading already started!"), 2, 0); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("List loading already started!"), POPUP_TYPE_INFO); else if (hwndDialog) { ShowWindow(hwndDialog, SW_SHOW); SetForegroundWindow(hwndDialog); SetFocus(hwndDialog); } - else if (iFlag) + else hListThread = mir_forkthread(GetList, 0); } @@ -473,7 +437,7 @@ void UninitListNew() INT_PTR ShowListCommand(WPARAM,LPARAM) { opts.bSilent = false; - DoGetList(true); + DoGetList(); return 0; } diff --git a/plugins/PluginUpdater/src/DlgUpdate.cpp b/plugins/PluginUpdater/src/DlgUpdate.cpp index 56de9eef47..879f9c0343 100644 --- a/plugins/PluginUpdater/src/DlgUpdate.cpp +++ b/plugins/PluginUpdater/src/DlgUpdate.cpp @@ -97,12 +97,11 @@ static void ApplyUpdates(void *param) // 3) Unpack all zips TCHAR *tszMirandaPath = Utils_ReplaceVarsT(_T("%miranda_path%")); for (int i = 0; i < todo.getCount(); i++) { - if (todo[i].bEnabled) { - TCHAR tszBackFile[MAX_PATH]; - FILEINFO& p = todo[i]; + FILEINFO& p = todo[i]; + if (p.bEnabled) { if (p.bDeleteOnly) { // we need only to backup the old file - TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1; + TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1, tszBackFile[MAX_PATH]; mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); BackupFile(p.tszNewName, tszBackFile); } @@ -110,13 +109,13 @@ static void ApplyUpdates(void *param) // if file name differs, we also need to backup the old file here // otherwise it would be replaced by unzip if ( _tcsicmp(p.tszOldName, p.tszNewName)) { - TCHAR tszSrcPath[MAX_PATH]; + TCHAR tszSrcPath[MAX_PATH], tszBackFile[MAX_PATH]; mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); BackupFile(tszSrcPath, tszBackFile); } - if ( unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack,true)) + if ( unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack)) SafeDeleteFile(p.File.tszDiskPath); // remove .zip after successful update } } @@ -139,7 +138,11 @@ static void ApplyUpdates(void *param) int rc = MessageBox(hDlg, TranslateT("Update complete. Press Yes to restart Miranda now or No to postpone a restart until the exit."), TranslateT("Plugin Updater"), MB_YESNO | MB_ICONQUESTION); PostMessage(hDlg, WM_CLOSE, 0, 0); if (rc == IDYES) +#if MIRANDA_VER >= 0x0A00 + CallServiceSync(MS_SYSTEM_RESTART, db_get_b(NULL,MODNAME,"RestartCurrentProfile",1) ? 1 : 0, 0); +#else CallFunctionAsync(RestartMe, 0); +#endif } static void ResizeVert(HWND hDlg, int yy) @@ -180,9 +183,6 @@ static INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM DeleteFile(szPath); } } - RECT r; - GetClientRect(hwndList, &r); - LVCOLUMN lvc = {0}; // Initialize the LVCOLUMN structure. // The mask specifies that the format, width, text, and @@ -203,30 +203,55 @@ static INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM //enumerate plugins, fill in list //bool one_enabled = false; ListView_DeleteAllItems(hwndList); + /// + LVGROUP lvg; + lvg.cbSize = sizeof(LVGROUP); + lvg.mask = LVGF_HEADER | LVGF_GROUPID; + + lvg.pszHeader = TranslateT("Plugins"); + lvg.iGroupId = 1; + ListView_InsertGroup(hwndList, 0, &lvg); + + lvg.pszHeader = TranslateT("Icons"); + lvg.iGroupId = 2; + ListView_InsertGroup(hwndList, 0, &lvg); + + lvg.pszHeader = TranslateT("Languages"); + lvg.iGroupId = 3; + ListView_InsertGroup(hwndList, 0, &lvg); + + lvg.pszHeader = TranslateT("Core components"); + lvg.iGroupId = 4; + ListView_InsertGroup(hwndList, 0, &lvg); - // Some code to create the list-view control. - // Initialize LVITEM members that are common to all items. - LVITEM lvI = {0}; - lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_NORECOMPUTE;// | LVIF_IMAGE; + lvg.pszHeader = TranslateT("Core"); + lvg.iGroupId = 5; + ListView_InsertGroup(hwndList, 0, &lvg); + + ListView_EnableGroupView(hwndList, TRUE); bool enableOk = false; OBJLIST &todo = *(OBJLIST *)lParam; for (int i = 0; i < todo.getCount(); ++i) { - lvI.mask = LVIF_TEXT | LVIF_PARAM;// | LVIF_IMAGE; + LVITEM lvI = {0}; + lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_GROUPID | LVIF_NORECOMPUTE; + lvI.iGroupId = (_tcschr(todo[i].tszOldName, L'\\') == NULL) ? 5 : + (_tcsstr(todo[i].tszOldName, _T("Plugins")) != NULL) ? 1 : + ((_tcsstr(todo[i].tszOldName, _T("Icons")) != NULL) ? 2 : + ((_tcsstr(todo[i].tszOldName, _T("Languages")) != NULL) ? 3 : + ((_tcsstr(todo[i].tszOldName, _T("Core")) != NULL) ? 4 : 5))); lvI.iSubItem = 0; lvI.lParam = (LPARAM)&todo[i]; lvI.pszText = todo[i].tszOldName; lvI.iItem = i; ListView_InsertItem(hwndList, &lvI); - // remember whether the user has decided not to update this component with this particular new version - todo[i].bEnabled = db_get_b(NULL, MODNAME "Files", StrToLower(_T2A(todo[i].tszOldName)), true); ListView_SetCheckState(hwndList, lvI.iItem, todo[i].bEnabled); if (todo[i].bEnabled) enableOk = true; } - HWND hwOk = GetDlgItem(hDlg, IDOK); - EnableWindow(hwOk, enableOk); + if(enableOk) + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); } bShowDetails = false; @@ -243,27 +268,26 @@ static INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM case LVN_ITEMCHANGED: if (GetWindowLongPtr(hDlg, GWLP_USERDATA)) { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; - - LVITEM lvI = {0}; - lvI.iItem = nmlv->iItem; - lvI.iSubItem = 0; - lvI.mask = LVIF_PARAM; - ListView_GetItem(hwndList, &lvI); - - OBJLIST &todo = *(OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); if ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK) { - todo[lvI.iItem].bEnabled = ListView_GetCheckState(hwndList, nmlv->iItem); - db_set_b(NULL, MODNAME "Files", StrToLower(_T2A(todo[lvI.iItem].tszOldName)), todo[lvI.iItem].bEnabled); + LVITEM lvI = {0}; + lvI.iItem = nmlv->iItem; + lvI.iSubItem = 0; + lvI.mask = LVIF_PARAM; + ListView_GetItem(hwndList, &lvI); + + FILEINFO *p = (FILEINFO*)lvI.lParam; + db_set_b(NULL, MODNAME "Files", StrToLower(_T2A(p->tszOldName)), p->bEnabled = ListView_GetCheckState(hwndList, nmlv->iItem)); + // Toggle the Download button bool enableOk = false; + OBJLIST &todo = *(OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); for (int i=0; i < todo.getCount(); ++i) { if (todo[i].bEnabled) { enableOk = true; break; } } - HWND hwOk = GetDlgItem(hDlg, IDOK); - EnableWindow(hwOk, enableOk ? TRUE : FALSE); + EnableWindow(GetDlgItem(hDlg, IDOK), enableOk ? TRUE : FALSE); } } break; @@ -319,9 +343,9 @@ static INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM opts.bSilent = true; delete (OBJLIST *)GetWindowLongPtr(hDlg, GWLP_USERDATA); SetWindowLongPtr(hDlg, GWLP_USERDATA, 0); - #if MIRANDA_VER >= 0x0A00 - db_set_dw(NULL, MODNAME, "LastUpdate", time(NULL)); - #endif +#if MIRANDA_VER >= 0x0A00 + db_set_dw(NULL, MODNAME, "LastUpdate", time(NULL)); +#endif mir_forkthread(InitTimer, (void*)0); break; } @@ -329,27 +353,6 @@ static INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM return FALSE; } -static LRESULT CALLBACK PopupDlgProcRestart(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case WM_COMMAND: - case WM_CONTEXTMENU: - PUDeletePopup(hDlg); - - if (uMsg == WM_COMMAND) { - TCHAR tszText[200]; - mir_sntprintf(tszText, SIZEOF(tszText), _T("%s\n\n%s"), TranslateT("You need to restart your Miranda to apply installed updates."), TranslateT("Would you like to restart it now?")); - - if (MessageBox(hDlg, tszText, TranslateT("Plugin Updater"), MB_YESNO | MB_ICONQUESTION) == IDYES) - CallFunctionAsync(RestartMe, 0); - } - - return TRUE; - } - - return DefWindowProc(hDlg, uMsg, wParam, lParam); -} - static void DlgUpdateSilent(void *lParam) { OBJLIST &UpdateFiles = *(OBJLIST *)lParam; @@ -378,7 +381,7 @@ static void DlgUpdateSilent(void *lParam) // Count all updates that have been enabled int count = 0; for (int i = 0; i < UpdateFiles.getCount(); i++) { - if (db_get_b(NULL, MODNAME "Files", StrToLower(_T2A(UpdateFiles[i].tszOldName)), 1) && !UpdateFiles[i].bDeleteOnly) { + if (UpdateFiles[i].bEnabled && !UpdateFiles[i].bDeleteOnly) { // download update FILEURL *pFileUrl = &UpdateFiles[i].File; if (!DownloadFile(pFileUrl, nlc)) { @@ -394,6 +397,7 @@ static void DlgUpdateSilent(void *lParam) } Netlib_CloseHandle(nlc); + // All available updates have been disabled if (count == 0) { delete &UpdateFiles; return; @@ -402,11 +406,11 @@ static void DlgUpdateSilent(void *lParam) // 3) Unpack all zips TCHAR *tszMirandaPath = Utils_ReplaceVarsT(_T("%miranda_path%")); for (int i = 0; i < UpdateFiles.getCount(); i++) { - if (db_get_b(NULL, MODNAME "Files", StrToLower(_T2A(UpdateFiles[i].tszOldName)), 1)) { - TCHAR tszBackFile[MAX_PATH]; - FILEINFO& p = UpdateFiles[i]; - if (p.bDeleteOnly) { // we need only to backup the old file - TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1; + FILEINFO& p = UpdateFiles[i]; + if (p.bEnabled) { + if (p.bDeleteOnly) { + // we need only to backup the old file + TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1, tszBackFile[MAX_PATH]; mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); BackupFile(p.tszNewName, tszBackFile); } @@ -414,14 +418,15 @@ static void DlgUpdateSilent(void *lParam) // if file name differs, we also need to backup the old file here // otherwise it would be replaced by unzip if (_tcsicmp(p.tszOldName, p.tszNewName)) { - TCHAR tszSrcPath[MAX_PATH]; + TCHAR tszSrcPath[MAX_PATH], tszBackFile[MAX_PATH]; mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); BackupFile(tszSrcPath, tszBackFile); } - - if (unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack, true)) - SafeDeleteFile(p.File.tszDiskPath); // remove .zip after successful update + + // remove .zip after successful update + if (unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack)) + SafeDeleteFile(p.File.tszDiskPath); } } } @@ -446,18 +451,7 @@ static void DlgUpdateSilent(void *lParam) mir_sntprintf(tszTitle, SIZEOF(tszTitle), TranslateT("%d component(s) was updated"), count); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1)) { - POPUPDATAT_V2 pd = { 0 }; - pd.cbSize = sizeof(pd); - pd.lchContact = NULL; - pd.lchIcon = LoadSkinnedIcon(SKINICON_OTHER_MIRANDA); - pd.colorBack = pd.colorText = 0; - pd.iSeconds = -1; - pd.PluginWindowProc = PopupDlgProcRestart; - - lstrcpyn(pd.lptzText, TranslateT("You need to restart your Miranda to apply installed updates."), MAX_SECONDLINE); - lstrcpyn(pd.lptzContactName, tszTitle, MAX_CONTACTNAME); - - CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pd, APF_NEWDATA); + ShowPopup(tszTitle,TranslateT("You need to restart your Miranda to apply installed updates."),POPUP_TYPE_MSG); } else { bool notified = false; @@ -479,7 +473,11 @@ static void DlgUpdateSilent(void *lParam) mir_sntprintf(tszText, SIZEOF(tszText), _T("%s\n\n%s"), TranslateT("You need to restart your Miranda to apply installed updates."), TranslateT("Would you like to restart it now?")); if (MessageBox(NULL, tszText, tszTitle, MB_ICONINFORMATION | MB_YESNO) == IDYES) +#if MIRANDA_VER >= 0x0A00 + CallServiceSync(MS_SYSTEM_RESTART, db_get_b(NULL,MODNAME,"RestartCurrentProfile",1) ? 1 : 0, 0); +#else CallFunctionAsync(RestartMe, 0); +#endif } } } @@ -518,12 +516,12 @@ static renameTable[] = { _T("rss.dll"), _T("Plugins\\newsaggregator.dll") }, { _T("dbx_3x.dll"), _T("Plugins\\dbx_mmap.dll") }, - #if MIRANDA_VER >= 0x0A00 - { _T("dbx_mmap_sa.dll"), _T("Plugins\\dbx_mmap.dll") }, - { _T("dbx_tree.dll"), _T("Plugins\\dbx_mmap.dll") }, - { _T("rc4.dll"), NULL }, - { _T("athena.dll"), NULL }, - #endif +#if MIRANDA_VER >= 0x0A00 + { _T("dbx_mmap_sa.dll"), _T("Plugins\\dbx_mmap.dll") }, + { _T("dbx_tree.dll"), _T("Plugins\\dbx_mmap.dll") }, + { _T("rc4.dll"), NULL }, + { _T("athena.dll"), NULL }, +#endif { _T("proto_newsaggr.dll"), _T("Icons\\proto_newsaggregator.dll") }, { _T("clienticons_*.dll"), _T("Icons\\fp_icons.dll") }, @@ -543,19 +541,18 @@ static renameTable[] = static bool CheckFileRename(const TCHAR *ptszOldName, TCHAR *pNewName) { for (int i = 0; i < SIZEOF(renameTable); i++) { - if (!wildcmpit(ptszOldName, renameTable[i].oldName)) - continue; - - TCHAR *ptszDest = renameTable[i].newName; - if (ptszDest == NULL) - *pNewName = 0; - else { - _tcsncpy_s(pNewName, MAX_PATH, ptszDest, _TRUNCATE); - size_t cbLen = _tcslen(ptszDest) - 1; - if (pNewName[cbLen] == '*') - _tcsncpy_s(pNewName + cbLen, MAX_PATH - cbLen, ptszOldName, _TRUNCATE); + if (wildcmpit(ptszOldName, renameTable[i].oldName)) { + TCHAR *ptszDest = renameTable[i].newName; + if (ptszDest == NULL) + *pNewName = 0; + else { + _tcsncpy_s(pNewName, MAX_PATH, ptszDest, _TRUNCATE); + size_t cbLen = _tcslen(ptszDest) - 1; + if (pNewName[cbLen] == '*') + _tcsncpy_s(pNewName + cbLen, MAX_PATH - cbLen, ptszOldName, _TRUNCATE); + } + return true; } - return true; } return false; @@ -572,11 +569,15 @@ static bool isValidExtension(const TCHAR *ptszFileName) static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const TCHAR *tszBaseUrl, SERVLIST& hashes, OBJLIST *UpdateFiles) { - int count = 0; - // skip updater's own folder if (!_tcsicmp(tszFolder, tszRoot)) - return count; + return 0; + + // skip profile folder + TCHAR tszProfilePath[MAX_PATH]; + CallService(MS_DB_GETPROFILEPATHT, SIZEOF(tszProfilePath), (LPARAM)tszProfilePath); + if (!_tcsicmp(tszFolder, tszProfilePath)) + return 0; TCHAR tszBuf[MAX_PATH]; mir_sntprintf(tszBuf, SIZEOF(tszBuf), _T("%s\\*"), tszFolder); @@ -584,18 +585,17 @@ static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const WIN32_FIND_DATA ffd; HANDLE hFind = FindFirstFile(tszBuf, &ffd); if (hFind == INVALID_HANDLE_VALUE) - return count; + return 0; + + Netlib_LogfT(hNetlibUser,_T("Scanning folder %s"), tszFolder); + int count = 0; do { if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + // Scan recursively all subfolders if (_tcscmp(ffd.cFileName, _T(".")) && _tcscmp(ffd.cFileName, _T(".."))) { - // we need to skip profile folder - TCHAR tszProfilePath[MAX_PATH]; - CallService(MS_DB_GETPROFILEPATHT, SIZEOF(tszProfilePath), (LPARAM)tszProfilePath); - mir_sntprintf(tszBuf, SIZEOF(tszBuf), _T("%s\\%s"), tszFolder, ffd.cFileName); - if (0 != _tcsicmp(tszBuf, tszProfilePath)) - count += ScanFolder(tszBuf, cbBaseLen, level+1, tszBaseUrl, hashes, UpdateFiles); + count += ScanFolder(tszBuf, cbBaseLen, level+1, tszBaseUrl, hashes, UpdateFiles); } } else if (isValidExtension(ffd.cFileName)) { @@ -622,6 +622,7 @@ static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const if (p[-1] != 'w' && p[-1] != 'W') continue; + // remove trailing w or W and try again int iPos = int(p - tszNewName)-1; strdel(p-1, 1); if ((item = hashes.find((ServListEntry*)&pName)) == NULL) @@ -651,19 +652,22 @@ static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const ptszUrl = _T(""); // Compare versions - if (bHasNewVersion) { // Yeah, we've got new version. + if (bHasNewVersion) { + // Yeah, we've got new version. + Netlib_LogfT(hNetlibUser,_T("Found update for %s"), tszBuf); FILEINFO *FileInfo = new FILEINFO; - _tcscpy(FileInfo->tszOldName, tszBuf+cbBaseLen); // copy the relative old name - if (tszNewName[0] == 0) { - FileInfo->bDeleteOnly = TRUE; - _tcscpy(FileInfo->tszNewName, tszBuf); // save the full old name for deletion + // copy the relative old name + _tcsncpy(FileInfo->tszOldName, tszBuf+cbBaseLen, SIZEOF(FileInfo->tszOldName)); + FileInfo->bDeleteOnly = (tszNewName[0] == 0); + if (FileInfo->bDeleteOnly) { + // save the full old name for deletion + _tcsncpy(FileInfo->tszNewName, tszBuf, SIZEOF(FileInfo->tszNewName)); } else { - FileInfo->bDeleteOnly = FALSE; _tcsncpy(FileInfo->tszNewName, ptszUrl, SIZEOF(FileInfo->tszNewName)); } - _tcscpy(tszBuf, ptszUrl); + _tcsncpy(tszBuf, ptszUrl, SIZEOF(tszBuf)); TCHAR *p = _tcsrchr(tszBuf, '.'); if (p) *p = 0; p = _tcsrchr(tszBuf, '\\'); @@ -675,10 +679,13 @@ static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const for (p = _tcschr(FileInfo->File.tszDownloadURL, '\\'); p != 0; p = _tcschr(p, '\\')) *p++ = '/'; + // remember whether the user has decided not to update this component with this particular new version + FileInfo->bEnabled = db_get_b(NULL, MODNAME "Files", StrToLower(_T2A(FileInfo->tszOldName)), 1); + FileInfo->File.CRCsum = MyCRC; UpdateFiles->insert(FileInfo); - - if (!opts.bSilent || db_get_b(NULL, MODNAME "Files", StrToLower(_T2A(FileInfo->tszNewName)), true)) + + if (!opts.bSilent || FileInfo->bEnabled) count++; } // end compare versions } @@ -691,8 +698,7 @@ static int ScanFolder(const TCHAR *tszFolder, size_t cbBaseLen, int level, const static void CheckUpdates(void *) { - char szKey[64] = {0}; - + Netlib_LogfT(hNetlibUser,_T("Checking for updates")); TCHAR tszTempPath[MAX_PATH]; DWORD dwLen = GetTempPath(SIZEOF(tszTempPath), tszTempPath); if (tszTempPath[dwLen-1] == '\\') @@ -710,7 +716,7 @@ static void CheckUpdates(void *) // Show dialog if (count == 0) { if (!opts.bSilent) - ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("No updates found."), 2, 0); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("No updates found."), POPUP_TYPE_INFO); delete UpdateFiles; opts.bSilent = true; } @@ -718,7 +724,7 @@ static void CheckUpdates(void *) } else opts.bSilent = true; - mir_forkthread(InitTimer, (void*)(success ? 0 : 2)); + mir_forkthread(InitTimer, (void*)(success ? 0 : 2)); hashes.destroy(); hCheckThread = NULL; @@ -727,15 +733,15 @@ static void CheckUpdates(void *) void DoCheck() { if (hCheckThread) - ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("Update checking already started!"), 2, 0); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("Update checking already started!"), POPUP_TYPE_INFO); else if (hwndDialog) { ShowWindow(hwndDialog, SW_SHOW); SetForegroundWindow(hwndDialog); SetFocus(hwndDialog); } else { - #if MIRANDA_VER >= 0x0A00 - db_set_dw(NULL, MODNAME, "LastUpdate", time(NULL)); - #endif +#if MIRANDA_VER >= 0x0A00 + db_set_dw(NULL, MODNAME, "LastUpdate", time(NULL)); +#endif hCheckThread = mir_forkthread(CheckUpdates, 0); } } @@ -748,6 +754,7 @@ void UninitCheck() INT_PTR MenuCommand(WPARAM,LPARAM) { + Netlib_LogfT(hNetlibUser,_T("Update started manually!")); opts.bSilent = false; DoCheck(); return 0; @@ -762,4 +769,21 @@ void UnloadCheck() { if (hCheckThread) hCheckThread = NULL; +} + +void CheckUpdateOnStartup() +{ + if(opts.bUpdateOnStartup) + { + if (opts.bOnlyOnceADay) + { + time_t now = time(NULL), + was = db_get_dw(NULL, MODNAME, "LastUpdate", 0); + + if ((now - was) < 86400) + return; + } + Netlib_LogfT(hNetlibUser,_T("Update on startup started!")); + DoCheck(); + } } \ No newline at end of file diff --git a/plugins/PluginUpdater/src/Events.cpp b/plugins/PluginUpdater/src/Events.cpp index 816f92c603..90ad62e3fb 100644 --- a/plugins/PluginUpdater/src/Events.cpp +++ b/plugins/PluginUpdater/src/Events.cpp @@ -48,11 +48,10 @@ int ModulesLoaded(WPARAM, LPARAM) else EmptyFolder(0, TRUE); // silently - if (AllowUpdateOnStartup()) - DoCheck(); + CheckUpdateOnStartup(); Timer = CreateWaitableTimer(NULL, FALSE, NULL); - mir_forkthread(InitTimer, (void*)0); + mir_forkthread(InitTimer, 0); return 0; } diff --git a/plugins/PluginUpdater/src/Notifications.cpp b/plugins/PluginUpdater/src/Notifications.cpp index 4a9108a5e8..9dbbf9a5a9 100644 --- a/plugins/PluginUpdater/src/Notifications.cpp +++ b/plugins/PluginUpdater/src/Notifications.cpp @@ -19,9 +19,27 @@ Boston, MA 02111-1307, USA. #include "common.h" -HANDLE hPipe = NULL; +aPopups PopupsList[POPUPS]; -void PopupAction(HWND hWnd, BYTE action) +void InitPopupList() +{ + int index = 0; + PopupsList[index].ID = index; + PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups0Bg", COLOR_BG_FIRSTDEFAULT); + PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups0Tx", COLOR_TX_DEFAULT); + + index = 1; + PopupsList[index].ID = index; + PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups1Bg", COLOR_BG_SECONDDEFAULT); + PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups1Tx", COLOR_TX_DEFAULT); + + index = 2; + PopupsList[index].ID = index; + PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups2Bg", COLOR_BG_FIRSTDEFAULT); + PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups2Tx", COLOR_TX_DEFAULT); +} + +void PopupAction(HWND hPopup, BYTE action) { switch (action) { case PCA_CLOSEPOPUP: @@ -29,108 +47,75 @@ void PopupAction(HWND hWnd, BYTE action) case PCA_DONOTHING: return; } - PUDeletePopup(hWnd); + PUDeletePopup(hPopup); } -static LRESULT CALLBACK PopupDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +static LRESULT CALLBACK PopupDlgProc(HWND hPopup, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { - case UM_POPUPACTION: - if (HIWORD(wParam) == BN_CLICKED) { - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); - if (pmpd) { - switch (LOWORD(wParam)) { - case IDYES: - if (IsWindow(pmpd->hDialog)) - PostMessage(pmpd->hDialog, WM_CLOSE, 0, 0); - PUDeletePopup(hDlg); - break; + case WM_COMMAND: + PopupAction(hPopup, PopupOptions.LeftClickAction); + break; - case IDNO: - if (IsWindow(pmpd->hDialog)) - PostMessage(pmpd->hDialog, WM_CLOSE, 0, 0); - PUDeletePopup(hDlg); - break; - } - } - } + case WM_CONTEXTMENU: + PopupAction(hPopup, PopupOptions.RightClickAction); break; case UM_FREEPLUGINDATA: - { - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); - if (pmpd > 0) - mir_free(pmpd); - return TRUE; //TRUE or FALSE is the same, it gets ignored. - } break; } - return DefWindowProc(hDlg, uMsg, wParam, lParam); + return DefWindowProc(hPopup, uMsg, wParam, lParam); +} + +static void _stdcall RestartPrompt(void *) { + TCHAR tszText[200]; + mir_sntprintf(tszText, SIZEOF(tszText), _T("%s\n\n%s"), TranslateT("You need to restart your Miranda to apply installed updates."), TranslateT("Would you like to restart it now?")); + + if (MessageBox(0, tszText, TranslateT("Plugin Updater"), MB_YESNO | MB_ICONQUESTION | MB_TOPMOST) == IDYES) + CallService(MS_SYSTEM_RESTART, db_get_b(NULL,MODNAME,"RestartCurrentProfile",1) ? 1 : 0, 0); } -static LRESULT CALLBACK PopupDlgProc2(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +static LRESULT CALLBACK PopupDlgProcRestart(HWND hPopup, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { - case WM_COMMAND: - PopupAction(hDlg, PopupOptions.LeftClickAction); - break; - case WM_CONTEXTMENU: - PopupAction(hDlg, PopupOptions.RightClickAction); + PUDeletePopup(hPopup); break; + case WM_COMMAND: + PUDeletePopup(hPopup); + CallFunctionAsync(RestartPrompt,0); - case UM_FREEPLUGINDATA: - { - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)PUGetPluginData(hDlg); - if (pmpd > 0) - mir_free(pmpd); - return TRUE; //TRUE or FALSE is the same, it gets ignored. - } break; } - return DefWindowProc(hDlg, uMsg, wParam, lParam); + return DefWindowProc(hPopup, uMsg, wParam, lParam); } -static void MakePopupAction(POPUPACTION &pa, int id) +void ShowPopup(LPCTSTR ptszTitle, LPCTSTR ptszText, int Number) { - pa.cbSize = sizeof(POPUPACTION); - pa.flags = PAF_ENABLED; - pa.wParam = MAKEWORD(id, BN_CLICKED); - pa.lParam = 0; - switch (id) { - case IDYES: - pa.lchIcon = Skin_GetIcon("btn_ok"); - strncpy_s(pa.lpzTitle, MODNAME"/Yes", MAX_ACTIONTITLE); - break; - - case IDNO: - pa.lchIcon = Skin_GetIcon("btn_cancel"); - strncpy_s(pa.lpzTitle, MODNAME"/No", MAX_ACTIONTITLE); - break; + if(Number != POPUP_TYPE_MSG) { + char setting[100]; + mir_snprintf(setting, SIZEOF(setting), "Popups%d", Number); + if(!db_get_b(NULL, MODNAME, setting, DEFAULT_MESSAGE_ENABLED)) + return; } -} -void ShowPopup(HWND hDlg, LPCTSTR ptszTitle, LPCTSTR ptszText, int Number, int ActType, bool NoMessageBox) -{ if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1)) { - LPMSGPOPUPDATA pmpd = (LPMSGPOPUPDATA)mir_alloc(sizeof(MSGPOPUPDATA)); - if (!pmpd) - return; - - POPUPDATAT_V2 pd = { 0 }; - pd.cbSize = sizeof(pd); - pd.lchContact = NULL; //(HANDLE)wParam; - pd.lchIcon = LoadSkinnedIcon(PopupsList[Number].Icon); - pd.PluginWindowProc = (Number == 0 && ActType != 0) ? PopupDlgProc : PopupDlgProc2; - pd.PluginData = pmpd; - pd.iSeconds = (Number == 0) ? -1 : PopupOptions.Timeout; - pd.hNotification = NULL; - pd.lpActions = pmpd->pa; + POPUPDATAT pd = { 0 }; + pd.lchContact = NULL; + pd.lchIcon = Skin_GetIcon("check_update"); + if(Number == POPUP_TYPE_MSG) { + pd.PluginWindowProc = PopupDlgProcRestart; + pd.iSeconds = -1; + } + else { + pd.PluginWindowProc = PopupDlgProc; + pd.iSeconds = PopupOptions.Timeout; + } - lstrcpyn(pd.lptzText, TranslateTS(ptszText), MAX_SECONDLINE); - lstrcpyn(pd.lptzContactName, TranslateTS(ptszTitle), MAX_CONTACTNAME); + lstrcpyn(pd.lptzText, ptszText, MAX_SECONDLINE); + lstrcpyn(pd.lptzContactName, ptszTitle, MAX_CONTACTNAME); switch (PopupOptions.DefColors) { case byCOLOR_WINDOWS: @@ -146,112 +131,25 @@ void ShowPopup(HWND hDlg, LPCTSTR ptszTitle, LPCTSTR ptszText, int Number, int A break; } - pmpd->hDialog = hDlg; - - if (ActType == 1) { - MakePopupAction(pmpd->pa[pd.actionCount++], IDYES); - MakePopupAction(pmpd->pa[pd.actionCount++], IDNO); + PUAddPopupT(&pd); + } else { + if(Number != POPUP_TYPE_MSG) { + char setting[100]; + mir_snprintf(setting, SIZEOF(setting), "Popups%dM", Number); + if (!db_get_b(NULL, MODNAME, setting, DEFAULT_MESSAGE_ENABLED)) + return; } - - CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pd, APF_NEWDATA); - } else if (!NoMessageBox) { - char setting[100]; - mir_snprintf(setting, SIZEOF(setting), "Popups%dM", Number); - if (db_get_b(NULL, MODNAME, setting, DEFAULT_MESSAGE_ENABLED)) { - int iMsgType; - switch( Number ) { - case 1: iMsgType = MB_ICONSTOP; break; - case 2: iMsgType = MB_ICONINFORMATION; break; - case 3: iMsgType = MB_ICONQUESTION; break; - case 4: return; - default: iMsgType = 0; - } - MessageBox(hDlg, TranslateTS(ptszText), TranslateTS(ptszTitle), iMsgType); + int iMsgType; + switch( Number ) { + case POPUP_TYPE_MSG: iMsgType = MB_ICONSTOP; break; + case POPUP_TYPE_ERROR: iMsgType = MB_ICONINFORMATION; break; + case POPUP_TYPE_INFO: iMsgType = MB_ICONQUESTION; break; + default: iMsgType = 0; } + MessageBox(0, ptszText, ptszTitle, iMsgType); } } -INT_PTR CALLBACK DlgDownload(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) { - case WM_INITDIALOG: - SetWindowText(GetDlgItem(hDlg, IDC_LABEL), tszDialogMsg); - SetWindowLongPtr(GetDlgItem(hDlg, IDC_PB), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hDlg, IDC_PB), GWL_STYLE) | PBS_MARQUEE); - SendMessage(GetDlgItem(hDlg, IDC_PB), PBM_SETMARQUEE, 1, 50); - return TRUE; - } - return FALSE; -} - -INT_PTR CALLBACK DlgDownloadPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case WM_INITDIALOG: - PopupDataText *temp = (PopupDataText*)lParam; - ShowPopup(hDlg, temp->Title, temp->Text, 3, 0); - return TRUE; - } - return FALSE; -} - -bool PrepareEscalation() -{ - // First try to create a file near Miranda32.exe - TCHAR szPath[MAX_PATH]; - GetModuleFileName(NULL, szPath, SIZEOF(szPath)); - TCHAR *ext = _tcsrchr(szPath, '.'); - if (ext != NULL) - *ext = '\0'; - _tcscat(szPath, _T(".test")); - HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile != INVALID_HANDLE_VALUE) { - // we are admins or UAC is disable, cool - CloseHandle(hFile); - DeleteFile(szPath); - return true; - } - - // Check the current process's "run as administrator" status. - if ( IsRunAsAdmin()) - return true; - - // Elevate the process. Create a pipe for a stub first - TCHAR tszPipeName[MAX_PATH]; - mir_sntprintf(tszPipeName, MAX_PATH, _T("\\\\.\\pipe\\Miranda_Pu_%d"), GetCurrentProcessId()); - hPipe = CreateNamedPipe(tszPipeName, PIPE_ACCESS_DUPLEX, PIPE_READMODE_BYTE | PIPE_WAIT, 1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL); - if (hPipe == INVALID_HANDLE_VALUE) { - hPipe = NULL; - return false; - } - - TCHAR cmdLine[100], *p; - GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)); - if ((p = _tcsrchr(szPath, '\\')) != 0) - _tcscpy(p+1, _T("pu_stub.exe")); - mir_sntprintf(cmdLine, SIZEOF(cmdLine), _T("%d"), GetCurrentProcessId()); - - // Launch a stub - SHELLEXECUTEINFO sei = { sizeof(sei) }; - sei.lpVerb = L"runas"; - sei.lpFile = szPath; - sei.lpParameters = cmdLine; - sei.hwnd = NULL; - sei.nShow = SW_NORMAL; - if (ShellExecuteEx(&sei)) { - if (hPipe != NULL) - ConnectNamedPipe(hPipe, NULL); - return true; - } - - DWORD dwError = GetLastError(); - if (dwError == ERROR_CANCELLED) - { - // The user refused to allow privileges elevation. - // Do nothing ... - } - return false; -} - int ImageList_AddIconFromIconLib(HIMAGELIST hIml, const char *name) { HICON icon = Skin_GetIconByHandle(Skin_GetIconHandle(name)); @@ -259,15 +157,3 @@ int ImageList_AddIconFromIconLib(HIMAGELIST hIml, const char *name) Skin_ReleaseIcon(icon); return res; } - -INT_PTR CALLBACK DlgMsgPop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch (uMsg) { - case WM_INITDIALOG: - PopupDataText *temp = (PopupDataText*)lParam; - ShowPopup(hDlg, temp->Title, temp->Text, 0, 1); - return TRUE; - } - ShowWindow(hDlg, SW_HIDE); - return FALSE; -} diff --git a/plugins/PluginUpdater/src/Notifications.h b/plugins/PluginUpdater/src/Notifications.h index b131a7e4a3..91c57a6c67 100644 --- a/plugins/PluginUpdater/src/Notifications.h +++ b/plugins/PluginUpdater/src/Notifications.h @@ -17,29 +17,21 @@ not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define POPUPS 4 +#define POPUPS 3 //=== Objects ===== //This one is used to easily tie status id, icon, text... typedef struct { int ID; - int Icon; COLORREF colorBack; COLORREF colorText; } aPopups; -typedef struct _MSGPOPUPDATA -{ - POPUPACTION pa[4]; - HWND hDialog; -} -MSGPOPUPDATA, *LPMSGPOPUPDATA; - #define DEFAULT_POPUP_LCLICK 1 #define DEFAULT_POPUP_RCLICK 0 #define DEFAULT_POPUP_ENABLED 1 -#define DEFAULT_MESSAGE_ENABLED 1 +#define DEFAULT_MESSAGE_ENABLED 0 #define DEFAULT_TIMEOUT_VALUE 0 #define COLOR_BG_FIRSTDEFAULT RGB(173,206,247) @@ -67,6 +59,6 @@ static struct { TCHAR *Text; int Action; } PopupActions[] = { - _T("Close popup"), PCA_CLOSEPOPUP, - _T("Do nothing"), PCA_DONOTHING + LPGENT("Close popup"), PCA_CLOSEPOPUP, + LPGENT("Do nothing"), PCA_DONOTHING }; diff --git a/plugins/PluginUpdater/src/Options.cpp b/plugins/PluginUpdater/src/Options.cpp index 11021ac371..9d7ff1eb32 100644 --- a/plugins/PluginUpdater/src/Options.cpp +++ b/plugins/PluginUpdater/src/Options.cpp @@ -44,24 +44,30 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 0, TranslateT("hours")); ComboBox_InsertString(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), 1, TranslateT("days")); ComboBox_SetCurSel(GetDlgItem(hwndDlg, IDC_PERIODMEASURE), opts.bPeriodMeasure); - DBVARIANT dbv; - if ( db_get_s(NULL, MODNAME, "UpdateURL", &dbv)) { + + BYTE UpdateMode = db_get_b(NULL, MODNAME, "UpdateMode", UPDATE_MODE_STABLE); + if (UpdateMode == UPDATE_MODE_STABLE) { SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL)); CheckDlgButton(hwndDlg, IDC_STABLE, TRUE); } + else if (UpdateMode == UPDATE_MODE_TRUNK) { + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL_TRUNK)); + CheckDlgButton(hwndDlg, IDC_TRUNK, TRUE); + } + else if (UpdateMode == UPDATE_MODE_TRUNK_SYMBOLS) { + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL_TRUNK_SYMBOLS)); + CheckDlgButton(hwndDlg, IDC_TRUNK_SYMBOLS, TRUE); + } else { - SetDlgItemTextA(hwndDlg, IDC_CUSTOMURL, dbv.pszVal); - if (!strcmp(dbv.pszVal, DEFAULT_UPDATE_URL)) - CheckDlgButton(hwndDlg, IDC_STABLE, TRUE); - else if (!strcmp(dbv.pszVal, DEFAULT_UPDATE_URL_TRUNK)) - CheckDlgButton(hwndDlg, IDC_TRUNK, TRUE); - else if (!strcmp(dbv.pszVal, DEFAULT_UPDATE_URL_TRUNK_SYMBOLS)) - CheckDlgButton(hwndDlg, IDC_TRUNK_SYMBOLS, TRUE); - else { - CheckDlgButton(hwndDlg, IDC_CUSTOM, TRUE); - EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), TRUE); + CheckDlgButton(hwndDlg, IDC_CUSTOM, TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), TRUE); + DBVARIANT dbv; + if (!db_get_s(NULL, MODNAME, "UpdateURL", &dbv)) { + SetDlgItemTextA(hwndDlg, IDC_CUSTOMURL, dbv.pszVal); + db_free(&dbv); } - db_free(&dbv); + else + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL)); } } return TRUE; @@ -87,10 +93,31 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA break; case IDC_TRUNK_SYMBOLS: + EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), FALSE); + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL_TRUNK_SYMBOLS)); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; case IDC_TRUNK: + EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), FALSE); + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL_TRUNK)); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; case IDC_STABLE: + EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), FALSE); + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL)); + SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); + break; case IDC_CUSTOM: - EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), IsDlgButtonChecked(hwndDlg, IDC_CUSTOM)); + EnableWindow(GetDlgItem(hwndDlg, IDC_CUSTOMURL), TRUE); + { + DBVARIANT dbv; + if (!db_get_ts(NULL, MODNAME, "UpdateURL", &dbv)) { + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, dbv.ptszVal); + db_free(&dbv); + } + else + SetDlgItemText(hwndDlg, IDC_CUSTOMURL, _T(DEFAULT_UPDATE_URL)); + } SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; @@ -146,21 +173,22 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA mir_forkthread(InitTimer, (void*)1); if ( IsDlgButtonChecked(hwndDlg, IDC_STABLE)) - db_set_s(NULL, MODNAME, "UpdateURL", DEFAULT_UPDATE_URL); + db_set_b(NULL, MODNAME, "UpdateMode", UPDATE_MODE_STABLE); else if ( IsDlgButtonChecked(hwndDlg, IDC_TRUNK)) - db_set_s(NULL, MODNAME, "UpdateURL", DEFAULT_UPDATE_URL_TRUNK); + db_set_b(NULL, MODNAME, "UpdateMode", UPDATE_MODE_TRUNK); else if ( IsDlgButtonChecked(hwndDlg, IDC_TRUNK_SYMBOLS)) { - ptrA oldUrl( db_get_sa(NULL, MODNAME, "UpdateURL")); - if (strcmp(oldUrl, DEFAULT_UPDATE_URL_TRUNK_SYMBOLS)) { + BYTE oldMode = db_get_b(NULL, MODNAME, "UpdateMode",0); + if(oldMode == UPDATE_MODE_TRUNK_SYMBOLS) { opts.bForceRedownload = true; db_set_b(NULL, MODNAME, "ForceRedownload", 1); } - db_set_s(NULL, MODNAME, "UpdateURL", DEFAULT_UPDATE_URL_TRUNK_SYMBOLS); + db_set_b(NULL, MODNAME, "UpdateMode", UPDATE_MODE_TRUNK_SYMBOLS); } else { char szUrl[100]; GetDlgItemTextA(hwndDlg, IDC_CUSTOMURL, szUrl, SIZEOF(szUrl)); db_set_s(NULL, MODNAME, "UpdateURL", szUrl); + db_set_b(NULL, MODNAME, "UpdateMode", UPDATE_MODE_CUSTOM); } } break; @@ -171,8 +199,6 @@ INT_PTR CALLBACK UpdateNotifyOptsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPA INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { - char str[20] = {0}, str2[20] = {0}; - switch (msg) { case WM_INITDIALOG: TranslateDialogDefault(hdlg); @@ -180,18 +206,12 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) //Colors if (PopupOptions.DefColors == byCOLOR_OWN) { CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_CHECKED); - CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_UNCHECKED); } - if (PopupOptions.DefColors == byCOLOR_WINDOWS) { - CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_UNCHECKED); - CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_UNCHECKED); + else if (PopupOptions.DefColors == byCOLOR_WINDOWS) { CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_CHECKED); } - if (PopupOptions.DefColors == byCOLOR_POPUP) { - CheckDlgButton(hdlg, IDC_USEOWNCOLORS, BST_UNCHECKED); + else if (PopupOptions.DefColors == byCOLOR_POPUP) { CheckDlgButton(hdlg, IDC_USEPOPUPCOLORS, BST_CHECKED); - CheckDlgButton(hdlg, IDC_USEWINCOLORS, BST_UNCHECKED); } for (int i = 0; i < POPUPS; i++) { SendDlgItemMessage(hdlg, (i+42071), CPM_SETCOLOUR, 0, PopupsList[i].colorBack); @@ -213,6 +233,7 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) //Popups nitified for (int i = 0; i < POPUPS; i++) { + char str[20] = {0}, str2[20] = {0}; mir_snprintf(str, SIZEOF(str), "Popups%d", i); mir_snprintf(str2, SIZEOF(str2), "Popups%dM", i); CheckDlgButton(hdlg, (i+40071), (db_get_b(NULL, MODNAME, str, DEFAULT_POPUP_ENABLED)) ? BST_CHECKED: BST_UNCHECKED); @@ -222,12 +243,6 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) else if (i > 0) EnableWindow(GetDlgItem(hdlg, (i+1024)), TRUE); } - - EnableWindow(GetDlgItem(hdlg, (40071)), FALSE); - return TRUE; - - case WM_SHOWWINDOW: - EnableWindow(GetDlgItem(hdlg, (40071)), FALSE); return TRUE; case WM_COMMAND: @@ -303,7 +318,7 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) for (int i = 0; i < POPUPS; i++) { if ((!IsDlgButtonChecked(hdlg, (i+40071))) || (!IsWindowEnabled(GetDlgItem(hdlg, (i+40071))))) continue; - ShowPopup(0, Title, Text, i, 0); + ShowPopup(Title, Text, i); } } break; @@ -352,7 +367,7 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) //Text color char szSetting[20] = {0}; DWORD ctlColor = 0; - for (int i = 0; i <= POPUPS-1; i++) { + for (int i = 0; i < POPUPS; i++) { ctlColor = SendDlgItemMessage(hdlg, (i+42071), CPM_GETCOLOUR, 0, 0); PopupsList[i].colorBack = ctlColor; mir_snprintf(szSetting, SIZEOF(szSetting), "Popups%iBg", i); @@ -373,6 +388,7 @@ INT_PTR CALLBACK DlgPopupOpts(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) db_set_b(NULL, MODNAME, "RightClickAction", PopupOptions.RightClickAction); //Notified popups for (int i = 0; i < POPUPS; i++) { + char str[20] = {0}, str2[20] = {0}; mir_snprintf(str, SIZEOF(str), "Popups%d", i); db_set_b(NULL, MODNAME, str, (BYTE)(IsDlgButtonChecked(hdlg, (i+40071)))); mir_snprintf(str2, SIZEOF(str2), "Popups%dM", i); diff --git a/plugins/PluginUpdater/src/PluginUpdater.cpp b/plugins/PluginUpdater/src/PluginUpdater.cpp index 5e14fddd70..4644d6d13e 100644 --- a/plugins/PluginUpdater/src/PluginUpdater.cpp +++ b/plugins/PluginUpdater/src/PluginUpdater.cpp @@ -138,6 +138,31 @@ extern "C" __declspec(dllexport) int Load(void) //add sounds SkinAddNewSoundEx("updatecompleted",LPGEN("Plugin Updater"),LPGEN("Update completed")); SkinAddNewSoundEx("updatefailed",LPGEN("Plugin Updater"),LPGEN("Update failed")); + + // Upgrade old settings + if(!db_set_b(0,MODNAME,"UpdateMode",UPDATE_MODE_STABLE)) + { + DBVARIANT dbvUpdateURL; + if (!db_get_s(0,MODNAME, "UpdateURL",&dbvUpdateURL)) + { + if (!strcmp(dbvUpdateURL.pszVal, DEFAULT_UPDATE_URL)) + { + db_set_b(0,MODNAME,"UpdateMode",UPDATE_MODE_STABLE); + db_unset(0,MODNAME, "UpdateURL"); + } + else if (!strcmp(dbvUpdateURL.pszVal, DEFAULT_UPDATE_URL_TRUNK)) + { + db_set_b(0,MODNAME,"UpdateMode",UPDATE_MODE_TRUNK); + db_unset(0,MODNAME, "UpdateURL"); + } + else if (!strcmp(dbvUpdateURL.pszVal, DEFAULT_UPDATE_URL_TRUNK_SYMBOLS"/")) + { + db_set_b(0,MODNAME,"UpdateMode",UPDATE_MODE_TRUNK_SYMBOLS); + db_unset(0,MODNAME, "UpdateURL"); + } + db_free(&dbvUpdateURL); + } + } return 0; } diff --git a/plugins/PluginUpdater/src/Utils.cpp b/plugins/PluginUpdater/src/Utils.cpp index 07e17b2231..a74c878f35 100644 --- a/plugins/PluginUpdater/src/Utils.cpp +++ b/plugins/PluginUpdater/src/Utils.cpp @@ -19,13 +19,8 @@ Boston, MA 02111-1307, USA. #include "Common.h" -BOOL DlgDld; -int Number = 0; -TCHAR tszDialogMsg[2048] = {0}; -FILEINFO *pFileInfo = NULL; -HANDLE hNetlibUser = NULL; +HANDLE hNetlibUser = NULL, hPipe = NULL; POPUP_OPTIONS PopupOptions = {0}; -aPopups PopupsList[POPUPS]; extern DWORD g_mirandaVersion; ///////////////////////////////////////////////////////////////////////////////////// @@ -40,8 +35,6 @@ struct static iconList[] = { { "check_update", LPGEN("Check for updates"), IDI_MENU }, - { "btn_ok", LPGEN("'Yes' Button"), IDI_OK }, - { "btn_cancel", LPGEN("'No' Button"), IDI_CANCEL }, { "info", LPGEN("Plugin info"), IDI_INFO }, { "plg_list", LPGEN("Plugin list"), IDI_PLGLIST }, }; @@ -80,33 +73,6 @@ void UnloadNetlib() hNetlibUser = NULL; } -void InitPopupList() -{ - int index = 0; - PopupsList[index].ID = index; - PopupsList[index].Icon = SKINICON_OTHER_MIRANDA; - PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups0Bg", COLOR_BG_FIRSTDEFAULT); - PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups0Tx", COLOR_TX_DEFAULT); - - index = 1; - PopupsList[index].ID = index; - PopupsList[index].Icon = SKINICON_OTHER_MIRANDA; - PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups1Bg", COLOR_BG_SECONDDEFAULT); - PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups1Tx", COLOR_TX_DEFAULT); - - index = 2; - PopupsList[index].ID = index; - PopupsList[index].Icon = SKINICON_OTHER_MIRANDA; - PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups2Bg", COLOR_BG_FIRSTDEFAULT); - PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups2Tx", COLOR_TX_DEFAULT); - - index = 3; - PopupsList[index].ID = index; - PopupsList[index].Icon = SKINICON_OTHER_MIRANDA; - PopupsList[index].colorBack = db_get_dw(NULL, MODNAME, "Popups3Bg", COLOR_BG_SECONDDEFAULT); - PopupsList[index].colorText = db_get_dw(NULL, MODNAME, "Popups3Tx", COLOR_TX_DEFAULT); -} - void LoadOptions() { PopupOptions.DefColors = db_get_b(NULL, MODNAME, "DefColors", DEFAULT_COLORS); @@ -178,16 +144,26 @@ int Get_CRC(unsigned char* buffer, ULONG bufsize) TCHAR* GetDefaultUrl() { - #if MIRANDA_VER < 0x0A00 - return mir_tstrdup(_T("http://miranda-ng.org/distr/deprecated/0.94.9/x%platform%")); - #else +#if MIRANDA_VER < 0x0A00 + return mir_tstrdup(_T("http://miranda-ng.org/distr/deprecated/0.94.9/x%platform%")); +#else + // If "UpdateMode" is missing, try to use "UpdateURL" directly + BYTE UpdateMode = db_get_b(NULL,MODNAME,"UpdateMode",UPDATE_MODE_CUSTOM); + if (UpdateMode==UPDATE_MODE_STABLE) + return mir_tstrdup(_T(DEFAULT_UPDATE_URL)); + else if (UpdateMode==UPDATE_MODE_TRUNK) + return mir_tstrdup(_T(DEFAULT_UPDATE_URL_TRUNK)); + else if (UpdateMode==UPDATE_MODE_TRUNK_SYMBOLS) + return mir_tstrdup(_T(DEFAULT_UPDATE_URL_TRUNK_SYMBOLS)); + else { TCHAR *result = db_get_tsa(NULL, MODNAME, "UpdateURL"); if (result == NULL) { // URL is not set - db_set_ts(NULL, MODNAME, "UpdateURL", _T(DEFAULT_UPDATE_URL)); + db_set_b(NULL,MODNAME,"UpdateMode",UPDATE_MODE_STABLE); result = mir_tstrdup( _T(DEFAULT_UPDATE_URL)); } return result; - #endif + } +#endif } int CompareHashes(const ServListEntry *p1, const ServListEntry *p2) @@ -199,11 +175,11 @@ bool ParseHashes(const TCHAR *ptszUrl, ptrT& baseUrl, SERVLIST& arHashes) { REPLACEVARSARRAY vars[2]; vars[0].lptzKey = _T("platform"); - #ifdef _WIN64 - vars[0].lptzValue = _T("64"); - #else - vars[0].lptzValue = _T("32"); - #endif +#ifdef _WIN64 + vars[0].lptzValue = _T("64"); +#else + vars[0].lptzValue = _T("32"); +#endif vars[1].lptzKey = vars[1].lptzValue = 0; REPLACEVARSDATA dat = { sizeof(REPLACEVARSDATA) }; @@ -213,7 +189,7 @@ bool ParseHashes(const TCHAR *ptszUrl, ptrT& baseUrl, SERVLIST& arHashes) // Download version info if (!opts.bSilent) - ShowPopup(NULL, TranslateT("Plugin Updater"), TranslateT("Checking new updates..."), 2, 0, true); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("Checking new updates..."), POPUP_TYPE_INFO); FILEURL pFileUrl; mir_sntprintf(pFileUrl.tszDownloadURL, SIZEOF(pFileUrl.tszDownloadURL), _T("%s/hashes.zip"), baseUrl); @@ -226,11 +202,11 @@ bool ParseHashes(const TCHAR *ptszUrl, ptrT& baseUrl, SERVLIST& arHashes) if (!ret) { if(!opts.bSilent) - ShowPopup(0, LPGENT("Plugin Updater"), LPGENT("An error occurred while checking new updates."), 1, 0); + ShowPopup(TranslateT("Plugin Updater"), TranslateT("An error occurred while checking new updates."), POPUP_TYPE_ERROR); return false; } - if(!unzip(pFileUrl.tszDiskPath, tszTempPath, NULL,true)) + if(!unzip(pFileUrl.tszDiskPath, tszTempPath, NULL)) return false; DeleteFile(pFileUrl.tszDiskPath); @@ -354,28 +330,12 @@ bool DownloadFile(FILEURL *pFileURL, HANDLE &nlc) mir_free(szUrl); mir_free(nlhr.headers); - DlgDld = ret; return ret; } ///////////////////////////////////////////////////////////////////////////////////////// -BOOL AllowUpdateOnStartup() -{ - if (!opts.bUpdateOnStartup) - return FALSE; - - if (opts.bOnlyOnceADay) { - time_t now = time(NULL); - time_t was = db_get_dw(NULL, MODNAME, "LastUpdate", 0); - - if ((now - was) < 86400) - return FALSE; - } - return TRUE; -} - -LONG PeriodToMilliseconds(const int period, BYTE& periodMeasure) +LONG PeriodToMilliseconds(const int period, BYTE periodMeasure) { LONG result = period * 1000; switch(periodMeasure) { @@ -394,7 +354,7 @@ LONG PeriodToMilliseconds(const int period, BYTE& periodMeasure) return result; } -void CALLBACK TimerAPCProc(LPVOID lpArg, DWORD dwTimerLowValue, DWORD dwTimerHighValue) +void CALLBACK TimerAPCProc(void *, DWORD, DWORD) { DoCheck(); } @@ -445,76 +405,6 @@ void strdel(TCHAR *parBuffer, int len) p[-len] = '\0'; } -#if MIRANDA_VER < 0x0A00 -static char szHexTable[] = "0123456789abcdef"; - -char* bin2hex(const void *pData, size_t len, char *dest) -{ - const BYTE *p = (const BYTE*)pData; - char *d = dest; - - for (size_t i=0; i < len; i++, p++) { - *d++ = szHexTable[*p >> 4]; - *d++ = szHexTable[*p & 0x0F]; - } - *d = 0; - - return dest; -} - -char* rtrim(char *str) -{ - if (str == NULL) - return NULL; - - char *p = strchr(str, 0); - while (--p >= str) { - switch (*p) { - case ' ': case '\t': case '\n': case '\r': - *p = 0; break; - default: - return str; - } - } - return str; -} - -void CreatePathToFileT(TCHAR* tszFilePath) -{ - TCHAR* pszLastBackslash = _tcsrchr(tszFilePath, '\\'); - if (pszLastBackslash == NULL) - return; - - *pszLastBackslash = '\0'; - CreateDirectoryTreeT(tszFilePath); - *pszLastBackslash = '\\'; -} - -void __stdcall RestartMe(void*) -{ - TCHAR mirandaPath[MAX_PATH], cmdLine[MAX_PATH]; - GetModuleFileName(NULL, mirandaPath, SIZEOF(mirandaPath)); - - TCHAR *profilename = Utils_ReplaceVarsT(_T("%miranda_profilename%")); - mir_sntprintf(cmdLine, SIZEOF(cmdLine), _T("\"%s\" /restart:%d /profile=%s"), mirandaPath, GetCurrentProcessId(), profilename); - mir_free(profilename); - - CallService("CloseAction", 0, 0); - - PROCESS_INFORMATION pi; - STARTUPINFO si = { sizeof(si) }; - CreateProcess(mirandaPath, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); -} - -#else - -void __stdcall RestartMe(void*) -{ - CallService(MS_SYSTEM_RESTART, db_get_b(NULL,MODNAME,"RestartCurrentProfile",1) ? 1 : 0, 0); -} - -#endif - void __stdcall OpenPluginOptions(void*) { OPENOPTIONSDIALOG ood = {0}; @@ -680,6 +570,65 @@ Cleanup: return fIsElevated; } +bool PrepareEscalation() +{ + // First try to create a file near Miranda32.exe + TCHAR szPath[MAX_PATH]; + GetModuleFileName(NULL, szPath, SIZEOF(szPath)); + TCHAR *ext = _tcsrchr(szPath, '.'); + if (ext != NULL) + *ext = '\0'; + _tcscat(szPath, _T(".test")); + HANDLE hFile = CreateFile(szPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile != INVALID_HANDLE_VALUE) { + // we are admins or UAC is disable, cool + CloseHandle(hFile); + DeleteFile(szPath); + return true; + } + else if (IsRunAsAdmin()) { + // Check the current process's "run as administrator" status. + return true; + } + else { + // Elevate the process. Create a pipe for a stub first + TCHAR tszPipeName[MAX_PATH]; + mir_sntprintf(tszPipeName, MAX_PATH, _T("\\\\.\\pipe\\Miranda_Pu_%d"), GetCurrentProcessId()); + hPipe = CreateNamedPipe(tszPipeName, PIPE_ACCESS_DUPLEX, PIPE_READMODE_BYTE | PIPE_WAIT, 1, 1024, 1024, NMPWAIT_USE_DEFAULT_WAIT, NULL); + if (hPipe == INVALID_HANDLE_VALUE) { + hPipe = NULL; + } + else { + TCHAR cmdLine[100], *p; + GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)); + if ((p = _tcsrchr(szPath, '\\')) != 0) + _tcscpy(p+1, _T("pu_stub.exe")); + mir_sntprintf(cmdLine, SIZEOF(cmdLine), _T("%d"), GetCurrentProcessId()); + + // Launch a stub + SHELLEXECUTEINFO sei = { sizeof(sei) }; + sei.lpVerb = L"runas"; + sei.lpFile = szPath; + sei.lpParameters = cmdLine; + sei.hwnd = NULL; + sei.nShow = SW_NORMAL; + if (ShellExecuteEx(&sei)) { + if (hPipe != NULL) + ConnectNamedPipe(hPipe, NULL); + return true; + } + + DWORD dwError = GetLastError(); + if (dwError == ERROR_CANCELLED) + { + // The user refused to allow privileges elevation. + // Do nothing ... + } + } + return false; + } +} + ///////////////////////////////////////////////////////////////////////////////////////// int TransactPipe(int opcode, const TCHAR *p1, const TCHAR *p2) diff --git a/plugins/PluginUpdater/src/unzipfile.cpp b/plugins/PluginUpdater/src/unzipfile.cpp index b29e7e1193..24da1147a4 100644 --- a/plugins/PluginUpdater/src/unzipfile.cpp +++ b/plugins/PluginUpdater/src/unzipfile.cpp @@ -45,7 +45,7 @@ void BackupFile(TCHAR *ptszSrcFileName, TCHAR *ptszBackFileName) SafeMoveFile(ptszSrcFileName, ptszBackFileName); } -bool extractCurrentFile(unzFile uf, TCHAR *ptszDestPath, TCHAR *ptszBackPath, bool ch) +bool extractCurrentFile(unzFile uf, TCHAR *ptszDestPath, TCHAR *ptszBackPath) { unz_file_info64 file_info; char filename[MAX_PATH], buf[8192]; @@ -57,9 +57,6 @@ bool extractCurrentFile(unzFile uf, TCHAR *ptszDestPath, TCHAR *ptszBackPath, bo for (char *p = strchr(filename, '/'); p; p = strchr(p+1, '/')) *p = '\\'; - if (ch && !db_get_b(NULL, MODNAME "Files", StrToLower(ptrA(mir_strdup(filename))), 1)) - return true; - TCHAR tszDestFile[MAX_PATH], tszBackFile[MAX_PATH]; TCHAR *ptszNewName = mir_utf8decodeT(filename); if (ptszNewName == NULL) @@ -121,7 +118,7 @@ bool extractCurrentFile(unzFile uf, TCHAR *ptszDestPath, TCHAR *ptszBackPath, bo return true; } -bool unzip(const TCHAR *ptszZipFile, TCHAR *ptszDestPath, TCHAR *ptszBackPath,bool ch) +bool unzip(const TCHAR *ptszZipFile, TCHAR *ptszDestPath, TCHAR *ptszBackPath) { bool bResult = true; @@ -131,7 +128,7 @@ bool unzip(const TCHAR *ptszZipFile, TCHAR *ptszDestPath, TCHAR *ptszBackPath,bo unzFile uf = unzOpen2_64(ptszZipFile, &ffunc); if (uf) { do { - if (!extractCurrentFile(uf, ptszDestPath, ptszBackPath,ch)) + if (!extractCurrentFile(uf, ptszDestPath, ptszBackPath)) bResult = false; } while (unzGoToNextFile(uf) == UNZ_OK); -- cgit v1.2.3