From dcd1fc6f6662c6c513f2e15e42473372e6a0240f Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 17 Sep 2020 18:14:24 +0300 Subject: =?UTF-8?q?fixes=20#2554=20(PluginUpdater:=20=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20=D0=B2=20?= =?UTF-8?q?=D1=81=D0=BB=D1=83=D1=87=D0=B0=D0=B5=20=D0=BD=D0=B5=D1=83=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=20=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/PluginUpdater/src/DlgUpdate.cpp | 2 ++ plugins/PluginUpdater/src/Utils.cpp | 59 ++++++++++++++++++++++++++++----- plugins/PluginUpdater/src/stdafx.h | 1 + 3 files changed, 53 insertions(+), 9 deletions(-) (limited to 'plugins/PluginUpdater/src') diff --git a/plugins/PluginUpdater/src/DlgUpdate.cpp b/plugins/PluginUpdater/src/DlgUpdate.cpp index d27012b5b7..5396683204 100644 --- a/plugins/PluginUpdater/src/DlgUpdate.cpp +++ b/plugins/PluginUpdater/src/DlgUpdate.cpp @@ -91,6 +91,7 @@ class CUpdateDLg : public CDlgBase mir_snwprintf(wszBackFile, L"%s\\%s", wszBackupFolder, it->wszNewName + wcslen(wszMirandaPath) + 1); if (dwErrorCode = BackupFile(it->wszNewName, wszBackFile)) { LBL_Error: + RollbackChanges(wszBackupFolder); Skin_PlaySound("updatefailed"); CMStringW wszError(FORMAT, TranslateT("Unpack operation failed with error code=%d, update terminated"), dwErrorCode); MessageBox(pDlg->GetHwnd(), wszError, TranslateT("Plugin Updater"), MB_OK | MB_ICONERROR); @@ -441,6 +442,7 @@ static void DlgUpdateSilent(void *param) mir_snwprintf(wszBackFile, L"%s\\%s", wszBackupFolder, it->wszNewName + wcslen(wszMirandaPath) + 1); if (dwErrorCode = BackupFile(it->wszNewName, wszBackFile)) { LBL_Error: + RollbackChanges(wszBackupFolder); Skin_PlaySound("updatefailed"); delete &UpdateFiles; return; diff --git a/plugins/PluginUpdater/src/Utils.cpp b/plugins/PluginUpdater/src/Utils.cpp index 5126bc04b8..63c1ede5b4 100644 --- a/plugins/PluginUpdater/src/Utils.cpp +++ b/plugins/PluginUpdater/src/Utils.cpp @@ -467,17 +467,20 @@ void RemoveBackupFolders() WIN32_FIND_DATAW fdata; HANDLE hFind = FindFirstFileW(wszMask, &fdata); - if (hFind) { - // sort folder names alphabetically - OBJLIST arNames(1, CompareDirs); - do { - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - arNames.insert(new CMStringW(fdata.cFileName)); - } while (FindNextFileW(hFind, &fdata)); + if (!hFind) + return; - // remove all folders with lesser dates if there're more than 10 folders - if (PrepareEscalation()) + // sort folder names alphabetically + OBJLIST arNames(1, CompareDirs); + do { + if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + arNames.insert(new CMStringW(fdata.cFileName)); + } while (FindNextFileW(hFind, &fdata)); + FindClose(hFind); + + // remove all folders with lesser dates if there're more than 10 folders + if (PrepareEscalation()) { while (arNames.getCount() > g_plugin.iNumberBackups) { mir_snwprintf(wszMask, L"%s\\Backups\\%s", g_wszRoot, arNames[0].c_str()); SafeDeleteDirectory(wszMask); @@ -486,6 +489,44 @@ void RemoveBackupFolders() } } +///////////////////////////////////////////////////////////////////////////////////////// +// moves updated files back to Miranda's folder + +static void SafeMoveFolder(const wchar_t *wszSrc, const wchar_t *wszDest) +{ + TFileName wszNewSrc, wszNewDest; + mir_snwprintf(wszNewSrc, L"%s\\*", wszSrc); + + WIN32_FIND_DATAW fdata; + HANDLE hFind = FindFirstFileW(wszNewSrc, &fdata); + if (!hFind) + return; + + do { + if (!mir_wstrcmp(fdata.cFileName, L".") || !mir_wstrcmp(fdata.cFileName, L"..")) + continue; + + mir_snwprintf(wszNewSrc, L"%s\\%s", wszSrc, fdata.cFileName); + mir_snwprintf(wszNewDest, L"%s\\%s", wszDest, fdata.cFileName); + + if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + SafeMoveFolder(wszNewSrc, wszNewDest); + else + SafeMoveFile(wszNewSrc, wszNewDest); + } + while (FindNextFileW(hFind, &fdata)); + + FindClose(hFind); +} + +void RollbackChanges(TFileName &pwszBackupFolder) +{ + VARSW dirname(L"%miranda_path%"); + SafeMoveFolder(pwszBackupFolder, dirname); + + SafeDeleteDirectory(pwszBackupFolder); +} + ///////////////////////////////////////////////////////////////////////////////////////// int TransactPipe(int opcode, const wchar_t *p1, const wchar_t *p2) diff --git a/plugins/PluginUpdater/src/stdafx.h b/plugins/PluginUpdater/src/stdafx.h index 28525666c9..8a0aea883e 100644 --- a/plugins/PluginUpdater/src/stdafx.h +++ b/plugins/PluginUpdater/src/stdafx.h @@ -259,6 +259,7 @@ bool PrepareEscalation(void); void CreateWorkFolders(TFileName &wszTempFolder, TFileName &wszBackupFolder); void RemoveBackupFolders(void); +void RollbackChanges(TFileName &pwszBackupFolder); int SafeCreateDirectory(const wchar_t *pwszDirName); int SafeDeleteDirectory(const wchar_t *pwszDirName); -- cgit v1.2.3