@@ -41,6 +41,55 @@ XHTHREAD CALLBACK XEngine_Download_HTTPThread(LPVOID lParam)
4141 }
4242 return 0 ;
4343}
44+
45+ void CALLBACK XEngine_Download_CBSend (LPCSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
46+ {
47+ int nThreadPos = 0 ; // 回调模式不需要发送线程池
48+ int nMsgLen = 4096 ;
49+ TCHAR tszMsgBuffer[4096 ];
50+ memset (tszMsgBuffer, ' \0 ' , sizeof (tszMsgBuffer));
51+
52+ if (Session_DLStroage_GetBuffer (nThreadPos, lpszClientAddr, tszMsgBuffer, &nMsgLen))
53+ {
54+ if (nMsgLen <= 0 )
55+ {
56+ if (st_ServiceCfg.st_XProxy .st_XProxyPass .bDLPass )
57+ {
58+ int nPLen = MAX_PATH;
59+ int nHttpCode = 0 ;
60+ UCHAR tszHashKey[MAX_PATH];
61+ TCHAR tszHashStr[MAX_PATH];
62+ TCHAR tszProxyStr[MAX_PATH];
63+ SESSION_STORAGEINFO st_StorageInfo;
64+
65+ memset (tszHashKey, ' \0 ' , MAX_PATH);
66+ memset (tszHashStr, ' \0 ' , MAX_PATH);
67+ memset (tszProxyStr, ' \0 ' , MAX_PATH);
68+ memset (&st_StorageInfo, ' \0 ' , sizeof (SESSION_STORAGEINFO));
69+
70+ OPenSsl_Api_Digest (st_StorageInfo.tszFileDir , tszHashKey, NULL , TRUE , st_ServiceCfg.st_XStorage .nHashMode );
71+ BaseLib_OperatorString_StrToHex ((char *)tszHashKey, 20 , tszHashStr);
72+ Session_DLStroage_GetInfo (nThreadPos, lpszClientAddr, &st_StorageInfo);
73+
74+ XStorageProtocol_Proxy_PacketUPDown (st_StorageInfo.tszFileDir , st_StorageInfo.tszClientAddr , st_StorageInfo.ullRWCount , tszProxyStr, &nPLen, tszHashStr);
75+ APIHelp_HttpRequest_Post (st_ServiceCfg.st_XProxy .st_XProxyPass .tszDLPass , tszProxyStr, &nHttpCode);
76+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T (" 下载客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s" ), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir , st_ServiceCfg.st_XProxy .st_XProxyPass .tszDLPass );
77+ }
78+ NetCore_TCPXCore_CBSendEx (xhNetDownload, lpszClientAddr);
79+ Session_DLStroage_Delete (lpszClientAddr);
80+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T (" 下载客户端:%s,文件已经发送完毕,用户已经被移除发送列表" ), lpszClientAddr);
81+ }
82+ else
83+ {
84+ XEngine_Task_SendDownload (lpszClientAddr, tszMsgBuffer, nMsgLen);
85+ }
86+ }
87+ else
88+ {
89+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T (" 下载客户端:%s,获取用户对应文件内容失败,错误:%lX" ), lpszClientAddr, Session_GetLastError ());
90+ }
91+ }
92+
4493XHTHREAD CALLBACK XEngine_Download_SendThread (LPVOID lParam)
4594{
4695 int nThreadPos = *(int *)lParam;
@@ -188,6 +237,20 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in
188237 _tcscpy (st_HDRParam.tszMimeType , _T (" bin" ));
189238 RfcComponents_HttpServer_SendMsgEx (xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL , ullSize);
190239 XEngine_Net_SendMsg (lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
240+ // 不能在send之前调用
241+ if (2 == st_ServiceCfg.st_XStorage .nSendMode )
242+ {
243+ if (!NetCore_TCPXCore_CBSendEx (xhNetDownload, lpszClientAddr, XEngine_Download_CBSend))
244+ {
245+ st_HDRParam.bIsClose = TRUE ;
246+ st_HDRParam.nHttpCode = 404 ;
247+
248+ RfcComponents_HttpServer_SendMsgEx (xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
249+ XEngine_Net_SendMsg (lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
250+ XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T (" 下载客户端:%s,设置回调下载失败,文件:%s,错误:%lX" ), lpszClientAddr, tszFileDir, Session_GetLastError ());
251+ return FALSE ;
252+ }
253+ }
191254 XLOG_PRINT (xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T (" 下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d" ), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd);
192255 return TRUE ;
193256}
0 commit comments