diff options
author | George Hazan <ghazan@miranda.im> | 2023-04-11 22:03:29 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2023-04-11 22:03:29 +0300 |
commit | cd83b1c10bbe50f5aa43a8e8f7dffc5fee1d769a (patch) | |
tree | ffbe1ab12d4f89ecbf6b909efe1a1ac7669efc15 /src/mir_app | |
parent | 805a76745801f9ac14a837e45ef50b9206ac54da (diff) |
DB::FILE_BLOB expansion for the offline file transfers, part I
Diffstat (limited to 'src/mir_app')
-rw-r--r-- | src/mir_app/src/MDatabaseCommon.cpp | 7 | ||||
-rw-r--r-- | src/mir_app/src/db_events.cpp | 9 | ||||
-rw-r--r-- | src/mir_app/src/mir_app.def | 6 | ||||
-rw-r--r-- | src/mir_app/src/mir_app64.def | 7 | ||||
-rw-r--r-- | src/mir_app/src/proto_interface.cpp | 2 | ||||
-rw-r--r-- | src/mir_app/src/proto_internal.cpp | 2 | ||||
-rw-r--r-- | src/mir_app/src/srmm_log_rtf.cpp | 24 |
7 files changed, 53 insertions, 4 deletions
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 @@ -547,6 +547,13 @@ STDMETHODIMP_(BOOL) MDatabaseCommon::WriteContactSetting(MCONTACT contactID, con }
/////////////////////////////////////////////////////////////////////////////////////////
+
+STDMETHODIMP_(int) MDatabaseCommon::SetEventJson(MEVENT, const char *, DBVARIANT *)
+{
+ return 1;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
// Resident settings
STDMETHODIMP_(BOOL) MDatabaseCommon::EnumResidentSettings(DBMODULEENUMPROC pFunc, void *pParam)
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);
|