diff options
author | George Hazan <george.hazan@gmail.com> | 2023-07-13 16:28:08 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2023-07-13 16:28:08 +0300 |
commit | 98f3d8e2edfc125ed9d7918415743e57cf820b9e (patch) | |
tree | 53ac7999bb942263bf3b3c92b7de6c91040fe5b5 | |
parent | a70adea1ff04895cc68a09e8209504cf2ffe89b9 (diff) |
rename code extracted to the separate function + memory leak fix
-rw-r--r-- | include/m_protosvc.h | 9 | ||||
-rw-r--r-- | src/mir_app/src/file.cpp | 19 | ||||
-rw-r--r-- | src/mir_app/src/file.h | 2 | ||||
-rw-r--r-- | src/mir_app/src/fileexistsdlg.cpp | 26 | ||||
-rw-r--r-- | src/mir_app/src/filexferdlg.cpp | 30 | ||||
-rw-r--r-- | src/mir_app/src/proto_internal.cpp | 8 |
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;
}
|