summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-07-27 12:33:50 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-07-27 12:33:50 +0300
commit134e453619448d877e437160330efc8053bf32d0 (patch)
treebe9a856ab122ef5ecc8b1cf0920bb3b39a64ab12 /src
parent18249f6a5acc26c75005526c6dfebcf112b7141d (diff)
fixes #3578 (Оффлайновые файлы: доработка журналов)
Diffstat (limited to 'src')
-rw-r--r--src/mir_app/src/file.cpp2
-rw-r--r--src/mir_app/src/file.h35
-rw-r--r--src/mir_app/src/mir_app.def1
-rw-r--r--src/mir_app/src/mir_app64.def1
-rw-r--r--src/mir_app/src/srmm_log_rtf.cpp37
-rw-r--r--src/mir_app/src/srmm_util.cpp16
6 files changed, 79 insertions, 13 deletions
diff --git a/src/mir_app/src/file.cpp b/src/mir_app/src/file.cpp
index ed1b9adbbf..9c0587bd8c 100644
--- a/src/mir_app/src/file.cpp
+++ b/src/mir_app/src/file.cpp
@@ -307,7 +307,7 @@ MEVENT Proto_RecvFile(MCONTACT hContact, PROTORECVFILE *pre)
// or if they are less than a limit (if a transfer has specified file size)
if (bSilent && File::bOfflineAuto)
if (File::iOfflineSize == 0 || (blob.getSize() > 0 && blob.getSize() < File::iOfflineSize * 1024))
- Srmm_DownloadOfflineFile(hContact, hdbe, false);
+ DownloadOfflineFile(hContact, hdbe, false, new OFD_Download());
bool bShow = !Contact::IsGroupChat(hContact);
if (bShow && blob.isOffline()) {
diff --git a/src/mir_app/src/file.h b/src/mir_app/src/file.h
index 0a29ec5d85..e4618da2c2 100644
--- a/src/mir_app/src/file.h
+++ b/src/mir_app/src/file.h
@@ -141,3 +141,38 @@ MFilePath FindUniqueFileName(const wchar_t *pszOriginalFile);
int GetRegValue(HKEY hKeyBase, const wchar_t *szSubKey, const wchar_t *szValue, wchar_t *szOutput, int cbOutput);
void GetSensiblyFormattedSize(__int64 size, wchar_t *szOut, int cchOut, int unitsOverride, int appendUnits, int *unitsUsed);
+
+// downloads or launches offline file
+struct OFD_Callback
+{
+ virtual ~OFD_Callback() {}
+ virtual void Invoke(const OFDTHREAD &ofd) = 0;
+};
+
+struct OFD_Download : public OFD_Callback
+{
+ void Invoke(const OFDTHREAD &ofd) override
+ {
+ if (ofd.bOpen)
+ ShellExecuteW(nullptr, L"open", ofd.wszPath, nullptr, nullptr, SW_SHOWDEFAULT);
+ }
+};
+
+class OFD_SaveAs : public OFD_Callback
+{
+ ptrW m_path;
+
+public:
+ OFD_SaveAs(const wchar_t *pwszPath) :
+ m_path(mir_wstrdup(pwszPath))
+ {}
+
+ ~OFD_SaveAs() {}
+
+ void Invoke(const OFDTHREAD &ofd) override
+ {
+ CopyFileW(ofd.wszPath, m_path, false);
+ }
+};
+
+void DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, bool bOpen, OFD_Callback *pCallback);
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index 1d06496629..3aabd35797 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -246,7 +246,6 @@ Srmm_RedrawToolbarIcons @338
?Srmm_GetNthButton@@YGPAUCustomButtonData@@H@Z @339 NONAME
?Srmm_GetButtonCount@@YGHXZ @340 NONAME
?Srmm_ClickToolbarIcon@@YGXIHPAUHWND__@@H@Z @341 NONAME
-?Srmm_DownloadOfflineFile@@YGXII_N@Z @342 NONAME
Miranda_OkToExit @344
Miranda_GetVersion @345
Miranda_GetFileVersion @346
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 8c6bc1eadc..83bdae4f9a 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -246,7 +246,6 @@ Srmm_RedrawToolbarIcons @338
?Srmm_GetNthButton@@YAPEAUCustomButtonData@@H@Z @339 NONAME
?Srmm_GetButtonCount@@YAHXZ @340 NONAME
?Srmm_ClickToolbarIcon@@YAXIHPEAUHWND__@@H@Z @341 NONAME
-?Srmm_DownloadOfflineFile@@YAXII_N@Z @342 NONAME
Miranda_OkToExit @344
Miranda_GetVersion @345
Miranda_GetFileVersion @346
diff --git a/src/mir_app/src/srmm_log_rtf.cpp b/src/mir_app/src/srmm_log_rtf.cpp
index 34fdb37a75..5ea77b4707 100644
--- a/src/mir_app/src/srmm_log_rtf.cpp
+++ b/src/mir_app/src/srmm_log_rtf.cpp
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "stdafx.h"
#include "chat.h"
+#include "file.h"
#define EVENTTYPE_STATUSCHANGE 25368
#define EVENTTYPE_ERRMSG 25366
@@ -223,20 +224,46 @@ INT_PTR CRtfLogWindow::Notify(WPARAM, LPARAM lParam)
AppendMenu(hMenu, MF_STRING, 3, TranslateT("Download"));
if (blob.getUrl() != nullptr)
AppendMenu(hMenu, MF_STRING, 4, TranslateT("Copy URL"));
+ AppendMenu(hMenu, MF_STRING, 5, TranslateT("Save as"));
POINT pt = { GET_X_LPARAM(pLink->lParam), GET_Y_LPARAM(pLink->lParam) };
ClientToScreen(((NMHDR *)lParam)->hwndFrom, &pt);
nCmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, 0, m_pDlg.m_hwnd, nullptr);
DestroyMenu(hMenu);
+ }
+
+ switch (nCmd) {
+ case 2:
+ case 3:
+ DownloadOfflineFile(m_pDlg.m_hContact, hDbEvent, nCmd == 2, new OFD_Download());
+ break;
+
+ case 4:
+ Utils_ClipboardCopy(blob.getUrl());
+ break;
- if (nCmd <= 0 || nCmd > 3) {
- if (nCmd == 4)
- Utils_ClipboardCopy(blob.getUrl());
- return TRUE;
+ case 5:
+ wchar_t str[MAX_PATH];
+ mir_wstrncpy(str, blob.getName(), _countof(str));
+ {
+ wchar_t filter[512];
+ mir_snwprintf(filter, L"%s (*)%c*%c", TranslateT("All files"), 0, 0);
+
+ OPENFILENAME ofn = {};
+ ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400;
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
+ ofn.lpstrFilter = filter;
+ ofn.lpstrFile = str;
+ ofn.nMaxFile = _countof(str);
+ ofn.nMaxFileTitle = MAX_PATH;
+ if (!GetSaveFileNameW(&ofn))
+ break;
}
+
+ DownloadOfflineFile(m_pDlg.m_hContact, hDbEvent, nCmd == 2, new OFD_SaveAs(str));
+ break;
}
- Srmm_DownloadOfflineFile(m_pDlg.m_hContact, hDbEvent, nCmd == 2);
return TRUE;
}
diff --git a/src/mir_app/src/srmm_util.cpp b/src/mir_app/src/srmm_util.cpp
index 33ca91f902..e30dff2ea4 100644
--- a/src/mir_app/src/srmm_util.cpp
+++ b/src/mir_app/src/srmm_util.cpp
@@ -114,6 +114,11 @@ OFDTHREAD::OFDTHREAD(MEVENT _1, const CMStringW &_2, bool _3) :
{
}
+OFDTHREAD::~OFDTHREAD()
+{
+ delete pCallback;
+}
+
void OFDTHREAD::Finish()
{
DBVARIANT dbv = { DBVT_WCHAR };
@@ -129,8 +134,7 @@ void OFDTHREAD::Finish()
NotifyEventHooks(g_hevEventEdited, db_event_getContact(hDbEvent), hDbEvent);
- if (bOpen)
- ShellExecuteW(nullptr, L"open", wszPath, nullptr, nullptr, SW_SHOWDEFAULT);
+ pCallback->Invoke(*this);
}
void OFDTHREAD::ResetFileName(const wchar_t *pwszNewName)
@@ -155,7 +159,7 @@ static void GenerateLocalName(const DB::EventInfo &dbei, DB::FILE_BLOB &blob, MC
blob.setLocalName(FindUniqueFileName(wszFullName));
}
-MIR_APP_DLL(void) Srmm_DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, bool bOpen)
+void DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, bool bOpen, OFD_Callback *pCallback)
{
DB::EventInfo dbei(hDbEvent);
if (!dbei)
@@ -180,11 +184,13 @@ MIR_APP_DLL(void) Srmm_DownloadOfflineFile(MCONTACT hContact, MEVENT hDbEvent, b
}
if (bDownloaded) {
- if (bOpen)
- ShellExecuteW(nullptr, L"open", blob.getLocalName(), nullptr, nullptr, SW_SHOWDEFAULT);
+ OFDTHREAD ofd(hDbEvent, blob.getLocalName(), bOpen);
+ pCallback->Invoke(ofd);
+ delete pCallback;
}
else {
OFDTHREAD *ofd = new OFDTHREAD(hDbEvent, blob.getLocalName(), bOpen);
+ ofd->pCallback = pCallback;
CallProtoService(dbei.szModule, PS_OFFLINEFILE, (WPARAM)ofd, 0);
}
}