From cd83b1c10bbe50f5aa43a8e8f7dffc5fee1d769a Mon Sep 17 00:00:00 2001 From: George Hazan Date: Tue, 11 Apr 2023 22:03:29 +0300 Subject: DB::FILE_BLOB expansion for the offline file transfers, part I --- src/mir_app/src/MDatabaseCommon.cpp | 7 +++++++ src/mir_app/src/db_events.cpp | 9 +++++++++ src/mir_app/src/mir_app.def | 6 +++++- src/mir_app/src/mir_app64.def | 7 ++++++- src/mir_app/src/proto_interface.cpp | 2 +- src/mir_app/src/proto_internal.cpp | 2 +- src/mir_app/src/srmm_log_rtf.cpp | 24 ++++++++++++++++++++++++ 7 files changed, 53 insertions(+), 4 deletions(-) (limited to 'src/mir_app') diff --git a/src/mir_app/src/MDatabaseCommon.cpp b/src/mir_app/src/MDatabaseCommon.cpp index b8084148f7..934f61c91a 100644 --- a/src/mir_app/src/MDatabaseCommon.cpp +++ b/src/mir_app/src/MDatabaseCommon.cpp @@ -546,6 +546,13 @@ STDMETHODIMP_(BOOL) MDatabaseCommon::WriteContactSetting(MCONTACT contactID, con return 0; } +///////////////////////////////////////////////////////////////////////////////////////// + +STDMETHODIMP_(int) MDatabaseCommon::SetEventJson(MEVENT, const char *, DBVARIANT *) +{ + return 1; +} + ///////////////////////////////////////////////////////////////////////////////////////// // Resident settings diff --git a/src/mir_app/src/db_events.cpp b/src/mir_app/src/db_events.cpp index 9e413aac76..6f6fc281be 100644 --- a/src/mir_app/src/db_events.cpp +++ b/src/mir_app/src/db_events.cpp @@ -297,6 +297,13 @@ DB::FILE_BLOB::FILE_BLOB(const DB::EventInfo &dbei) if (root) { m_wszFileName = root["f"].as_mstring().Detach(); m_wszDescription = root["d"].as_mstring().Detach(); + + CMStringA szProtoString(root["u"].as_mstring()); + if (!szProtoString.IsEmpty()) { + m_szProtoString = szProtoString.Detach(); + m_iFileSize = root["fs"].as_int(); + m_iTransferred = root["ft"].as_int(); + } } } @@ -307,6 +314,8 @@ void DB::FILE_BLOB::write(DB::EventInfo &dbei) { JSONNode root; root << WCHAR_PARAM("f", m_wszFileName) << WCHAR_PARAM("d", m_wszDescription ? m_wszDescription : L""); + if (isOffline()) + root << CHAR_PARAM("u", m_szProtoString) << INT_PARAM("fs", m_iFileSize) << INT_PARAM("ft", m_iTransferred); std::string text = root.write(); dbei.cbBlob = (int)text.size() + 1; diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 92990599e4..f4c74509a7 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -55,7 +55,7 @@ Button_SetSkin_IcoLib @24 ?ProtoBroadcastAck@PROTO_INTERFACE@@QAEHIHHPAXJ@Z @56 NONAME ?RecvAwayMsg@PROTO_INTERFACE@@UAEHIHPAUPROTORECVEVENT@@@Z @57 NONAME ?RecvContacts@PROTO_INTERFACE@@UAEHIPAUPROTORECVEVENT@@@Z @58 NONAME -?RecvFile@PROTO_INTERFACE@@UAEHIPAUPROTORECVFILE@@@Z @59 NONAME +?RecvFile@PROTO_INTERFACE@@UAEIIPAUPROTORECVFILE@@@Z @59 NONAME ?RecvMsg@PROTO_INTERFACE@@UAEIIPAUPROTORECVEVENT@@@Z @60 NONAME ?SearchAdvanced@PROTO_INTERFACE@@UAEPAXPAUHWND__@@@Z @62 NONAME ?SearchBasic@PROTO_INTERFACE@@UAEPAXPB_W@Z @63 NONAME @@ -843,3 +843,7 @@ Chat_IsMuted @941 NONAME ?getDescr@FILE_BLOB@DB@@QBEPB_WXZ @958 NONAME ?getName@FILE_BLOB@DB@@QBEPB_WXZ @959 NONAME ?write@FILE_BLOB@DB@@QAEXAAVEventInfo@2@@Z @960 NONAME +?getUrl@FILE_BLOB@DB@@QBEPBDXZ @961 NONAME +?isCompleted@FILE_BLOB@DB@@QBE_NXZ @962 NONAME +?isOffline@FILE_BLOB@DB@@QBE_NXZ @963 NONAME +?setSize@FILE_BLOB@DB@@QAEXI@Z @964 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 41bbf55dc6..a6e78bcdad 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -55,7 +55,7 @@ Button_SetSkin_IcoLib @24 ?ProtoBroadcastAck@PROTO_INTERFACE@@QEAA_JIHHPEAX_J@Z @56 NONAME ?RecvAwayMsg@PROTO_INTERFACE@@UEAAHIHPEAUPROTORECVEVENT@@@Z @57 NONAME ?RecvContacts@PROTO_INTERFACE@@UEAAHIPEAUPROTORECVEVENT@@@Z @58 NONAME -?RecvFile@PROTO_INTERFACE@@UEAAHIPEAUPROTORECVFILE@@@Z @59 NONAME +?RecvFile@PROTO_INTERFACE@@UEAAIIPEAUPROTORECVFILE@@@Z @59 NONAME ?RecvMsg@PROTO_INTERFACE@@UEAAIIPEAUPROTORECVEVENT@@@Z @60 NONAME ?SearchAdvanced@PROTO_INTERFACE@@UEAAPEAXPEAUHWND__@@@Z @62 NONAME ?SearchBasic@PROTO_INTERFACE@@UEAAPEAXPEB_W@Z @63 NONAME @@ -843,3 +843,8 @@ Chat_IsMuted @941 NONAME ?getDescr@FILE_BLOB@DB@@QEBAPEB_WXZ @958 NONAME ?getName@FILE_BLOB@DB@@QEBAPEB_WXZ @959 NONAME ?write@FILE_BLOB@DB@@QEAAXAEAVEventInfo@2@@Z @960 NONAME +?getUrl@FILE_BLOB@DB@@QEBAPEBDXZ @961 NONAME +?isCompleted@FILE_BLOB@DB@@QEBA_NXZ @962 NONAME +?isOffline@FILE_BLOB@DB@@QEBA_NXZ @963 NONAME +?setSize@FILE_BLOB@DB@@QEAAXI@Z @964 NONAME +?SetEventJson@MDatabaseCommon@@UEAAHIPEBDPEAUDBVARIANT@@@Z @965 NONAME diff --git a/src/mir_app/src/proto_interface.cpp b/src/mir_app/src/proto_interface.cpp index 07a276d20a..71a610d640 100644 --- a/src/mir_app/src/proto_interface.cpp +++ b/src/mir_app/src/proto_interface.cpp @@ -195,7 +195,7 @@ int PROTO_INTERFACE::RecvContacts(MCONTACT, PROTORECVEVENT*) return 1; // error } -int PROTO_INTERFACE::RecvFile(MCONTACT hContact, PROTORECVFILE *pcre) +MEVENT PROTO_INTERFACE::RecvFile(MCONTACT hContact, PROTORECVFILE *pcre) { CCSDATA ccs = { hContact, PSR_FILE, 0, (LPARAM)pcre }; return CallService(MS_PROTO_RECVFILET, 0, (LPARAM)&ccs); diff --git a/src/mir_app/src/proto_internal.cpp b/src/mir_app/src/proto_internal.cpp index 802f2230bc..85b587e416 100644 --- a/src/mir_app/src/proto_internal.cpp +++ b/src/mir_app/src/proto_internal.cpp @@ -192,7 +192,7 @@ struct DEFAULT_PROTO_INTERFACE : public PROTO_INTERFACE return (int)ProtoCallService(m_szModuleName, PSR_CONTACTS, 0, (LPARAM)&ccs); } - int RecvFile(MCONTACT hContact, PROTORECVFILE* evt) override + MEVENT RecvFile(MCONTACT hContact, PROTORECVFILE* evt) override { CCSDATA ccs = { hContact, PSR_FILE, 0, (LPARAM)evt }; return ProtoCallService(m_szModuleName, PSR_FILE, 0, (LPARAM)&ccs); diff --git a/src/mir_app/src/srmm_log_rtf.cpp b/src/mir_app/src/srmm_log_rtf.cpp index fd1279ec39..dec151b43d 100644 --- a/src/mir_app/src/srmm_log_rtf.cpp +++ b/src/mir_app/src/srmm_log_rtf.cpp @@ -154,6 +154,30 @@ INT_PTR CRtfLogWindow::Notify(WPARAM, LPARAM lParam) if (wcschr(tr.lpstrText, '@') != nullptr && wcschr(tr.lpstrText, ':') == nullptr && wcschr(tr.lpstrText, '/') == nullptr) wszText.Insert(0, L"mailto:"); + MEVENT hDbEvent; + if (swscanf(tr.lpstrText, L"ofile:%u", &hDbEvent) == 1) { + if (pLink->msg != WM_LBUTTONUP) + return false; + + DB::EventInfo dbei(hDbEvent); + if (!dbei) + return false; + + DB::FILE_BLOB blob(dbei); + + wchar_t tszTempPath[MAX_PATH]; + GetTempPathW(_countof(tszTempPath), tszTempPath); + CMStringW tszFilePath(FORMAT, L"%s%s", tszTempPath, blob.getName()); + + if (_waccess(tszFilePath, 0)) { + OFDTHREAD *dt = new OFDTHREAD(hDbEvent, tszFilePath); + CallProtoService(dbei.szModule, PS_OFFLINEFILE, (WPARAM)dt, 0); + } + else ShellExecute(nullptr, L"open", tszFilePath.c_str(), nullptr, nullptr, SW_SHOWDEFAULT); + + return TRUE; + } + if (pLink->msg == WM_RBUTTONDOWN) { HMENU hMenu = LoadMenu(g_plugin.getInst(), MAKEINTRESOURCE(IDR_CONTEXT)); HMENU hSubMenu = GetSubMenu(hMenu, 6); -- cgit v1.2.3