SocketObject4C.h 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Author : Bruce Liang
  5. * Website : https://github.com/ldcsaa
  6. * Project : https://github.com/ldcsaa/HP-Socket
  7. * Blog : http://www.cnblogs.com/ldcsaa
  8. * Wiki : http://www.oschina.net/p/hp-socket
  9. * QQ Group : 44636872, 75375912
  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. #pragma once
  24. #include "hpsocket/HPSocket4C.h"
  25. #include "hpsocket/SocketInterface.h"
  26. #include "common/FuncHelper.h"
  27. class C_HP_Object
  28. {
  29. public:
  30. template<class T> static inline HP_Object FromFirst(T* pFirst)
  31. {
  32. return (HP_Object)((char*)pFirst - first);
  33. }
  34. template<class T> static inline T* ToFirst(HP_Object pObject)
  35. {
  36. return (T*)((char*)pObject + first);
  37. }
  38. template<size_t offset, class T> static inline HP_Object FromSecond(T* pSecond)
  39. {
  40. return (C_HP_Object*)((char*)pSecond - first - (offset + __DUAL_VPTR_GAP__));
  41. }
  42. template<class T> static inline T* ToSecond(HP_Object pObject)
  43. {
  44. return (T*)((char*)pObject + ((C_HP_Object*)pObject)->second);
  45. }
  46. public:
  47. C_HP_Object(int offset = 0) : second(first + (offset + __DUAL_VPTR_GAP__)) {}
  48. virtual ~C_HP_Object() {}
  49. private:
  50. static const size_t first = (sizeof(PVOID) + sizeof(size_t));
  51. size_t second;
  52. };
  53. template<class T, class L, int offset = 0> class C_HP_ObjectT : private C_HP_Object, public T
  54. {
  55. public:
  56. C_HP_ObjectT(L* pListener) : C_HP_Object(offset), T(pListener) {}
  57. };
  58. template<class T, class L, size_t offset = 0> class C_HP_ServerListenerT : public L
  59. {
  60. public:
  61. virtual EnHandleResult OnPrepareListen(T* pSender, SOCKET soListen)
  62. {
  63. return (m_fnOnPrepareListen)
  64. ? m_fnOnPrepareListen(C_HP_Object::FromSecond<offset>(pSender), soListen)
  65. : HR_IGNORE;
  66. }
  67. virtual EnHandleResult OnAccept(T* pSender, CONNID dwConnID, UINT_PTR soClient)
  68. {
  69. return (m_fnOnAccept)
  70. ? m_fnOnAccept(C_HP_Object::FromSecond<offset>(pSender), dwConnID, soClient)
  71. : HR_IGNORE;
  72. }
  73. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID)
  74. {
  75. return (m_fnOnHandShake)
  76. ? m_fnOnHandShake(C_HP_Object::FromSecond<offset>(pSender), dwConnID)
  77. : HR_IGNORE;
  78. }
  79. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  80. {
  81. return (m_fnOnSend)
  82. ? m_fnOnSend(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  83. : HR_IGNORE;
  84. }
  85. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  86. {
  87. ASSERT(m_fnOnReceive);
  88. return (m_fnOnReceive)
  89. ? m_fnOnReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  90. : HR_IGNORE;
  91. }
  92. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength)
  93. {
  94. ASSERT(m_fnOnPullReceive);
  95. return (m_fnOnPullReceive)
  96. ? m_fnOnPullReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, iLength)
  97. : HR_IGNORE;
  98. }
  99. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  100. {
  101. ASSERT(m_fnOnClose);
  102. return (m_fnOnClose)
  103. ? m_fnOnClose(C_HP_Object::FromSecond<offset>(pSender), dwConnID, enOperation, iErrorCode)
  104. : HR_IGNORE;
  105. }
  106. virtual EnHandleResult OnShutdown(T* pSender)
  107. {
  108. return (m_fnOnShutdown)
  109. ? m_fnOnShutdown(C_HP_Object::FromSecond<offset>(pSender))
  110. : HR_IGNORE;
  111. }
  112. public:
  113. C_HP_ServerListenerT()
  114. : m_fnOnPrepareListen (nullptr)
  115. , m_fnOnAccept (nullptr)
  116. , m_fnOnHandShake (nullptr)
  117. , m_fnOnSend (nullptr)
  118. , m_fnOnReceive (nullptr)
  119. , m_fnOnPullReceive (nullptr)
  120. , m_fnOnClose (nullptr)
  121. , m_fnOnShutdown (nullptr)
  122. {
  123. }
  124. public:
  125. HP_FN_Server_OnPrepareListen m_fnOnPrepareListen ;
  126. HP_FN_Server_OnAccept m_fnOnAccept ;
  127. HP_FN_Server_OnHandShake m_fnOnHandShake ;
  128. HP_FN_Server_OnSend m_fnOnSend ;
  129. HP_FN_Server_OnReceive m_fnOnReceive ;
  130. HP_FN_Server_OnPullReceive m_fnOnPullReceive ;
  131. HP_FN_Server_OnClose m_fnOnClose ;
  132. HP_FN_Server_OnShutdown m_fnOnShutdown ;
  133. };
  134. template<class T, class L, size_t offset = 0> class C_HP_AgentListenerT : public L
  135. {
  136. public:
  137. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket)
  138. {
  139. return (m_fnOnPrepareConnect)
  140. ? m_fnOnPrepareConnect(C_HP_Object::FromSecond<offset>(pSender), dwConnID, socket)
  141. : HR_IGNORE;
  142. }
  143. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID)
  144. {
  145. return (m_fnOnConnect)
  146. ? m_fnOnConnect(C_HP_Object::FromSecond<offset>(pSender), dwConnID)
  147. : HR_IGNORE;
  148. }
  149. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID)
  150. {
  151. return (m_fnOnHandShake)
  152. ? m_fnOnHandShake(C_HP_Object::FromSecond<offset>(pSender), dwConnID)
  153. : HR_IGNORE;
  154. }
  155. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  156. {
  157. return (m_fnOnSend)
  158. ? m_fnOnSend(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  159. : HR_IGNORE;
  160. }
  161. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  162. {
  163. ASSERT(m_fnOnReceive);
  164. return (m_fnOnReceive)
  165. ? m_fnOnReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  166. : HR_IGNORE;
  167. }
  168. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength)
  169. {
  170. ASSERT(m_fnOnPullReceive);
  171. return (m_fnOnPullReceive)
  172. ? m_fnOnPullReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, iLength)
  173. : HR_IGNORE;
  174. }
  175. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  176. {
  177. ASSERT(m_fnOnClose);
  178. return (m_fnOnClose)
  179. ? m_fnOnClose(C_HP_Object::FromSecond<offset>(pSender), dwConnID, enOperation, iErrorCode)
  180. : HR_IGNORE;
  181. }
  182. virtual EnHandleResult OnShutdown(T* pSender)
  183. {
  184. return (m_fnOnShutdown)
  185. ? m_fnOnShutdown(C_HP_Object::FromSecond<offset>(pSender))
  186. : HR_IGNORE;
  187. }
  188. public:
  189. C_HP_AgentListenerT()
  190. : m_fnOnPrepareConnect (nullptr)
  191. , m_fnOnConnect (nullptr)
  192. , m_fnOnHandShake (nullptr)
  193. , m_fnOnSend (nullptr)
  194. , m_fnOnReceive (nullptr)
  195. , m_fnOnPullReceive (nullptr)
  196. , m_fnOnClose (nullptr)
  197. , m_fnOnShutdown (nullptr)
  198. {
  199. }
  200. public:
  201. HP_FN_Agent_OnPrepareConnect m_fnOnPrepareConnect;
  202. HP_FN_Agent_OnConnect m_fnOnConnect ;
  203. HP_FN_Agent_OnHandShake m_fnOnHandShake ;
  204. HP_FN_Agent_OnSend m_fnOnSend ;
  205. HP_FN_Agent_OnReceive m_fnOnReceive ;
  206. HP_FN_Agent_OnPullReceive m_fnOnPullReceive ;
  207. HP_FN_Agent_OnClose m_fnOnClose ;
  208. HP_FN_Agent_OnShutdown m_fnOnShutdown ;
  209. };
  210. template<class T, class L, size_t offset = 0> class C_HP_ClientListenerT : public L
  211. {
  212. public:
  213. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket)
  214. {
  215. return (m_fnOnPrepareConnect)
  216. ? m_fnOnPrepareConnect(C_HP_Object::FromSecond<offset>(pSender), dwConnID, socket)
  217. : HR_IGNORE;
  218. }
  219. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID)
  220. {
  221. return (m_fnOnConnect)
  222. ? m_fnOnConnect(C_HP_Object::FromSecond<offset>(pSender), dwConnID)
  223. : HR_IGNORE;
  224. }
  225. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID)
  226. {
  227. return (m_fnOnHandShake)
  228. ? m_fnOnHandShake(C_HP_Object::FromSecond<offset>(pSender), dwConnID)
  229. : HR_IGNORE;
  230. }
  231. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  232. {
  233. return (m_fnOnSend)
  234. ? m_fnOnSend(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  235. : HR_IGNORE;
  236. }
  237. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  238. {
  239. ASSERT(m_fnOnReceive);
  240. return (m_fnOnReceive)
  241. ? m_fnOnReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, pData, iLength)
  242. : HR_IGNORE;
  243. }
  244. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength)
  245. {
  246. ASSERT(m_fnOnPullReceive);
  247. return (m_fnOnPullReceive)
  248. ? m_fnOnPullReceive(C_HP_Object::FromSecond<offset>(pSender), dwConnID, iLength)
  249. : HR_IGNORE;
  250. }
  251. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  252. {
  253. ASSERT(m_fnOnClose);
  254. return (m_fnOnClose)
  255. ? m_fnOnClose(C_HP_Object::FromSecond<offset>(pSender), dwConnID, enOperation, iErrorCode)
  256. : HR_IGNORE;
  257. }
  258. public:
  259. C_HP_ClientListenerT()
  260. : m_fnOnPrepareConnect (nullptr)
  261. , m_fnOnConnect (nullptr)
  262. , m_fnOnHandShake (nullptr)
  263. , m_fnOnSend (nullptr)
  264. , m_fnOnReceive (nullptr)
  265. , m_fnOnPullReceive (nullptr)
  266. , m_fnOnClose (nullptr)
  267. {
  268. }
  269. public:
  270. HP_FN_Client_OnPrepareConnect m_fnOnPrepareConnect;
  271. HP_FN_Client_OnConnect m_fnOnConnect ;
  272. HP_FN_Client_OnHandShake m_fnOnHandShake ;
  273. HP_FN_Client_OnSend m_fnOnSend ;
  274. HP_FN_Client_OnReceive m_fnOnReceive ;
  275. HP_FN_Client_OnPullReceive m_fnOnPullReceive ;
  276. HP_FN_Client_OnClose m_fnOnClose ;
  277. };
  278. typedef C_HP_ServerListenerT<ITcpServer, ITcpServerListener> C_HP_TcpServerListener;
  279. typedef C_HP_ServerListenerT<ITcpServer, ITcpServerListener, sizeof(IPullSocket)> C_HP_TcpPullServerListener;
  280. typedef C_HP_ServerListenerT<ITcpServer, ITcpServerListener, sizeof(IPackSocket)> C_HP_TcpPackServerListener;
  281. typedef C_HP_AgentListenerT<ITcpAgent, ITcpAgentListener> C_HP_TcpAgentListener;
  282. typedef C_HP_AgentListenerT<ITcpAgent, ITcpAgentListener, sizeof(IPullSocket)> C_HP_TcpPullAgentListener;
  283. typedef C_HP_AgentListenerT<ITcpAgent, ITcpAgentListener, sizeof(IPackSocket)> C_HP_TcpPackAgentListener;
  284. typedef C_HP_ClientListenerT<ITcpClient, ITcpClientListener> C_HP_TcpClientListener;
  285. typedef C_HP_ClientListenerT<ITcpClient, ITcpClientListener, sizeof(IPullClient)> C_HP_TcpPullClientListener;
  286. typedef C_HP_ClientListenerT<ITcpClient, ITcpClientListener, sizeof(IPackClient)> C_HP_TcpPackClientListener;
  287. #ifdef _UDP_SUPPORT
  288. template<class T, class L, size_t offset = 0> class C_HP_UdpNodeListenerT : public L
  289. {
  290. public:
  291. virtual EnHandleResult OnPrepareListen(T* pSender, SOCKET soListen)
  292. {
  293. return (m_fnOnPrepareListen)
  294. ? m_fnOnPrepareListen(C_HP_Object::FromSecond<offset>(pSender), soListen)
  295. : HR_IGNORE;
  296. }
  297. virtual EnHandleResult OnSend(T* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength)
  298. {
  299. return (m_fnOnSend)
  300. ? m_fnOnSend(C_HP_Object::FromSecond<offset>(pSender), lpszRemoteAddress, usRemotePort, pData, iLength)
  301. : HR_IGNORE;
  302. }
  303. virtual EnHandleResult OnReceive(T* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength)
  304. {
  305. ASSERT(m_fnOnReceive);
  306. return (m_fnOnReceive)
  307. ? m_fnOnReceive(C_HP_Object::FromSecond<offset>(pSender), lpszRemoteAddress, usRemotePort, pData, iLength)
  308. : HR_IGNORE;
  309. }
  310. virtual EnHandleResult OnError(T* pSender, EnSocketOperation enOperation, int iErrorCode, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength)
  311. {
  312. ASSERT(m_fnOnError);
  313. return (m_fnOnError)
  314. ? m_fnOnError(C_HP_Object::FromSecond<offset>(pSender), enOperation, iErrorCode, lpszRemoteAddress, usRemotePort, pData, iLength)
  315. : HR_IGNORE;
  316. }
  317. virtual EnHandleResult OnShutdown(T* pSender)
  318. {
  319. return (m_fnOnShutdown)
  320. ? m_fnOnShutdown(C_HP_Object::FromSecond<offset>(pSender))
  321. : HR_IGNORE;
  322. }
  323. public:
  324. C_HP_UdpNodeListenerT()
  325. : m_fnOnPrepareListen (nullptr)
  326. , m_fnOnSend (nullptr)
  327. , m_fnOnReceive (nullptr)
  328. , m_fnOnError (nullptr)
  329. , m_fnOnShutdown (nullptr)
  330. {
  331. }
  332. public:
  333. HP_FN_UdpNode_OnPrepareListen m_fnOnPrepareListen ;
  334. HP_FN_UdpNode_OnSend m_fnOnSend ;
  335. HP_FN_UdpNode_OnReceive m_fnOnReceive ;
  336. HP_FN_UdpNode_OnError m_fnOnError ;
  337. HP_FN_UdpNode_OnShutdown m_fnOnShutdown ;
  338. };
  339. typedef C_HP_ServerListenerT<IUdpServer, IUdpServerListener> C_HP_UdpServerListener;
  340. typedef C_HP_ClientListenerT<IUdpClient, IUdpClientListener> C_HP_UdpClientListener;
  341. typedef C_HP_ClientListenerT<IUdpCast, IUdpCastListener> C_HP_UdpCastListener;
  342. typedef C_HP_UdpNodeListenerT<IUdpNode, IUdpNodeListener> C_HP_UdpNodeListener;
  343. typedef C_HP_ServerListenerT<IUdpServer, IUdpServerListener, sizeof(IArqSocket)> C_HP_UdpArqServerListener;
  344. typedef C_HP_ClientListenerT<IUdpClient, IUdpClientListener, sizeof(IArqClient)> C_HP_UdpArqClientListener;
  345. #endif
  346. #ifdef _HTTP_SUPPORT
  347. template<class T> class C_HP_HttpListenerT : public IHttpListenerT<T>
  348. {
  349. public:
  350. virtual EnHttpParseResult OnMessageBegin(T* pSender, CONNID dwConnID)
  351. {
  352. return (m_fnOnMessageBegin)
  353. ? m_fnOnMessageBegin(C_HP_Object::FromFirst(pSender), dwConnID)
  354. : HPR_OK;
  355. }
  356. virtual EnHttpParseResult OnRequestLine(T* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  357. {
  358. return (m_fnOnRequestLine)
  359. ? m_fnOnRequestLine(C_HP_Object::FromFirst(pSender), dwConnID, lpszMethod, lpszUrl)
  360. : HPR_OK;
  361. }
  362. virtual EnHttpParseResult OnStatusLine(T* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  363. {
  364. return (m_fnOnStatusLine)
  365. ? m_fnOnStatusLine(C_HP_Object::FromFirst(pSender), dwConnID, usStatusCode, lpszDesc)
  366. : HPR_OK;
  367. }
  368. virtual EnHttpParseResult OnHeader(T* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  369. {
  370. return (m_fnOnHeader)
  371. ? m_fnOnHeader(C_HP_Object::FromFirst(pSender), dwConnID, lpszName, lpszValue)
  372. : HPR_OK;
  373. }
  374. virtual EnHttpParseResult OnHeadersComplete(T* pSender, CONNID dwConnID)
  375. {
  376. ASSERT(m_fnOnHeadersComplete);
  377. return (m_fnOnHeadersComplete)
  378. ? m_fnOnHeadersComplete(C_HP_Object::FromFirst(pSender), dwConnID)
  379. : HPR_OK;
  380. }
  381. virtual EnHttpParseResult OnBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  382. {
  383. ASSERT(m_fnOnBody);
  384. return (m_fnOnBody)
  385. ? m_fnOnBody(C_HP_Object::FromFirst(pSender), dwConnID, pData, iLength)
  386. : HPR_OK;
  387. }
  388. virtual EnHttpParseResult OnChunkHeader(T* pSender, CONNID dwConnID, int iLength)
  389. {
  390. return (m_fnOnChunkHeader)
  391. ? m_fnOnChunkHeader(C_HP_Object::FromFirst(pSender), dwConnID, iLength)
  392. : HPR_OK;
  393. }
  394. virtual EnHttpParseResult OnChunkComplete(T* pSender, CONNID dwConnID)
  395. {
  396. return (m_fnOnChunkComplete)
  397. ? m_fnOnChunkComplete(C_HP_Object::FromFirst(pSender), dwConnID)
  398. : HPR_OK;
  399. }
  400. virtual EnHttpParseResult OnMessageComplete(T* pSender, CONNID dwConnID)
  401. {
  402. ASSERT(m_fnOnMessageComplete);
  403. return (m_fnOnMessageComplete)
  404. ? m_fnOnMessageComplete(C_HP_Object::FromFirst(pSender), dwConnID)
  405. : HPR_OK;
  406. }
  407. virtual EnHttpParseResult OnUpgrade(T* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  408. {
  409. return (m_fnOnUpgrade)
  410. ? m_fnOnUpgrade(C_HP_Object::FromFirst(pSender), dwConnID, enUpgradeType)
  411. : HPR_OK;
  412. }
  413. virtual EnHttpParseResult OnParseError(T* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  414. {
  415. ASSERT(m_fnOnParseError);
  416. return (m_fnOnParseError)
  417. ? m_fnOnParseError(C_HP_Object::FromFirst(pSender), dwConnID, iErrorCode, lpszErrorDesc)
  418. : HPR_OK;
  419. }
  420. virtual EnHandleResult OnWSMessageHeader(T* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen)
  421. {
  422. return (m_fnOnWSMessageHeader)
  423. ? m_fnOnWSMessageHeader(C_HP_Object::FromFirst(pSender), dwConnID, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen)
  424. : HR_OK;
  425. }
  426. virtual EnHandleResult OnWSMessageBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  427. {
  428. return (m_fnOnWSMessageBody)
  429. ? m_fnOnWSMessageBody(C_HP_Object::FromFirst(pSender), dwConnID, pData, iLength)
  430. : HR_OK;
  431. }
  432. virtual EnHandleResult OnWSMessageComplete(T* pSender, CONNID dwConnID)
  433. {
  434. return (m_fnOnWSMessageComplete)
  435. ? m_fnOnWSMessageComplete(C_HP_Object::FromFirst(pSender), dwConnID)
  436. : HR_OK;
  437. }
  438. public:
  439. C_HP_HttpListenerT()
  440. : m_fnOnMessageBegin (nullptr)
  441. , m_fnOnRequestLine (nullptr)
  442. , m_fnOnStatusLine (nullptr)
  443. , m_fnOnHeader (nullptr)
  444. , m_fnOnHeadersComplete (nullptr)
  445. , m_fnOnBody (nullptr)
  446. , m_fnOnChunkHeader (nullptr)
  447. , m_fnOnChunkComplete (nullptr)
  448. , m_fnOnMessageComplete (nullptr)
  449. , m_fnOnUpgrade (nullptr)
  450. , m_fnOnParseError (nullptr)
  451. , m_fnOnWSMessageHeader (nullptr)
  452. , m_fnOnWSMessageBody (nullptr)
  453. , m_fnOnWSMessageComplete(nullptr)
  454. {
  455. }
  456. public:
  457. HP_FN_Http_OnMessageBegin m_fnOnMessageBegin ;
  458. HP_FN_Http_OnRequestLine m_fnOnRequestLine ;
  459. HP_FN_Http_OnStatusLine m_fnOnStatusLine ;
  460. HP_FN_Http_OnHeader m_fnOnHeader ;
  461. HP_FN_Http_OnHeadersComplete m_fnOnHeadersComplete ;
  462. HP_FN_Http_OnBody m_fnOnBody ;
  463. HP_FN_Http_OnChunkHeader m_fnOnChunkHeader ;
  464. HP_FN_Http_OnChunkComplete m_fnOnChunkComplete ;
  465. HP_FN_Http_OnMessageComplete m_fnOnMessageComplete ;
  466. HP_FN_Http_OnUpgrade m_fnOnUpgrade ;
  467. HP_FN_Http_OnParseError m_fnOnParseError ;
  468. HP_FN_Http_OnWSMessageHeader m_fnOnWSMessageHeader ;
  469. HP_FN_Http_OnWSMessageBody m_fnOnWSMessageBody ;
  470. HP_FN_Http_OnWSMessageComplete m_fnOnWSMessageComplete ;
  471. };
  472. typedef C_HP_HttpListenerT<IHttpServer> C_HP_HttpServerBaseListener1;
  473. typedef C_HP_HttpListenerT<IHttpAgent> C_HP_HttpAgentBaseListener1;
  474. typedef C_HP_HttpListenerT<IHttpClient> C_HP_HttpClientBaseListener1;
  475. typedef C_HP_ServerListenerT<ITcpServer, ITcpServerListener, sizeof(IComplexHttpResponder)> C_HP_HttpServerBaseListener2;
  476. typedef C_HP_AgentListenerT<ITcpAgent, ITcpAgentListener, sizeof(IComplexHttpRequester)> C_HP_HttpAgentBaseListener2;
  477. typedef C_HP_ClientListenerT<ITcpClient, ITcpClientListener, sizeof(IHttpRequester)> C_HP_HttpClientBaseListener2;
  478. class C_HP_HttpServerListener : public IHttpServerListener
  479. {
  480. public:
  481. virtual EnHttpParseResult OnMessageBegin(IHttpServer* pSender, CONNID dwConnID)
  482. {return m_lsnHttp.OnMessageBegin(pSender, dwConnID);}
  483. virtual EnHttpParseResult OnRequestLine(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  484. {return m_lsnHttp.OnRequestLine(pSender, dwConnID, lpszMethod, lpszUrl);}
  485. virtual EnHttpParseResult OnStatusLine(IHttpServer* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  486. {return m_lsnHttp.OnStatusLine(pSender, dwConnID, usStatusCode, lpszDesc);}
  487. virtual EnHttpParseResult OnHeader(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  488. {return m_lsnHttp.OnHeader(pSender, dwConnID, lpszName, lpszValue);}
  489. virtual EnHttpParseResult OnHeadersComplete(IHttpServer* pSender, CONNID dwConnID)
  490. {return m_lsnHttp.OnHeadersComplete(pSender, dwConnID);}
  491. virtual EnHttpParseResult OnBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  492. {return m_lsnHttp.OnBody(pSender, dwConnID, pData, iLength);}
  493. virtual EnHttpParseResult OnChunkHeader(IHttpServer* pSender, CONNID dwConnID, int iLength)
  494. {return m_lsnHttp.OnChunkHeader(pSender, dwConnID, iLength);}
  495. virtual EnHttpParseResult OnChunkComplete(IHttpServer* pSender, CONNID dwConnID)
  496. {return m_lsnHttp.OnChunkComplete(pSender, dwConnID);}
  497. virtual EnHttpParseResult OnMessageComplete(IHttpServer* pSender, CONNID dwConnID)
  498. {return m_lsnHttp.OnMessageComplete(pSender, dwConnID);}
  499. virtual EnHttpParseResult OnUpgrade(IHttpServer* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  500. {return m_lsnHttp.OnUpgrade(pSender, dwConnID, enUpgradeType);}
  501. virtual EnHttpParseResult OnParseError(IHttpServer* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  502. {return m_lsnHttp.OnParseError(pSender, dwConnID, iErrorCode, lpszErrorDesc);}
  503. virtual EnHandleResult OnWSMessageHeader(IHttpServer* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen)
  504. {return m_lsnHttp.OnWSMessageHeader(pSender, dwConnID, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen);}
  505. virtual EnHandleResult OnWSMessageBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  506. {return m_lsnHttp.OnWSMessageBody(pSender, dwConnID, pData, iLength);}
  507. virtual EnHandleResult OnWSMessageComplete(IHttpServer* pSender, CONNID dwConnID)
  508. {return m_lsnHttp.OnWSMessageComplete(pSender, dwConnID);}
  509. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen)
  510. {return m_lsnServer.OnPrepareListen(pSender, soListen);}
  511. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient)
  512. {return m_lsnServer.OnAccept(pSender, dwConnID, soClient);}
  513. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID)
  514. {return m_lsnServer.OnHandShake(pSender, dwConnID);}
  515. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  516. {return m_lsnServer.OnSend(pSender, dwConnID, pData, iLength);}
  517. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  518. {return m_lsnServer.OnReceive(pSender, dwConnID, pData, iLength);}
  519. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength)
  520. {return m_lsnServer.OnReceive(pSender, dwConnID, iLength);}
  521. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  522. {return m_lsnServer.OnClose(pSender, dwConnID, enOperation, iErrorCode);}
  523. virtual EnHandleResult OnShutdown(ITcpServer* pSender)
  524. {return m_lsnServer.OnShutdown(pSender);}
  525. public:
  526. C_HP_HttpServerBaseListener1 m_lsnHttp;
  527. C_HP_HttpServerBaseListener2 m_lsnServer;
  528. };
  529. class C_HP_HttpAgentListener : public IHttpAgentListener
  530. {
  531. public:
  532. virtual EnHttpParseResult OnMessageBegin(IHttpAgent* pSender, CONNID dwConnID)
  533. {return m_lsnHttp.OnMessageBegin(pSender, dwConnID);}
  534. virtual EnHttpParseResult OnRequestLine(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  535. {return m_lsnHttp.OnRequestLine(pSender, dwConnID, lpszMethod, lpszUrl);}
  536. virtual EnHttpParseResult OnStatusLine(IHttpAgent* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  537. {return m_lsnHttp.OnStatusLine(pSender, dwConnID, usStatusCode, lpszDesc);}
  538. virtual EnHttpParseResult OnHeader(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  539. {return m_lsnHttp.OnHeader(pSender, dwConnID, lpszName, lpszValue);}
  540. virtual EnHttpParseResult OnHeadersComplete(IHttpAgent* pSender, CONNID dwConnID)
  541. {return m_lsnHttp.OnHeadersComplete(pSender, dwConnID);}
  542. virtual EnHttpParseResult OnBody(IHttpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  543. {return m_lsnHttp.OnBody(pSender, dwConnID, pData, iLength);}
  544. virtual EnHttpParseResult OnChunkHeader(IHttpAgent* pSender, CONNID dwConnID, int iLength)
  545. {return m_lsnHttp.OnChunkHeader(pSender, dwConnID, iLength);}
  546. virtual EnHttpParseResult OnChunkComplete(IHttpAgent* pSender, CONNID dwConnID)
  547. {return m_lsnHttp.OnChunkComplete(pSender, dwConnID);}
  548. virtual EnHttpParseResult OnMessageComplete(IHttpAgent* pSender, CONNID dwConnID)
  549. {return m_lsnHttp.OnMessageComplete(pSender, dwConnID);}
  550. virtual EnHttpParseResult OnUpgrade(IHttpAgent* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  551. {return m_lsnHttp.OnUpgrade(pSender, dwConnID, enUpgradeType);}
  552. virtual EnHttpParseResult OnParseError(IHttpAgent* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  553. {return m_lsnHttp.OnParseError(pSender, dwConnID, iErrorCode, lpszErrorDesc);}
  554. virtual EnHandleResult OnWSMessageHeader(IHttpAgent* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen)
  555. {return m_lsnHttp.OnWSMessageHeader(pSender, dwConnID, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen);}
  556. virtual EnHandleResult OnWSMessageBody(IHttpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  557. {return m_lsnHttp.OnWSMessageBody(pSender, dwConnID, pData, iLength);}
  558. virtual EnHandleResult OnWSMessageComplete(IHttpAgent* pSender, CONNID dwConnID)
  559. {return m_lsnHttp.OnWSMessageComplete(pSender, dwConnID);}
  560. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket)
  561. {return m_lsnAgent.OnPrepareConnect(pSender, dwConnID, socket);}
  562. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID)
  563. {return m_lsnAgent.OnConnect(pSender, dwConnID);}
  564. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID)
  565. {return m_lsnAgent.OnHandShake(pSender, dwConnID);}
  566. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  567. {return m_lsnAgent.OnSend(pSender, dwConnID, pData, iLength);}
  568. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  569. {return m_lsnAgent.OnReceive(pSender, dwConnID, pData, iLength);}
  570. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength)
  571. {return m_lsnAgent.OnReceive(pSender, dwConnID, iLength);}
  572. virtual EnHandleResult OnClose(ITcpAgent* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  573. {return m_lsnAgent.OnClose(pSender, dwConnID, enOperation, iErrorCode);}
  574. virtual EnHandleResult OnShutdown(ITcpAgent* pSender)
  575. {return m_lsnAgent.OnShutdown(pSender);}
  576. public:
  577. C_HP_HttpAgentBaseListener1 m_lsnHttp;
  578. C_HP_HttpAgentBaseListener2 m_lsnAgent;
  579. };
  580. class C_HP_HttpClientListener : public IHttpClientListener
  581. {
  582. public:
  583. virtual EnHttpParseResult OnMessageBegin(IHttpClient* pSender, CONNID dwConnID)
  584. {return m_lsnHttp.OnMessageBegin(pSender, dwConnID);}
  585. virtual EnHttpParseResult OnRequestLine(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  586. {return m_lsnHttp.OnRequestLine(pSender, dwConnID, lpszMethod, lpszUrl);}
  587. virtual EnHttpParseResult OnStatusLine(IHttpClient* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  588. {return m_lsnHttp.OnStatusLine(pSender, dwConnID, usStatusCode, lpszDesc);}
  589. virtual EnHttpParseResult OnHeader(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  590. {return m_lsnHttp.OnHeader(pSender, dwConnID, lpszName, lpszValue);}
  591. virtual EnHttpParseResult OnHeadersComplete(IHttpClient* pSender, CONNID dwConnID)
  592. {return m_lsnHttp.OnHeadersComplete(pSender, dwConnID);}
  593. virtual EnHttpParseResult OnBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  594. {return m_lsnHttp.OnBody(pSender, dwConnID, pData, iLength);}
  595. virtual EnHttpParseResult OnChunkHeader(IHttpClient* pSender, CONNID dwConnID, int iLength)
  596. {return m_lsnHttp.OnChunkHeader(pSender, dwConnID, iLength);}
  597. virtual EnHttpParseResult OnChunkComplete(IHttpClient* pSender, CONNID dwConnID)
  598. {return m_lsnHttp.OnChunkComplete(pSender, dwConnID);}
  599. virtual EnHttpParseResult OnMessageComplete(IHttpClient* pSender, CONNID dwConnID)
  600. {return m_lsnHttp.OnMessageComplete(pSender, dwConnID);}
  601. virtual EnHttpParseResult OnUpgrade(IHttpClient* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  602. {return m_lsnHttp.OnUpgrade(pSender, dwConnID, enUpgradeType);}
  603. virtual EnHttpParseResult OnParseError(IHttpClient* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  604. {return m_lsnHttp.OnParseError(pSender, dwConnID, iErrorCode, lpszErrorDesc);}
  605. virtual EnHandleResult OnWSMessageHeader(IHttpClient* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen)
  606. {return m_lsnHttp.OnWSMessageHeader(pSender, dwConnID, bFinal, iReserved, iOperationCode, lpszMask, ullBodyLen);}
  607. virtual EnHandleResult OnWSMessageBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  608. {return m_lsnHttp.OnWSMessageBody(pSender, dwConnID, pData, iLength);}
  609. virtual EnHandleResult OnWSMessageComplete(IHttpClient* pSender, CONNID dwConnID)
  610. {return m_lsnHttp.OnWSMessageComplete(pSender, dwConnID);}
  611. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket)
  612. {return m_lsnClient.OnPrepareConnect(pSender, dwConnID, socket);}
  613. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID)
  614. {return m_lsnClient.OnConnect(pSender, dwConnID);}
  615. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID)
  616. {return m_lsnClient.OnHandShake(pSender, dwConnID);}
  617. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  618. {return m_lsnClient.OnSend(pSender, dwConnID, pData, iLength);}
  619. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
  620. {return m_lsnClient.OnReceive(pSender, dwConnID, pData, iLength);}
  621. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength)
  622. {return m_lsnClient.OnReceive(pSender, dwConnID, iLength);}
  623. virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  624. {return m_lsnClient.OnClose(pSender, dwConnID, enOperation, iErrorCode);}
  625. public:
  626. C_HP_HttpClientBaseListener1 m_lsnHttp;
  627. C_HP_HttpClientBaseListener2 m_lsnClient;
  628. };
  629. #endif
  630. class C_HP_ThreadPoolListener : public IHPThreadPoolListener
  631. {
  632. public:
  633. virtual void OnStartup(IHPThreadPool* pThreadPool)
  634. {
  635. if(m_fnOnStartup)
  636. m_fnOnStartup((HP_ThreadPool)pThreadPool);
  637. }
  638. virtual void OnShutdown(IHPThreadPool* pThreadPool)
  639. {
  640. if(m_fnOnShutdown)
  641. m_fnOnShutdown((HP_ThreadPool)pThreadPool);
  642. }
  643. virtual void OnWorkerThreadStart(IHPThreadPool* pThreadPool, THR_ID dwThreadID)
  644. {
  645. if(m_fnOnWorkerThreadStart)
  646. m_fnOnWorkerThreadStart((HP_ThreadPool)pThreadPool, dwThreadID);
  647. }
  648. virtual void OnWorkerThreadEnd(IHPThreadPool* pThreadPool, THR_ID dwThreadID)
  649. {
  650. if(m_fnOnWorkerThreadEnd)
  651. m_fnOnWorkerThreadEnd((HP_ThreadPool)pThreadPool, dwThreadID);
  652. }
  653. public:
  654. C_HP_ThreadPoolListener()
  655. : m_fnOnStartup (nullptr)
  656. , m_fnOnShutdown (nullptr)
  657. , m_fnOnWorkerThreadStart (nullptr)
  658. , m_fnOnWorkerThreadEnd (nullptr)
  659. {
  660. }
  661. public:
  662. HP_FN_ThreadPool_OnStartup m_fnOnStartup;
  663. HP_FN_ThreadPool_OnShutdown m_fnOnShutdown;
  664. HP_FN_ThreadPool_OnWorkerThreadStart m_fnOnWorkerThreadStart;
  665. HP_FN_ThreadPool_OnWorkerThreadEnd m_fnOnWorkerThreadEnd;
  666. };