summaryrefslogtreecommitdiff
path: root/plugins/DbChecker/src
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-08-08 14:37:17 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-08-08 14:37:17 +0300
commit62e4253a9a92179d184ffb8dcb8947d4d38b9aea (patch)
tree81fd8f7fcd8a382e696a1c639c23013eea0c54a3 /plugins/DbChecker/src
parent6bb288a0c37e0027e6eea64124df80750744b4ec (diff)
Dbchecker:
- all global data removed, DbToolOptions now acts as an object attached to the wizard; - many glitches removed; - profile manager in the core now teached to use DBChecker, if present
Diffstat (limited to 'plugins/DbChecker/src')
-rw-r--r--plugins/DbChecker/src/finished.cpp46
-rw-r--r--plugins/DbChecker/src/main.cpp32
-rw-r--r--plugins/DbChecker/src/openerror.cpp65
-rw-r--r--plugins/DbChecker/src/progress.cpp60
-rw-r--r--plugins/DbChecker/src/resource.h8
-rw-r--r--plugins/DbChecker/src/selectdb.cpp324
-rw-r--r--plugins/DbChecker/src/stdafx.h24
-rw-r--r--plugins/DbChecker/src/version.h2
-rw-r--r--plugins/DbChecker/src/wizard.cpp15
-rw-r--r--plugins/DbChecker/src/worker.cpp21
10 files changed, 122 insertions, 475 deletions
diff --git a/plugins/DbChecker/src/finished.cpp b/plugins/DbChecker/src/finished.cpp
deleted file mode 100644
index cf5d75f896..0000000000
--- a/plugins/DbChecker/src/finished.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-Miranda Database Tool
-Copyright (C) 2001-2005 Richard Hughes
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "stdafx.h"
-
-INT_PTR CALLBACK FinishedDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- INT_PTR bReturn;
- if (DoMyControlProcessing(hdlg, message, wParam, lParam, &bReturn))
- return bReturn;
-
- switch (message) {
- case WM_INITDIALOG:
- EnableWindow(GetDlgItem(GetParent(hdlg), IDC_BACK), FALSE);
- EnableWindow(GetDlgItem(GetParent(hdlg), IDOK), FALSE);
- SetDlgItemText(GetParent(hdlg), IDCANCEL, TranslateT("&Finish"));
- SetWindowLongPtr(GetDlgItem(hdlg, IDC_DBFILE), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hdlg, IDC_DBFILE), GWL_STYLE) | SS_PATHELLIPSIS);
- SetDlgItemText(hdlg, IDC_DBFILE, opts.filename);
-
- TranslateDialogDefault(hdlg);
- return TRUE;
-
- case WZN_CANCELCLICKED:
- bLaunchMiranda = IsDlgButtonChecked(hdlg, IDC_LAUNCHMIRANDA) == BST_CHECKED;
- Profile_SetDefault(opts.filename);
- wizardResult = 1;
- return TRUE;
- }
- return FALSE;
-}
diff --git a/plugins/DbChecker/src/main.cpp b/plugins/DbChecker/src/main.cpp
index 89b5633957..eb59131e86 100644
--- a/plugins/DbChecker/src/main.cpp
+++ b/plugins/DbChecker/src/main.cpp
@@ -19,11 +19,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
-int hLangpack = 0;
-bool bServiceMode, bLaunchMiranda, bAutoExit;
-
-DbToolOptions opts = { 0 };
-
CMPlugin g_plugin;
/////////////////////////////////////////////////////////////////////////////////////////
@@ -60,28 +55,27 @@ static HANDLE hService; // do not remove it!
static INT_PTR ServiceMode(WPARAM, LPARAM)
{
- bLaunchMiranda = bAutoExit = false;
- bServiceMode = true;
-
- opts.db = db_get_current();
+ auto *opts = new DbToolOptions();
+ opts->db = db_get_current();
db_setCurrent(nullptr);
- wcsncpy_s(opts.filename, VARSW(L"%miranda_userdata%\\%miranda_profilename%.dat"), _TRUNCATE);
+ wcsncpy_s(opts->filename, VARSW(L"%miranda_userdata%\\%miranda_profilename%.dat"), _TRUNCATE);
- opts.dbChecker = opts.db->GetChecker();
- if (opts.dbChecker == nullptr)
+ opts->dbChecker = opts->db->GetChecker();
+ if (opts->dbChecker == nullptr) {
+ delete opts;
return SERVICE_FAILED;
+ }
- DialogBox(g_plugin.getInst(), MAKEINTRESOURCE(IDD_WIZARD), nullptr, WizardDlgProc);
- return (bLaunchMiranda) ? SERVICE_CONTINUE : SERVICE_FAILED;
+ DialogBoxParamW(g_plugin.getInst(), MAKEINTRESOURCE(IDD_WIZARD), nullptr, WizardDlgProc, LPARAM(opts));
+ return SERVICE_FAILED;
}
static INT_PTR CheckProfile(WPARAM wParam, LPARAM lParam)
{
- bLaunchMiranda = lParam != 0;
- bAutoExit = lParam == 2;
- bServiceMode = false;
- wcsncpy(opts.filename, (wchar_t*)wParam, _countof(opts.filename));
- return DialogBox(g_plugin.getInst(), MAKEINTRESOURCE(IDD_WIZARD), nullptr, WizardDlgProc);
+ auto *opts = new DbToolOptions();
+ opts->bAutoExit = lParam == 2;
+ wcsncpy(opts->filename, (wchar_t*)wParam, _countof(opts->filename));
+ return DialogBoxParamW(g_plugin.getInst(), MAKEINTRESOURCE(IDD_WIZARD), nullptr, WizardDlgProc, LPARAM(opts));
}
int CMPlugin::Load(void)
diff --git a/plugins/DbChecker/src/openerror.cpp b/plugins/DbChecker/src/openerror.cpp
index e5cf04c98a..54e13398d3 100644
--- a/plugins/DbChecker/src/openerror.cpp
+++ b/plugins/DbChecker/src/openerror.cpp
@@ -27,28 +27,63 @@ INT_PTR CALLBACK OpenErrorDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
switch (message) {
case WM_INITDIALOG:
- {
- wchar_t szError[256];
- FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, opts.error, 0, szError, _countof(szError), nullptr);
- SetDlgItemText(hdlg, IDC_ERRORTEXT, szError);
- }
- if (opts.error == ERROR_SHARING_VIOLATION) ShowWindow(GetDlgItem(hdlg, IDC_INUSE), SW_SHOW);
- SetWindowLongPtr(GetDlgItem(hdlg, IDC_FILE), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hdlg, IDC_FILE), GWL_STYLE) | SS_PATHELLIPSIS);
- TranslateDialogDefault(hdlg);
- SetDlgItemText(hdlg, IDC_FILE, opts.filename);
- return TRUE;
+ {
+ auto *opts = (DbToolOptions *)lParam;
+
+ wchar_t szError[256];
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, opts->error, 0, szError, _countof(szError), nullptr);
+ SetDlgItemText(hdlg, IDC_ERRORTEXT, szError);
+
+ if (opts->error == ERROR_SHARING_VIOLATION)
+ ShowWindow(GetDlgItem(hdlg, IDC_INUSE), SW_SHOW);
+ SetWindowLongPtr(GetDlgItem(hdlg, IDC_FILE), GWL_STYLE, GetWindowLongPtr(GetDlgItem(hdlg, IDC_FILE), GWL_STYLE) | SS_PATHELLIPSIS);
+ TranslateDialogDefault(hdlg);
+ SetDlgItemText(hdlg, IDC_FILE, opts->filename);
+ }
+ return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
- case IDC_BACK:
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_SELECTDB, (LPARAM)SelectDbDlgProc);
- break;
-
case IDOK:
- OpenDatabase(hdlg);
+ OpenDatabase(GetParent(hdlg));
break;
}
break;
}
return FALSE;
}
+
+int OpenDatabase(HWND hdlg)
+{
+ auto *opts = (DbToolOptions *)GetWindowLongPtr(hdlg, GWLP_USERDATA);
+ wchar_t tszMsg[1024];
+
+ if (opts->dbChecker == nullptr) {
+ DATABASELINK *dblink = FindDatabasePlugin(opts->filename);
+ if (dblink == nullptr) {
+ mir_snwprintf(tszMsg,
+ TranslateT("Database Checker cannot find a suitable database plugin to open '%s'."),
+ opts->filename);
+ LBL_Error:
+ MessageBox(hdlg, tszMsg, TranslateT("Error"), MB_OK | MB_ICONERROR);
+ return false;
+ }
+
+ auto *pDb = dblink->Load(opts->filename, false);
+ if (pDb == nullptr) {
+ PostMessage(hdlg, WZM_GOTOPAGE, IDD_OPENERROR, (LPARAM)OpenErrorDlgProc);
+ return true;
+ }
+
+ opts->dbChecker = pDb->GetChecker();
+ if (opts->dbChecker == nullptr) {
+ mir_snwprintf(tszMsg, TranslateT("Database driver '%s' doesn't support checking."), TranslateW(dblink->szFullName));
+ goto LBL_Error;
+ }
+
+ opts->db = pDb;
+ }
+
+ PostMessage(hdlg, WZM_GOTOPAGE, IDD_PROGRESS, (LPARAM)ProgressDlgProc);
+ return true;
+}
diff --git a/plugins/DbChecker/src/progress.cpp b/plugins/DbChecker/src/progress.cpp
index 8475648bef..9d06f8332f 100644
--- a/plugins/DbChecker/src/progress.cpp
+++ b/plugins/DbChecker/src/progress.cpp
@@ -21,9 +21,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define WM_PROCESSINGDONE (WM_USER+1)
-void __cdecl WorkerThread(void *unused);
+void __cdecl WorkerThread(DbToolOptions *opts);
static HWND hwndStatus, hdlgProgress, hwndBar;
-HANDLE hEventRun = nullptr, hEventAbort = nullptr;
int errorCount;
LRESULT wizardResult;
@@ -73,8 +72,13 @@ INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
if (DoMyControlProcessing(hdlg, message, wParam, lParam, &bReturn))
return bReturn;
+ auto *opts = (DbToolOptions *)GetWindowLongPtrW(hdlg, GWLP_USERDATA);
+
switch (message) {
case WM_INITDIALOG:
+ opts = (DbToolOptions *)lParam;
+ SetWindowLongPtrW(hdlg, GWLP_USERDATA, lParam);
+
EnableWindow(GetDlgItem(GetParent(hdlg), IDOK), FALSE);
hdlgProgress = hdlg;
hwndStatus = GetDlgItem(hdlg, IDC_STATUS);
@@ -82,10 +86,11 @@ INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
hwndBar = GetDlgItem(hdlg, IDC_PROGRESS);
SendMessage(hwndBar, PBM_SETRANGE, 0, MAKELPARAM(0, 1000));
{
- SIZE s;
HDC hdc = GetDC(nullptr);
HFONT hFont = (HFONT)SendMessage(hdlg, WM_GETFONT, 0, 0);
HFONT hoFont = (HFONT)SelectObject(hdc, hFont);
+
+ SIZE s;
GetTextExtentPoint32(hdc, L"x", 1, &s);
SelectObject(hdc, hoFont);
ReleaseDC(nullptr, hdc);
@@ -101,10 +106,8 @@ INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
hBoldFont = CreateFontIndirect(&lf);
}
manualAbort = 0;
- hEventRun = CreateEvent(nullptr, TRUE, TRUE, nullptr);
- hEventAbort = CreateEvent(nullptr, TRUE, FALSE, nullptr);
TranslateDialogDefault(hdlg);
- _beginthread(WorkerThread, 0, nullptr);
+ mir_forkThread<DbToolOptions>(WorkerThread, opts);
return TRUE;
case WM_MEASUREITEM:
@@ -142,16 +145,21 @@ INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
SetTextColor(dis->hDC, RGB(0, 192, 0));
break;
}
- if (bold) hoFont = (HFONT)SelectObject(dis->hDC, hBoldFont);
+ if (bold)
+ hoFont = (HFONT)SelectObject(dis->hDC, hBoldFont);
ExtTextOut(dis->hDC, dis->rcItem.left, dis->rcItem.top, ETO_CLIPPED | ETO_OPAQUE, &dis->rcItem, str, (UINT)mir_wstrlen(str), nullptr);
- if (bold) SelectObject(dis->hDC, hoFont);
+ if (bold)
+ SelectObject(dis->hDC, hoFont);
}
return TRUE;
case WM_PROCESSINGDONE:
SetProgressBar(1000);
- AddToStatus(STATUS_SUCCESS, TranslateT("Click Next to continue"));
- EnableWindow(GetDlgItem(GetParent(hdlg), IDOK), TRUE);
+ if (opts->bAutoExit)
+ PostMessage(GetParent(hdlg), WM_COMMAND, IDCANCEL, 0);
+
+ SetDlgItemText(GetParent(hdlg), IDCANCEL, TranslateT("&Finish"));
+ AddToStatus(STATUS_SUCCESS, TranslateT("Click Finish to continue"));
if (manualAbort == 1)
EndDialog(GetParent(hdlg), 0);
@@ -162,49 +170,27 @@ INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM
break;
case WZN_CANCELCLICKED:
- ResetEvent(hEventRun);
- if (IsWindowEnabled(GetDlgItem(GetParent(hdlg), IDOK)))
+ ResetEvent(opts->hEventRun);
+ if (opts->bFinished)
break;
if (MessageBox(hdlg, TranslateT("Processing has not yet completed, if you cancel now then the changes that have currently been made will be rolled back and the original database will be restored. Do you still want to cancel?"), TranslateT("Miranda Database Tool"), MB_YESNO) == IDYES) {
manualAbort = 1;
- SetEvent(hEventAbort);
+ SetEvent(opts->hEventAbort);
}
- SetEvent(hEventRun);
+ SetEvent(opts->hEventRun);
SetWindowLongPtr(hdlg, DWLP_MSGRESULT, TRUE);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
- case IDC_BACK:
- ResetEvent(hEventRun);
- if (!IsWindowEnabled(GetDlgItem(GetParent(hdlg), IDOK))) {
- if (MessageBox(hdlg, TranslateT("Processing has not yet completed, if you go back now then the changes that have currently been made will be rolled back and the original database will be restored. Do you still want to go back?"), TranslateT("Miranda Database Tool"), MB_YESNO) == IDYES) {
- manualAbort = 2;
- SetEvent(hEventAbort);
- }
- SetEvent(hEventRun);
- break;
- }
- SetEvent(hEventRun);
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_PROGRESS, (LPARAM)ProgressDlgProc);
- break;
-
case IDOK:
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_FINISHED, (LPARAM)FinishedDlgProc);
+ EndDialog(GetParent(hdlg), 1);
break;
}
break;
case WM_DESTROY:
- if (hEventAbort) {
- CloseHandle(hEventAbort);
- hEventAbort = nullptr;
- }
- if (hEventRun) {
- CloseHandle(hEventRun);
- hEventRun = nullptr;
- }
if (hBoldFont) {
DeleteObject(hBoldFont);
hBoldFont = nullptr;
diff --git a/plugins/DbChecker/src/resource.h b/plugins/DbChecker/src/resource.h
index b6ea208d3c..82fcbd96a3 100644
--- a/plugins/DbChecker/src/resource.h
+++ b/plugins/DbChecker/src/resource.h
@@ -2,30 +2,24 @@
// Microsoft Visual C++ generated include file.
// Used by resource.rc
//
-#define IDC_BACK 3
+
#define IDD_WIZARD 101
#define IDE_WATERMARK 102
#define IDI_DBTOOL 102
#define IDE_HDRLOGO 103
#define IDI_PROFILEGREEN 104
#define IDD_WELCOME 106
-#define IDD_SELECTDB 107
#define IDD_OPENERROR 108
#define IDD_PROGRESS 111
-#define IDD_FINISHED 112
#define IDI_BAD 113
#define IDC_WATERMARK 1000
#define IDC_TITLE 1001
#define IDC_HDRLOGO 1002
-#define IDC_DBLIST 1003
#define IDC_FILE 1004
-#define IDC_OTHER 1005
#define IDC_ERRORTEXT 1006
#define IDC_INUSE 1007
#define IDC_PROGRESS 1011
#define IDC_STATUS 1012
-#define IDC_LAUNCHMIRANDA 1015
-#define IDC_DBFILE 1016
#define IDC_BACKUPFILE 1017
#define IDC_CHECK1 1018
#define IDC_STATIC -1
diff --git a/plugins/DbChecker/src/selectdb.cpp b/plugins/DbChecker/src/selectdb.cpp
deleted file mode 100644
index 162a49af7c..0000000000
--- a/plugins/DbChecker/src/selectdb.cpp
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
-Miranda Database Tool
-Copyright (C) 2001-2005 Richard Hughes
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program 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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "stdafx.h"
-
-static bool CheckBroken(const wchar_t *ptszFullPath)
-{
- DATABASELINK *dblink = FindDatabasePlugin(ptszFullPath);
- if (dblink == nullptr)
- return true;
-
- return dblink->grokHeader(ptszFullPath) != EGROKPRF_NOERROR;
-}
-
-int OpenDatabase(HWND hdlg)
-{
- wchar_t tszMsg[1024];
- int error = 0;
-
- if (opts.dbChecker == nullptr) {
- DATABASELINK* dblink = FindDatabasePlugin(opts.filename);
- if (dblink == nullptr) {
- mir_snwprintf(tszMsg,
- TranslateT("Database Checker cannot find a suitable database plugin to open '%s'."),
- opts.filename);
- LBL_Error:
- MessageBox(hdlg, tszMsg, TranslateT("Error"), MB_OK | MB_ICONERROR);
- return false;
- }
-
- auto *pDb = dblink->Load(opts.filename, false);
- if (pDb == nullptr) {
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_OPENERROR, (LPARAM)OpenErrorDlgProc);
- return true;
- }
-
- opts.dbChecker = pDb->GetChecker();
- if (opts.dbChecker == nullptr) {
- mir_snwprintf(tszMsg, TranslateT("Database driver '%s' doesn't support checking."), TranslateW(dblink->szFullName));
- goto LBL_Error;
- }
-
- opts.db = pDb;
- }
-
- // force check
- if (error == EGROKPRF_OBSOLETE)
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_PROGRESS, (LPARAM)ProgressDlgProc);
- else
- PostMessage(GetParent(hdlg), WZM_GOTOPAGE, IDD_PROGRESS, (LPARAM)ProgressDlgProc);
- return true;
-}
-
-void GetProfileDirectory(wchar_t* szMirandaDir, wchar_t* szPath, int cbPath)
-{
- wchar_t szProfileDir[MAX_PATH], szExpandedProfileDir[MAX_PATH], szMirandaBootIni[MAX_PATH];
-
- mir_wstrcpy(szMirandaBootIni, szMirandaDir);
- mir_wstrcat(szMirandaBootIni, L"\\mirandaboot.ini");
- GetPrivateProfileString(L"Database", L"ProfileDir", L"./Profiles", szProfileDir, _countof(szProfileDir), szMirandaBootIni);
- ExpandEnvironmentStrings(szProfileDir, szExpandedProfileDir, _countof(szExpandedProfileDir));
- _wchdir(szMirandaDir);
- if (!_wfullpath(szPath, szExpandedProfileDir, cbPath))
- mir_wstrncpy(szPath, szMirandaDir, cbPath);
- if (szPath[mir_wstrlen(szPath) - 1] == '\\')
- szPath[mir_wstrlen(szPath) - 1] = 0;
-}
-
-static int AddDatabaseToList(HWND hwndList, const wchar_t* filename, wchar_t* dir)
-{
- LV_ITEM lvi;
- lvi.mask = LVIF_PARAM;
- lvi.iSubItem = 0;
- for (lvi.iItem = ListView_GetItemCount(hwndList) - 1; lvi.iItem >= 0; lvi.iItem--) {
- ListView_GetItem(hwndList, &lvi);
- if (!mir_wstrcmpi((wchar_t*)lvi.lParam, filename))
- return lvi.iItem;
- }
-
- struct _stat st;
- if (_wstat(filename, &st) == -1)
- return -1;
-
- DWORD totalSize = st.st_size;
-
- bool isBroken = CheckBroken(filename);
-
- const wchar_t *pName = wcsrchr(filename, '\\');
- if (pName == nullptr)
- pName = (LPTSTR)filename;
- else
- pName++;
-
- wchar_t szName[MAX_PATH];
- mir_snwprintf(szName, L"%s%s", dir, pName);
-
- wchar_t *pDot = wcsrchr(szName, '.');
- if (pDot != nullptr && !mir_wstrcmpi(pDot, L".dat"))
- *pDot = 0;
-
- lvi.iItem = 0;
- lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
- lvi.iSubItem = 0;
- lvi.lParam = (LPARAM)wcsdup(filename);
- lvi.pszText = szName;
- lvi.iImage = (isBroken) ? 1 : 0;
-
- int iNewItem = ListView_InsertItem(hwndList, &lvi);
- wchar_t szSize[20];
- mir_snwprintf(szSize, L"%.2lf MB", totalSize / 1048576.0);
- ListView_SetItemText(hwndList, iNewItem, 1, szSize);
- return iNewItem;
-}
-
-void FindAdd(HWND hdlg, wchar_t *szProfileDir, wchar_t *szPrefix)
-{
- HANDLE hFind;
- WIN32_FIND_DATA fd;
- wchar_t szSearchPath[MAX_PATH], szFilename[MAX_PATH];
-
- mir_wstrcpy(szSearchPath, szProfileDir);
- mir_wstrcat(szSearchPath, L"\\*.*");
-
- hFind = FindFirstFile(szSearchPath, &fd);
- if (hFind != INVALID_HANDLE_VALUE) {
- do {
- if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || !mir_wstrcmp(fd.cFileName, L".") || !mir_wstrcmp(fd.cFileName, L".."))
- continue;
-
- mir_snwprintf(szFilename, L"%s\\%s\\%s.dat", szProfileDir, fd.cFileName, fd.cFileName);
- if (_waccess(szFilename, 0) == 0)
- AddDatabaseToList(GetDlgItem(hdlg, IDC_DBLIST), szFilename, szPrefix);
- } while (FindNextFile(hFind, &fd));
- FindClose(hFind);
- }
-}
-
-wchar_t *addstring(wchar_t *str, wchar_t *add)
-{
- mir_wstrcpy(str, add);
- return str + mir_wstrlen(add) + 1;
-}
-
-INT_PTR CALLBACK SelectDbDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
-{
- INT_PTR bReturn;
- if (DoMyControlProcessing(hdlg, message, wParam, lParam, &bReturn))
- return bReturn;
-
- switch (message) {
- case WM_INITDIALOG:
- TranslateDialogDefault(hdlg);
- if (bServiceMode) {
- OpenDatabase(hdlg);
- return TRUE;
- }
- {
- HIMAGELIST hIml = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 3, 3);
- ImageList_AddIcon(hIml, LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_PROFILEGREEN)));
- ImageList_AddIcon(hIml, LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_BAD)));
- ListView_SetImageList(GetDlgItem(hdlg, IDC_DBLIST), hIml, LVSIL_SMALL);
- }
- ListView_SetExtendedListViewStyleEx(GetDlgItem(hdlg, IDC_DBLIST), LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
- {
- LV_COLUMN lvc;
- lvc.mask = LVCF_WIDTH | LVCF_FMT | LVCF_TEXT;
- lvc.cx = 290;
- lvc.fmt = LVCFMT_LEFT;
- lvc.pszText = TranslateT("Database");
- ListView_InsertColumn(GetDlgItem(hdlg, IDC_DBLIST), 0, &lvc);
- lvc.cx = 68;
- lvc.fmt = LVCFMT_RIGHT;
- lvc.pszText = TranslateT("Total size");
- ListView_InsertColumn(GetDlgItem(hdlg, IDC_DBLIST), 1, &lvc);
-
- wchar_t szMirandaPath[MAX_PATH];
- GetModuleFileName(nullptr, szMirandaPath, _countof(szMirandaPath));
- wchar_t *str2 = wcsrchr(szMirandaPath, '\\');
- if (str2 != nullptr)
- *str2 = 0;
-
- int i = 0;
- HKEY hKey;
- wchar_t szProfileDir[MAX_PATH];
- wchar_t szMirandaProfiles[MAX_PATH];
- DWORD cbData = _countof(szMirandaPath);
-
- mir_wstrcpy(szMirandaProfiles, szMirandaPath);
- mir_wstrcat(szMirandaProfiles, L"\\Profiles");
- GetProfileDirectory(szMirandaPath, szProfileDir, _countof(szProfileDir));
-
- // search in profile dir (using ini file)
- if (mir_wstrcmpi(szProfileDir, szMirandaProfiles))
- FindAdd(hdlg, szProfileDir, L"[ini]\\");
-
- FindAdd(hdlg, szMirandaProfiles, L"[prf]\\");
- // search in current dir (as DBTOOL)
- FindAdd(hdlg, szMirandaPath, L"[.]\\");
-
- // search in profile dir (using registry path + ini file)
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\miranda32.exe", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) {
- if (RegQueryValueEx(hKey, L"Path", nullptr, nullptr, (PBYTE)szMirandaPath, &cbData) == ERROR_SUCCESS) {
- if (mir_wstrcmp(szProfileDir, szMirandaPath)) {
- GetProfileDirectory(szMirandaPath, szProfileDir, _countof(szProfileDir));
- FindAdd(hdlg, szProfileDir, L"[reg]\\");
- }
- }
- RegCloseKey(hKey);
- }
- // select
- if (opts.filename[0])
- i = AddDatabaseToList(GetDlgItem(hdlg, IDC_DBLIST), opts.filename, L"");
- if (i == -1)
- i = 0;
- ListView_SetItemState(GetDlgItem(hdlg, IDC_DBLIST), i, LVIS_SELECTED, LVIS_SELECTED);
- }
-
- if (opts.dbChecker != nullptr) {
- opts.dbChecker->Destroy();
- opts.dbChecker = nullptr;
- }
- return TRUE;
-
- case WZN_PAGECHANGING:
- GetDlgItemText(hdlg, IDC_FILE, opts.filename, _countof(opts.filename));
- break;
-
- case WM_COMMAND:
- switch (LOWORD(wParam)) {
- case IDC_FILE:
- if (HIWORD(wParam) == EN_CHANGE)
- EnableWindow(GetDlgItem(GetParent(hdlg), IDOK), GetWindowTextLength(GetDlgItem(hdlg, IDC_FILE)));
- break;
-
- case IDC_OTHER:
- {
- OPENFILENAME ofn = { 0 };
- wchar_t str[MAX_PATH];
-
- // L"Miranda Databases (*.dat)\0*.DAT\0All Files (*)\0*\0";
- wchar_t *filter, *tmp, *tmp1, *tmp2;
- tmp1 = TranslateT("Miranda Databases (*.dat)");
- tmp2 = TranslateT("All Files");
- filter = tmp = (wchar_t*)_alloca((mir_wstrlen(tmp1) + mir_wstrlen(tmp2) + 11)*sizeof(wchar_t));
- tmp = addstring(tmp, tmp1);
- tmp = addstring(tmp, L"*.DAT");
- tmp = addstring(tmp, tmp2);
- tmp = addstring(tmp, L"*");
- *tmp = 0;
-
- GetDlgItemText(hdlg, IDC_FILE, str, _countof(str));
- ofn.lStructSize = sizeof(ofn);
- ofn.hwndOwner = hdlg;
- ofn.hInstance = nullptr;
- ofn.lpstrFilter = filter;
- ofn.lpstrDefExt = L"dat";
- ofn.lpstrFile = str;
- ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
- ofn.nMaxFile = _countof(str);
- ofn.nMaxFileTitle = MAX_PATH;
- if (GetOpenFileName(&ofn)) {
- int i = AddDatabaseToList(GetDlgItem(hdlg, IDC_DBLIST), str, L"");
- if (i == -1)
- i = 0;
- ListView_SetItemState(GetDlgItem(hdlg, IDC_DBLIST), i, LVIS_SELECTED, LVIS_SELECTED);
- }
- }
- break;
-
- case IDC_BACK:
- break;
-
- case IDOK:
- OpenDatabase(hdlg);
- break;
- }
- break;
-
- case WM_NOTIFY:
- switch (((LPNMHDR)lParam)->idFrom) {
- case IDC_DBLIST:
- switch (((LPNMLISTVIEW)lParam)->hdr.code) {
- case LVN_ITEMCHANGED:
- LV_ITEM lvi;
- lvi.iItem = ListView_GetNextItem(GetDlgItem(hdlg, IDC_DBLIST), -1, LVNI_SELECTED);
- if (lvi.iItem == -1) break;
- lvi.mask = LVIF_PARAM;
- ListView_GetItem(GetDlgItem(hdlg, IDC_DBLIST), &lvi);
- SetDlgItemText(hdlg, IDC_FILE, (wchar_t*)lvi.lParam);
- SendMessage(hdlg, WM_COMMAND, MAKEWPARAM(IDC_FILE, EN_CHANGE), (LPARAM)GetDlgItem(hdlg, IDC_FILE));
- }
- break;
- }
- break;
-
- case WM_DESTROY:
- {
- LV_ITEM lvi;
- lvi.mask = LVIF_PARAM;
- for (lvi.iItem = ListView_GetItemCount(GetDlgItem(hdlg, IDC_DBLIST)) - 1; lvi.iItem >= 0; lvi.iItem--) {
- ListView_GetItem(GetDlgItem(hdlg, IDC_DBLIST), &lvi);
- free((char*)lvi.lParam);
- }
- }
- break;
- }
- return FALSE;
-}
diff --git a/plugins/DbChecker/src/stdafx.h b/plugins/DbChecker/src/stdafx.h
index a646cf9e4c..a6d280a373 100644
--- a/plugins/DbChecker/src/stdafx.h
+++ b/plugins/DbChecker/src/stdafx.h
@@ -40,12 +40,27 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define WZN_PAGECHANGING (WM_USER+1221)
#define WZN_CANCELCLICKED (WM_USER+1222)
-struct DbToolOptions
+struct DbToolOptions : public MZeroedObject
{
- wchar_t filename[MAX_PATH];
+ DbToolOptions()
+ {
+ hEventRun = CreateEvent(nullptr, TRUE, TRUE, nullptr);
+ hEventAbort = CreateEvent(nullptr, TRUE, FALSE, nullptr);
+ }
+
+ ~DbToolOptions()
+ {
+ delete db;
+ CloseHandle(hEventAbort);
+ CloseHandle(hEventRun);
+ }
+
MDatabaseCommon *db;
MIDatabaseChecker *dbChecker;
DWORD error;
+ HANDLE hEventRun, hEventAbort;
+ bool bFinished, bAutoExit;
+ wchar_t filename[MAX_PATH];
};
struct CMPlugin : public PLUGIN<CMPlugin>
@@ -56,18 +71,13 @@ struct CMPlugin : public PLUGIN<CMPlugin>
int Unload() override;
};
-extern DbToolOptions opts;
-extern HANDLE hEventRun, hEventAbort;
extern int errorCount;
extern LRESULT wizardResult;
-extern bool bServiceMode, bLaunchMiranda, bAutoExit;
int DoMyControlProcessing(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam, INT_PTR *bReturn);
INT_PTR CALLBACK WizardDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK SelectDbDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK ProgressDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK FinishedDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK OpenErrorDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam);
int OpenDatabase(HWND hdlg);
diff --git a/plugins/DbChecker/src/version.h b/plugins/DbChecker/src/version.h
index 3d7b2f3d8b..f1d4945707 100644
--- a/plugins/DbChecker/src/version.h
+++ b/plugins/DbChecker/src/version.h
@@ -1,6 +1,6 @@
#define __MAJOR_VERSION 0
#define __MINOR_VERSION 95
-#define __RELEASE_NUM 3
+#define __RELEASE_NUM 12
#define __BUILD_NUM 1
#include <stdver.h>
diff --git a/plugins/DbChecker/src/wizard.cpp b/plugins/DbChecker/src/wizard.cpp
index 2653f2f04b..a1b2b65645 100644
--- a/plugins/DbChecker/src/wizard.cpp
+++ b/plugins/DbChecker/src/wizard.cpp
@@ -92,23 +92,24 @@ int DoMyControlProcessing(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam,
INT_PTR CALLBACK WizardDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hdlgPage;
+ auto *opts = (DbToolOptions *)GetWindowLongPtr(hdlg, GWLP_USERDATA);
switch (message) {
case WM_INITDIALOG:
TranslateDialogDefault(hdlg);
+ SetWindowLongPtr(hdlg, GWLP_USERDATA, lParam);
SendMessage(hdlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(g_plugin.getInst(), MAKEINTRESOURCE(IDI_DBTOOL)));
hdlgPage = nullptr;
- SendMessage(hdlg, WZM_GOTOPAGE, IDD_SELECTDB, (LPARAM)SelectDbDlgProc);
+ OpenDatabase(hdlg);
return TRUE;
case WZM_GOTOPAGE:
if (hdlgPage != nullptr) DestroyWindow(hdlgPage);
- EnableWindow(GetDlgItem(hdlg, IDC_BACK), TRUE);
EnableWindow(GetDlgItem(hdlg, IDOK), TRUE);
EnableWindow(GetDlgItem(hdlg, IDCANCEL), TRUE);
SetDlgItemText(hdlg, IDCANCEL, TranslateT("Cancel"));
- hdlgPage = CreateDialog(g_plugin.getInst(), MAKEINTRESOURCE(wParam), hdlg, (DLGPROC)lParam);
+ hdlgPage = CreateDialogParamW(g_plugin.getInst(), MAKEINTRESOURCE(wParam), hdlg, (DLGPROC)lParam, LPARAM(opts));
TranslateDialogDefault(hdlgPage);
SetWindowPos(hdlgPage, nullptr, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
ShowWindow(hdlgPage, SW_SHOW);
@@ -116,7 +117,6 @@ INT_PTR CALLBACK WizardDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lP
case WM_COMMAND:
switch (LOWORD(wParam)) {
- case IDC_BACK:
case IDOK:
SendMessage(hdlgPage, WZN_PAGECHANGING, wParam, 0);
SendMessage(hdlgPage, message, wParam, lParam);
@@ -131,10 +131,11 @@ INT_PTR CALLBACK WizardDlgProc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lP
break;
case WM_DESTROY:
- if (opts.dbChecker) {
- opts.dbChecker->Destroy();
- opts.dbChecker = nullptr;
+ if (opts->dbChecker) {
+ opts->dbChecker->Destroy();
+ opts->dbChecker = nullptr;
}
+ delete opts;
DestroyWindow(hdlgPage);
if (hBoldFont != nullptr) {
diff --git a/plugins/DbChecker/src/worker.cpp b/plugins/DbChecker/src/worker.cpp
index 379a702613..b77bb94469 100644
--- a/plugins/DbChecker/src/worker.cpp
+++ b/plugins/DbChecker/src/worker.cpp
@@ -21,13 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
void ProcessingDone(void);
-static void Finalize()
-{
- opts.dbChecker->Destroy();
- opts.dbChecker = nullptr;
-}
-
-void __cdecl WorkerThread(void *)
+void __cdecl WorkerThread(DbToolOptions *opts)
{
time_t ts = time(nullptr);
@@ -37,22 +31,24 @@ void __cdecl WorkerThread(void *)
DBCHeckCallback callback;
callback.pfnAddLogMessage = AddToStatus;
- opts.dbChecker->Start(&callback);
+ opts->dbChecker->Start(&callback);
for (int task = 0;; task++) {
if (callback.spaceProcessed / (callback.spaceUsed / 1000 + 1) > sp) {
sp = callback.spaceProcessed / (callback.spaceUsed / 1000 + 1);
SetProgressBar(sp);
}
- WaitForSingleObject(hEventRun, INFINITE);
- if (WaitForSingleObject(hEventAbort, 0) == WAIT_OBJECT_0) {
+ WaitForSingleObject(opts->hEventRun, INFINITE);
+ if (WaitForSingleObject(opts->hEventAbort, 0) == WAIT_OBJECT_0) {
AddToStatus(STATUS_FATAL, TranslateT("Processing aborted by user"));
break;
}
- int ret = opts.dbChecker->CheckDb(task);
+ int ret = opts->dbChecker->CheckDb(task);
if (ret == ERROR_OUT_OF_PAPER) {
- Finalize();
+ opts->dbChecker->Destroy();
+ opts->dbChecker = nullptr;
+
AddToStatus(STATUS_MESSAGE, TranslateT("Elapsed time: %d sec"), time(nullptr) - ts);
if (errorCount)
AddToStatus(STATUS_SUCCESS, TranslateT("All tasks completed but with errors (%d)"), errorCount);
@@ -64,5 +60,6 @@ void __cdecl WorkerThread(void *)
break;
}
+ opts->bFinished = true;
ProcessingDone();
}