diff options
author | George Hazan <george.hazan@gmail.com> | 2023-07-27 12:33:50 +0300 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2023-07-27 12:33:50 +0300 |
commit | 134e453619448d877e437160330efc8053bf32d0 (patch) | |
tree | be9a856ab122ef5ecc8b1cf0920bb3b39a64ab12 /src | |
parent | 18249f6a5acc26c75005526c6dfebcf112b7141d (diff) |
fixes #3578 (Оффлайновые файлы: доработка журналов)
Diffstat (limited to 'src')
-rw-r--r-- | src/mir_app/src/file.cpp | 2 | ||||
-rw-r--r-- | src/mir_app/src/file.h | 35 | ||||
-rw-r--r-- | src/mir_app/src/mir_app.def | 1 | ||||
-rw-r--r-- | src/mir_app/src/mir_app64.def | 1 | ||||
-rw-r--r-- | src/mir_app/src/srmm_log_rtf.cpp | 37 | ||||
-rw-r--r-- | src/mir_app/src/srmm_util.cpp | 16 |
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);
}
}
|