SpTransactionContext.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpMisc.h"
  4. #include "SpModule.h"
  5. #include "SpEntity.h"
  6. #include "SpTransactionContext.h"
  7. #include "sp_ses.h"
  8. #include <winpr/sysinfo.h>
  9. SpTransactionContext::SpTransactionContext(sp_ses_uas_t *uas, int info, int method_id, int method_sig, int timeout, iobuffer_t **p_pkt, int tsx_id)
  10. : m_pkt(NULL), m_tsx(NULL)
  11. {
  12. int rc;
  13. sp_tsx_uas_callback cb;
  14. cb.on_destroy = NULL;
  15. cb.user_data = this;
  16. rc = sp_tsx_uas_create(uas, tsx_id, &cb, &m_tsx);
  17. if (rc == 0) {
  18. m_info = info;
  19. m_method_id = method_id;
  20. m_method_sig = method_sig;
  21. m_timeout = timeout;
  22. m_expire_time = timeout < 0 ? -1 : ((int)GetTickCount() + timeout);
  23. if (p_pkt) {
  24. m_pkt = *p_pkt;
  25. *p_pkt = NULL;
  26. }
  27. }
  28. }
  29. SpTransactionContext::~SpTransactionContext()
  30. {
  31. if (m_pkt)
  32. iobuffer_dec_ref(m_pkt);
  33. if (m_tsx) {
  34. sp_tsx_uas_close(m_tsx);
  35. sp_tsx_uas_destroy(m_tsx);
  36. }
  37. }
  38. bool SpTransactionContext::IsOneWayCall()
  39. {
  40. return !!m_info;
  41. }
  42. DWORD SpTransactionContext::GetRequestID()
  43. {
  44. if (m_tsx) {
  45. return (DWORD)sp_tsx_uas_get_id(m_tsx);
  46. } else {
  47. return -1;
  48. }
  49. }
  50. ErrorCodeEnum SpTransactionContext::GetReceiveBuffer(DWORD &dwMessageID, DWORD &dwMessageSignature, CAutoBuffer &Buffer)
  51. {
  52. if (m_pkt) {
  53. dwMessageID = (DWORD)m_method_id;
  54. dwMessageSignature = (DWORD)m_method_sig;
  55. int size = iobuffer_get_length(m_pkt);
  56. Buffer.Init(size);
  57. if (size > 0) {
  58. memcpy(&Buffer[0], iobuffer_data(m_pkt, 0), size);
  59. }
  60. return Error_Succeed;
  61. } else {
  62. return Error_Unexpect;
  63. }
  64. }
  65. ErrorCodeEnum SpTransactionContext::SendAnswer(CAutoBuffer Buffer, bool bEnd)
  66. {
  67. if (m_info) {
  68. return Error_Bug;
  69. }
  70. else
  71. {
  72. iobuffer_t *ans_pkt = iobuffer_create(-1, -1);
  73. int rc;
  74. int v;
  75. v = (int)Error_Succeed;
  76. iobuffer_write(ans_pkt, IOBUF_T_I4, &v, 0); // sys error
  77. v = 0;
  78. iobuffer_write(ans_pkt, IOBUF_T_I4, &v, 0); // user error
  79. v = Buffer.GetCount();
  80. if (v > 0)
  81. iobuffer_write(ans_pkt, IOBUF_T_BUF, &Buffer[0], v);
  82. #if _DEBUG
  83. //Dbg("on_ans: tsx_id = %d, method_id = %d, pkt_size = %d", sp_tsx_uas_get_id(m_tsx), m_method_id, iobuffer_get_length(ans_pkt));
  84. #endif
  85. rc = sp_tsx_uas_answer(m_tsx, !!bEnd, &ans_pkt);
  86. if (ans_pkt)
  87. iobuffer_dec_ref(ans_pkt);
  88. return SpTranslateError(rc);
  89. }
  90. }
  91. ErrorCodeEnum SpTransactionContext::SendAnswer(ErrorCodeEnum eSysError, DWORD dwUserError)
  92. {
  93. if (m_info) {
  94. return Error_Bug;
  95. }
  96. else {
  97. iobuffer_t *ans_pkt = iobuffer_create(-1, -1);
  98. int rc;
  99. int v;
  100. v = (int)eSysError;
  101. iobuffer_write(ans_pkt, IOBUF_T_I4, &v, 0); // sys error
  102. iobuffer_write(ans_pkt, IOBUF_T_I4, &dwUserError, 0); // user error
  103. #if _DEBUG
  104. //Dbg("on_ans: tsx_id = %d, method_id = %d, pkt_size = %d, error = 0x%X", sp_tsx_uas_get_id(m_tsx), m_method_id, iobuffer_get_length(ans_pkt), (int)eErrorCode);
  105. #endif
  106. rc = sp_tsx_uas_answer(m_tsx, 1, &ans_pkt);
  107. if (ans_pkt)
  108. iobuffer_dec_ref(ans_pkt);
  109. return SpTranslateError(rc);
  110. }
  111. }
  112. DWORD SpTransactionContext::GetExpireLeftTime()
  113. {
  114. if (m_tsx) { // because the machine will restart every day, so use int for time ticks storage is ok!
  115. if (m_expire_time == -1) {
  116. return m_expire_time;
  117. } else {
  118. int now = (int)GetTickCount();
  119. return m_expire_time > now ? (m_expire_time - now) : 0;
  120. }
  121. } else {
  122. return -1;
  123. }
  124. }
  125. ErrorCodeEnum SpTransactionContext::GetExpireTime(DWORD &dwWholeTime,DWORD &dwLeftTime)
  126. {
  127. if (m_tsx) {
  128. if (m_expire_time == -1) {
  129. dwWholeTime = dwLeftTime = 0xffffffff;
  130. } else {
  131. int now = (int)GetTickCount();
  132. dwWholeTime = m_timeout;
  133. dwLeftTime = m_expire_time > now ? (m_expire_time - now) : 0;
  134. }
  135. return Error_Succeed;
  136. } else {
  137. return Error_Unexpect;
  138. }
  139. }
  140. ErrorCodeEnum SpTransactionContext::SetExpireTime( DWORD dwMS )
  141. {
  142. return Error_NotImpl;
  143. }
  144. //
  145. // SpMUITransactionContext
  146. //
  147. ErrorCodeEnum SpMUITransactionContext::SendAnswer( ErrorCodeEnum eErrorCode, DWORD dwUserError)
  148. {
  149. if (m_op == OP_START) {
  150. m_pEntity->FinishStart(eErrorCode);
  151. } else if (m_op == OP_PAUSE) {
  152. m_pEntity->FinishPause(eErrorCode);
  153. } else if (m_op == OP_SELFTEST) {
  154. m_pEntity->FinishSelfTest(eErrorCode);
  155. } else if (m_op == OP_CONTINUE) {
  156. m_pEntity->FinishContinue(eErrorCode);
  157. } else if (m_op == OP_CLOSE) {
  158. m_pEntity->FinishClose(eErrorCode);
  159. }
  160. return Error_Unexpect;
  161. }