summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-07-26 17:02:53 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-07-26 17:02:53 +0300
commite0bf792776131deef8f2634fb3eeb8bd8239c059 (patch)
treea004484e81d10505af43d1efa66726d4a9bb6d39
parent6f0837663b1aac2ede278e7dd8fb416290f82dad (diff)
.
-rw-r--r--include/m_protoint.h9
-rw-r--r--include/m_protosvc.h7
-rw-r--r--libs/win32/mir_app.libbin265082 -> 266558 bytes
-rw-r--r--libs/win64/mir_app.libbin264126 -> 265642 bytes
-rw-r--r--protocols/ICQ-WIM/src/proto.cpp20
-rw-r--r--protocols/ICQ-WIM/src/proto.h3
-rw-r--r--protocols/JabberG/src/jabber_file.cpp2
-rw-r--r--protocols/JabberG/src/jabber_proto.h2
-rw-r--r--protocols/Telegram/src/avatars.cpp37
-rw-r--r--protocols/Telegram/src/proto.cpp29
-rw-r--r--protocols/Telegram/src/proto.h9
-rw-r--r--protocols/Telegram/src/server.cpp30
-rw-r--r--protocols/Telegram/src/utils.cpp2
-rw-r--r--src/mir_app/src/db_events.cpp5
-rw-r--r--src/mir_app/src/file.cpp3
-rw-r--r--src/mir_app/src/filexferdlg.cpp5
-rw-r--r--src/mir_app/src/mir_app.def6
-rw-r--r--src/mir_app/src/mir_app64.def6
-rw-r--r--src/mir_app/src/proto_chains.cpp6
-rw-r--r--src/mir_app/src/proto_interface.cpp9
-rw-r--r--src/mir_app/src/protocols.cpp2
21 files changed, 150 insertions, 42 deletions
diff --git a/include/m_protoint.h b/include/m_protoint.h
index 83a4d8d523..eddad66824 100644
--- a/include/m_protoint.h
+++ b/include/m_protoint.h
@@ -266,9 +266,6 @@ public:
// called when the Account Manager needs to draw short account's options
virtual MWindow OnCreateAccMgrUI(MWindow hwndParent);
- // called when an offline file is being created
- virtual void OnCreateOfflineFile(DB::FILE_BLOB &blob, void *ft);
-
// called when an event is altered in database
virtual void OnEventDeleted(MCONTACT, MEVENT);
@@ -284,6 +281,12 @@ public:
// the analog of ME_SYSTEM_MODULESLOADED for an account
virtual void OnModulesLoaded(void);
+ // called when an offline file is being received
+ virtual void OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *ft);
+
+ // prepares an event of the file being sent
+ virtual void OnSendOfflineFile(DB::EventInfo &dbei, DB::FILE_BLOB &blob, void *ft);
+
// same for ME_SYSTEM_SHUTDOWN
virtual void OnShutdown(void);
diff --git a/include/m_protosvc.h b/include/m_protosvc.h
index 170d1260c0..5941bbe213 100644
--- a/include/m_protosvc.h
+++ b/include/m_protosvc.h
@@ -799,13 +799,6 @@ __forceinline INT_PTR ProtoChainRecvFile(MCONTACT hContact, PROTORECVFILE *pre)
}
///////////////////////////////////////////////////////////////////////////////
-// Offline file's blob preparation
-// wParam = (DB::FILEBLOB*) blob to patch
-// lParam = (HANDLE) pointer to custom file transfer, passed to PROTORECVFILE.lParam
-
-#define PS_PRECREATE_OFFLINEFILE "/PreCreateOfflineFile"
-
-///////////////////////////////////////////////////////////////////////////////
// Offline file processing
#define PS_OFFLINEFILE "/OfflineFile"
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib
index ef73e11d59..795089f618 100644
--- a/libs/win32/mir_app.lib
+++ b/libs/win32/mir_app.lib
Binary files differ
diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib
index 0d78e4dc8e..052a17039e 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp
index 27af8879f2..078fc8885e 100644
--- a/protocols/ICQ-WIM/src/proto.cpp
+++ b/protocols/ICQ-WIM/src/proto.cpp
@@ -169,14 +169,30 @@ void CIcqProto::OnContactDeleted(MCONTACT hContact)
<< AIMSID(this) << WCHAR_PARAM("buddy", szId) << INT_PARAM("allGroups", 1));
}
-void CIcqProto::OnCreateOfflineFile(DB::FILE_BLOB &blob, void *hTransfer)
+void CIcqProto::OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *ft)
{
- if (auto *pFileInfo = (IcqFileInfo *)hTransfer) {
+ if (auto *pFileInfo = (IcqFileInfo *)ft) {
blob.setUrl(pFileInfo->szOrigUrl);
blob.setSize(pFileInfo->dwFileSize);
}
}
+void CIcqProto::OnSendOfflineFile(DB::EventInfo &dbei, DB::FILE_BLOB &blob, void *hTransfer)
+{
+ auto *ft = (IcqFileTransfer *)hTransfer;
+
+ auto *p = wcsrchr(ft->m_wszFileName, '\\');
+ if (p == nullptr)
+ p = ft->m_wszFileName;
+ else
+ p++;
+ blob.setName(p);
+
+ blob.setUrl("boo");
+ blob.complete(ft->pfts.currentFileSize);
+ blob.setLocalName(ft->m_wszFileName);
+}
+
void CIcqProto::OnEventEdited(MCONTACT, MEVENT)
{
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h
index 9b91e02383..7ca0874770 100644
--- a/protocols/ICQ-WIM/src/proto.h
+++ b/protocols/ICQ-WIM/src/proto.h
@@ -415,10 +415,11 @@ class CIcqProto : public PROTO<CIcqProto>
void OnContactAdded(MCONTACT) override;
void OnContactDeleted(MCONTACT) override;
MWindow OnCreateAccMgrUI(MWindow) override;
- void OnCreateOfflineFile(DB::FILE_BLOB &blob, void *ft) override;
void OnEventEdited(MCONTACT, MEVENT) override;
void OnMarkRead(MCONTACT, MEVENT) override;
void OnModulesLoaded() override;
+ void OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *ft) override;
+ void OnSendOfflineFile(DB::EventInfo &dbei, DB::FILE_BLOB &blob, void *ft) override;
void OnShutdown() override;
public:
diff --git a/protocols/JabberG/src/jabber_file.cpp b/protocols/JabberG/src/jabber_file.cpp
index 863874a011..18ca3c59b3 100644
--- a/protocols/JabberG/src/jabber_file.cpp
+++ b/protocols/JabberG/src/jabber_file.cpp
@@ -108,7 +108,7 @@ void __cdecl CJabberProto::OfflineFileThread(OFDTHREAD *ofd)
delete ofd;
}
-void CJabberProto::OnCreateOfflineFile(DB::FILE_BLOB &blob, void *pHandle)
+void CJabberProto::OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *pHandle)
{
if (auto *ft = (filetransfer *)pHandle)
if (ft->type == FT_HTTP && ft->httpPath)
diff --git a/protocols/JabberG/src/jabber_proto.h b/protocols/JabberG/src/jabber_proto.h
index bc41a58f3c..4a645a894b 100644
--- a/protocols/JabberG/src/jabber_proto.h
+++ b/protocols/JabberG/src/jabber_proto.h
@@ -151,9 +151,9 @@ struct CJabberProto : public PROTO<CJabberProto>, public IJabberInterface
void OnBuildProtoMenu(void) override;
void OnContactDeleted(MCONTACT) override;
MWindow OnCreateAccMgrUI(MWindow) override;
- void OnCreateOfflineFile(DB::FILE_BLOB &blob, void *pHandle);
void OnMarkRead(MCONTACT, MEVENT) override;
void OnModulesLoaded() override;
+ void OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *ft) override;
void OnShutdown() override;
//====| Services |====================================================================
diff --git a/protocols/Telegram/src/avatars.cpp b/protocols/Telegram/src/avatars.cpp
index 48236fd9e7..8551dda5b8 100644
--- a/protocols/Telegram/src/avatars.cpp
+++ b/protocols/Telegram/src/avatars.cpp
@@ -124,7 +124,7 @@ INT_PTR __cdecl CTelegramProto::SvcOfflineFile(WPARAM param, LPARAM)
/////////////////////////////////////////////////////////////////////////////////////////
// Offline file pre-creator
-void CTelegramProto::OnCreateOfflineFile(DB::FILE_BLOB &blob, void *pHandle)
+void CTelegramProto::OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *pHandle)
{
if (auto *ft = (TG_FILE_REQUEST *)pHandle) {
blob.setUrl(ft->m_uniqueId.GetBuffer());
@@ -132,6 +132,26 @@ void CTelegramProto::OnCreateOfflineFile(DB::FILE_BLOB &blob, void *pHandle)
}
}
+void CTelegramProto::OnSendOfflineFile(DB::EventInfo &dbei, DB::FILE_BLOB &blob, void *hTransfer)
+{
+ auto *ft = (TG_FILE_REQUEST *)hTransfer;
+
+ dbei.szId = ft->m_uniqueId;
+ if (!ft->m_szUserId.IsEmpty())
+ dbei.szUserId = ft->m_szUserId;
+
+ auto *p = wcsrchr(ft->m_fileName, '\\');
+ if (p == nullptr)
+ p = ft->m_fileName;
+ else
+ p++;
+ blob.setName(p);
+
+ blob.setUrl("boo");
+ blob.complete(ft->m_fileSize);
+ blob.setLocalName(ft->m_fileName);
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
TG_FILE_REQUEST* CTelegramProto::PopFile(const char *pszUniqueId)
@@ -216,6 +236,21 @@ void CTelegramProto::ProcessFile(TD::updateFile *pObj)
return;
}
+ for (auto &it : m_arOwnMsg) {
+ if (it->tmpFileId == pFile->id_) {
+ if (!pFile->remote_->id_.empty()) {
+ char szId[100];
+ _i64toa(it->tmpMsgId, szId, 10);
+ if (auto hDbEvent = db_event_getById(m_szModuleName, szId)) {
+ DBVARIANT dbv = { DBVT_UTF8 };
+ dbv.pszVal = (char *)pFile->remote_->id_.c_str();
+ db_event_setJson(hDbEvent, "u", &dbv);
+ }
+ }
+ return;
+ }
+ }
+
for (auto &it : m_arUsers) {
if (it->szAvatarHash == pFile->remote_->unique_id_.c_str()) {
PROTO_AVATAR_INFORMATION pai;
diff --git a/protocols/Telegram/src/proto.cpp b/protocols/Telegram/src/proto.cpp
index 731d7babf1..849c0469f8 100644
--- a/protocols/Telegram/src/proto.cpp
+++ b/protocols/Telegram/src/proto.cpp
@@ -415,11 +415,36 @@ HANDLE CTelegramProto::SendFile(MCONTACT hContact, const wchar_t *szDescription,
return pTransfer;
}
-void CTelegramProto::OnSendFile(td::ClientManager::Response &, void *pUserInfo)
+void CTelegramProto::OnSendFile(td::ClientManager::Response &response, void *pUserInfo)
{
auto *ft = (TG_FILE_REQUEST *)pUserInfo;
+
+ if (response.object->get_id() == TD::message::ID) {
+ auto *pMsg = (TD::message *)response.object.get();
+ ft->m_uniqueId.Format("%lld", pMsg->id_);
+
+ if (auto *pUser = FindChat(pMsg->chat_id_)) {
+ char szUserId[100];
+ if (this->GetGcUserId(pUser, pMsg, szUserId))
+ ft->m_szUserId = szUserId;
+
+ auto *pOwnMsg = new TG_OWN_MESSAGE(pUser->hContact, 0, pMsg->id_);
+ const TD::MessageContent *pBody = pMsg->content_.get();
+ switch (pBody->get_id()) {
+ case TD::messagePhoto::ID:
+ pOwnMsg->tmpFileId = ((TD::messagePhoto*)pBody)->photo_->sizes_[0]->photo_->id_;
+ break;
+
+ case TD::messageDocument::ID:
+ pOwnMsg->tmpFileId = ((TD::messageDocument *)pBody)->document_->document_->id_;
+ break;
+ }
+ m_arOwnMsg.insert(pOwnMsg);
+ }
+ }
+
ProtoBroadcastAck(ft->m_hContact, ACKTYPE_FILE, ACKRESULT_SUCCESS, ft);
- delete ft;
+ delete ft;
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Telegram/src/proto.h b/protocols/Telegram/src/proto.h
index 4fefc25766..32376a5710 100644
--- a/protocols/Telegram/src/proto.h
+++ b/protocols/Telegram/src/proto.h
@@ -80,7 +80,7 @@ struct TG_FILE_REQUEST : public MZeroedObject
Type m_type;
MCONTACT m_hContact = 0;
TD::int53 m_fileId, m_fileSize = 0;
- CMStringA m_uniqueId;
+ CMStringA m_uniqueId, m_szUserId;
CMStringW m_destPath, m_fileName, m_wszDescr;
OFDTHREAD *ofd = 0;
};
@@ -137,7 +137,7 @@ struct TG_OWN_MESSAGE
tmpMsgId(_3)
{}
- int64_t tmpMsgId;
+ int64_t tmpMsgId, tmpFileId = -1;
HANDLE hAck;
MCONTACT hContact;
};
@@ -340,12 +340,13 @@ public:
void OnBuildProtoMenu() override;
void OnContactDeleted(MCONTACT hContact) override;
MWindow OnCreateAccMgrUI(MWindow hwndParent) override;
- void OnCreateOfflineFile(DB::FILE_BLOB &blob, void *ft) override;
+ void OnErase() override;
void OnEventDeleted(MCONTACT, MEVENT) override;
void OnMarkRead(MCONTACT, MEVENT) override;
void OnModulesLoaded() override;
+ void OnReceiveOfflineFile(DB::FILE_BLOB &blob, void *ft) override;
+ void OnSendOfflineFile(DB::EventInfo &dbei, DB::FILE_BLOB &blob, void *hTransfer) override;
void OnShutdown() override;
- void OnErase() override;
// Events ////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Telegram/src/server.cpp b/protocols/Telegram/src/server.cpp
index b702e95177..7241123e9b 100644
--- a/protocols/Telegram/src/server.cpp
+++ b/protocols/Telegram/src/server.cpp
@@ -1,4 +1,4 @@
--/*
+/*
Copyright (C) 2012-23 Miranda NG team (https://miranda-ng.org)
This program is free software; you can redistribute it and/or
@@ -184,12 +184,24 @@ void CTelegramProto::ProcessResponse(td::ClientManager::Response response)
case TD::updateMessageSendSucceeded::ID:
{
auto *pMessage = (TD::updateMessageSendSucceeded *)response.object.get();
+
+ if (pMessage->old_message_id_) {
+ char szId[100];
+ _i64toa(pMessage->old_message_id_, szId, 10);
+ if (auto hDbEvent = db_event_getById(m_szModuleName, szId)) {
+ _i64toa(pMessage->message_->id_, szId, 10);
+ db_event_updateId(hDbEvent, szId);
+ }
+ }
+
ProcessMessage(pMessage->message_.get());
if (auto *pOwnMsg = m_arOwnMsg.find((TG_OWN_MESSAGE *)&pMessage->old_message_id_)) {
- char szMsgId[100];
- _i64toa(pMessage->message_->id_, szMsgId, 10);
- ProtoBroadcastAck(pOwnMsg->hContact ? pOwnMsg->hContact : m_iSavedMessages, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, pOwnMsg->hAck, (LPARAM)szMsgId);
+ if (pOwnMsg->hAck) {
+ char szMsgId[100];
+ _i64toa(pMessage->message_->id_, szMsgId, 10);
+ ProtoBroadcastAck(pOwnMsg->hContact ? pOwnMsg->hContact : m_iSavedMessages, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, pOwnMsg->hAck, (LPARAM)szMsgId);
+ }
m_arOwnMsg.remove(pOwnMsg);
}
@@ -623,6 +635,11 @@ void CTelegramProto::ProcessMessage(const TD::message *pMessage)
if (pMessage->sending_state_->get_id() == TD::messageSendingStatePending::ID)
return;
+ char szId[100], szUserId[100];
+ _i64toa(pMessage->id_, szId, 10);
+ if (db_event_getById(m_szModuleName, szId))
+ return;
+
CMStringA szText(GetMessageText(pUser, pMessage));
if (szText.IsEmpty()) {
debugLogA("this message was not processed, ignored");
@@ -640,11 +657,6 @@ void CTelegramProto::ProcessMessage(const TD::message *pMessage)
Contact::RemoveFromList(pUser->hContact);
}
- char szId[100], szUserId[100];
- _i64toa(pMessage->id_, szId, 10);
- if (db_event_getById(m_szModuleName, szId))
- return;
-
PROTORECVEVENT pre = {};
pre.szMessage = szText.GetBuffer();
pre.szMsgId = szId;
diff --git a/protocols/Telegram/src/utils.cpp b/protocols/Telegram/src/utils.cpp
index 849f5c2399..b3d3598c82 100644
--- a/protocols/Telegram/src/utils.cpp
+++ b/protocols/Telegram/src/utils.cpp
@@ -330,7 +330,7 @@ CMStringA CTelegramProto::GetMessageSticker(const TD::file *pFile, const char *p
static const TD::photoSize* GetBiggestPhoto(const TD::photo *pPhoto)
{
- const char *types[] = {"y", "x", "m", "s"};
+ const char *types[] = { "y", "x", "m", "s" };
for (auto *pType : types)
for (auto &it : pPhoto->sizes_)
if (it->type_ == pType)
diff --git a/src/mir_app/src/db_events.cpp b/src/mir_app/src/db_events.cpp
index ed1dcd0921..b31742623c 100644
--- a/src/mir_app/src/db_events.cpp
+++ b/src/mir_app/src/db_events.cpp
@@ -340,8 +340,11 @@ 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())
+ if (isOffline()) {
root << CHAR_PARAM("u", m_szProtoString) << INT_PARAM("fs", m_iFileSize) << INT_PARAM("ft", m_iTransferred);
+ if (mir_wstrlen(m_wszLocalName))
+ root << WCHAR_PARAM("lf", m_wszLocalName);
+ }
std::string text = root.write();
dbei.cbBlob = (int)text.size() + 1;
diff --git a/src/mir_app/src/file.cpp b/src/mir_app/src/file.cpp
index 1caa5414b8..5267fad64b 100644
--- a/src/mir_app/src/file.cpp
+++ b/src/mir_app/src/file.cpp
@@ -260,7 +260,8 @@ MEVENT Proto_RecvFile(MCONTACT hContact, PROTORECVFILE *pre)
}
DB::FILE_BLOB blob(wszFiles, wszDescr);
- CallProtoService(dbei.szModule, PS_PRECREATE_OFFLINEFILE, WPARAM(&blob), pre->lParam);
+ if (auto *ppro = Proto_GetContactInstance(hContact))
+ ppro->OnReceiveOfflineFile(blob, (void*)pre->lParam);
blob.write(dbei);
MEVENT hdbe = db_event_add(hContact, &dbei);
diff --git a/src/mir_app/src/filexferdlg.cpp b/src/mir_app/src/filexferdlg.cpp
index c1cd617cf5..7812d7ba90 100644
--- a/src/mir_app/src/filexferdlg.cpp
+++ b/src/mir_app/src/filexferdlg.cpp
@@ -589,7 +589,7 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
else {
Skin_PlaySound("FileDone");
if (dat->send) {
- dat->fs = nullptr; /* protocol will free structure */
+ HANDLE fs = dat->fs; dat->fs = nullptr; /* protocol will free structure */
SetFtStatus(hwndDlg, LPGENW("Transfer completed."), FTS_TEXT);
DB::EventInfo dbei;
@@ -599,7 +599,10 @@ INT_PTR CALLBACK DlgProcFileTransfer(HWND hwndDlg, UINT msg, WPARAM wParam, LPAR
dbei.timestamp = time(0);
DB::FILE_BLOB blob(dat->szFilenames, dat->szMsg);
+ if (auto *ppro = Proto_GetContactInstance(dat->hContact))
+ ppro->OnSendOfflineFile(dbei, blob, fs);
blob.write(dbei);
+
db_event_add(dat->hContact, &dbei);
dat->files = nullptr; // protocol library frees this
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index eced6ed67c..1d06496629 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -864,7 +864,7 @@ Chat_IsMuted @941 NONAME
?getIcon@LOGINFO@@QBEHXZ @981 NONAME
?getIndex@LOGINFO@@QBEHXZ @982 NONAME
?write@LOGINFO@@QBEXPAURtfChatLogStreamData@@_NAAV?$CMStringT@DV?$ChTraitsCRT@D@@@@PB_W@Z @983 NONAME
-?OnCreateOfflineFile@PROTO_INTERFACE@@UAEXAAVFILE_BLOB@DB@@PAX@Z @984 NONAME
+?OnReceiveOfflineFile@PROTO_INTERFACE@@UAEXAAVFILE_BLOB@DB@@PAX@Z @984 NONAME
?setSize@FILE_BLOB@DB@@QAEX_J@Z @985 NONAME
?setUrl@FILE_BLOB@DB@@QAEXPBD@Z @986 NONAME
?Clist_GetEvent@@YGPAUCListEvent@@IH@Z @987 NONAME
@@ -886,3 +886,7 @@ Clist_GroupRestoreExpanded @1002 NONAME
Clist_GroupSaveExpanded @1003 NONAME
?OnRedrawTimer@CSrmmBaseDialog@@AAEXPAVCTimer@@@Z @1004 NONAME
?ScheduleRedrawLog@CSrmmBaseDialog@@QAEXXZ @1005 NONAME
+?OnSendOfflineFile@PROTO_INTERFACE@@UAEXAAVEventInfo@DB@@AAVFILE_BLOB@3@PAX@Z @1006 NONAME
+?Proto_GetContactInstance@@YGPAUPROTO_INTERFACE@@I@Z @1007 NONAME
+?complete@FILE_BLOB@DB@@QAEX_J@Z @1008 NONAME
+?setName@FILE_BLOB@DB@@QAEXPB_W@Z @1009 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 3598906804..8c6bc1eadc 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -864,7 +864,7 @@ Chat_IsMuted @941 NONAME
?getIcon@LOGINFO@@QEBAHXZ @981 NONAME
?getIndex@LOGINFO@@QEBAHXZ @982 NONAME
?write@LOGINFO@@QEBAXPEAURtfChatLogStreamData@@_NAEAV?$CMStringT@DV?$ChTraitsCRT@D@@@@PEB_W@Z @983 NONAME
-?OnCreateOfflineFile@PROTO_INTERFACE@@UEAAXAEAVFILE_BLOB@DB@@PEAX@Z @984 NONAME
+?OnReceiveOfflineFile@PROTO_INTERFACE@@UEAAXAEAVFILE_BLOB@DB@@PEAX@Z @984 NONAME
?setSize@FILE_BLOB@DB@@QEAAX_J@Z @985 NONAME
?setUrl@FILE_BLOB@DB@@QEAAXPEBD@Z @986 NONAME
?Clist_GetEvent@@YAPEAUCListEvent@@IH@Z @987 NONAME
@@ -886,3 +886,7 @@ Clist_GroupRestoreExpanded @1002 NONAME
Clist_GroupSaveExpanded @1003 NONAME
?OnRedrawTimer@CSrmmBaseDialog@@AEAAXPEAVCTimer@@@Z @1004 NONAME
?ScheduleRedrawLog@CSrmmBaseDialog@@QEAAXXZ @1005 NONAME
+?OnSendOfflineFile@PROTO_INTERFACE@@UEAAXAEAVEventInfo@DB@@AEAVFILE_BLOB@3@PEAX@Z @1006 NONAME
+?Proto_GetContactInstance@@YAPEAUPROTO_INTERFACE@@I@Z @1007 NONAME
+?complete@FILE_BLOB@DB@@QEAAX_J@Z @1008 NONAME
+?setName@FILE_BLOB@DB@@QEAAXPEB_W@Z @1009 NONAME
diff --git a/src/mir_app/src/proto_chains.cpp b/src/mir_app/src/proto_chains.cpp
index 5417c07995..69b5adc285 100644
--- a/src/mir_app/src/proto_chains.cpp
+++ b/src/mir_app/src/proto_chains.cpp
@@ -134,6 +134,12 @@ MIR_APP_DLL(INT_PTR) Proto_ChainRecv(int iOrder, CCSDATA *ccs)
return ret;
}
+MIR_APP_DLL(PROTO_INTERFACE *) Proto_GetContactInstance(MCONTACT hContact)
+{
+ auto *pa = Proto_GetContactAccount(hContact);
+ return (pa) ? pa->ppro : nullptr;
+}
+
MIR_APP_DLL(PROTOACCOUNT*) Proto_GetContactAccount(MCONTACT hContact)
{
if (hContact == 0)
diff --git a/src/mir_app/src/proto_interface.cpp b/src/mir_app/src/proto_interface.cpp
index 7029c6295a..b4621cf918 100644
--- a/src/mir_app/src/proto_interface.cpp
+++ b/src/mir_app/src/proto_interface.cpp
@@ -80,9 +80,6 @@ MWindow PROTO_INTERFACE::OnCreateAccMgrUI(MWindow)
return nullptr; // error
}
-void PROTO_INTERFACE::OnCreateOfflineFile(DB::FILE_BLOB&, void *)
-{}
-
void PROTO_INTERFACE::OnEventDeleted(MCONTACT, MEVENT)
{}
@@ -103,6 +100,12 @@ bool PROTO_INTERFACE::IsReadyToExit()
return true;
}
+void PROTO_INTERFACE::OnReceiveOfflineFile(DB::FILE_BLOB &, void *)
+{}
+
+void PROTO_INTERFACE::OnSendOfflineFile(DB::EventInfo &, DB::FILE_BLOB &, void *)
+{}
+
void PROTO_INTERFACE::OnShutdown()
{}
diff --git a/src/mir_app/src/protocols.cpp b/src/mir_app/src/protocols.cpp
index d369bdf4da..f4d7b42d2d 100644
--- a/src/mir_app/src/protocols.cpp
+++ b/src/mir_app/src/protocols.cpp
@@ -49,7 +49,6 @@ static TServiceListItem serviceItems[] =
{ PS_AUTHDENY, 4 },
{ PSR_AUTH, 5 },
{ PSS_AUTHREQUEST, 6 },
- { PS_PRECREATE_OFFLINEFILE, 7 },
{ PSS_FILEALLOW, 8 },
{ PSS_FILECANCEL, 9 },
{ PSS_FILEDENY, 10 },
@@ -401,7 +400,6 @@ INT_PTR CallProtoServiceInt(MCONTACT hContact, const char *szModule, const char
case 4: return (INT_PTR)ppi->AuthDeny((MEVENT)wParam, (wchar_t *)lParam);
case 5: return (INT_PTR)ppi->AuthRecv(hContact, (PROTORECVEVENT *)lParam);
case 6: return (INT_PTR)ppi->AuthRequest(hContact, (wchar_t *)lParam);
- case 7: ppi->OnCreateOfflineFile(*(DB::FILE_BLOB *)wParam, (void *)lParam); return 0;
case 8: return (INT_PTR)ppi->FileAllow(hContact, (HANDLE)wParam, (wchar_t *)lParam);
case 9: return (INT_PTR)ppi->FileCancel(hContact, (HANDLE)wParam);
case 10: return (INT_PTR)ppi->FileDeny(hContact, (HANDLE)wParam, (wchar_t *)lParam);