SpClientSessionFunction.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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. #define DEFAULT_CONNECT_TIMEOUT 10000 //10s
  8. #define WILD_POINTER_JUDGE 0x123456789ABCDEF0
  9. SpClientSessionFunction::SpClientSessionFunction( SpEntity *pEntity, CClientSessionBase *pClientSessionBase, const char *pszRemoteEntity ) : SpAsyncWait(pEntity),
  10. m_local_seq(0), m_pEntity(pEntity), m_pClientSessionBase(pClientSessionBase), m_uac(NULL), m_value(WILD_POINTER_JUDGE)
  11. {
  12. //Dbg("SpClientSessionFunction()");
  13. //LOG_FUNCTION();
  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. Dbg("uac create, remote_epid:%d", remote_epid);
  31. }
  32. }
  33. SpClientSessionFunction::~SpClientSessionFunction()
  34. {
  35. m_value = 0;
  36. //Dbg("~SpClientSessionFunction()");
  37. //LOG_FUNCTION();
  38. }
  39. ErrorCodeEnum SpClientSessionFunction::Begin(const char *pszParam)
  40. {
  41. int rc;
  42. if (m_uac) {
  43. iobuffer_t *conn_pkt = iobuffer_create(-1, -1);
  44. iobuffer_write(conn_pkt, IOBUF_T_STR, pszParam, -1);
  45. IncrementRef();
  46. rc = sp_ses_uac_async_connect(m_uac, DEFAULT_CONNECT_TIMEOUT+1, &conn_pkt);
  47. if (rc != 0) {
  48. DecrementRef();
  49. }
  50. if (conn_pkt)
  51. iobuffer_dec_ref(conn_pkt);
  52. } else {
  53. rc = Error_NetBroken;
  54. }
  55. return SpTranslateError(rc);
  56. }
  57. ErrorCodeEnum SpClientSessionFunction::Close()
  58. {
  59. int rc;
  60. if (m_uac) {
  61. rc = sp_ses_uac_close(m_uac);
  62. if (rc == 0) {
  63. sp_ses_uac_destroy(m_uac);
  64. }
  65. } else {
  66. rc = Error_NotInit;
  67. }
  68. return SpTranslateError(rc);
  69. }
  70. void SpClientSessionFunction::OnAnswerWaited(ErrorCodeEnum Error)
  71. {
  72. if (Error == Error_Succeed) {
  73. if (AsyncGetAnswer() == Error_Succeed) {
  74. m_pClientSessionBase->OnConnectSucceed();
  75. }
  76. }
  77. }
  78. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer)
  79. {
  80. ErrorCodeEnum Error;
  81. if (m_uac) {
  82. int rc;
  83. iobuffer_t *info_pkt = iobuffer_create(-1, Buffer.GetCount()+32);
  84. int v = Buffer.GetCount();
  85. if (v > 0)
  86. iobuffer_write(info_pkt, IOBUF_T_BUF, &Buffer[0], v);
  87. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  88. if (info_pkt)
  89. iobuffer_dec_ref(info_pkt);
  90. Error = SpTranslateError(rc);
  91. //if (Error == Error_Succeed)
  92. // Dbg("send info: method_id=%d, method_sig=%d, pkt_size=%d", dwMessageID, dwMessageSignature, Buffer.GetCount());
  93. } else {
  94. Error = Error_NotInit;
  95. }
  96. return Error;
  97. }
  98. ErrorCodeEnum SpClientSessionFunction::OnewayCall(DWORD dwMessageID, DWORD dwMessageSignature)
  99. {
  100. ErrorCodeEnum Error;
  101. if (m_uac) {
  102. int rc;
  103. iobuffer_t *info_pkt = iobuffer_create(-1, -1);
  104. rc = sp_ses_uac_send_info(m_uac, (int)dwMessageID, (int)dwMessageSignature, &info_pkt);
  105. if (info_pkt)
  106. iobuffer_dec_ref(info_pkt);
  107. Error = SpTranslateError(rc);
  108. //if (Error == Error_Succeed)
  109. // Dbg("send info: method_id=%d, method_sig=%d, pkt_size=0", dwMessageID, dwMessageSignature);
  110. } else {
  111. Error = Error_NotInit;
  112. }
  113. return Error;
  114. }
  115. SessionStateEnum SpClientSessionFunction::GetCurrentState()
  116. {
  117. SessionStateEnum State = SessionState_NotInit;
  118. if (m_uac) {
  119. int state = sp_ses_uac_get_state(m_uac);
  120. switch (state) {
  121. case SP_SES_STATE_INIT:
  122. case SP_SES_STATE_CONNECTING:
  123. break;
  124. case SP_SES_STATE_CONNECTED:
  125. State = SessionState_Live;
  126. break;
  127. case SP_SES_STATE_TERM:
  128. case SP_SES_STATE_ERROR:
  129. State = SessionState_Close;
  130. break;
  131. default:
  132. assert(0);
  133. State = SessionState_NotInit;
  134. break;
  135. }
  136. } else {
  137. State = SessionState_NotInit;
  138. }
  139. return State;
  140. }
  141. ErrorCodeEnum SpClientSessionFunction::CloseSession()
  142. {
  143. return Close();
  144. }
  145. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CAutoBuffer Buffer, CSmartPointer<IAsynWaitSp> &pAsynWaitSp, DWORD dwTimeOut, DWORD dwReqId)
  146. {
  147. ErrorCodeEnum Error;
  148. if (!m_uac)
  149. return Error_NotInit;
  150. if (dwReqId == -1) {
  151. dwReqId = InterlockedIncrement((LONG*)&m_local_seq);
  152. }
  153. SpAsyncWaitTsx *pAsyncWait = new SpAsyncWaitTsx(m_pEntity, m_uac, dwTimeOut, (int)dwMessageID, (int)dwMessageSignature, Buffer, (int)dwReqId);
  154. Error = pAsyncWait->Begin();
  155. if (Error == Error_Succeed)
  156. {
  157. pAsynWaitSp.Attach(pAsyncWait, pAsyncWait->GetRefCountPtr());
  158. pAsyncWait->SetMessageID(dwMessageID);
  159. //Dbg("send req: tsx_id=%d, method_id=%d, method_sig=%d, pkt_size=%d",
  160. // dwReqId, dwMessageID, dwMessageSignature, Buffer.GetCount());
  161. }
  162. pAsyncWait->DecrementRef(); // xkm@20150115
  163. return Error;
  164. }
  165. ErrorCodeEnum SpClientSessionFunction::AsyncRequest(DWORD dwMessageID, DWORD dwMessageSignature, CSmartPointer<IAsynWaitSp> &pAsynWaitSp, DWORD dwTimeOut, DWORD dwReqId)
  166. {
  167. CAutoBuffer Buffer;
  168. return AsyncRequest(dwMessageID, dwMessageSignature, Buffer, pAsynWaitSp, dwTimeOut, dwReqId);
  169. }
  170. void SpClientSessionFunction::__on_connect(sp_ses_uac_t *uac, int error, void *user_data)
  171. {
  172. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  173. if (pThis->isVaildPointer())
  174. pThis->on_connect(error);
  175. }
  176. void SpClientSessionFunction::__on_close(sp_ses_uac_t *uac, int error, void *user_data)
  177. {
  178. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  179. if (pThis->isVaildPointer())
  180. pThis->on_close(error);
  181. }
  182. void SpClientSessionFunction::__on_destroy(sp_ses_uac_t *uac, void *user_data)
  183. {
  184. SpClientSessionFunction *pThis = static_cast<SpClientSessionFunction*>(user_data);
  185. if (pThis->isVaildPointer())
  186. pThis->on_destroy();
  187. }
  188. void SpClientSessionFunction::on_connect(int error)
  189. {
  190. ReceiveAnsPkt(error, 1, NULL);
  191. DecrementRef();
  192. }
  193. void SpClientSessionFunction::on_close(int error)
  194. {
  195. m_pClientSessionBase->OnClose(SpTranslateError(error));
  196. }
  197. void SpClientSessionFunction::on_destroy()
  198. {
  199. if (m_pClientSessionBase) {
  200. Dbg("Enter %s", __FUNCTION__);
  201. m_pClientSessionBase->OnDestroy();
  202. }
  203. }
  204. bool SpClientSessionFunction::isVaildPointer()
  205. {
  206. return m_value == WILD_POINTER_JUDGE;
  207. }
  208. const char * SpClientSessionFunction::GetRemoteEntityName()
  209. {
  210. if (m_uac) {
  211. int remote_ent_idx = sp_ses_uac_get_remote_svc_id(m_uac);
  212. sp_entity_t *ent = sp_mod_mgr_find_entity_by_idx(sp_get_env()->mod_mgr, remote_ent_idx);
  213. if (ent) {
  214. return ent->cfg->name;
  215. }
  216. }
  217. return NULL;
  218. }