From 00cff5cf367a3dd8f2ff5c88d59430787f6df884 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 19 Feb 2024 15:08:17 +0300 Subject: =?UTF-8?q?fixes=20#4193=20(=D0=95=D1=81=D0=BB=D0=B8=20=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B7=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B8=D0=BA=D0=BD=D1=83=D1=82=D1=8C=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=83=D0=B6=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B=D0=B9,=20=D0=BD=D0=BE=20=D0=B5=D1=89=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B9,=20=D0=BE=D1=84=D1=84=D0=BB=D0=B0?= =?UTF-8?q?=D0=B9=D0=BD-=D1=84=D0=B0=D0=B9=D0=BB,=20=D1=82=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BE=D1=81=D0=BA=D1=83=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BD=D0=B0=D1=87=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B3=D0=BB=D1=8E=D1=87=D0=B8=D1=82=D1=8C.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/m_protosvc.h | 2 +- src/mir_app/src/srmm_util.cpp | 23 ++++++++++++++++++++--- src/mir_app/src/stdafx.h | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/m_protosvc.h b/include/m_protosvc.h index 64d31b6aa8..7f33cf5e2b 100644 --- a/include/m_protosvc.h +++ b/include/m_protosvc.h @@ -725,7 +725,7 @@ struct MIR_APP_EXPORT OFDTHREAD : public MNonCopyable MEVENT hDbEvent; MFilePath wszPath; struct OFD_Callback *pCallback = nullptr; - bool bOpen = false, bCopy = false; + bool bOpen = false, bCopy = false, bLocked = false; }; struct OFD_Callback diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp index f78513cd70..b9e4d4c4ff 100644 --- a/src/mir_app/src/srmm_util.cpp +++ b/src/mir_app/src/srmm_util.cpp @@ -117,6 +117,9 @@ MIR_APP_DLL(int) Srmm_GetWindowData(MCONTACT hContact, MessageWindowData &mwd) ///////////////////////////////////////////////////////////////////////////////////////// // downloads or launches cloud file +static mir_cs csLocked; +static std::map arLocked; + OFDTHREAD::OFDTHREAD(MEVENT _1, const CMStringW &_2, int iCommand) : hDbEvent(_1), wszPath(_2) @@ -127,6 +130,11 @@ OFDTHREAD::OFDTHREAD(MEVENT _1, const CMStringW &_2, int iCommand) : OFDTHREAD::~OFDTHREAD() { + if (bLocked) { + mir_cslock lck(csLocked); + arLocked.erase(hDbEvent); + } + delete pCallback; } @@ -161,7 +169,6 @@ void GetContactSentFilesDir(MCONTACT hContact, wchar_t *szDir, int cchDir) mir_snwprintf(szDir, cchDir, L"%s\\dlFiles\\%d\\", VARSW(L"%miranda_userdata%").get(), hContact); } - static void GenerateLocalName(const DB::EventInfo &dbei, DB::FILE_BLOB &blob, MCONTACT hContact) { wchar_t wszReceiveFolder[MAX_PATH]; @@ -178,6 +185,8 @@ static void GenerateLocalName(const DB::EventInfo &dbei, DB::FILE_BLOB &blob, MC void DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, DB::EventInfo &dbei, int iCommand, OFD_Callback *pCallback) { + std::unique_ptr callback(pCallback); + DB::FILE_BLOB blob(dbei); if (!blob.isOffline()) return; @@ -199,11 +208,19 @@ void DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, DB::EventInfo &dbei if (bDownloaded) { OFDTHREAD ofd(hDbEvent, blob.getLocalName(), iCommand); pCallback->Invoke(ofd); - delete pCallback; } else { + { + mir_cslock lck(csLocked); + if (arLocked.find(hDbEvent) != arLocked.end()) + return; + + arLocked[hDbEvent] = true; + } + OFDTHREAD *ofd = new OFDTHREAD(hDbEvent, blob.getLocalName(), iCommand); - ofd->pCallback = pCallback; + ofd->bLocked = true; + ofd->pCallback = callback.release(); CallProtoService(dbei.szModule, PS_OFFLINEFILE, (WPARAM)ofd); } } diff --git a/src/mir_app/src/stdafx.h b/src/mir_app/src/stdafx.h index 9c91bb225b..3962c77b01 100644 --- a/src/mir_app/src/stdafx.h +++ b/src/mir_app/src/stdafx.h @@ -56,6 +56,7 @@ typedef struct SslHandle *HSSL; #include #include +#include #include #define __NO_CMPLUGIN_NEEDED -- cgit v1.2.3