FlowControlFSM.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #pragma once
  2. #include "SpBase.h"
  3. #include "SpHelper.h"
  4. #include "SpFSM.h"
  5. #include "InitiativeTransfer_server_g.h"
  6. #include "InitiativeTransfer_msg_g.h"
  7. #include "AssistantChannel_client_g.h"
  8. #include "chan_protocol.h"
  9. using namespace AssistantChannel;
  10. #include "InitiativeTransfer_msg_g.h"
  11. using namespace InitiativeTransfer;
  12. #define USER_EVT_REQAGENTFLOW EVT_USER+1
  13. #define USER_EVT_ANSAGENTFLOW EVT_USER+2
  14. #define USER_EVT_CHAN_ON EVT_USER+3
  15. #define USER_EVT_CHAN_OFF EVT_USER+4
  16. #define USER_EVT_NTFENTFLOW EVT_USER+5
  17. #define USER_EVT_DISCTRL EVT_USER+6
  18. #define USER_EVT_REQACMFLOW EVT_USER+9
  19. #define USER_EVT_ANSACMFLOW EVT_USER+10
  20. #define USER_EVT_EXIT EVT_USER+50
  21. #define USER_EVT_ASSIS_IDEL EVT_USER+60
  22. #define USER_EVT_MENU_RETURN EVT_USER+70
  23. #define USER_EVT_EXIT_BACKRUN EVT_USER+80
  24. class CFlowControlFSM;
  25. class ChannelClient : public ChannelService_ClientBase
  26. {
  27. public:
  28. ChannelClient(CEntityBase *pEntity, CFlowControlFSM *pFSM) : ChannelService_ClientBase(pEntity), m_pFSM(pFSM) {}
  29. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData);
  30. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_Packet_Info &Msg, CSmartPointer<IReleasable> pData);
  31. private:
  32. CFlowControlFSM *m_pFSM;
  33. };
  34. struct ReqAgentFlowEvent : public FSMEvent
  35. {
  36. ReqAgentFlowEvent() : FSMEvent(USER_EVT_REQAGENTFLOW) {}
  37. virtual ~ReqAgentFlowEvent() {}
  38. CSimpleStringW req_context;
  39. virtual void OnUnhandled()
  40. {
  41. AgentFlowResult evt;
  42. evt.error = Error_InvalidState;
  43. SpSendBroadcast(m_pEntityBase->GetFunction(), SP_MSG_OF(AgentFlowResult),SP_MSG_SIG_OF(AgentFlowResult),evt);
  44. }
  45. CEntityBase *m_pEntityBase;
  46. };
  47. struct AnsAgentFlowEvent : public FSMEvent
  48. {
  49. AnsAgentFlowEvent() : FSMEvent(USER_EVT_ANSAGENTFLOW) {}
  50. virtual ~AnsAgentFlowEvent() {}
  51. #if defined(RVC_OS_WIN)
  52. CSimpleStringW ans_context;
  53. #else
  54. CSimpleString16Bit ans_context;
  55. #endif //RVC_OS_WIN
  56. int err;
  57. };
  58. struct NotifyEnterFlowEvent : public FSMEvent
  59. {
  60. NotifyEnterFlowEvent() : FSMEvent(USER_EVT_NTFENTFLOW) {}
  61. virtual ~NotifyEnterFlowEvent() {}
  62. virtual void OnUnhandled();
  63. #if defined(RVC_OS_WIN)
  64. CSimpleStringW context;
  65. #else
  66. CSimpleString16Bit context;
  67. #endif //RVC_OS_WIN
  68. CFlowControlFSM *m_pFSM;
  69. };
  70. struct AnsACMFlowEvent : public FSMEvent
  71. {
  72. AnsACMFlowEvent() : FSMEvent(USER_EVT_ANSACMFLOW) {}
  73. virtual ~AnsACMFlowEvent() {}
  74. CSimpleStringW ans_context;
  75. };
  76. struct ReqACMFlowEvent : public FSMEvent
  77. {
  78. ReqACMFlowEvent() : FSMEvent(USER_EVT_REQACMFLOW) {}
  79. virtual ~ReqACMFlowEvent() {}
  80. #if defined(RVC_OS_WIN)
  81. CSimpleStringW req_context;
  82. #else
  83. CSimpleString16Bit req_context;
  84. #endif //RVC_OS_WIN
  85. };
  86. class CFlowControlFSM : public FSMImpl<CFlowControlFSM>, public IFSMStateHooker
  87. {
  88. public:
  89. enum {s0, s1, s2, s3, s5, s7};
  90. BEGIN_FSM_STATE(CFlowControlFSM)
  91. FSM_STATE_ENTRY(s0, "Offline", s0_on_entry, s0_on_exit, s0_on_event)
  92. FSM_STATE_ENTRY(s1, "FrontFlow", s1_on_entry, s1_on_exit, s1_on_event)
  93. FSM_STATE_ENTRY(s2, "BackRun", s2_on_entry, s2_on_exit, s2_on_event)
  94. FSM_STATE_ENTRY(s3, "FrontCall", s3_on_entry, s3_on_exit, s3_on_event)
  95. FSM_STATE_ENTRY(s5, "Transferring", s5_on_entry, s5_on_exit, s5_on_event)
  96. FSM_STATE_ENTRY(s7, "Error", s7_on_entry, s7_on_exit, s7_on_event)
  97. END_FSM_STATE()
  98. BEGIN_FSM_RULE(CFlowControlFSM, s0)
  99. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_CHAN_ON)
  100. FSM_RULE_ENTRY_ANY(s0, FSM_STATE_EXIT, USER_EVT_EXIT)
  101. FSM_RULE_ENTRY_ANY(s0, s0, USER_EVT_ANSACMFLOW)
  102. FSM_RULE_ENTRY_ANY(s0, s0, USER_EVT_REQAGENTFLOW)
  103. FSM_RULE_ENTRY(s1, s7, USER_EVT_REQAGENTFLOW, 0)
  104. FSM_RULE_ENTRY(s1, s2, USER_EVT_REQAGENTFLOW, 1)
  105. FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_CHAN_OFF)
  106. FSM_RULE_ENTRY_ANY(s1, s5, USER_EVT_NTFENTFLOW)
  107. FSM_RULE_ENTRY_ANY(s2, s0, USER_EVT_CHAN_OFF)
  108. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_MENU_RETURN)
  109. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_EXIT_BACKRUN)
  110. FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_ANSAGENTFLOW)
  111. FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_REQACMFLOW)
  112. FSM_RULE_ENTRY_ANY(s2, s2, USER_EVT_NTFENTFLOW)
  113. FSM_RULE_ENTRY_ANY(s2, s7, USER_EVT_REQAGENTFLOW)
  114. FSM_RULE_ENTRY(s3, s2, USER_EVT_ANSACMFLOW, 1)
  115. FSM_RULE_ENTRY(s3, s7, USER_EVT_ANSACMFLOW, 0)
  116. FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_CHAN_OFF)
  117. FSM_RULE_ENTRY_ANY(s5, s1, USER_EVT_DISCTRL)
  118. FSM_RULE_ENTRY_ANY(s5, s2, USER_EVT_REQAGENTFLOW)
  119. FSM_RULE_ENTRY_ANY(s5, s0, USER_EVT_CHAN_OFF)
  120. FSM_RULE_ENTRY_ANY(s7, s0, USER_EVT_CHAN_OFF)
  121. END_FSM_RULE()
  122. CFlowControlFSM();
  123. ~CFlowControlFSM();
  124. virtual void OnStateTrans(int iSrcState, int iDstState);
  125. virtual ErrorCodeEnum OnInit();
  126. virtual ErrorCodeEnum OnExit();
  127. void s0_on_entry() {}
  128. void s0_on_exit() {}
  129. unsigned int s0_on_event(FSMEvent* event);
  130. void s1_on_entry() {}
  131. void s1_on_exit() {}
  132. unsigned int s1_on_event(FSMEvent* event);
  133. void s2_on_entry() {}
  134. void s2_on_exit();
  135. unsigned int s2_on_event(FSMEvent* event);
  136. void s3_on_entry();
  137. void s3_on_exit();
  138. unsigned int s3_on_event(FSMEvent* event);
  139. void s5_on_entry();
  140. void s5_on_exit();
  141. unsigned int s5_on_event(FSMEvent* event);
  142. void s6_on_entry() {}
  143. void s6_on_exit() {}
  144. unsigned int s6_on_event(FSMEvent* event) {}
  145. void s7_on_entry();
  146. void s7_on_exit() {}
  147. unsigned int s7_on_event(FSMEvent* event);
  148. void ProcessPacket(int sub_type, CBlob &blob);
  149. ErrorCodeEnum SetState(const char *s, const char *sdesc);
  150. bool IsAssistchanEntityAvailable();
  151. ErrorCodeEnum ConnectToAssistchan(bool blogevt = false);
  152. bool IsAssistchanConnectSessionOK();
  153. void FreeAssistchanClient();
  154. ErrorCodeEnum DisallowControl();
  155. bool m_bConnectAssit;
  156. private:
  157. bool m_bChanOff;
  158. ChannelClient *m_pClient;
  159. };