summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-07-13 16:28:08 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-07-13 16:28:08 +0300
commit98f3d8e2edfc125ed9d7918415743e57cf820b9e (patch)
tree53ac7999bb942263bf3b3c92b7de6c91040fe5b5
parenta70adea1ff04895cc68a09e8209504cf2ffe89b9 (diff)
rename code extracted to the separate function + memory leak fix
-rw-r--r--include/m_protosvc.h9
-rw-r--r--src/mir_app/src/file.cpp19
-rw-r--r--src/mir_app/src/file.h2
-rw-r--r--src/mir_app/src/fileexistsdlg.cpp26
-rw-r--r--src/mir_app/src/filexferdlg.cpp30
-rw-r--r--src/mir_app/src/proto_internal.cpp8
6 files changed, 55 insertions, 39 deletions
diff --git a/include/m_protosvc.h b/include/m_protosvc.h
index b5381981fe..979d4568e9 100644
--- a/include/m_protosvc.h
+++ b/include/m_protosvc.h
@@ -444,8 +444,13 @@ struct CUSTOMSEARCHRESULTS
struct PROTOFILERESUME
{
- int action; // a FILERESUME_ flag
- const wchar_t *szFilename; // full path. Only valid if action == FILERESUME_RENAME
+ ~PROTOFILERESUME()
+ {
+ mir_free(szFilename);
+ }
+
+ int action; // a FILERESUME_ flag
+ wchar_t *szFilename = 0; // full path. Only valid if action == FILERESUME_RENAME
};
#define PS_FILERESUME "/FileResume"
diff --git a/src/mir_app/src/file.cpp b/src/mir_app/src/file.cpp
index 1aa3851a32..d2b8ae5442 100644
--- a/src/mir_app/src/file.cpp
+++ b/src/mir_app/src/file.cpp
@@ -139,7 +139,24 @@ void GetSensiblyFormattedSize(__int64 size, wchar_t *szOut, int cchOut, int unit
}
}
-// Tripple redirection sucks but is needed to nullify the array pointer
+CMStringW FindUniqueFileName(const wchar_t *pszOriginalFile)
+{
+ const wchar_t *pszExtension, *pszFilename;
+ if ((pszFilename = wcsrchr(pszOriginalFile, '\\')) == nullptr)
+ pszFilename = pszOriginalFile;
+ if ((pszExtension = wcsrchr(pszFilename + 1, '.')) == nullptr)
+ pszExtension = pszFilename + mir_wstrlen(pszFilename);
+
+ CMStringW buf;
+ for (int i = 1;; i++) {
+ buf.Format(L"%.*s (%d)%s", unsigned(pszExtension - pszOriginalFile), pszOriginalFile, i, pszExtension);
+ if (_waccess(buf, 0) != 0)
+ break;
+ }
+ return buf;
+}
+
+// Triple redirection sucks but is needed to nullify the array pointer
void FreeFilesMatrix(wchar_t ***files)
{
if (*files == nullptr)
diff --git a/src/mir_app/src/file.h b/src/mir_app/src/file.h
index a57f2e9f18..f2d90e12ca 100644
--- a/src/mir_app/src/file.h
+++ b/src/mir_app/src/file.h
@@ -90,6 +90,8 @@ void UpdateProtoFileTransferStatus(PROTOFILETRANSFERSTATUS *dest, PROTOFILETRANS
MEVENT Proto_RecvFile(MCONTACT hContact, PROTORECVFILE *pre);
+CMStringW FindUniqueFileName(const wchar_t *pszOriginalFile);
+
// filesenddlg.c
INT_PTR CALLBACK DlgProcSendFile(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
diff --git a/src/mir_app/src/fileexistsdlg.cpp b/src/mir_app/src/fileexistsdlg.cpp
index 0c290ffc3e..c5d6526a01 100644
--- a/src/mir_app/src/fileexistsdlg.cpp
+++ b/src/mir_app/src/fileexistsdlg.cpp
@@ -242,7 +242,7 @@ INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
case WM_COMMAND:
{
- PROTOFILERESUME pfr = {};
+ auto *pfr = new PROTOFILERESUME();
switch (LOWORD(wParam)) {
case IDC_OPENFILE:
ShellExecute(hwndDlg, NULL, fts->szCurrentFile.w, NULL, NULL, SW_SHOW);
@@ -262,20 +262,20 @@ INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
DoAnnoyingShellCommand(hwndDlg, fts->szCurrentFile.w, C_PROPERTIES, NULL);
return FALSE;
case IDC_RESUME:
- pfr.action = FILERESUME_RESUME;
+ pfr->action = FILERESUME_RESUME;
break;
case IDC_RESUMEALL:
- pfr.action = FILERESUME_RESUMEALL;
+ pfr->action = FILERESUME_RESUMEALL;
break;
case IDC_OVERWRITE:
- pfr.action = FILERESUME_OVERWRITE;
+ pfr->action = FILERESUME_OVERWRITE;
break;
case IDC_OVERWRITEALL:
- pfr.action = FILERESUME_OVERWRITEALL;
+ pfr->action = FILERESUME_OVERWRITEALL;
break;
case IDC_AUTORENAME:
- pfr.action = FILERESUME_RENAMEALL;
+ pfr->action = FILERESUME_RENAMEALL;
break;
case IDC_SAVEAS:
@@ -293,27 +293,29 @@ INT_PTR CALLBACK DlgProcFileExists(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM
ofn.lpstrFile = str;
ofn.nMaxFile = _countof(str);
ofn.nMaxFileTitle = MAX_PATH;
- if (!GetSaveFileName(&ofn))
+ if (!GetSaveFileName(&ofn)) {
+ delete pfr;
return FALSE;
+ }
- pfr.szFilename = mir_wstrdup(str);
- pfr.action = FILERESUME_RENAME;
+ pfr->szFilename = mir_wstrdup(str);
+ pfr->action = FILERESUME_RENAME;
}
break;
case IDC_SKIP:
- pfr.action = FILERESUME_SKIP;
+ pfr->action = FILERESUME_SKIP;
break;
case IDCANCEL:
- pfr.action = FILERESUME_CANCEL;
+ pfr->action = FILERESUME_CANCEL;
break;
default:
return FALSE;
}
- PostMessage((HWND)GetPropA(hwndDlg, "Miranda.ParentWnd"), M_FILEEXISTSDLGREPLY, (WPARAM)mir_wstrdup(fts->szCurrentFile.w), (LPARAM)new PROTOFILERESUME(pfr));
+ PostMessage((HWND)GetPropA(hwndDlg, "Miranda.ParentWnd"), M_FILEEXISTSDLGREPLY, (WPARAM)mir_wstrdup(fts->szCurrentFile.w), (LPARAM)pfr);
DestroyWindow(hwndDlg);
}
break;
diff --git a/src/mir_app/src/filexferdlg.cpp b/src/mir_app/src/filexferdlg.cpp
index 1a366fa7b0..9f6f042ef7 100644
--- a/src/mir_app/src/filexferdlg.cpp
+++ b/src/mir_app/src/filexferdlg.cpp
@@ -452,40 +452,30 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
EnableWindow(hwndDlg, TRUE);
{
PROTOFILERESUME *pfr = (PROTOFILERESUME *)lParam;
- wchar_t *szOriginalFilename = (wchar_t *)wParam;
+ ptrW szOriginalFilename((wchar_t *)wParam);
char *szProto = Proto_GetBaseAccountName(dat->hContact);
switch (pfr->action) {
case FILERESUME_CANCEL:
- if (dat->fs) ProtoChainSend(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0);
- dat->fs = nullptr;
- mir_free(szOriginalFilename);
- if (pfr->szFilename) mir_free((char *)pfr->szFilename);
- mir_free(pfr);
+ if (dat->fs) {
+ ProtoChainSend(dat->hContact, PSS_FILECANCEL, (WPARAM)dat->fs, 0);
+ dat->fs = nullptr;
+ }
+ delete pfr;
return 0;
+
case FILERESUME_RESUMEALL:
case FILERESUME_OVERWRITEALL:
dat->resumeBehaviour = pfr->action;
pfr->action &= ~FILERESUMEF_ALL;
break;
+
case FILERESUME_RENAMEALL:
pfr->action = FILERESUME_RENAME;
- {
- wchar_t *pszExtension, *pszFilename;
- if ((pszFilename = wcsrchr(szOriginalFilename, '\\')) == nullptr) pszFilename = szOriginalFilename;
- if ((pszExtension = wcsrchr(pszFilename + 1, '.')) == nullptr) pszExtension = pszFilename + mir_wstrlen(pszFilename);
- if (pfr->szFilename) mir_free((wchar_t *)pfr->szFilename);
- size_t size = (pszExtension - szOriginalFilename) + 21 + mir_wstrlen(pszExtension);
- pfr->szFilename = (wchar_t *)mir_alloc(sizeof(wchar_t) * size);
- for (int i = 1;; i++) {
- mir_snwprintf((wchar_t *)pfr->szFilename, size, L"%.*s (%u)%s", unsigned(pszExtension - szOriginalFilename), szOriginalFilename, i, pszExtension);
- if (_waccess(pfr->szFilename, 0) != 0)
- break;
- }
- }
+ replaceStrW(pfr->szFilename, FindUniqueFileName(szOriginalFilename).Detach());
break;
}
- mir_free(szOriginalFilename);
+
CallProtoService(szProto, PS_FILERESUME, (WPARAM)dat->fs, (LPARAM)pfr);
delete pfr;
}
diff --git a/src/mir_app/src/proto_internal.cpp b/src/mir_app/src/proto_internal.cpp
index 85b587e416..5e2b4c6d02 100644
--- a/src/mir_app/src/proto_internal.cpp
+++ b/src/mir_app/src/proto_internal.cpp
@@ -125,14 +125,14 @@ struct DEFAULT_PROTO_INTERFACE : public PROTO_INTERFACE
virtual int FileResume(HANDLE hTransfer, int action, const wchar_t *szFilename) override
{
- PROTOFILERESUME pfr = { action, szFilename };
- if (m_iVersion > 1)
+ PROTOFILERESUME pfr = { action, 0 };
+ if (m_iVersion > 1) {
+ pfr.szFilename = mir_wstrdup(szFilename);
return (int)ProtoCallService(m_szModuleName, PS_FILERESUME, (WPARAM)hTransfer, (LPARAM)&pfr);
+ }
pfr.szFilename = (wchar_t*)mir_u2a(pfr.szFilename);
int res = (int)ProtoCallService(m_szModuleName, PS_FILERESUME, (WPARAM)hTransfer, (LPARAM)&pfr);
- mir_free((wchar_t*)pfr.szFilename);
-
return res;
}