SpClientSessionFunction.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpMisc.h"
  4. #include "SpAsyncWait.h"
  5. #include "SpEntity.h"
  6. #include "SpClientSessionFunction.h"
  7. #include "dbgutil.h"
  8. #define DEFAULT_CONNECT_TIMEOUT 10000 //10s
  9. #define WILD_POINTER_JUDGE 0x123456789ABCDEF0
  10. SpClientSessionFunction::SpClientSessionFunction( SpEntity *pEntity, CClientSessionBase *pClientSessionBase, const char *pszRemoteEntity )
  11. : SpAsyncWait(pEntity), m_local_seq(0), m_pEntity(pEntity)
  12. , m_pClientSessionBase(pClientSessionBase), m_uac(NULL), m_value(WILD_POINTER_JUDGE)
  13. {
  14. int rc;
  15. sp_ses_uac_callback cb;
  16. int remote_entity_id = SP_INVALID_SVC_ID;
  17. int remote_epid = SP_INVALID_MOD_ID;
  18. sp_env_t *env = sp_get_env();
  19. sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, pszRemoteEntity);
  20. if (ent && ent->service_flag && (ent->state == EntityState_Idle || ent->state == EntityState_Busy)) {
  21. remote_entity_id = ent->cfg->idx;
  22. remote_epid = ent->mod->cfg->idx;
  23. }
  24. if (remote_entity_id != SP_INVALID_SVC_ID) {
  25. cb.user_data = this;
  26. cb.on_connect = &__on_connect;
  27. cb.on_close = &__on_close;
  28. cb.on_destroy = &__on_destroy;
  29. rc = sp_ses_uac_create(pEntity->get_ses_mgr(), remote_epid, remote_entity_id, &cb, &m_uac);
  30. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("uac create, remote_epid:%d", remote_epid);
  31. }
  32. }
  33. SpClientSessionFunction::~SpClientSessionFunction()
  34. {
  35. m_value = 0;
  36. }
  37. ErrorCodeEnum SpClientSessionFunction::Begin(const char *pszParam)
  38. {
  39. int rc;
  40. if (m_uac) {
  41. iobuffer_t *conn_pkt = iobuffer_create(-1, -1);
  42. iobuffer_write(conn_pkt, IOBUF_T_STR, pszParam, -1);
  43. IncrementRef();
  44. rc = sp_ses_uac_async_connect(m_uac, DEFAULT_CONNECT_TIMEOUT+1, &conn_pkt);
  45. if (rc != 0) {
  46. DecrementRef();
  47. }
  48. if (conn_pkt)
  49. iobuffer_dec_ref(conn_pkt);
  50. } else {
  51. rc = Error_NetBroken;
  52. }
  53. return SpTranslateError(rc);
  54. }
  55. ErrorCodeEnum SpClientSessionFunction::Close()
  56. {
  57. int rc;
  58. if (m_uac) {
  59. rc = sp_ses_uac_close(m_uac);
  60. if (rc == 0) {
  61. sp_ses_uac_destroy(m_uac);
  62. }
  63. } else {
  64. rc = Error_NotInit;
  65. }
  66. return SpTranslateError(rc);
  67. }
  68. void SpClientSessionFunction::OnAnswerWaited(ErrorCodeEnum Error)
  69. {
  70. if (Error == Error_Succeed) {
  71. if (AsyncGetAnswer() == Error_Succeed) {
  72. m_pClientSessionBase->OnConnectSucceed();
  73. }
  74. }
  75. }
  76. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer)
  77. {
  78. ErrorCodeEnum Error;
  79. if (m_uac) {
  80. int rc;
  81. iobuffer_t *info_pkt = iobuffer_create(-1, Buffer.GetCount()+32);
  82. int v = Buffer.GetCount();
  83. if (v > 0)
  84. iobuffer_write(info_pkt, IOBUF_T_BUF, &Buffer[0], v);
  85. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  86. if (info_pkt)
  87. iobuffer_dec_ref(info_pkt);
  88. Error = SpTranslateError(rc);
  89. } else {
  90. Error = Error_NotInit;
  91. }
  92. return Error;
  93. }
  94. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature)
  95. {
  96. ErrorCodeEnum Error;
  97. if (m_uac) {
  98. int rc;
  99. iobuffer_t *info_pkt = iobuffer_create(-1, -1);
  100. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  101. if (info_pkt)
  102. iobuffer_dec_ref(info_pkt);
  103. Error = SpTranslateError(rc);
  104. } else {
  105. Error = Error_NotInit;
  106. }
  107. return Error;
  108. }
  109. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, linkContext& pContext)
  110. {
  111. ErrorCodeEnum Error;
  112. if (m_uac) {
  113. int rc;
  114. iobuffer_t* info_pkt = iobuffer_create(-1, Buffer.GetCount() + 32);
  115. int v = Buffer.GetCount();
  116. if (v > 0)
  117. iobuffer_write(info_pkt, IOBUF_T_BUF, &Buffer[0], v);
  118. if (pContext.checkEmpty())
  119. pContext.AutoGenerate();
  120. iobuffer_set_linkInfo(info_pkt, pContext.bussinessId.GetData(), pContext.traceId.GetData(), pContext.spanId.GetData(), pContext.parentSpanId.GetData());
  121. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  122. if (info_pkt)
  123. iobuffer_dec_ref(info_pkt);
  124. Error = SpTranslateError(rc);
  125. }
  126. else {
  127. Error = Error_NotInit;
  128. }
  129. return Error;
  130. }
  131. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, linkContext& pContext)
  132. {
  133. ErrorCodeEnum Error;
  134. if (m_uac) {
  135. int rc;
  136. iobuffer_t* info_pkt = iobuffer_create(-1, -1);
  137. if (pContext.checkEmpty())
  138. pContext.AutoGenerate();
  139. iobuffer_set_linkInfo(info_pkt, pContext.bussinessId.GetData(), pContext.traceId.GetData(), pContext.spanId.GetData(), pContext.parentSpanId.GetData());
  140. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  141. if (info_pkt)
  142. iobuffer_dec_ref(info_pkt);
  143. Error = SpTranslateError(rc);
  144. }
  145. else {
  146. Error = Error_NotInit;
  147. }
  148. return Error;
  149. }
  150. SessionStateEnum SpClientSessionFunction::GetCurrentState()
  151. {
  152. SessionStateEnum State = SessionState_NotInit;
  153. if (m_uac) {
  154. int state = sp_ses_uac_get_state(m_uac);
  155. switch (state) {
  156. case SP_SES_STATE_INIT:
  157. case SP_SES_STATE_CONNECTING:
  158. break;
  159. case SP_SES_STATE_CONNECTED:
  160. State = SessionState_Live;
  161. break;
  162. case SP_SES_STATE_TERM:
  163. case SP_SES_STATE_ERROR:
  164. State = SessionState_Close;
  165. break;
  166. default:
  167. TOOLKIT_ASSERT(0);
  168. State = SessionState_NotInit;
  169. break;
  170. }
  171. } else {
  172. State = SessionState_NotInit;
  173. }
  174. return State;
  175. }
  176. ErrorCodeEnum SpClientSessionFunction::CloseSession()
  177. {
  178. return Close();
  179. }
  180. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, linkContext& pContext, DWORD dwTimeOut, DWORD dwReqId) {
  181. ErrorCodeEnum Error;
  182. if (!m_uac)
  183. return Error_NotInit;
  184. if (dwReqId == -1) {
  185. dwReqId = InterlockedIncrement((LONG*)&m_local_seq);
  186. }
  187. if (pContext.checkEmpty())
  188. pContext.AutoGenerate();
  189. SpAsyncWaitTsx* pAsyncWait = new SpAsyncWaitTsx(m_pEntity, m_uac, dwTimeOut, (int)dwMessageID, (int)dwMessageSignature, Buffer, (int)dwReqId);
  190. pAsyncWait->setLinkContext(pContext);
  191. Error = pAsyncWait->Begin();
  192. if (Error == Error_Succeed)
  193. {
  194. pAsynWaitSp.Attach(pAsyncWait, pAsyncWait->GetRefCountPtr());
  195. pAsyncWait->SetMessageID(dwMessageID);
  196. }
  197. pAsyncWait->DecrementRef(); // xkm@20150115
  198. return Error;
  199. }
  200. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CSmartPointer<IAsynWaitSp>& pAsynWaitSp, linkContext& pContext, DWORD dwTimeOut, DWORD dwReqId)
  201. {
  202. CAutoBuffer Buffer;
  203. return AsyncRequest(dwMessageID, dwMessageSignature, Buffer, pAsynWaitSp, pContext, dwTimeOut, dwReqId);
  204. }
  205. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, CSmartPointer<IAsynWaitSp> &pAsynWaitSp, DWORD dwTimeOut, DWORD dwReqId)
  206. {
  207. ErrorCodeEnum Error;
  208. if (!m_uac)
  209. return Error_NotInit;
  210. if (dwReqId == -1) {
  211. dwReqId = InterlockedIncrement((LONG*)&m_local_seq);
  212. }
  213. SpAsyncWaitTsx *pAsyncWait = new SpAsyncWaitTsx(m_pEntity, m_uac, dwTimeOut, (int)dwMessageID, (int)dwMessageSignature, Buffer, (int)dwReqId);
  214. Error = pAsyncWait->Begin();
  215. if (Error == Error_Succeed)
  216. {
  217. pAsynWaitSp.Attach(pAsyncWait, pAsyncWait->GetRefCountPtr());
  218. pAsyncWait->SetMessageID(dwMessageID);
  219. }
  220. pAsyncWait->DecrementRef(); // xkm@20150115
  221. return Error;
  222. }
  223. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CSmartPointer<IAsynWaitSp> &pAsynWaitSp, DWORD dwTimeOut, DWORD dwReqId)
  224. {
  225. CAutoBuffer Buffer;
  226. return AsyncRequest(dwMessageID, dwMessageSignature, Buffer, pAsynWaitSp, dwTimeOut, dwReqId);
  227. }
  228. void SpClientSessionFunction::__on_connect(sp_ses_uac_t *uac, int error, void *user_data)
  229. {
  230. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  231. if (pThis->isVaildPointer())
  232. pThis->on_connect(error);
  233. }
  234. void SpClientSessionFunction::__on_close(sp_ses_uac_t *uac, int error, void *user_data)
  235. {
  236. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  237. if (pThis->isVaildPointer())
  238. pThis->on_close(error);
  239. }
  240. void SpClientSessionFunction::__on_destroy(sp_ses_uac_t *uac, void *user_data)
  241. {
  242. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  243. if (pThis->isVaildPointer())
  244. pThis->on_destroy();
  245. }
  246. void SpClientSessionFunction::on_connect(int error)
  247. {
  248. ReceiveAnsPkt(error, 1, NULL);
  249. DecrementRef();
  250. }
  251. void SpClientSessionFunction::on_close(int error)
  252. {
  253. m_pClientSessionBase->OnClose(SpTranslateError(error));
  254. }
  255. void SpClientSessionFunction::on_destroy()
  256. {
  257. if (m_pClientSessionBase) {
  258. m_pClientSessionBase->OnDestroy();
  259. }
  260. }
  261. bool SpClientSessionFunction::isVaildPointer()
  262. {
  263. return m_value == WILD_POINTER_JUDGE;
  264. }
  265. const char * SpClientSessionFunction::GetRemoteEntityName()
  266. {
  267. if (m_uac) {
  268. int remote_ent_idx = sp_ses_uac_get_remote_svc_id(m_uac);
  269. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(sp_get_env()->mod_mgr, remote_ent_idx);
  270. if (ent) {
  271. return ent->cfg->name;
  272. }
  273. }
  274. return NULL;
  275. }