SocketObject4C.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 3.6.1
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. #pragma once
  25. #include "HPSocket4C.h"
  26. #include "SocketInterface.h"
  27. class C_HP_Object
  28. {
  29. public:
  30. template<class T> static inline T* ToFirst(HP_Object pObject)
  31. {
  32. return (T*)((char*)pObject + first);
  33. }
  34. template<class T> static inline T* ToSecond(HP_Object pObject)
  35. {
  36. return (T*)((char*)pObject + ((C_HP_Object*)pObject)->second);
  37. }
  38. template<class T> static inline HP_Object FromFirst(T* pFirst)
  39. {
  40. return (HP_Object)((char*)pFirst - first);
  41. }
  42. template<class T> static inline HP_Object FromSecond(T* pSecond)
  43. {
  44. C_HP_Object* pObj = (C_HP_Object*)((char*)pSecond - first);
  45. if(pObj->second != first)
  46. {
  47. pObj = (C_HP_Object*)((char*)pObj - sizeof(HP_Object));
  48. ASSERT(pObj->second == first + sizeof(HP_Object));
  49. }
  50. return (HP_Object)pObj;
  51. }
  52. public:
  53. C_HP_Object(int offset = 0) : second(first + offset) {}
  54. virtual ~C_HP_Object() {}
  55. private:
  56. static const size_t first = (sizeof(PVOID) + sizeof(size_t));
  57. size_t second;
  58. };
  59. template<class T, class L, int offset = 0> class C_HP_ObjectT : private C_HP_Object, public T
  60. {
  61. public:
  62. C_HP_ObjectT(L* pListener) : C_HP_Object(offset), T(pListener) {}
  63. };
  64. class C_HP_ServerListener : public IServerListener
  65. {
  66. public:
  67. virtual EnHandleResult OnPrepareListen(UINT_PTR soListen)
  68. {
  69. return (m_fnOnPrepareListen)
  70. ? m_fnOnPrepareListen(soListen)
  71. : HR_IGNORE;
  72. }
  73. virtual EnHandleResult OnAccept(CONNID dwConnID, UINT_PTR soClient)
  74. {
  75. return (m_fnOnAccept)
  76. ? m_fnOnAccept(dwConnID, soClient)
  77. : HR_IGNORE;
  78. }
  79. virtual EnHandleResult OnHandShake(CONNID dwConnID)
  80. {
  81. return (m_fnOnHandShake)
  82. ? m_fnOnHandShake(dwConnID)
  83. : HR_IGNORE;
  84. }
  85. virtual EnHandleResult OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
  86. {
  87. return (m_fnOnSend)
  88. ? m_fnOnSend(dwConnID, pData, iLength)
  89. : HR_IGNORE;
  90. }
  91. virtual EnHandleResult OnReceive(CONNID dwConnID, const BYTE* pData, int iLength)
  92. {
  93. ASSERT(m_fnOnReceive);
  94. return (m_fnOnReceive)
  95. ? m_fnOnReceive(dwConnID, pData, iLength)
  96. : HR_IGNORE;
  97. }
  98. virtual EnHandleResult OnReceive(CONNID dwConnID, int iLength)
  99. {
  100. ASSERT(m_fnOnPullReceive);
  101. return (m_fnOnPullReceive)
  102. ? m_fnOnPullReceive(dwConnID, iLength)
  103. : HR_IGNORE;
  104. }
  105. virtual EnHandleResult OnClose(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  106. {
  107. ASSERT(m_fnOnClose);
  108. return (m_fnOnClose)
  109. ? m_fnOnClose(dwConnID, enOperation, iErrorCode)
  110. : HR_IGNORE;
  111. }
  112. virtual EnHandleResult OnShutdown()
  113. {
  114. return (m_fnOnShutdown)
  115. ? m_fnOnShutdown()
  116. : HR_IGNORE;
  117. }
  118. public:
  119. C_HP_ServerListener()
  120. : m_fnOnPrepareListen (nullptr)
  121. , m_fnOnAccept (nullptr)
  122. , m_fnOnHandShake (nullptr)
  123. , m_fnOnSend (nullptr)
  124. , m_fnOnReceive (nullptr)
  125. , m_fnOnPullReceive (nullptr)
  126. , m_fnOnClose (nullptr)
  127. , m_fnOnShutdown (nullptr)
  128. {
  129. }
  130. public:
  131. HP_FN_Server_OnPrepareListen m_fnOnPrepareListen ;
  132. HP_FN_Server_OnAccept m_fnOnAccept ;
  133. HP_FN_Server_OnHandShake m_fnOnHandShake ;
  134. HP_FN_Server_OnSend m_fnOnSend ;
  135. HP_FN_Server_OnReceive m_fnOnReceive ;
  136. HP_FN_Server_OnPullReceive m_fnOnPullReceive ;
  137. HP_FN_Server_OnClose m_fnOnClose ;
  138. HP_FN_Server_OnShutdown m_fnOnShutdown ;
  139. };
  140. class C_HP_AgentListener : public IAgentListener
  141. {
  142. public:
  143. virtual EnHandleResult OnPrepareConnect(CONNID dwConnID, UINT_PTR socket)
  144. {
  145. return (m_fnOnPrepareConnect)
  146. ? m_fnOnPrepareConnect(dwConnID, socket)
  147. : HR_IGNORE;
  148. }
  149. virtual EnHandleResult OnConnect(CONNID dwConnID)
  150. {
  151. return (m_fnOnConnect)
  152. ? m_fnOnConnect(dwConnID)
  153. : HR_IGNORE;
  154. }
  155. virtual EnHandleResult OnHandShake(CONNID dwConnID)
  156. {
  157. return (m_fnOnHandShake)
  158. ? m_fnOnHandShake(dwConnID)
  159. : HR_IGNORE;
  160. }
  161. virtual EnHandleResult OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
  162. {
  163. return (m_fnOnSend)
  164. ? m_fnOnSend(dwConnID, pData, iLength)
  165. : HR_IGNORE;
  166. }
  167. virtual EnHandleResult OnReceive(CONNID dwConnID, const BYTE* pData, int iLength)
  168. {
  169. ASSERT(m_fnOnReceive);
  170. return (m_fnOnReceive)
  171. ? m_fnOnReceive(dwConnID, pData, iLength)
  172. : HR_IGNORE;
  173. }
  174. virtual EnHandleResult OnReceive(CONNID dwConnID, int iLength)
  175. {
  176. ASSERT(m_fnOnPullReceive);
  177. return (m_fnOnPullReceive)
  178. ? m_fnOnPullReceive(dwConnID, iLength)
  179. : HR_IGNORE;
  180. }
  181. virtual EnHandleResult OnClose(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  182. {
  183. ASSERT(m_fnOnClose);
  184. return (m_fnOnClose)
  185. ? m_fnOnClose(dwConnID, enOperation, iErrorCode)
  186. : HR_IGNORE;
  187. }
  188. virtual EnHandleResult OnShutdown()
  189. {
  190. return (m_fnOnShutdown)
  191. ? m_fnOnShutdown()
  192. : HR_IGNORE;
  193. }
  194. public:
  195. C_HP_AgentListener()
  196. : m_fnOnPrepareConnect (nullptr)
  197. , m_fnOnConnect (nullptr)
  198. , m_fnOnHandShake (nullptr)
  199. , m_fnOnSend (nullptr)
  200. , m_fnOnReceive (nullptr)
  201. , m_fnOnPullReceive (nullptr)
  202. , m_fnOnClose (nullptr)
  203. , m_fnOnShutdown (nullptr)
  204. {
  205. }
  206. public:
  207. HP_FN_Agent_OnPrepareConnect m_fnOnPrepareConnect;
  208. HP_FN_Agent_OnConnect m_fnOnConnect ;
  209. HP_FN_Agent_OnHandShake m_fnOnHandShake ;
  210. HP_FN_Agent_OnSend m_fnOnSend ;
  211. HP_FN_Agent_OnReceive m_fnOnReceive ;
  212. HP_FN_Agent_OnPullReceive m_fnOnPullReceive ;
  213. HP_FN_Agent_OnClose m_fnOnClose ;
  214. HP_FN_Agent_OnShutdown m_fnOnShutdown ;
  215. };
  216. class C_HP_ClientListener : public IClientListener
  217. {
  218. public:
  219. virtual EnHandleResult OnPrepareConnect(IClient* pClient, UINT_PTR socket)
  220. {
  221. return (m_fnOnPrepareConnect)
  222. ? m_fnOnPrepareConnect(C_HP_Object::FromSecond(pClient), socket)
  223. : HR_IGNORE;
  224. }
  225. virtual EnHandleResult OnConnect(IClient* pClient)
  226. {
  227. return (m_fnOnConnect)
  228. ? m_fnOnConnect(C_HP_Object::FromSecond(pClient))
  229. : HR_IGNORE;
  230. }
  231. virtual EnHandleResult OnHandShake(IClient* pClient)
  232. {
  233. return (m_fnOnHandShake)
  234. ? m_fnOnHandShake(C_HP_Object::FromSecond(pClient))
  235. : HR_IGNORE;
  236. }
  237. virtual EnHandleResult OnSend(IClient* pClient, const BYTE* pData, int iLength)
  238. {
  239. return (m_fnOnSend)
  240. ? m_fnOnSend(C_HP_Object::FromSecond(pClient), pData, iLength)
  241. : HR_IGNORE;
  242. }
  243. virtual EnHandleResult OnReceive(IClient* pClient, const BYTE* pData, int iLength)
  244. {
  245. ASSERT(m_fnOnReceive);
  246. return (m_fnOnReceive)
  247. ? m_fnOnReceive(C_HP_Object::FromSecond(pClient), pData, iLength)
  248. : HR_IGNORE;
  249. }
  250. virtual EnHandleResult OnReceive(IClient* pClient, int iLength)
  251. {
  252. ASSERT(m_fnOnPullReceive);
  253. return (m_fnOnPullReceive)
  254. ? m_fnOnPullReceive(C_HP_Object::FromSecond(pClient), iLength)
  255. : HR_IGNORE;
  256. }
  257. virtual EnHandleResult OnClose(IClient* pClient, EnSocketOperation enOperation, int iErrorCode)
  258. {
  259. ASSERT(m_fnOnClose);
  260. return (m_fnOnClose)
  261. ? m_fnOnClose(C_HP_Object::FromSecond(pClient), enOperation, iErrorCode)
  262. : HR_IGNORE;
  263. }
  264. public:
  265. C_HP_ClientListener()
  266. : m_fnOnPrepareConnect (nullptr)
  267. , m_fnOnConnect (nullptr)
  268. , m_fnOnHandShake (nullptr)
  269. , m_fnOnSend (nullptr)
  270. , m_fnOnReceive (nullptr)
  271. , m_fnOnPullReceive (nullptr)
  272. , m_fnOnClose (nullptr)
  273. {
  274. }
  275. public:
  276. HP_FN_Client_OnPrepareConnect m_fnOnPrepareConnect;
  277. HP_FN_Client_OnConnect m_fnOnConnect ;
  278. HP_FN_Client_OnHandShake m_fnOnHandShake ;
  279. HP_FN_Client_OnSend m_fnOnSend ;
  280. HP_FN_Client_OnReceive m_fnOnReceive ;
  281. HP_FN_Client_OnPullReceive m_fnOnPullReceive ;
  282. HP_FN_Client_OnClose m_fnOnClose ;
  283. };
  284. class C_HP_ComplexHttpListener : public IComplexHttpListener
  285. {
  286. public:
  287. virtual EnHttpParseResult OnMessageBegin(CONNID dwConnID)
  288. {
  289. return (m_fnOnMessageBegin)
  290. ? m_fnOnMessageBegin(dwConnID)
  291. : HPR_OK;
  292. }
  293. virtual EnHttpParseResult OnRequestLine(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  294. {
  295. return (m_fnOnRequestLine)
  296. ? m_fnOnRequestLine(dwConnID, lpszMethod, lpszUrl)
  297. : HPR_OK;
  298. }
  299. virtual EnHttpParseResult OnStatusLine(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  300. {
  301. return (m_fnOnStatusLine)
  302. ? m_fnOnStatusLine(dwConnID, usStatusCode, lpszDesc)
  303. : HPR_OK;
  304. }
  305. virtual EnHttpParseResult OnHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  306. {
  307. return (m_fnOnHeader)
  308. ? m_fnOnHeader(dwConnID, lpszName, lpszValue)
  309. : HPR_OK;
  310. }
  311. virtual EnHttpParseResult OnHeadersComplete(CONNID dwConnID)
  312. {
  313. ASSERT(m_fnOnHeadersComplete);
  314. return (m_fnOnHeadersComplete)
  315. ? m_fnOnHeadersComplete(dwConnID)
  316. : HPR_OK;
  317. }
  318. virtual EnHttpParseResult OnBody(CONNID dwConnID, const BYTE* pData, int iLength)
  319. {
  320. ASSERT(m_fnOnBody);
  321. return (m_fnOnBody)
  322. ? m_fnOnBody(dwConnID, pData, iLength)
  323. : HPR_OK;
  324. }
  325. virtual EnHttpParseResult OnChunkHeader(CONNID dwConnID, int iLength)
  326. {
  327. return (m_fnOnChunkHeader)
  328. ? m_fnOnChunkHeader(dwConnID, iLength)
  329. : HPR_OK;
  330. }
  331. virtual EnHttpParseResult OnChunkComplete(CONNID dwConnID)
  332. {
  333. return (m_fnOnChunkComplete)
  334. ? m_fnOnChunkComplete(dwConnID)
  335. : HPR_OK;
  336. }
  337. virtual EnHttpParseResult OnMessageComplete(CONNID dwConnID)
  338. {
  339. ASSERT(m_fnOnMessageComplete);
  340. return (m_fnOnMessageComplete)
  341. ? m_fnOnMessageComplete(dwConnID)
  342. : HPR_OK;
  343. }
  344. virtual EnHttpParseResult OnUpgrade(CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  345. {
  346. return (m_fnOnUpgrade)
  347. ? m_fnOnUpgrade(dwConnID, enUpgradeType)
  348. : HPR_OK;
  349. }
  350. virtual EnHttpParseResult OnParseError(CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  351. {
  352. ASSERT(m_fnOnParseError);
  353. return (m_fnOnParseError)
  354. ? m_fnOnParseError(dwConnID, iErrorCode, lpszErrorDesc)
  355. : HPR_OK;
  356. }
  357. public:
  358. C_HP_ComplexHttpListener()
  359. : m_fnOnMessageBegin (nullptr)
  360. , m_fnOnRequestLine (nullptr)
  361. , m_fnOnStatusLine (nullptr)
  362. , m_fnOnHeader (nullptr)
  363. , m_fnOnHeadersComplete (nullptr)
  364. , m_fnOnBody (nullptr)
  365. , m_fnOnChunkHeader (nullptr)
  366. , m_fnOnChunkComplete (nullptr)
  367. , m_fnOnMessageComplete (nullptr)
  368. , m_fnOnUpgrade (nullptr)
  369. , m_fnOnParseError (nullptr)
  370. {
  371. }
  372. public:
  373. HP_FN_ComplexHttp_OnMessageBegin m_fnOnMessageBegin ;
  374. HP_FN_ComplexHttp_OnRequestLine m_fnOnRequestLine ;
  375. HP_FN_ComplexHttp_OnStatusLine m_fnOnStatusLine ;
  376. HP_FN_ComplexHttp_OnHeader m_fnOnHeader ;
  377. HP_FN_ComplexHttp_OnHeadersComplete m_fnOnHeadersComplete ;
  378. HP_FN_ComplexHttp_OnBody m_fnOnBody ;
  379. HP_FN_ComplexHttp_OnChunkHeader m_fnOnChunkHeader ;
  380. HP_FN_ComplexHttp_OnChunkComplete m_fnOnChunkComplete ;
  381. HP_FN_ComplexHttp_OnMessageComplete m_fnOnMessageComplete ;
  382. HP_FN_ComplexHttp_OnUpgrade m_fnOnUpgrade ;
  383. HP_FN_ComplexHttp_OnParseError m_fnOnParseError ;
  384. };
  385. class C_HP_HttpServerListener : public IHttpServerListener
  386. {
  387. public:
  388. virtual EnHttpParseResult OnMessageBegin(CONNID dwConnID)
  389. {return m_lsnHttp.OnMessageBegin(dwConnID);}
  390. virtual EnHttpParseResult OnRequestLine(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  391. {return m_lsnHttp.OnRequestLine(dwConnID, lpszMethod, lpszUrl);}
  392. virtual EnHttpParseResult OnStatusLine(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  393. {return m_lsnHttp.OnStatusLine(dwConnID, usStatusCode, lpszDesc);}
  394. virtual EnHttpParseResult OnHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  395. {return m_lsnHttp.OnHeader(dwConnID, lpszName, lpszValue);}
  396. virtual EnHttpParseResult OnHeadersComplete(CONNID dwConnID)
  397. {return m_lsnHttp.OnHeadersComplete(dwConnID);}
  398. virtual EnHttpParseResult OnBody(CONNID dwConnID, const BYTE* pData, int iLength)
  399. {return m_lsnHttp.OnBody(dwConnID, pData, iLength);}
  400. virtual EnHttpParseResult OnChunkHeader(CONNID dwConnID, int iLength)
  401. {return m_lsnHttp.OnChunkHeader(dwConnID, iLength);}
  402. virtual EnHttpParseResult OnChunkComplete(CONNID dwConnID)
  403. {return m_lsnHttp.OnChunkComplete(dwConnID);}
  404. virtual EnHttpParseResult OnMessageComplete(CONNID dwConnID)
  405. {return m_lsnHttp.OnMessageComplete(dwConnID);}
  406. virtual EnHttpParseResult OnUpgrade(CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  407. {return m_lsnHttp.OnUpgrade(dwConnID, enUpgradeType);}
  408. virtual EnHttpParseResult OnParseError(CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  409. {return m_lsnHttp.OnParseError(dwConnID, iErrorCode, lpszErrorDesc);}
  410. virtual EnHandleResult OnPrepareListen(UINT_PTR soListen)
  411. {return m_lsnServer.OnPrepareListen(soListen);}
  412. virtual EnHandleResult OnAccept(CONNID dwConnID, UINT_PTR soClient)
  413. {return m_lsnServer.OnAccept(dwConnID, soClient);}
  414. virtual EnHandleResult OnHandShake(CONNID dwConnID)
  415. {return m_lsnServer.OnHandShake(dwConnID);}
  416. virtual EnHandleResult OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
  417. {return m_lsnServer.OnSend(dwConnID, pData, iLength);}
  418. virtual EnHandleResult OnReceive(CONNID dwConnID, const BYTE* pData, int iLength)
  419. {return m_lsnServer.OnReceive(dwConnID, pData, iLength);}
  420. virtual EnHandleResult OnReceive(CONNID dwConnID, int iLength)
  421. {return m_lsnServer.OnReceive(dwConnID, iLength);}
  422. virtual EnHandleResult OnClose(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  423. {return m_lsnServer.OnClose(dwConnID, enOperation, iErrorCode);}
  424. virtual EnHandleResult OnShutdown()
  425. {return m_lsnServer.OnShutdown();}
  426. public:
  427. C_HP_ComplexHttpListener m_lsnHttp;
  428. C_HP_ServerListener m_lsnServer;
  429. };
  430. class C_HP_HttpAgentListener : public IHttpAgentListener
  431. {
  432. public:
  433. virtual EnHttpParseResult OnMessageBegin(CONNID dwConnID)
  434. {return m_lsnHttp.OnMessageBegin(dwConnID);}
  435. virtual EnHttpParseResult OnRequestLine(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl)
  436. {return m_lsnHttp.OnRequestLine(dwConnID, lpszMethod, lpszUrl);}
  437. virtual EnHttpParseResult OnStatusLine(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc)
  438. {return m_lsnHttp.OnStatusLine(dwConnID, usStatusCode, lpszDesc);}
  439. virtual EnHttpParseResult OnHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue)
  440. {return m_lsnHttp.OnHeader(dwConnID, lpszName, lpszValue);}
  441. virtual EnHttpParseResult OnHeadersComplete(CONNID dwConnID)
  442. {return m_lsnHttp.OnHeadersComplete(dwConnID);}
  443. virtual EnHttpParseResult OnBody(CONNID dwConnID, const BYTE* pData, int iLength)
  444. {return m_lsnHttp.OnBody(dwConnID, pData, iLength);}
  445. virtual EnHttpParseResult OnChunkHeader(CONNID dwConnID, int iLength)
  446. {return m_lsnHttp.OnChunkHeader(dwConnID, iLength);}
  447. virtual EnHttpParseResult OnChunkComplete(CONNID dwConnID)
  448. {return m_lsnHttp.OnChunkComplete(dwConnID);}
  449. virtual EnHttpParseResult OnMessageComplete(CONNID dwConnID)
  450. {return m_lsnHttp.OnMessageComplete(dwConnID);}
  451. virtual EnHttpParseResult OnUpgrade(CONNID dwConnID, EnHttpUpgradeType enUpgradeType)
  452. {return m_lsnHttp.OnUpgrade(dwConnID, enUpgradeType);}
  453. virtual EnHttpParseResult OnParseError(CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc)
  454. {return m_lsnHttp.OnParseError(dwConnID, iErrorCode, lpszErrorDesc);}
  455. virtual EnHandleResult OnPrepareConnect(CONNID dwConnID, UINT_PTR socket)
  456. {return m_lsnAgent.OnPrepareConnect(dwConnID, socket);}
  457. virtual EnHandleResult OnConnect(CONNID dwConnID)
  458. {return m_lsnAgent.OnConnect(dwConnID);}
  459. virtual EnHandleResult OnHandShake(CONNID dwConnID)
  460. {return m_lsnAgent.OnHandShake(dwConnID);}
  461. virtual EnHandleResult OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
  462. {return m_lsnAgent.OnSend(dwConnID, pData, iLength);}
  463. virtual EnHandleResult OnReceive(CONNID dwConnID, const BYTE* pData, int iLength)
  464. {return m_lsnAgent.OnReceive(dwConnID, pData, iLength);}
  465. virtual EnHandleResult OnReceive(CONNID dwConnID, int iLength)
  466. {return m_lsnAgent.OnReceive(dwConnID, iLength);}
  467. virtual EnHandleResult OnClose(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
  468. {return m_lsnAgent.OnClose(dwConnID, enOperation, iErrorCode);}
  469. virtual EnHandleResult OnShutdown()
  470. {return m_lsnAgent.OnShutdown();}
  471. public:
  472. C_HP_ComplexHttpListener m_lsnHttp;
  473. C_HP_AgentListener m_lsnAgent;
  474. };
  475. class C_HP_SingleHttpListener : public IHttpListener
  476. {
  477. public:
  478. virtual EnHttpParseResult OnMessageBegin(IHttp* pHttp)
  479. {
  480. return (m_fnOnMessageBegin)
  481. ? m_fnOnMessageBegin(C_HP_Object::FromFirst(pHttp))
  482. : HPR_OK;
  483. }
  484. virtual EnHttpParseResult OnRequestLine(IHttp* pHttp, LPCSTR lpszMethod, LPCSTR lpszUrl)
  485. {
  486. return (m_fnOnRequestLine)
  487. ? m_fnOnRequestLine(C_HP_Object::FromFirst(pHttp), lpszMethod, lpszUrl)
  488. : HPR_OK;
  489. }
  490. virtual EnHttpParseResult OnStatusLine(IHttp* pHttp, USHORT usStatusCode, LPCSTR lpszDesc)
  491. {
  492. return (m_fnOnStatusLine)
  493. ? m_fnOnStatusLine(C_HP_Object::FromFirst(pHttp), usStatusCode, lpszDesc)
  494. : HPR_OK;
  495. }
  496. virtual EnHttpParseResult OnHeader(IHttp* pHttp, LPCSTR lpszName, LPCSTR lpszValue)
  497. {
  498. return (m_fnOnHeader)
  499. ? m_fnOnHeader(C_HP_Object::FromFirst(pHttp), lpszName, lpszValue)
  500. : HPR_OK;
  501. }
  502. virtual EnHttpParseResult OnHeadersComplete(IHttp* pHttp)
  503. {
  504. ASSERT(m_fnOnHeadersComplete);
  505. return (m_fnOnHeadersComplete)
  506. ? m_fnOnHeadersComplete(C_HP_Object::FromFirst(pHttp))
  507. : HPR_OK;
  508. }
  509. virtual EnHttpParseResult OnBody(IHttp* pHttp, const BYTE* pData, int iLength)
  510. {
  511. ASSERT(m_fnOnBody);
  512. return (m_fnOnBody)
  513. ? m_fnOnBody(C_HP_Object::FromFirst(pHttp), pData, iLength)
  514. : HPR_OK;
  515. }
  516. virtual EnHttpParseResult OnChunkHeader(IHttp* pHttp, int iLength)
  517. {
  518. return (m_fnOnChunkHeader)
  519. ? m_fnOnChunkHeader(C_HP_Object::FromFirst(pHttp), iLength)
  520. : HPR_OK;
  521. }
  522. virtual EnHttpParseResult OnChunkComplete(IHttp* pHttp)
  523. {
  524. return (m_fnOnChunkComplete)
  525. ? m_fnOnChunkComplete(C_HP_Object::FromFirst(pHttp))
  526. : HPR_OK;
  527. }
  528. virtual EnHttpParseResult OnMessageComplete(IHttp* pHttp)
  529. {
  530. ASSERT(m_fnOnMessageComplete);
  531. return (m_fnOnMessageComplete)
  532. ? m_fnOnMessageComplete(C_HP_Object::FromFirst(pHttp))
  533. : HPR_OK;
  534. }
  535. virtual EnHttpParseResult OnUpgrade(IHttp* pHttp, EnHttpUpgradeType enUpgradeType)
  536. {
  537. return (m_fnOnUpgrade)
  538. ? m_fnOnUpgrade(C_HP_Object::FromFirst(pHttp), enUpgradeType)
  539. : HPR_OK;
  540. }
  541. virtual EnHttpParseResult OnParseError(IHttp* pHttp, int iErrorCode, LPCSTR lpszErrorDesc)
  542. {
  543. ASSERT(m_fnOnParseError);
  544. return (m_fnOnParseError)
  545. ? m_fnOnParseError(C_HP_Object::FromFirst(pHttp), iErrorCode, lpszErrorDesc)
  546. : HPR_OK;
  547. }
  548. public:
  549. C_HP_SingleHttpListener()
  550. : m_fnOnMessageBegin (nullptr)
  551. , m_fnOnRequestLine (nullptr)
  552. , m_fnOnStatusLine (nullptr)
  553. , m_fnOnHeader (nullptr)
  554. , m_fnOnHeadersComplete (nullptr)
  555. , m_fnOnBody (nullptr)
  556. , m_fnOnChunkHeader (nullptr)
  557. , m_fnOnChunkComplete (nullptr)
  558. , m_fnOnMessageComplete (nullptr)
  559. , m_fnOnUpgrade (nullptr)
  560. , m_fnOnParseError (nullptr)
  561. {
  562. }
  563. public:
  564. HP_FN_SingleHttp_OnMessageBegin m_fnOnMessageBegin ;
  565. HP_FN_SingleHttp_OnRequestLine m_fnOnRequestLine ;
  566. HP_FN_SingleHttp_OnStatusLine m_fnOnStatusLine ;
  567. HP_FN_SingleHttp_OnHeader m_fnOnHeader ;
  568. HP_FN_SingleHttp_OnHeadersComplete m_fnOnHeadersComplete ;
  569. HP_FN_SingleHttp_OnBody m_fnOnBody ;
  570. HP_FN_SingleHttp_OnChunkHeader m_fnOnChunkHeader ;
  571. HP_FN_SingleHttp_OnChunkComplete m_fnOnChunkComplete ;
  572. HP_FN_SingleHttp_OnMessageComplete m_fnOnMessageComplete ;
  573. HP_FN_SingleHttp_OnUpgrade m_fnOnUpgrade ;
  574. HP_FN_SingleHttp_OnParseError m_fnOnParseError ;
  575. };
  576. class C_HP_HttpClientListener : public IHttpClientListener
  577. {
  578. public:
  579. virtual EnHttpParseResult OnMessageBegin(IHttp* pHttp)
  580. {return m_lsnHttp.OnMessageBegin(pHttp);}
  581. virtual EnHttpParseResult OnRequestLine(IHttp* pHttp, LPCSTR lpszMethod, LPCSTR lpszUrl)
  582. {return m_lsnHttp.OnRequestLine(pHttp, lpszMethod, lpszUrl);}
  583. virtual EnHttpParseResult OnStatusLine(IHttp* pHttp, USHORT usStatusCode, LPCSTR lpszDesc)
  584. {return m_lsnHttp.OnStatusLine(pHttp, usStatusCode, lpszDesc);}
  585. virtual EnHttpParseResult OnHeader(IHttp* pHttp, LPCSTR lpszName, LPCSTR lpszValue)
  586. {return m_lsnHttp.OnHeader(pHttp, lpszName, lpszValue);}
  587. virtual EnHttpParseResult OnHeadersComplete(IHttp* pHttp)
  588. {return m_lsnHttp.OnHeadersComplete(pHttp);}
  589. virtual EnHttpParseResult OnBody(IHttp* pHttp, const BYTE* pData, int iLength)
  590. {return m_lsnHttp.OnBody(pHttp, pData, iLength);}
  591. virtual EnHttpParseResult OnChunkHeader(IHttp* pHttp, int iLength)
  592. {return m_lsnHttp.OnChunkHeader(pHttp, iLength);}
  593. virtual EnHttpParseResult OnChunkComplete(IHttp* pHttp)
  594. {return m_lsnHttp.OnChunkComplete(pHttp);}
  595. virtual EnHttpParseResult OnMessageComplete(IHttp* pHttp)
  596. {return m_lsnHttp.OnMessageComplete(pHttp);}
  597. virtual EnHttpParseResult OnUpgrade(IHttp* pHttp, EnHttpUpgradeType enUpgradeType)
  598. {return m_lsnHttp.OnUpgrade(pHttp, enUpgradeType);}
  599. virtual EnHttpParseResult OnParseError(IHttp* pHttp, int iErrorCode, LPCSTR lpszErrorDesc)
  600. {return m_lsnHttp.OnParseError(pHttp, iErrorCode, lpszErrorDesc);}
  601. virtual EnHandleResult OnPrepareConnect(IClient* pClient, UINT_PTR socket)
  602. {return m_lsnClient.OnPrepareConnect(pClient, socket);}
  603. virtual EnHandleResult OnConnect(IClient* pClient)
  604. {return m_lsnClient.OnConnect(pClient);}
  605. virtual EnHandleResult OnHandShake(IClient* pClient)
  606. {return m_lsnClient.OnHandShake(pClient);}
  607. virtual EnHandleResult OnSend(IClient* pClient, const BYTE* pData, int iLength)
  608. {return m_lsnClient.OnSend(pClient, pData, iLength);}
  609. virtual EnHandleResult OnReceive(IClient* pClient, const BYTE* pData, int iLength)
  610. {return m_lsnClient.OnReceive(pClient, pData, iLength);}
  611. virtual EnHandleResult OnReceive(IClient* pClient, int iLength)
  612. {return m_lsnClient.OnReceive(pClient, iLength);}
  613. virtual EnHandleResult OnClose(IClient* pClient, EnSocketOperation enOperation, int iErrorCode)
  614. {return m_lsnClient.OnClose(pClient, enOperation, iErrorCode);}
  615. public:
  616. C_HP_SingleHttpListener m_lsnHttp;
  617. C_HP_ClientListener m_lsnClient;
  618. };