FlowControlFSM.h 5.2 KB

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