ConnectorFSM.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. #pragma once
  2. #include "SpHelper.h"
  3. #include "SpFSM.h"
  4. #include "SpIni.h"
  5. #include "IHttpFunc.h"
  6. #include "Event.h"
  7. #include "../include/EventCode.h"
  8. #include "y2k_time.h"
  9. #include "CommEntityUtil.hpp"
  10. #ifdef _WIN32
  11. #include "resource.h"
  12. #else
  13. #include "uuid/uuid.h"
  14. #endif
  15. #include "http_callrouter.h"
  16. #include "../mod_assistantchannel/VideoDesc.h"
  17. #include "../mod_sipphone/SIPPhone_client_g.h"
  18. using namespace SIPPhone;
  19. #include "../mod_assistantchannel/AssistantChannel_client_g.h"
  20. using namespace AssistantChannel;
  21. #include "../mod_mediacontroller/MediaController_client_g.h"
  22. using namespace MediaController;
  23. #include "../mod_assistantchannel/chan_protocol.h"
  24. #include "CallType.h"
  25. #include "CounterConnector_def_g.h"
  26. #include "CounterConnector_msg_g.h"
  27. using namespace CounterConnector;
  28. #include "../mod_interactioncontext/InteractionContext_client_g.h"
  29. #include "../mod_interactioncontext/InteractionContext_def_g.h"
  30. using namespace InteractionContext;
  31. #include <vector>
  32. #include <string>
  33. #ifndef RVC_DEFAULT_HTTPTIMEOUT
  34. #define RVC_DEFAULT_HTTPTIMEOUT 10
  35. #endif // !RVC_DEFAULT_HTTPTIMEOUT
  36. #ifndef RVC_DEFAULT_VOIPSERVER_ADDR
  37. #ifdef DEVOPS_ON_PRD
  38. #define RVC_DEFAULT_VOIPSERVER_ADDR "sip:843235023@10.16.129.1,10.16.130.65 2334|sip:843235023@10.16.129.3,10.16.130.66 2334|sip:843235023@10.16.129.5,10.16.130.67 2334|sip:843235023@10.16.129.9,10.16.130.68 2334|sip:843235023@10.16.129.10,10.16.130.131 2334|sip:843235023@10.16.128.1,10.16.130.132 2334|sip:843235023@10.16.128.2,10.16.130.133 2334|sip:843235023@10.16.128.3,10.16.130.134 2334|sip:843235023@10.16.128.4,10.16.130.68 2334|sip:843235023@10.16.128.5,10.16.130.131 2334\0"
  39. #else
  40. #define RVC_DEFAULT_VOIPSERVER_ADDR "sip:843215022@55.9.188.83,55.9.188.83 2334|sip:843215022@55.9.188.83,55.9.188.83 2334\0"
  41. #endif// !DEVOPS_ON_PRD
  42. #endif // !RVC_DEFAULT_VOIPSERVER_ADDR
  43. #define USER_EVT_PICKUP_CALL EVT_USER+1
  44. #define USER_EVT_HANDFREE_CALL EVT_USER+2
  45. #define USER_EVT_HANGUP EVT_USER+3
  46. #define USER_EVT_DOUBLE_RECORD_CALL EVT_USER+5
  47. #define USER_EVT_JMP_FAIL EVT_USER+11
  48. #define USER_EVT_JMP_HANDFREE EVT_USER+12
  49. #define USER_EVT_JMP_PICKUP EVT_USER+13
  50. #define USER_EVT_TO_HANDFREE EVT_USER+14
  51. #define USER_EVT_TO_PICKUP EVT_USER+15
  52. #define USER_EVT_SIP_STATE_CONNECTED EVT_USER+21
  53. #define USER_EVT_SIP_STATE_IDLE EVT_USER+22
  54. #define USER_EVT_CHAN_STATE_CONNECTED EVT_USER+31
  55. #define USER_EVT_CHAN_STATE_IDLE EVT_USER+33
  56. #define USER_EVT_RECONNECT EVT_USER+40
  57. #define USER_EVT_AGENT_WRITABLE EVT_USER+41
  58. #define USER_EVT_ERROR EVT_USER+10
  59. #define USER_EVT_EXIT EVT_USER+50
  60. #define USER_EVT_STOP_RECORD_BROADCAST EVT_USER+55
  61. #define USER_EVT_ASSISTCHAN_IDEL EVT_USER+60
  62. #define USER_EVT_SIPPHONE_IDEL EVT_USER+61
  63. #define USER_EVT_STARTVIDEODISPLAY EVT_USER+70
  64. #define USER_EVT_STOPVIDEODISPLAY EVT_USER+71
  65. #define USER_EVT_SHOWLOACALVIDEO EVT_USER+72
  66. #define USER_EVT_STOPLOCALVIDEO EVT_USER+73
  67. #define USER_EVT_SHOWLOACALREMOTEVIDEO EVT_USER+74
  68. #define USER_EVT_STOPLOACALREMOTEVIDEO EVT_USER+75
  69. enum CurServerNum
  70. {
  71. Error_Server = -1,
  72. MAIN_SERVER,
  73. BACK_SERVER
  74. };
  75. #ifndef MAX_VOIP_SERVER_NUM
  76. #define MAX_VOIP_SERVER_NUM 16
  77. #endif
  78. struct ChanStateConnectedEvent : public FSMEvent
  79. {
  80. ChanStateConnectedEvent(const char *param) : FSMEvent(USER_EVT_CHAN_STATE_CONNECTED), m_param(param) {}
  81. CSimpleStringA m_param;
  82. };
  83. struct StartVideoDisplayEvent : public FSMEvent
  84. {
  85. StartVideoDisplayEvent(const char *param) : FSMEvent(USER_EVT_STARTVIDEODISPLAY), m_param(param) {}
  86. CSimpleStringA m_param;
  87. };
  88. struct ShowLocalVideoEvent : public FSMEvent
  89. {
  90. ShowLocalVideoEvent(const char *param) : FSMEvent(USER_EVT_SHOWLOACALVIDEO), m_param(param) {}
  91. CSimpleStringA m_param;
  92. };
  93. struct ShowLocalAndRemoteVideoEvent : public FSMEvent
  94. {
  95. ShowLocalAndRemoteVideoEvent(const char *param) : FSMEvent(USER_EVT_SHOWLOACALREMOTEVIDEO), m_param(param) {}
  96. CSimpleStringA m_param;
  97. };
  98. struct CallingParam
  99. {
  100. //呼叫模式,0:可视柜台正常呼叫,1:双录连线
  101. CallingTypeEnum nCallType;
  102. CSimpleStringA connect_session;
  103. CSimpleStringA connect_ip;
  104. int connect_port;
  105. CSimpleStringA subid;
  106. int assistant_port;
  107. };
  108. #ifndef MAX_LENGTH_OF_BRANCHNO
  109. #define MAX_LENGTH_OF_BRANCHNO 4
  110. #endif
  111. #ifndef MAX_LENGTH_OF_SESSIONID
  112. #define MAX_LENGTH_OF_SESSIONID 16
  113. #endif
  114. #ifndef MAX_LENGTH_OF_CONNECTIP
  115. #define MAX_LENGTH_OF_CONNECTIP 16
  116. #endif
  117. class ACMCallFSM : public FSMImpl<ACMCallFSM>, public IFSMStateHooker
  118. {
  119. public:
  120. enum {s0,s7,s8,s10,s11,s12,s13,s14,s20,s21,s22,s23,s24,s3,s4,s50,s51,s52,s53,s60,s61,s62,s63};
  121. BEGIN_FSM_STATE(ACMCallFSM)
  122. FSM_STATE_ENTRY(s0,"Offline",s0_on_entry,s0_on_exit,s0_on_event)
  123. FSM_STATE_ENTRY(s7,"ShowLocalVideo",s7_on_entry,s7_on_exit,s7_on_event)
  124. FSM_STATE_ENTRY(s8,"Delay",s8_on_entry,s8_on_exit,s8_on_event)
  125. FSM_STATE_ENTRY(s10,"Calling_Start",s10_on_entry,s10_on_exit,s10_on_event)
  126. FSM_STATE_ENTRY(s11,"Calling_SipConnect",s11_on_entry,s11_on_exit,s11_on_event)
  127. FSM_STATE_ENTRY(s12,"Calling_ChanConnect",s12_on_entry,s12_on_exit,s12_on_event)
  128. FSM_STATE_ENTRY(s13,"Calling_AllReady",s13_on_entry,s13_on_exit,s13_on_event)
  129. FSM_STATE_ENTRY(s14,"ShowLocalRemoteVideo",s14_on_entry,s14_on_exit,s14_on_event)
  130. FSM_STATE_ENTRY(s20, "ExitCall_Start",s20_on_entry,s20_on_exit,s20_on_event)
  131. FSM_STATE_ENTRY(s21, "ExitChan_Finished",s21_on_entry,s21_on_exit,s21_on_event)
  132. FSM_STATE_ENTRY(s22, "ExitSip_Finished",s22_on_entry,s22_on_exit,s22_on_event)
  133. FSM_STATE_ENTRY(s23, "ExitCall_AllFinished",s23_on_entry,s23_on_exit,s23_on_event)
  134. FSM_STATE_ENTRY(s24, "ExitCall_Delay",s24_on_entry,s24_on_exit,s24_on_event)
  135. FSM_STATE_ENTRY(s3, "HandFree",s3_on_entry,s3_on_exit,s3_on_event)
  136. FSM_STATE_ENTRY(s4, "Pickup",s4_on_entry,s4_on_exit,s4_on_event)
  137. FSM_STATE_ENTRY(s50, "Broken0",s50_on_entry,s50_on_exit,s50_on_event)
  138. FSM_STATE_ENTRY(s51, "Broken_SipFinished",s51_on_entry,s51_on_exit,s51_on_event)
  139. FSM_STATE_ENTRY(s52, "Broken_ChanFinished",s52_on_entry,s52_on_exit,s52_on_event)
  140. FSM_STATE_ENTRY(s53, "Broken_AllFinished",s53_on_entry,s53_on_exit,s53_on_event)
  141. FSM_STATE_ENTRY(s60, "Hangup_Start",s60_on_entry,s60_on_exit,s60_on_event)
  142. FSM_STATE_ENTRY(s61, "Hangup_SipFinished",s61_on_entry,s61_on_exit,s61_on_event)
  143. FSM_STATE_ENTRY(s62, "Hangup_ChanFinished",s62_on_entry,s62_on_exit,s62_on_event)
  144. FSM_STATE_ENTRY(s63, "Hangup_AllFinished",s63_on_entry,s63_on_exit,s63_on_event)
  145. END_FSM_STATE()
  146. BEGIN_FSM_RULE(ACMCallFSM,s0)
  147. FSM_RULE_ENTRY_ANY(s0, s8, USER_EVT_PICKUP_CALL)
  148. FSM_RULE_ENTRY_ANY(s0, s7, USER_EVT_SHOWLOACALVIDEO)
  149. FSM_RULE_ENTRY_ANY(s0, s14, USER_EVT_SHOWLOACALREMOTEVIDEO)
  150. FSM_RULE_ENTRY_ANY(s7, s0, USER_EVT_STOPLOCALVIDEO)
  151. FSM_RULE_ENTRY_ANY(s14, s0, USER_EVT_STOPLOACALREMOTEVIDEO)
  152. FSM_RULE_ENTRY_ANY(s0, FSM_STATE_EXIT, USER_EVT_EXIT)
  153. FSM_RULE_ENTRY_ANY(s0, s8, USER_EVT_HANDFREE_CALL)
  154. FSM_RULE_ENTRY_ANY(s0, s8, USER_EVT_DOUBLE_RECORD_CALL)
  155. FSM_RULE_ENTRY_ANY(s14, s0, USER_EVT_STOP_RECORD_BROADCAST)
  156. FSM_RULE_ENTRY_ANY(s8, s11, EVT_TIMER)
  157. FSM_RULE_ENTRY_ANY(s11, s12, USER_EVT_SIP_STATE_CONNECTED)
  158. FSM_RULE_ENTRY_ANY(s11, s23, USER_EVT_JMP_FAIL)
  159. FSM_RULE_ENTRY_ANY(s11, s21, EVT_TIMER)
  160. FSM_RULE_ENTRY_ANY(s11, s23, USER_EVT_SIP_STATE_IDLE)
  161. FSM_RULE_ENTRY_ANY(s11, s21, USER_EVT_HANGUP)
  162. FSM_RULE_ENTRY_ANY(s21, s23, USER_EVT_SIP_STATE_IDLE)
  163. FSM_RULE_ENTRY_ANY(s21, s23, USER_EVT_JMP_FAIL)
  164. FSM_RULE_ENTRY_ANY(s12, s13, USER_EVT_CHAN_STATE_CONNECTED)
  165. FSM_RULE_ENTRY_ANY(s12, s21, USER_EVT_CHAN_STATE_IDLE)
  166. FSM_RULE_ENTRY_ANY(s12, s22, USER_EVT_SIP_STATE_IDLE)
  167. FSM_RULE_ENTRY_ANY(s12, s21, USER_EVT_JMP_FAIL)
  168. FSM_RULE_ENTRY_ANY(s22, s23, USER_EVT_CHAN_STATE_IDLE)
  169. FSM_RULE_ENTRY_ANY(s12, s20, USER_EVT_HANGUP)
  170. FSM_RULE_ENTRY_ANY(s20, s21, USER_EVT_CHAN_STATE_IDLE)
  171. FSM_RULE_ENTRY_ANY(s20, s22, USER_EVT_SIP_STATE_IDLE)
  172. FSM_RULE_ENTRY_ANY(s13, s3, USER_EVT_JMP_HANDFREE)
  173. FSM_RULE_ENTRY_ANY(s13, s4, USER_EVT_JMP_PICKUP)
  174. FSM_RULE_ENTRY_ANY(s23, s0, EVT_TIMER)
  175. FSM_RULE_ENTRY_ANY(s23, s24, USER_EVT_RECONNECT)
  176. FSM_RULE_ENTRY_ANY(s24, s11, EVT_TIMER)
  177. FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_TO_PICKUP)
  178. FSM_RULE_ENTRY_ANY(s3, s51, USER_EVT_SIP_STATE_IDLE)
  179. FSM_RULE_ENTRY_ANY(s3, s52, USER_EVT_CHAN_STATE_IDLE)
  180. FSM_RULE_ENTRY_ANY(s3, s60, USER_EVT_HANGUP)
  181. FSM_RULE_ENTRY_ANY(s4, s3, USER_EVT_TO_HANDFREE)
  182. FSM_RULE_ENTRY_ANY(s4, s51, USER_EVT_SIP_STATE_IDLE)
  183. FSM_RULE_ENTRY_ANY(s4, s52, USER_EVT_CHAN_STATE_IDLE)
  184. FSM_RULE_ENTRY_ANY(s4, s60, USER_EVT_HANGUP)
  185. FSM_RULE_ENTRY_ANY(s50, s51, USER_EVT_SIP_STATE_IDLE)
  186. FSM_RULE_ENTRY_ANY(s50, s52, USER_EVT_CHAN_STATE_IDLE)
  187. FSM_RULE_ENTRY_ANY(s51, s53, USER_EVT_CHAN_STATE_IDLE)
  188. FSM_RULE_ENTRY_ANY(s52, s53, USER_EVT_SIP_STATE_IDLE)
  189. FSM_RULE_ENTRY_ANY(s52, s53, USER_EVT_JMP_FAIL)
  190. FSM_RULE_ENTRY_ANY(s53, s0, EVT_TIMER)
  191. FSM_RULE_ENTRY_ANY(s60, s61, USER_EVT_SIP_STATE_IDLE)
  192. FSM_RULE_ENTRY_ANY(s60, s62, USER_EVT_CHAN_STATE_IDLE)
  193. FSM_RULE_ENTRY_ANY(s61, s63, USER_EVT_CHAN_STATE_IDLE)
  194. FSM_RULE_ENTRY_ANY(s62, s63, USER_EVT_SIP_STATE_IDLE)
  195. FSM_RULE_ENTRY_ANY(s62, s63, USER_EVT_JMP_FAIL)
  196. FSM_RULE_ENTRY_ANY(s63, s0, EVT_TIMER)
  197. //assitchannel重启后,状态跳转到Offline
  198. FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_ASSISTCHAN_IDEL)
  199. FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_ASSISTCHAN_IDEL)
  200. FSM_RULE_ENTRY_ANY(s50, s0, USER_EVT_ASSISTCHAN_IDEL)
  201. FSM_RULE_ENTRY_ANY(s51, s0, USER_EVT_ASSISTCHAN_IDEL)
  202. FSM_RULE_ENTRY_ANY(s52, s0, USER_EVT_ASSISTCHAN_IDEL)
  203. FSM_RULE_ENTRY_ANY(s53, s0, USER_EVT_ASSISTCHAN_IDEL)
  204. FSM_RULE_ENTRY_ANY(s60, s0, USER_EVT_ASSISTCHAN_IDEL)
  205. FSM_RULE_ENTRY_ANY(s61, s0, USER_EVT_ASSISTCHAN_IDEL)
  206. FSM_RULE_ENTRY_ANY(s62, s0, USER_EVT_ASSISTCHAN_IDEL)
  207. FSM_RULE_ENTRY_ANY(s63, s0, USER_EVT_ASSISTCHAN_IDEL)
  208. //sipphone重启后,所有状态跳转到Offline
  209. FSM_RULE_ENTRY_ANY(s8, s0, USER_EVT_SIPPHONE_IDEL)
  210. FSM_RULE_ENTRY_ANY(s10, s0, USER_EVT_SIPPHONE_IDEL)
  211. FSM_RULE_ENTRY_ANY(s11, s0, USER_EVT_SIPPHONE_IDEL)
  212. FSM_RULE_ENTRY_ANY(s12, s0, USER_EVT_SIPPHONE_IDEL)
  213. FSM_RULE_ENTRY_ANY(s13, s0, USER_EVT_SIPPHONE_IDEL)
  214. FSM_RULE_ENTRY_ANY(s20, s0, USER_EVT_SIPPHONE_IDEL)
  215. FSM_RULE_ENTRY_ANY(s21, s0, USER_EVT_SIPPHONE_IDEL)
  216. FSM_RULE_ENTRY_ANY(s22, s0, USER_EVT_SIPPHONE_IDEL)
  217. FSM_RULE_ENTRY_ANY(s23, s0, USER_EVT_SIPPHONE_IDEL)
  218. FSM_RULE_ENTRY_ANY(s24, s0, USER_EVT_SIPPHONE_IDEL)
  219. FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_SIPPHONE_IDEL)
  220. FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_SIPPHONE_IDEL)
  221. FSM_RULE_ENTRY_ANY(s50, s0, USER_EVT_SIPPHONE_IDEL)
  222. FSM_RULE_ENTRY_ANY(s51, s0, USER_EVT_SIPPHONE_IDEL)
  223. FSM_RULE_ENTRY_ANY(s52, s0, USER_EVT_SIPPHONE_IDEL)
  224. FSM_RULE_ENTRY_ANY(s53, s0, USER_EVT_SIPPHONE_IDEL)
  225. FSM_RULE_ENTRY_ANY(s60, s0, USER_EVT_SIPPHONE_IDEL)
  226. FSM_RULE_ENTRY_ANY(s61, s0, USER_EVT_SIPPHONE_IDEL)
  227. FSM_RULE_ENTRY_ANY(s62, s0, USER_EVT_SIPPHONE_IDEL)
  228. FSM_RULE_ENTRY_ANY(s63, s0, USER_EVT_SIPPHONE_IDEL)
  229. //sipphone重启后,所有状态跳转到Offline
  230. //分布式呼叫场景,拒接主动挂断
  231. FSM_RULE_ENTRY_ANY(s0, s60, USER_EVT_HANGUP)
  232. //分布式呼叫场景,拒接主动挂断
  233. END_FSM_RULE()
  234. ACMCallFSM();
  235. ~ACMCallFSM();
  236. virtual void OnStateTrans(int iSrcState, int iDstState);
  237. virtual ErrorCodeEnum OnInit();
  238. virtual ErrorCodeEnum OnExit();
  239. void s0_on_entry();
  240. void s0_on_exit();
  241. unsigned int s0_on_event(FSMEvent* event);
  242. void s7_on_entry();
  243. void s7_on_exit();
  244. unsigned int s7_on_event(FSMEvent* event);
  245. void s8_on_entry();
  246. void s8_on_exit();
  247. unsigned int s8_on_event(FSMEvent* event);
  248. void s10_on_entry();
  249. void s10_on_exit();
  250. unsigned int s10_on_event(FSMEvent* event);
  251. void s11_on_entry();
  252. void s11_on_exit();
  253. unsigned int s11_on_event(FSMEvent* event);
  254. void s12_on_entry();
  255. void s12_on_exit();
  256. unsigned int s12_on_event(FSMEvent* event);
  257. void s13_on_entry();
  258. void s13_on_exit();
  259. unsigned int s13_on_event(FSMEvent* event);
  260. void s14_on_entry();
  261. void s14_on_exit();
  262. unsigned int s14_on_event(FSMEvent* event);
  263. void s20_on_entry();
  264. void s20_on_exit();
  265. unsigned int s20_on_event(FSMEvent* event);
  266. void s21_on_entry();
  267. void s21_on_exit();
  268. unsigned int s21_on_event(FSMEvent* event);
  269. void s22_on_entry();
  270. void s22_on_exit();
  271. unsigned int s22_on_event(FSMEvent* event);
  272. void s23_on_entry();
  273. void s23_on_exit();
  274. unsigned int s23_on_event(FSMEvent* event);
  275. void s24_on_entry();
  276. void s24_on_exit();
  277. unsigned int s24_on_event(FSMEvent* event);
  278. void s3_on_entry();
  279. void s3_on_exit();
  280. unsigned int s3_on_event(FSMEvent* event);
  281. void s4_on_entry();
  282. void s4_on_exit();
  283. unsigned int s4_on_event(FSMEvent* event);
  284. void s50_on_entry();
  285. void s50_on_exit();
  286. unsigned int s50_on_event(FSMEvent* event);
  287. void s51_on_entry();
  288. void s51_on_exit();
  289. unsigned int s51_on_event(FSMEvent* event);
  290. void s52_on_entry();
  291. void s52_on_exit();
  292. unsigned int s52_on_event(FSMEvent* event);
  293. void s53_on_entry();
  294. void s53_on_exit();
  295. unsigned int s53_on_event(FSMEvent* event);
  296. void s60_on_entry();
  297. void s60_on_exit();
  298. unsigned int s60_on_event(FSMEvent* event);
  299. void s61_on_entry();
  300. void s61_on_exit();
  301. unsigned int s61_on_event(FSMEvent* event);
  302. void s62_on_entry();
  303. void s62_on_exit();
  304. unsigned int s62_on_event(FSMEvent* event);
  305. void s63_on_entry();
  306. void s63_on_exit();
  307. unsigned int s63_on_event(FSMEvent* event);
  308. bool m_bHangup;
  309. //sip呼叫失败次数,连续10次SIP呼叫失败触发自检重启SIPPHONE
  310. unsigned int m_nSipErrorNum;
  311. unsigned int m_uConnectTime;
  312. bool m_bConnected;
  313. long m_lConnectCostTime;
  314. bool ReConnectionAssistchan();
  315. bool ReConnectionSipphone(bool bLog = true);
  316. bool ReConnectionSyncService();
  317. int GetCallRouteList();
  318. ErrorCodeEnum StartVideo(const char *param)
  319. {
  320. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Start Video");
  321. if (!m_pPhoneClient)
  322. return Error_NetBroken;
  323. PhoneService_StartVideo_Info Info;
  324. ErrorCodeEnum Error = ParseVideoDesc(param, Info.remote_ip, Info.remote_port,
  325. Info.remote_width, Info.remote_height, Info.remote_fps,
  326. Info.local_view_x, Info.local_view_y, Info.local_view_cx, Info.local_view_cy,
  327. Info.remote_view_x, Info.remote_view_y, Info.remote_view_cx, Info.remote_view_cy);
  328. Info.local_hwd_move = 0;
  329. Info.remote_hwd_move = 1;
  330. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start video, remote width:%d, remote height:%d, local(%d,%d,%d,%d),remote(%d,%d,%d,%d), remote_fps:%d",
  331. // Info.remote_width, Info.remote_height,
  332. // Info.local_view_x, Info.local_view_y, Info.local_view_cx, Info.local_view_cy,
  333. // Info.remote_view_x, Info.remote_view_y, Info.remote_view_cx, Info.remote_view_cy, Info.remote_fps);
  334. if (Error == Error_Succeed) {
  335. Error = (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->StartVideo(Info);
  336. }
  337. else {
  338. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse video desc failed!");
  339. }
  340. return Error;
  341. }
  342. ErrorCodeEnum StopVideo()
  343. {
  344. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Stop Video");
  345. if (!m_pPhoneClient)
  346. return Error_NetBroken;
  347. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->StopVideo();
  348. }
  349. ErrorCodeEnum StartVideoRender(const char* param)
  350. {
  351. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start Record Video Render, and param is %s.", param);
  352. if (!m_pPhoneClient)
  353. return Error_NetBroken;
  354. PhoneService_StartVideoRender_Info Info;
  355. ErrorCodeEnum Error = ParseVideoRenderDesc(param,
  356. Info.local_view_x, Info.local_view_y, Info.local_view_cx, Info.local_view_cy,
  357. Info.remote_view_x, Info.remote_view_y, Info.remote_view_cx, Info.remote_view_cy);
  358. Info.local_hwd_move = 0;
  359. Info.remote_hwd_move = 1;
  360. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start record video render,local(%d,%d,%d,%d),remote(%d,%d,%d,%d)",
  361. //Info.local_view_x, Info.local_view_y, Info.local_view_cx, Info.local_view_cy,
  362. //Info.remote_view_x, Info.remote_view_y, Info.remote_view_cx, Info.remote_view_cy);
  363. if (Error == Error_Succeed) {
  364. Error = (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->StartVideoRender(Info);
  365. }
  366. else {
  367. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse video desc failed!");
  368. }
  369. return Error;
  370. }
  371. ErrorCodeEnum StopVideoRender()
  372. {
  373. /*DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Stop Record Video Render");*/
  374. if (!m_pPhoneClient)
  375. return Error_NetBroken;
  376. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->StopVideoRender();
  377. }
  378. ErrorCodeEnum RealSipErrorCheck()
  379. {
  380. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Sip connect Fail 6 times,RealSipErrorCheck!");
  381. if (!m_pPhoneClient)
  382. return Error_NetBroken;
  383. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->RealErrorCheck();
  384. }
  385. ErrorCodeEnum SetCallingType(CallingTypeEnum eType)
  386. {
  387. if (!m_pPhoneClient) {
  388. return Error_NetBroken;
  389. }
  390. PhoneService_SetCallingParam_Info info;
  391. info.CallType = eType;
  392. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->SetCallingParam(info);
  393. }
  394. bool IsCameraRenderState()
  395. {
  396. bool brender = false;
  397. if (!m_pPhoneClient) {
  398. return brender;
  399. }
  400. PhoneService_IsCameraRender_Req req;
  401. PhoneService_IsCameraRender_Ans ans;
  402. if (Error_Succeed == (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->IsCameraRender(req, ans, 5000)) {
  403. brender = ans.result;
  404. }
  405. return brender;
  406. }
  407. private:
  408. int TranslateState(int innerState);
  409. ErrorCodeEnum SetCallState(int state);
  410. //TODO: CrossPlaform [Gifur@2025730]
  411. void get_format_uuid(char* strbuffer, size_t ulen)
  412. {
  413. #ifdef RVC_OS_WIN
  414. UUID uuid;
  415. size_t uuidlen = 0;
  416. RPC_CSTR buf;
  417. UuidCreate((UUID*)&uuid);
  418. UuidToString((UUID*)&uuid, &buf);
  419. uuidlen = strlen((const char*)buf);
  420. if (uuidlen < ulen) {
  421. memcpy(strbuffer, (const char*)buf, uuidlen);
  422. }
  423. RpcStringFree(&buf);
  424. #else
  425. uuid_t uuid;
  426. uuid_generate(uuid);
  427. uuid_unparse(uuid, strbuffer);
  428. #endif
  429. }
  430. //TODO: CrossPlaform [Gifur@2025729]
  431. ErrorCodeEnum GetLocalIP(char *buff, size_t ulen)
  432. {
  433. #if defined(RVC_OS_WIN)
  434. char tmp[MAX_PATH] = { 0 };
  435. gethostname(tmp, sizeof(tmp));
  436. hostent* ent = gethostbyname(tmp);
  437. if (ent) {
  438. int icount = 0;
  439. for (; ent->h_addr_list[icount]; ) {
  440. ++icount;
  441. }
  442. m_iNetAdapterNum = icount;
  443. for (int i = 0; ent->h_addr_list[i]; ++i) {
  444. if (ent->h_addrtype == AF_INET) {
  445. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  446. char* p = inet_ntoa(*in);
  447. if (p[0] != '0') {
  448. if (strstr(p, "198.168.") == NULL && 0 != strncmp(p, "2.0.0.1", strlen("2.0.0.1"))) {
  449. strcpy(buff, p);
  450. return Error_Succeed;
  451. }
  452. }
  453. }
  454. }
  455. }
  456. return Error_Unexpect;
  457. #else
  458. ErrorCodeEnum error = Error_Unexpect;
  459. int sockfd = -1;
  460. struct ifconf ifconf;
  461. struct ifreq* ifreq = NULL;
  462. char strbuf[256] = { 0 };
  463. ifconf.ifc_len = 256;
  464. ifconf.ifc_buf = strbuf;
  465. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  466. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("socket error");
  467. return error;
  468. }
  469. ioctl(sockfd, SIOCGIFCONF, &ifconf); //get all socket info
  470. ifreq = (struct ifreq*)ifconf.ifc_buf;
  471. for (int i = (ifconf.ifc_len / sizeof(struct ifreq)); i > 0; i--) {
  472. if (ifreq->ifr_flags == AF_INET) { //for ipv4
  473. char* strIP = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr);
  474. ifreq++;
  475. if (NULL != strIP) {
  476. if (NULL == strstr(strIP, "198.168.") && NULL == strstr(strIP, "127.0.0.1")) {
  477. strcpy(buff, strIP);
  478. error = Error_Succeed;
  479. break;
  480. }
  481. }
  482. }
  483. }
  484. close(sockfd);
  485. return error;
  486. #endif //RVC_OS_WIN
  487. }
  488. ErrorCodeEnum MakeCall(const char *to_uri, const char *from_uri, const char *call_id, CallingParam callingparam)
  489. {
  490. if (!m_pPhoneClient){
  491. return Error_NetBroken;
  492. }
  493. CSimpleStringA strCode;
  494. PhoneService_MakeCall_Req Req;
  495. PhoneService_MakeCall_Ans Ans;
  496. Req.to_uri = to_uri;
  497. Req.from_uri = from_uri;
  498. Req.call_id = call_id;
  499. //设置呼叫参数
  500. PhoneService_SetCallingParam_Info info;
  501. info.CallType = callingparam.nCallType;
  502. info.connect_session = callingparam.connect_session;
  503. info.connect_ip = callingparam.connect_ip;
  504. info.connect_port = callingparam.connect_port;
  505. (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->SetCallingParam(info);
  506. ErrorCodeEnum Error = (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->MakeCall(Req, Ans, 10000);
  507. return Error;
  508. }
  509. ErrorCodeEnum HangupCall()
  510. {
  511. if (!m_pPhoneClient) {
  512. return Error_NetBroken;
  513. }
  514. PhoneService_HangupCall_Req Req;
  515. PhoneService_HangupCall_Ans Ans;
  516. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->HangupCall(Req, Ans, 10000);
  517. }
  518. ErrorCodeEnum ReleaseCall(int type)
  519. {
  520. if (!m_pPhoneClient)
  521. return Error_NetBroken;
  522. PhoneService_ReleaseCall_Req Req;
  523. Req.type = type;
  524. PhoneService_ReleaseCall_Ans Ans;
  525. return (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->ReleaseCall(Req, Ans, 10000);
  526. }
  527. ErrorCodeEnum StartChannel(int nChanServer)
  528. {
  529. if (!m_pChannelClient) {
  530. return Error_NetBroken;
  531. }
  532. if ((m_strChanProxyIP[nChanServer]=="")&&(m_iChanProxyPort[nChanServer]==0)){
  533. return Error_Param;
  534. }
  535. ChannelService_Connect_Req Req;
  536. ChannelService_Connect_Ans Ans;
  537. Req.ip = m_strChanProxyIP[nChanServer];
  538. Req.port = m_iChanProxyPort[nChanServer];
  539. return m_pChannelClient->Connect(Req, Ans, 10000);
  540. }
  541. ErrorCodeEnum StartChannel(int nChanServer,CallingParam callparam)
  542. {
  543. if (!m_pChannelClient) {
  544. return Error_NetBroken;
  545. }
  546. ChannelService_Connect_Req Req;
  547. ChannelService_Connect_Ans Ans;
  548. if ((m_strChanProxyIP[nChanServer]=="")&&(m_iChanProxyPort[nChanServer]==0)){
  549. return Error_Param;
  550. }
  551. else{
  552. Req.ip = m_strChanProxyIP[nChanServer];
  553. Req.port = m_iChanProxyPort[nChanServer];
  554. return m_pChannelClient->Connect(Req, Ans, 10000);
  555. }
  556. }
  557. ErrorCodeEnum StopChannel()
  558. {
  559. if (!m_pPhoneClient) {
  560. return Error_NetBroken;
  561. }
  562. ChannelService_Close_Req Req;
  563. ChannelService_Close_Ans Ans;
  564. return m_pChannelClient->Close(Req, Ans, 10000);
  565. }
  566. CSimpleStringA MakeCallUri(const char *callnum,const char *serverip,int serverport)
  567. {
  568. return CSimpleStringA::Format("sip:%s@%s:%d;transport=UDP",
  569. callnum, serverip, serverport);
  570. }
  571. ErrorCodeEnum LoadConfig()
  572. {
  573. int iTimeOut = RVC_DEFAULT_HTTPTIMEOUT;
  574. int iPrintDbg = 0;
  575. SpIniMappingTable table;
  576. table.AddEntryString("CounterConnector", "default_voip_server", m_strDefaultServer, NULL);
  577. table.AddEntryString("CounterConnector", "http_call_route_addr", m_strHttpCallRouteAddr, NULL);
  578. table.AddEntryInt("CounterConnector", "http_timeout", iTimeOut, 0);
  579. table.AddEntryInt("CounterConnector", "http_printdbg", iPrintDbg, 0);
  580. CSmartPointer<IConfigInfo> spConfig;
  581. ErrorCodeEnum Error = m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, spConfig);
  582. if (Error == Error_Succeed) {
  583. Error = table.Load(spConfig);
  584. if (Error_Succeed == Error) {
  585. if (iTimeOut > 0 && iTimeOut < 20 * RVC_DEFAULT_HTTPTIMEOUT) {
  586. m_iHttpTimeOut = iTimeOut;
  587. }
  588. if (iPrintDbg) {
  589. m_bHttpPrinttDbg = true;
  590. }
  591. }
  592. }
  593. return Error;
  594. }
  595. ErrorCodeEnum LoadTerminalId()
  596. {
  597. CSystemStaticInfo Info;
  598. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetSystemStaticInfo(Info);
  599. if (Error == Error_Succeed) {
  600. m_strTerminalId = Info.strTerminalID;
  601. }
  602. return Error;
  603. }
  604. ErrorCodeEnum AllowAgentWrite()
  605. {
  606. if (!m_pChannelClient)
  607. return Error_NetBroken;
  608. ChannelService_Send_Info Info;
  609. Info.compress = false;
  610. Info.encrypt = false;
  611. Info.id = 0;
  612. Info.sub_type = 0;
  613. Info.type = ACM_TYPE_MODE;
  614. return (*m_pChannelClient)(EntityResource::getLink().upgradeLink())->Send(Info);
  615. }
  616. ErrorCodeEnum StartRing()
  617. {
  618. #ifdef _WIN32
  619. bool bRet = ::PlaySoundA(MAKEINTRESOURCEA(IDR_RINGOUT), ModuleBase::GetModuleBase()->GetInstance(), SND_ASYNC|SND_RESOURCE|SND_LOOP);
  620. if (bRet) {
  621. m_bRing = true;
  622. return Error_Succeed;
  623. }
  624. else {
  625. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("play sound failed!%d", GetLastError());
  626. return Error_Unexpect;
  627. }
  628. #else
  629. m_bRing = TRUE;
  630. return Error_Succeed;
  631. #endif
  632. }
  633. void StopRing()
  634. {
  635. #ifdef _WIN32
  636. if (m_bRing) {
  637. bool bRet = false;
  638. int tries = 0;
  639. do {
  640. bRet = ::PlaySoundA(NULL, NULL, SND_ASYNC|SND_LOOP);
  641. } while (bRet == false && (Sleep(100), tries < 3));
  642. m_bRing = false;
  643. }
  644. #else
  645. if (m_bRing) {
  646. m_bRing = false;
  647. }
  648. #endif
  649. }
  650. bool CheckBeginRing(int iSrcState, int iDstState)
  651. {
  652. if (iSrcState == ACMCallFSM::s0 && iDstState == ACMCallFSM::s10)
  653. return true;
  654. return false;
  655. }
  656. bool CheckEndRing(int iSrcState, int iDstState)
  657. {
  658. if (m_bRing) {
  659. if (iSrcState == ACMCallFSM::s10 || iSrcState == ACMCallFSM::s12) {
  660. if (iDstState != ACMCallFSM::s10 && iDstState != ACMCallFSM::s12)
  661. return true;
  662. }
  663. }
  664. return false;
  665. }
  666. int GetDelayTime();
  667. void SetDelayTime();
  668. int ParseDefaultServer(const char* strServer);
  669. int GetFailedErrorCode(int iSrcState);
  670. int LogFailedWarns(int iFailedCode, const char* strmsg);
  671. public:
  672. //话机的物理状态
  673. bool m_bHandFree;
  674. //坐席控制话筒的当前状态
  675. bool m_bAgentHandFree;
  676. //是否处于接通坐席状态
  677. bool m_bIsAgentControl;
  678. //流程拨号,带技能号
  679. CSimpleStringA m_strHintCallNum;
  680. bool m_bAssistchanIdel;
  681. CurServerNum m_nCurSipServer;
  682. CurServerNum m_nCurChanServer;
  683. //呼叫类型,用于区分是分布式呼叫还是常规呼叫,由业务中台设置或者指令模块设置
  684. CallingParam m_CallingParam;
  685. int m_iFailedLastState;
  686. bool m_bConAssist;
  687. bool m_bConSipphone;
  688. CSimpleStringA m_strQueueName;
  689. CSimpleStringA m_strAddClientLevel;
  690. bool m_bNeedQueueName;
  691. private:
  692. unsigned int m_nStarttime;
  693. PhoneService_ClientBase *m_pPhoneClient;
  694. ChannelService_ClientBase *m_pChannelClient;
  695. SyncService_ClientBase*m_pSyncServiceClient;
  696. CSimpleStringA m_strTerminalId;
  697. CSimpleStringA m_strChanProxyIP[2];
  698. int m_iChanProxyPort[2];
  699. //去分行化
  700. node_list_head_t *m_pCallRouteList;
  701. CSimpleStringA m_strDefaultServer;
  702. std::vector<std::string> m_voipserver;
  703. ErrorCodeEnum m_LastSipError;
  704. ErrorCodeEnum m_LastAssistError;
  705. int m_iNetAdapterNum;
  706. CSimpleStringA m_strHttpCallRouteAddr;
  707. CSimpleStringA m_strHttpServerAPI;
  708. int m_iHttpTimeOut;
  709. bool m_bHttpPrinttDbg;
  710. bool m_bRing;
  711. };