diff options
-rw-r--r-- | include/m_netlib.h | 2 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.cpp | 61 | ||||
-rw-r--r-- | protocols/ICQ-WIM/src/proto.h | 1 | ||||
-rw-r--r-- | src/mir_app/src/netlib.h | 3 | ||||
-rw-r--r-- | src/mir_app/src/netlib_http.cpp | 5 |
5 files changed, 33 insertions, 39 deletions
diff --git a/include/m_netlib.h b/include/m_netlib.h index bd8aea61c5..92906a93d4 100644 --- a/include/m_netlib.h +++ b/include/m_netlib.h @@ -563,7 +563,7 @@ __forceinline MHttpRequest* operator<<(MHttpRequest &req, const WCHAR_PARAM &par EXTERN_C MIR_APP_DLL(MHttpResponse *) Netlib_HttpTransaction(HNETLIBUSER hNlu, MHttpRequest *pRequest);
-typedef void(__cdecl *pfnDownloadCallback)(void *);
+typedef void(__cdecl *pfnDownloadCallback)(size_t iProgress, void *pUserInfo);
EXTERN_C MIR_APP_DLL(MHttpResponse *) Netlib_DownloadFile(
HNETLIBUSER hNlu,
diff --git a/protocols/ICQ-WIM/src/proto.cpp b/protocols/ICQ-WIM/src/proto.cpp index 78fbc046e6..2e2d866938 100644 --- a/protocols/ICQ-WIM/src/proto.cpp +++ b/protocols/ICQ-WIM/src/proto.cpp @@ -242,32 +242,13 @@ void CIcqProto::OnEventDeleted(MCONTACT hContact, MEVENT hEvent) /////////////////////////////////////////////////////////////////////////////////////////
-void CIcqProto::OnFileRecv(MHttpResponse *pReply, AsyncHttpRequest *pReq)
+static void __cdecl DownloadCallack(size_t iProgress, void *pParam)
{
- if (pReply->resultCode != 200)
- return;
-
- auto *ofd = (OFDTHREAD *)pReq->pUserInfo;
- debugLogW(L"Saving to [%s]", ofd->wszPath.c_str());
- int fileId = _wopen(ofd->wszPath, _O_BINARY | _O_CREAT | _O_TRUNC | _O_WRONLY, _S_IREAD | _S_IWRITE);
- if (fileId == -1) {
- debugLogW(L"Cannot open [%s] for writing", ofd->wszPath.c_str());
- return;
- }
-
- int cbWritten = _write(fileId, pReply->body, pReply->body.GetLength());
- _close(fileId);
- if (cbWritten != pReply->body.GetLength()) {
- debugLogW(L"Error writing data into [%s]: %d instead of %d", ofd->wszPath.c_str(), cbWritten, pReply->body.GetLength());
- return;
- }
+ auto *ofd = (OFDTHREAD *)pParam;
DBVARIANT dbv = { DBVT_DWORD };
- dbv.dVal = cbWritten;
+ dbv.dVal = unsigned(iProgress);
db_event_setJson(ofd->hDbEvent, "ft", &dbv);
-
- ofd->Finish();
- delete ofd;
}
void __cdecl CIcqProto::OfflineFileThread(void *pParam)
@@ -282,19 +263,31 @@ void __cdecl CIcqProto::OfflineFileThread(void *pParam) if (fileText2url(blob.getUrl(), &wszUrl)) {
if (auto *pFileInfo = RetrieveFileInfo(dbei.hContact, wszUrl)) {
if (!ofd->bCopy) {
- auto *pReq = new AsyncHttpRequest(CONN_NONE, REQUEST_GET, pFileInfo->szUrl, &CIcqProto::OnFileRecv);
- pReq->pUserInfo = ofd;
- pReq->AddHeader("Sec-Fetch-User", "?1");
- pReq->AddHeader("Sec-Fetch-Site", "cross-site");
- pReq->AddHeader("Sec-Fetch-Mode", "navigate");
- pReq->AddHeader("Accept-Encoding", "gzip");
- Push(pReq);
- return; // ofd is used inside CIcqProto::OnFileRecv, don't remove it
+ MHttpRequest nlhr(REQUEST_GET);
+ nlhr.m_szUrl = pFileInfo->szUrl;
+ nlhr.AddHeader("Sec-Fetch-User", "?1");
+ nlhr.AddHeader("Sec-Fetch-Site", "cross-site");
+ nlhr.AddHeader("Sec-Fetch-Mode", "navigate");
+ nlhr.AddHeader("Accept-Encoding", "gzip");
+
+ debugLogW(L"Saving to [%s]", ofd->wszPath.c_str());
+ NLHR_PTR reply(Netlib_DownloadFile(m_hNetlibUser, &nlhr, ofd->wszPath, DownloadCallack, ofd));
+ if (reply && reply->resultCode == 200) {
+ struct _stat st;
+ _wstat(ofd->wszPath, &st);
+
+ DBVARIANT dbv = { DBVT_DWORD };
+ dbv.dVal = st.st_size;
+ db_event_setJson(ofd->hDbEvent, "ft", &dbv);
+
+ ofd->Finish();
+ }
+ }
+ else {
+ ofd->wszPath.Empty();
+ ofd->wszPath.Append(_A2T(pFileInfo->szUrl));
+ ofd->pCallback->Invoke(*ofd);
}
-
- ofd->wszPath.Empty();
- ofd->wszPath.Append(_A2T(pFileInfo->szUrl));
- ofd->pCallback->Invoke(*ofd);
}
}
}
diff --git a/protocols/ICQ-WIM/src/proto.h b/protocols/ICQ-WIM/src/proto.h index 9bf4661ca7..dfb75d78a3 100644 --- a/protocols/ICQ-WIM/src/proto.h +++ b/protocols/ICQ-WIM/src/proto.h @@ -274,7 +274,6 @@ class CIcqProto : public PROTO<CIcqProto> void OnFileContinue(MHttpResponse *pReply, AsyncHttpRequest *pReq);
void OnFileInit(MHttpResponse *pReply, AsyncHttpRequest *pReq);
void OnFileInfo(MHttpResponse *pReply, AsyncHttpRequest *pReq);
- void OnFileRecv(MHttpResponse *pReply, AsyncHttpRequest *pReq);
void OnGenToken(MHttpResponse *pReply, AsyncHttpRequest *pReq);
void OnGetChatInfo(MHttpResponse *pReply, AsyncHttpRequest *pReq);
void OnGetPatches(MHttpResponse *pReply, AsyncHttpRequest *pReq);
diff --git a/src/mir_app/src/netlib.h b/src/mir_app/src/netlib.h index 0a764c5f0f..5f8f35bf0c 100644 --- a/src/mir_app/src/netlib.h +++ b/src/mir_app/src/netlib.h @@ -92,7 +92,8 @@ public: class MFileChunkStorage : public MChunkHandler
{
- int fileId, prevBlocks = 0;
+ int fileId;
+ size_t prevBlocks = 0;
pfnDownloadCallback pCallback;
void *pCallbackInfo;
diff --git a/src/mir_app/src/netlib_http.cpp b/src/mir_app/src/netlib_http.cpp index 69946a0c8a..de0a5255cd 100644 --- a/src/mir_app/src/netlib_http.cpp +++ b/src/mir_app/src/netlib_http.cpp @@ -1157,10 +1157,11 @@ bool MFileChunkStorage::updateChunk(const void *pData, size_t cbLen) }
if (pCallback) {
- int nBlocks = _filelength(fileId) / 65536;
+ size_t iProgress = _filelength(fileId);
+ size_t nBlocks = iProgress / 65536;
if (nBlocks != prevBlocks) {
prevBlocks = nBlocks;
- pCallback(pCallbackInfo);
+ pCallback(iProgress, pCallbackInfo);
}
}
return true;
|