diff options
Diffstat (limited to 'plugins/PluginUpdater/src')
| -rw-r--r-- | plugins/PluginUpdater/src/Common.h | 24 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Compat/compat.cpp | 101 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Compat/compat.h | 22 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/DlgListNew.cpp | 154 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/DlgUpdate.cpp | 266 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Events.cpp | 5 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Notifications.cpp | 264 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Notifications.h | 16 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Options.cpp | 90 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/PluginUpdater.cpp | 27 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/Utils.cpp | 221 | ||||
| -rw-r--r-- | plugins/PluginUpdater/src/unzipfile.cpp | 9 | 
12 files changed, 568 insertions, 631 deletions
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 <m_popup2.h>
  #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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)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<FILEINFO> *)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<FILEINFO> &UpdateFiles = *(OBJLIST<FILEINFO> *)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<FILEINFO> *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..d0678e91e5 100644 --- a/plugins/PluginUpdater/src/PluginUpdater.cpp +++ b/plugins/PluginUpdater/src/PluginUpdater.cpp @@ -135,9 +135,30 @@ extern "C" __declspec(dllexport) int Load(void)  	InitEvents();
 -	//add sounds
 -	SkinAddNewSoundEx("updatecompleted",LPGEN("Plugin Updater"),LPGEN("Update completed"));
 -	SkinAddNewSoundEx("updatefailed",LPGEN("Plugin Updater"),LPGEN("Update failed"));
 +	// add sounds
 +	SkinAddNewSoundEx("updatecompleted", LPGEN("Plugin Updater"), LPGEN("Update completed"));
 +	SkinAddNewSoundEx("updatefailed", LPGEN("Plugin Updater"), LPGEN("Update failed"));
 +	
 +	// Upgrade old settings
 +	if (-1 == db_get_b(0, MODNAME, "UpdateMode", -1)) {
 +		ptrA dbvUpdateURL(db_get_sa(0, MODNAME, "UpdateURL"));
 +		if (dbvUpdateURL) {
 +			if (!strcmp(dbvUpdateURL, DEFAULT_UPDATE_URL)) {
 +				db_set_b(0, MODNAME, "UpdateMode", UPDATE_MODE_STABLE);
 +				db_unset(0, MODNAME, "UpdateURL");
 +			}
 +			else if (!strcmp(dbvUpdateURL, DEFAULT_UPDATE_URL_TRUNK)) {
 +				db_set_b(0, MODNAME, "UpdateMode", UPDATE_MODE_TRUNK);
 +				db_unset(0, MODNAME, "UpdateURL");
 +			}
 +			else if (!strcmp(dbvUpdateURL, DEFAULT_UPDATE_URL_TRUNK_SYMBOLS"/")) {
 +				db_set_b(0, MODNAME, "UpdateMode", UPDATE_MODE_TRUNK_SYMBOLS);
 +				db_unset(0, MODNAME, "UpdateURL");
 +			}
 +			else db_set_b(0, MODNAME, "UpdateMode", UPDATE_MODE_CUSTOM);
 +		}
 +		else db_set_b(0, MODNAME, "UpdateMode", UPDATE_MODE_STABLE);
 +	}
  	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);
  | 
