工具项目

HPSocket.cpp 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Author : Bruce Liang
  5. * Website : http://www.jessma.org
  6. * Project : https://github.com/ldcsaa
  7. * Blog : http://www.cnblogs.com/ldcsaa
  8. * Wiki : http://www.oschina.net/p/hp-socket
  9. * QQ Group : 75375912, 44636872
  10. *
  11. * Licensed under the Apache License, Version 2.0 (the "License");
  12. * you may not use this file except in compliance with the License.
  13. * You may obtain a copy of the License at
  14. *
  15. * http://www.apache.org/licenses/LICENSE-2.0
  16. *
  17. * Unless required by applicable law or agreed to in writing, software
  18. * distributed under the License is distributed on an "AS IS" BASIS,
  19. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20. * See the License for the specific language governing permissions and
  21. * limitations under the License.
  22. */
  23. #include "stdafx.h"
  24. #include "HPSocket.h"
  25. #include "TcpServer.h"
  26. #include "TcpAgent.h"
  27. #include "TcpClient.h"
  28. #include "TcpPullServer.h"
  29. #include "TcpPullClient.h"
  30. #include "TcpPullAgent.h"
  31. #include "TcpPackServer.h"
  32. #include "TcpPackClient.h"
  33. #include "TcpPackAgent.h"
  34. #include "UdpServer.h"
  35. #include "UdpClient.h"
  36. #include "UdpCast.h"
  37. #ifdef _HTTP_SUPPORT
  38. #include "HttpServer.h"
  39. #include "HttpAgent.h"
  40. #include "HttpClient.h"
  41. #endif
  42. /*****************************************************************************************************************************************************/
  43. /****************************************************************** TCP/UDP Exports ******************************************************************/
  44. /*****************************************************************************************************************************************************/
  45. HPSOCKET_API ITcpServer* HP_Create_TcpServer(ITcpServerListener* pListener)
  46. {
  47. return new CTcpServer(pListener);
  48. }
  49. HPSOCKET_API ITcpAgent* HP_Create_TcpAgent(ITcpAgentListener* pListener)
  50. {
  51. return new CTcpAgent(pListener);
  52. }
  53. HPSOCKET_API ITcpClient* HP_Create_TcpClient(ITcpClientListener* pListener)
  54. {
  55. return new CTcpClient(pListener);
  56. }
  57. HPSOCKET_API ITcpPullServer* HP_Create_TcpPullServer(ITcpServerListener* pListener)
  58. {
  59. return (ITcpPullServer*)(new CTcpPullServer(pListener));
  60. }
  61. HPSOCKET_API ITcpPullAgent* HP_Create_TcpPullAgent(ITcpAgentListener* pListener)
  62. {
  63. return (ITcpPullAgent*)(new CTcpPullAgent(pListener));
  64. }
  65. HPSOCKET_API ITcpPullClient* HP_Create_TcpPullClient(ITcpClientListener* pListener)
  66. {
  67. return (ITcpPullClient*)(new CTcpPullClient(pListener));
  68. }
  69. HPSOCKET_API ITcpPackServer* HP_Create_TcpPackServer(ITcpServerListener* pListener)
  70. {
  71. return (ITcpPackServer*)(new CTcpPackServer(pListener));
  72. }
  73. HPSOCKET_API ITcpPackAgent* HP_Create_TcpPackAgent(ITcpAgentListener* pListener)
  74. {
  75. return (ITcpPackAgent*)(new CTcpPackAgent(pListener));
  76. }
  77. HPSOCKET_API ITcpPackClient* HP_Create_TcpPackClient(ITcpClientListener* pListener)
  78. {
  79. return (ITcpPackClient*)(new CTcpPackClient(pListener));
  80. }
  81. HPSOCKET_API IUdpServer* HP_Create_UdpServer(IUdpServerListener* pListener)
  82. {
  83. return new CUdpServer(pListener);
  84. }
  85. HPSOCKET_API IUdpClient* HP_Create_UdpClient(IUdpClientListener* pListener)
  86. {
  87. return new CUdpClient(pListener);
  88. }
  89. HPSOCKET_API IUdpCast* HP_Create_UdpCast(IUdpCastListener* pListener)
  90. {
  91. return new CUdpCast(pListener);
  92. }
  93. HPSOCKET_API void HP_Destroy_TcpServer(ITcpServer* pServer)
  94. {
  95. delete pServer;
  96. }
  97. HPSOCKET_API void HP_Destroy_TcpAgent(ITcpAgent* pAgent)
  98. {
  99. delete pAgent;
  100. }
  101. HPSOCKET_API void HP_Destroy_TcpClient(ITcpClient* pClient)
  102. {
  103. delete pClient;
  104. }
  105. HPSOCKET_API void HP_Destroy_TcpPullServer(ITcpPullServer* pServer)
  106. {
  107. delete pServer;
  108. }
  109. HPSOCKET_API void HP_Destroy_TcpPullAgent(ITcpPullAgent* pAgent)
  110. {
  111. delete pAgent;
  112. }
  113. HPSOCKET_API void HP_Destroy_TcpPullClient(ITcpPullClient* pClient)
  114. {
  115. delete pClient;
  116. }
  117. HPSOCKET_API void HP_Destroy_TcpPackServer(ITcpPackServer* pServer)
  118. {
  119. delete pServer;
  120. }
  121. HPSOCKET_API void HP_Destroy_TcpPackAgent(ITcpPackAgent* pAgent)
  122. {
  123. delete pAgent;
  124. }
  125. HPSOCKET_API void HP_Destroy_TcpPackClient(ITcpPackClient* pClient)
  126. {
  127. delete pClient;
  128. }
  129. HPSOCKET_API void HP_Destroy_UdpServer(IUdpServer* pServer)
  130. {
  131. delete pServer;
  132. }
  133. HPSOCKET_API void HP_Destroy_UdpClient(IUdpClient* pClient)
  134. {
  135. delete pClient;
  136. }
  137. HPSOCKET_API void HP_Destroy_UdpCast(IUdpCast* pCast)
  138. {
  139. delete pCast;
  140. }
  141. /*****************************************************************************************************************************************************/
  142. /*************************************************************** Global Function Exports *************************************************************/
  143. /*****************************************************************************************************************************************************/
  144. HPSOCKET_API DWORD HP_GetHPSocketVersion()
  145. {
  146. return ::GetHPSocketVersion();
  147. }
  148. HPSOCKET_API LPCTSTR HP_GetSocketErrorDesc(EnSocketError enCode)
  149. {
  150. return ::GetSocketErrorDesc(enCode);
  151. }
  152. HPSOCKET_API DWORD SYS_GetLastError()
  153. {
  154. return ::GetLastError();
  155. }
  156. HPSOCKET_API int SYS_WSAGetLastError()
  157. {
  158. return ::WSAGetLastError();
  159. }
  160. HPSOCKET_API int SYS_SetSocketOption(SOCKET sock, int level, int name, LPVOID val, int len)
  161. {
  162. return ::SSO_SetSocketOption(sock, level, name, val, len);
  163. }
  164. HPSOCKET_API int SYS_GetSocketOption(SOCKET sock, int level, int name, LPVOID val, int* len)
  165. {
  166. return ::SSO_GetSocketOption(sock, level, name, val, len);
  167. }
  168. HPSOCKET_API int SYS_IoctlSocket(SOCKET sock, long cmd, u_long* arg)
  169. {
  170. return ::SSO_IoctlSocket(sock, cmd, arg);
  171. }
  172. HPSOCKET_API int SYS_WSAIoctl(SOCKET sock, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned)
  173. {
  174. return ::SSO_WSAIoctl(sock, dwIoControlCode, lpvInBuffer, cbInBuffer, lpvOutBuffer, cbOutBuffer, lpcbBytesReturned);
  175. }
  176. HPSOCKET_API int SYS_SSO_NoDelay(SOCKET sock, BOOL bNoDelay)
  177. {
  178. return ::SSO_NoDelay(sock, bNoDelay);
  179. }
  180. HPSOCKET_API int SYS_SSO_DontLinger(SOCKET sock, BOOL bDont)
  181. {
  182. return ::SSO_DontLinger(sock, bDont);
  183. }
  184. HPSOCKET_API int SYS_SSO_Linger(SOCKET sock, USHORT l_onoff, USHORT l_linger)
  185. {
  186. return ::SSO_Linger(sock, l_onoff, l_linger);
  187. }
  188. HPSOCKET_API int SYS_SSO_RecvBuffSize(SOCKET sock, int size)
  189. {
  190. return ::SSO_RecvBuffSize(sock, size);
  191. }
  192. HPSOCKET_API int SYS_SSO_SendBuffSize(SOCKET sock, int size)
  193. {
  194. return ::SSO_SendBuffSize(sock, size);
  195. }
  196. HPSOCKET_API int SYS_SSO_ReuseAddress(SOCKET sock, BOOL bReuse)
  197. {
  198. return ::SSO_ReuseAddress(sock, bReuse);
  199. }
  200. HPSOCKET_API BOOL SYS_GetSocketLocalAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort)
  201. {
  202. return ::GetSocketLocalAddress(socket, lpszAddress, iAddressLen, usPort);
  203. }
  204. HPSOCKET_API BOOL SYS_GetSocketRemoteAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort)
  205. {
  206. return ::GetSocketRemoteAddress(socket, lpszAddress, iAddressLen, usPort);
  207. }
  208. HPSOCKET_API BOOL SYS_EnumHostIPAddresses(LPCTSTR lpszHost, EnIPAddrType enType, __out LPTIPAddr** lpppIPAddr, __out int& iIPAddrCount)
  209. {
  210. return ::EnumHostIPAddresses(lpszHost, enType, lpppIPAddr, iIPAddrCount);
  211. }
  212. HPSOCKET_API BOOL SYS_FreeHostIPAddresses(LPTIPAddr* lppIPAddr)
  213. {
  214. return ::FreeHostIPAddresses(lppIPAddr);
  215. }
  216. HPSOCKET_API BOOL SYS_IsIPAddress(LPCTSTR lpszAddress, EnIPAddrType* penType)
  217. {
  218. return ::IsIPAddress(lpszAddress, penType);
  219. }
  220. HPSOCKET_API BOOL SYS_GetIPAddress(LPCTSTR lpszHost, TCHAR lpszIP[], int& iIPLenth, EnIPAddrType& enType)
  221. {
  222. return ::GetIPAddress(lpszHost, lpszIP, iIPLenth, enType);
  223. }
  224. HPSOCKET_API ULONGLONG SYS_NToH64(ULONGLONG value)
  225. {
  226. return ::NToH64(value);
  227. }
  228. HPSOCKET_API ULONGLONG SYS_HToN64(ULONGLONG value)
  229. {
  230. return ::HToN64(value);
  231. }
  232. HPSOCKET_API BOOL SYS_CodePageToUnicode(int iCodePage, const char szSrc[], WCHAR szDest[], int& iDestLength)
  233. {
  234. return ::CodePageToUnicode(iCodePage, szSrc, szDest, iDestLength);
  235. }
  236. HPSOCKET_API BOOL SYS_UnicodeToCodePage(int iCodePage, const WCHAR szSrc[], char szDest[], int& iDestLength)
  237. {
  238. return ::UnicodeToCodePage(iCodePage, szSrc, szDest, iDestLength);
  239. }
  240. HPSOCKET_API BOOL SYS_GbkToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength)
  241. {
  242. return ::GbkToUnicode(szSrc, szDest, iDestLength);
  243. }
  244. HPSOCKET_API BOOL SYS_UnicodeToGbk(const WCHAR szSrc[], char szDest[], int& iDestLength)
  245. {
  246. return ::UnicodeToGbk(szSrc, szDest, iDestLength);
  247. }
  248. HPSOCKET_API BOOL SYS_Utf8ToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength)
  249. {
  250. return ::Utf8ToUnicode(szSrc, szDest, iDestLength);
  251. }
  252. HPSOCKET_API BOOL SYS_UnicodeToUtf8(const WCHAR szSrc[], char szDest[], int& iDestLength)
  253. {
  254. return ::UnicodeToUtf8(szSrc, szDest, iDestLength);
  255. }
  256. HPSOCKET_API BOOL SYS_GbkToUtf8(const char szSrc[], char szDest[], int& iDestLength)
  257. {
  258. return ::GbkToUtf8(szSrc, szDest, iDestLength);
  259. }
  260. HPSOCKET_API BOOL SYS_Utf8ToGbk(const char szSrc[], char szDest[], int& iDestLength)
  261. {
  262. return ::Utf8ToGbk(szSrc, szDest, iDestLength);
  263. }
  264. HPSOCKET_API DWORD SYS_GuessBase64EncodeBound(DWORD dwSrcLen)
  265. {
  266. return ::GuessBase64EncodeBound(dwSrcLen);
  267. }
  268. HPSOCKET_API DWORD SYS_GuessBase64DecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  269. {
  270. return ::GuessBase64DecodeBound(lpszSrc, dwSrcLen);
  271. }
  272. HPSOCKET_API int SYS_Base64Encode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  273. {
  274. return ::Base64Encode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  275. }
  276. HPSOCKET_API int SYS_Base64Decode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  277. {
  278. return ::Base64Decode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  279. }
  280. HPSOCKET_API DWORD SYS_GuessUrlEncodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  281. {
  282. return ::GuessUrlEncodeBound(lpszSrc, dwSrcLen);
  283. }
  284. HPSOCKET_API DWORD SYS_GuessUrlDecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  285. {
  286. return ::GuessUrlDecodeBound(lpszSrc, dwSrcLen);
  287. }
  288. HPSOCKET_API int SYS_UrlEncode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  289. {
  290. return ::UrlEncode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  291. }
  292. HPSOCKET_API int SYS_UrlDecode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  293. {
  294. return ::UrlDecode(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  295. }
  296. /*****************************************************************************************************************************************************/
  297. /******************************************************************** HTTP Exports *******************************************************************/
  298. /*****************************************************************************************************************************************************/
  299. #ifdef _HTTP_SUPPORT
  300. HPSOCKET_API IHttpServer* HP_Create_HttpServer(IHttpServerListener* pListener)
  301. {
  302. return (IHttpServer*)(new CHttpServer(pListener));
  303. }
  304. HPSOCKET_API IHttpAgent* HP_Create_HttpAgent(IHttpAgentListener* pListener)
  305. {
  306. return (IHttpAgent*)(new CHttpAgent(pListener));
  307. }
  308. HPSOCKET_API IHttpClient* HP_Create_HttpClient(IHttpClientListener* pListener)
  309. {
  310. return (IHttpClient*)(new CHttpClient(pListener));
  311. }
  312. HPSOCKET_API IHttpSyncClient* HP_Create_HttpSyncClient(IHttpClientListener* pListener)
  313. {
  314. return (IHttpSyncClient*)(new CHttpSyncClient(pListener));
  315. }
  316. HPSOCKET_API void HP_Destroy_HttpServer(IHttpServer* pServer)
  317. {
  318. delete pServer;
  319. }
  320. HPSOCKET_API void HP_Destroy_HttpAgent(IHttpAgent* pAgent)
  321. {
  322. delete pAgent;
  323. }
  324. HPSOCKET_API void HP_Destroy_HttpClient(IHttpClient* pClient)
  325. {
  326. delete pClient;
  327. }
  328. HPSOCKET_API void HP_Destroy_HttpSyncClient(IHttpSyncClient* pClient)
  329. {
  330. delete pClient;
  331. }
  332. /**************************************************************************/
  333. /*************************** HTTP Cookie ¹ÜÀí·½·¨ **************************/
  334. HPSOCKET_API BOOL HP_HttpCookie_MGR_LoadFromFile(LPCSTR lpszFile, BOOL bKeepExists)
  335. {
  336. return g_CookieMgr.LoadFromFile(lpszFile, bKeepExists);
  337. }
  338. HPSOCKET_API BOOL HP_HttpCookie_MGR_SaveToFile(LPCSTR lpszFile, BOOL bKeepExists)
  339. {
  340. return g_CookieMgr.SaveToFile(lpszFile, bKeepExists);
  341. }
  342. HPSOCKET_API BOOL HP_HttpCookie_MGR_ClearCookies(LPCSTR lpszDomain, LPCSTR lpszPath)
  343. {
  344. return g_CookieMgr.ClearCookies(lpszDomain, lpszPath);
  345. }
  346. HPSOCKET_API BOOL HP_HttpCookie_MGR_RemoveExpiredCookies(LPCSTR lpszDomain, LPCSTR lpszPath)
  347. {
  348. return g_CookieMgr.RemoveExpiredCookies(lpszDomain, lpszPath);
  349. }
  350. HPSOCKET_API BOOL HP_HttpCookie_MGR_SetCookie(LPCSTR lpszName, LPCSTR lpszValue, LPCSTR lpszDomain, LPCSTR lpszPath, int iMaxAge, BOOL bHttpOnly, BOOL bSecure, int enSameSite, BOOL bOnlyUpdateValueIfExists)
  351. {
  352. return g_CookieMgr.SetCookie(lpszName, lpszValue, lpszDomain, lpszPath, iMaxAge, bHttpOnly, bSecure, (CCookie::EnSameSite)enSameSite, bOnlyUpdateValueIfExists);
  353. }
  354. HPSOCKET_API BOOL HP_HttpCookie_MGR_DeleteCookie(LPCSTR lpszDomain, LPCSTR lpszPath, LPCSTR lpszName)
  355. {
  356. return g_CookieMgr.DeleteCookie(lpszDomain, lpszPath, lpszName);
  357. }
  358. HPSOCKET_API void HP_HttpCookie_MGR_SetEnableThirdPartyCookie(BOOL bEnableThirdPartyCookie)
  359. {
  360. g_CookieMgr.SetEnableThirdPartyCookie(bEnableThirdPartyCookie);
  361. }
  362. HPSOCKET_API BOOL HP_HttpCookie_MGR_IsEnableThirdPartyCookie()
  363. {
  364. return g_CookieMgr.IsEnableThirdPartyCookie();
  365. }
  366. HPSOCKET_API BOOL HP_HttpCookie_HLP_ParseExpires(LPCSTR lpszExpires, __time64_t& tmExpires)
  367. {
  368. return CCookie::ParseExpires(lpszExpires, tmExpires);
  369. }
  370. HPSOCKET_API BOOL HP_HttpCookie_HLP_MakeExpiresStr(char lpszBuff[], int& iBuffLen, __time64_t tmExpires)
  371. {
  372. return CCookie::MakeExpiresStr(lpszBuff, iBuffLen, tmExpires);
  373. }
  374. HPSOCKET_API BOOL HP_HttpCookie_HLP_ToString(char lpszBuff[], int& iBuffLen, LPCSTR lpszName, LPCSTR lpszValue, LPCSTR lpszDomain, LPCSTR lpszPath, int iMaxAge, BOOL bHttpOnly, BOOL bSecure, int enSameSite)
  375. {
  376. return CCookie::ToString(lpszBuff, iBuffLen, lpszName, lpszValue, lpszDomain, lpszPath, iMaxAge, bHttpOnly, bSecure, (CCookie::EnSameSite)enSameSite);
  377. }
  378. HPSOCKET_API __time64_t HP_HttpCookie_HLP_CurrentUTCTime()
  379. {
  380. return CCookie::CurrentUTCTime();
  381. }
  382. HPSOCKET_API __time64_t HP_HttpCookie_HLP_MaxAgeToExpires(int iMaxAge)
  383. {
  384. return CCookie::MaxAgeToExpires(iMaxAge);
  385. }
  386. HPSOCKET_API int HP_HttpCookie_HLP_ExpiresToMaxAge(__time64_t tmExpires)
  387. {
  388. return CCookie::ExpiresToMaxAge(tmExpires);
  389. }
  390. /*****************************************************************************************************************************************************/
  391. /************************************************************* HTTP Global Function Exports **********************************************************/
  392. /*****************************************************************************************************************************************************/
  393. HPSOCKET_API int SYS_Compress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  394. {
  395. return ::Compress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  396. }
  397. HPSOCKET_API int SYS_CompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iLevel, int iMethod, int iWindowBits, int iMemLevel, int iStrategy)
  398. {
  399. return ::CompressEx(lpszSrc, dwSrcLen, lpszDest, dwDestLen, iLevel, iMethod, iWindowBits, iMemLevel, iStrategy);
  400. }
  401. HPSOCKET_API int SYS_Uncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  402. {
  403. return ::Uncompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  404. }
  405. HPSOCKET_API int SYS_UncompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iWindowBits)
  406. {
  407. return ::UncompressEx(lpszSrc, dwSrcLen, lpszDest, dwDestLen, iWindowBits);
  408. }
  409. HPSOCKET_API DWORD SYS_GuessCompressBound(DWORD dwSrcLen, BOOL bGZip)
  410. {
  411. return ::GuessCompressBound(dwSrcLen, bGZip);
  412. }
  413. HPSOCKET_API int SYS_GZipCompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  414. {
  415. return ::GZipCompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  416. }
  417. HPSOCKET_API int SYS_GZipUncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen)
  418. {
  419. return ::GZipUncompress(lpszSrc, dwSrcLen, lpszDest, dwDestLen);
  420. }
  421. HPSOCKET_API DWORD SYS_GZipGuessUncompressBound(const BYTE* lpszSrc, DWORD dwSrcLen)
  422. {
  423. return ::GZipGuessUncompressBound(lpszSrc, dwSrcLen);
  424. }
  425. #endif