ConnectorFSM.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771
  1. #include "stdafx.h"
  2. #include "ConnectorFSM.h"
  3. #include "EventCode.h"
  4. #include "json/json.h"
  5. #include "strutil.h"
  6. #include <winpr/crt.h>
  7. #include <winpr/string.h>
  8. #define RELEASEING_TIMER_INTERVAL 1200
  9. #define RELEASEING_SIP_TIMER 20000
  10. #define SIP_CALL_TIMER 70000 //sip呼叫超时时间,20170314,增加超时时间解决坐席忽闪问题
  11. #define RELEASEING_SIP_TIMEOUT 30000
  12. #define SIP_CONNECT_FAIL_TIMES 10
  13. #define LIVEDETECT_CONNECT_INTERVAL 5000 //live detection实体检测间隔5s
  14. #define LIVEDETECTION_TIMEOUT 60000 //活体检测超时时间60s
  15. #define CALLROUTE_MAX_TRY_COUNT 3
  16. #ifndef MAX_PATH
  17. #define MAX_PATH 260
  18. #endif
  19. #ifndef RVC_CALLROUTE_HTTP_API
  20. #define RVC_CALLROUTE_HTTP_API "/api/route/query"
  21. #endif // !RVC_CALLROUTE_HTTP_API
  22. static const char* connect_failed_case_table[] = {
  23. "",
  24. "[RTA3401] 连线失败,请检查网络",
  25. "[RTA3402] 坐席忙,请稍后再试",
  26. "[RTA3403] 声卡故障,请使用话筒重新办理",
  27. "[RTA3404] 声卡故障,请使用免提重新办理",
  28. "[RTA3405] 连线失败,系统忙,请稍后再试",
  29. "[RTA3406] 连接坐席失败,系统忙,请稍后再试",
  30. "[RTA3407] 连线失败,服务端异常,请稍后再试"
  31. };
  32. static const char* connect_failed_rtamsg_table[] = {
  33. "",
  34. "RTA3401",
  35. "RTA3402",
  36. "RTA3403",
  37. "RTA3404",
  38. "RTA3405",
  39. "RTA3406",
  40. "RTA3407"
  41. };
  42. class SyncServiceClient:public SyncService_ClientBase
  43. {
  44. public:
  45. SyncServiceClient(CEntityBase *pEntity, ACMCallFSM* fsm) : SyncService_ClientBase(pEntity), m_fsm(fsm) {}
  46. ACMCallFSM *m_fsm;
  47. };
  48. class MyPhoneClient : public PhoneService_ClientBase
  49. {
  50. public:
  51. MyPhoneClient(CEntityBase *pEntity, ACMCallFSM* fsm) : PhoneService_ClientBase(pEntity), m_fsm(fsm) {m_bSipConnected = false;}
  52. virtual void OnMessage(ErrorCodeEnum Error, PhoneService_PhoneState_Info &Msg, CSmartPointer<IReleasable> pData)
  53. {
  54. if (Error == Error_Succeed) {
  55. switch (Msg.state) {
  56. case ePhone_Init:
  57. case ePhone_Terminated:
  58. {
  59. FSMEvent *e = new FSMEvent(USER_EVT_SIP_STATE_IDLE);
  60. m_fsm->PostEventFIFO(e);
  61. }
  62. break;
  63. case ePhone_Ready:
  64. {
  65. FSMEvent *e = new FSMEvent(USER_EVT_SIP_STATE_CONNECTED);
  66. m_fsm->PostEventFIFO(e);
  67. m_bSipConnected = true;
  68. }
  69. break;
  70. case ePhone_Calling:
  71. {
  72. m_bSipConnected = false;
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. if (ePhone_Terminated == Msg.state){
  79. if (!m_bSipConnected){
  80. LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_SIP_CONNECT_FAILED, CSimpleStringA::Format("sip connect failed for %s.", Msg.status.GetData()).GetData());
  81. }
  82. }
  83. }
  84. }
  85. public:
  86. ACMCallFSM *m_fsm;
  87. int m_bSipConnected;
  88. };
  89. class MyChannelClient : public ChannelService_ClientBase
  90. {
  91. public:
  92. MyChannelClient(CEntityBase *pEntity, ACMCallFSM* fsm) : ChannelService_ClientBase(pEntity), m_fsm(fsm) {}
  93. virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData)
  94. {
  95. if (Error == Error_Succeed) {
  96. switch (Msg.state) {
  97. case eChannelState_Idle:
  98. {
  99. FSMEvent *e = new FSMEvent(USER_EVT_CHAN_STATE_IDLE);
  100. m_fsm->PostEventFIFO(e);
  101. }
  102. break;
  103. case eChannelState_Connected:
  104. {
  105. FSMEvent *e = new ChanStateConnectedEvent(Msg.param);
  106. m_fsm->PostEventFIFO(e);
  107. }
  108. break;
  109. default:
  110. break;
  111. }
  112. }
  113. }
  114. ACMCallFSM *m_fsm;
  115. };
  116. ACMCallFSM::ACMCallFSM()
  117. : m_pPhoneClient(NULL), m_pChannelClient(NULL), m_bRing(false),m_iFailedLastState(0)
  118. {
  119. m_nCurSipServer = CurServerNum::MAIN_SERVER;
  120. m_nCurChanServer = CurServerNum::MAIN_SERVER;
  121. m_pSyncServiceClient = NULL;
  122. m_bConAssist = false;
  123. m_bConSipphone = false;
  124. memset(m_strChanProxyIP, 0, sizeof(m_strChanProxyIP));
  125. memset(m_iChanProxyPort, 0, sizeof(m_iChanProxyPort));
  126. m_pCallRouteList = NULL;
  127. m_strDefaultServer = NULL;
  128. m_strHttpCallRouteAddr = NULL;
  129. m_strHttpServerAPI = RVC_CALLROUTE_HTTP_API;
  130. m_strQueueName = NULL;
  131. m_strAddClientLevel = NULL;
  132. m_LastSipError = Error_Succeed;
  133. m_LastAssistError = Error_Succeed;
  134. m_bNeedQueueName = false;
  135. m_iHttpTimeOut = RVC_DEFAULT_HTTPTIMEOUT;
  136. m_bHttpPrinttDbg = false;
  137. }
  138. ACMCallFSM::~ACMCallFSM()
  139. {
  140. }
  141. ErrorCodeEnum ACMCallFSM::OnInit()
  142. {
  143. ErrorCodeEnum Error = LoadConfig();
  144. int iCount = 0;
  145. if (Error != Error_Succeed) {
  146. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("on_error");
  147. FSMEvent* e = new FSMEvent(USER_EVT_ERROR);
  148. PostEventFIFO(e); // jump to error state
  149. return Error;
  150. }
  151. GetEntityBase()->GetFunction()->SetSysVar("CallState", "O"); // set to offline state
  152. Error = LoadTerminalId();
  153. if (Error != Error_Succeed) {
  154. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("on_error");
  155. FSMEvent* e = new FSMEvent(USER_EVT_ERROR);
  156. PostEventFIFO(e); // jump to error state
  157. return Error;
  158. }
  159. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_strDefaultServer %s.", m_strDefaultServer.GetData());
  160. if(m_strDefaultServer.GetLength() > 0){
  161. iCount = ParseDefaultServer(m_strDefaultServer.GetData());
  162. }
  163. char strbuf[2 * MAX_PATH] = { 0 };
  164. snprintf(strbuf, 2 * MAX_PATH, "%s", RVC_DEFAULT_VOIPSERVER_ADDR);
  165. if (0 == iCount) {
  166. ParseDefaultServer(strbuf);
  167. }
  168. m_bHangup = false;
  169. m_bHandFree = true;
  170. m_bAgentHandFree = true;
  171. m_bIsAgentControl = false;
  172. m_nSipErrorNum = 0;
  173. memset(&m_CallingParam, 0, sizeof(m_CallingParam));
  174. m_uConnectTime = 0;
  175. m_bConnected = false;
  176. m_lConnectCostTime = 0;
  177. AddStateHooker(this);
  178. return Error;
  179. }
  180. bool ACMCallFSM::ReConnectionAssistchan()
  181. {
  182. if (m_pChannelClient != NULL){
  183. m_pChannelClient->GetFunction()->CloseSession();
  184. #ifdef RVC_OS_WIN
  185. m_pChannelClient->SafeDelete();
  186. #endif
  187. m_pChannelClient = NULL;
  188. }
  189. if (m_pChannelClient == NULL){
  190. m_pChannelClient = new MyChannelClient(m_pEntity, this);
  191. ErrorCodeEnum Error = m_pChannelClient->Connect();
  192. if (Error != Error_Succeed) {
  193. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_channelClient connect fail!");
  194. #ifdef RVC_OS_WIN
  195. m_pChannelClient->SafeDelete();
  196. #endif
  197. m_pChannelClient = NULL;
  198. return false;
  199. }
  200. if (Error == Error_Succeed){
  201. ChannelService_BeginState_Sub ChannelSub;
  202. Error = (*m_pChannelClient)(EntityResource::getLink().upgradeLink())->BeginState(ChannelSub);
  203. if (Error != Error_Succeed){
  204. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState biz channel failed!");
  205. m_pChannelClient->GetFunction()->CloseSession();
  206. #ifdef RVC_OS_WIN
  207. m_pChannelClient->SafeDelete();
  208. #endif
  209. m_pChannelClient = NULL;
  210. return false;
  211. }
  212. }
  213. }
  214. return true;
  215. }
  216. bool ACMCallFSM::ReConnectionSipphone(bool bLog)
  217. {
  218. if (m_pPhoneClient != NULL){
  219. m_pPhoneClient->GetFunction()->CloseSession();
  220. #ifdef RVC_OS_WIN
  221. m_pPhoneClient->SafeDelete();
  222. #endif
  223. m_pPhoneClient = NULL;
  224. }
  225. if (m_pPhoneClient == NULL){
  226. m_pPhoneClient = new MyPhoneClient(m_pEntity, this);
  227. ErrorCodeEnum Error = m_pPhoneClient->Connect();
  228. if (Error != Error_Succeed) {
  229. if (bLog) {
  230. LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
  231. }
  232. #ifdef RVC_OS_WIN
  233. m_pPhoneClient->SafeDelete();
  234. #endif
  235. m_pPhoneClient = NULL;
  236. return false;
  237. }
  238. if (Error == Error_Succeed)
  239. {
  240. PhoneService_BeginState_Sub PhoneSub;
  241. Error = (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->BeginState(PhoneSub);
  242. if (Error != Error_Succeed) {
  243. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState sip failed!");
  244. m_pPhoneClient->GetFunction()->CloseSession();
  245. #ifdef RVC_OS_WIN
  246. m_pPhoneClient->SafeDelete();
  247. #endif
  248. m_pPhoneClient = NULL;
  249. return false;
  250. }
  251. }
  252. }
  253. return true;
  254. }
  255. bool ACMCallFSM::ReConnectionSyncService()
  256. {
  257. if (NULL != m_pSyncServiceClient){
  258. m_pSyncServiceClient->GetFunction()->CloseSession();
  259. #ifdef RVC_OS_WIN
  260. m_pSyncServiceClient->SafeDelete();
  261. #endif
  262. m_pSyncServiceClient = NULL;
  263. }
  264. m_pSyncServiceClient = new SyncServiceClient(m_pEntity, this);
  265. ErrorCodeEnum Error = m_pSyncServiceClient->Connect();
  266. if (Error_Succeed != Error){
  267. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect SyncService Fail!");
  268. #ifdef RVC_OS_WIN
  269. m_pSyncServiceClient->SafeDelete();
  270. #endif
  271. m_pSyncServiceClient = NULL;
  272. return false;
  273. }
  274. return true;
  275. }
  276. int ACMCallFSM::GetCallRouteList()
  277. {
  278. int iret = -1;
  279. if (m_strHttpCallRouteAddr.GetLength() != 0) {
  280. int ihttpcount = 0;
  281. http_call_info_t http_callinfo;
  282. http_callinfo.strServerURL = m_strHttpCallRouteAddr;
  283. http_callinfo.strAPI = m_strHttpServerAPI;
  284. if (m_bNeedQueueName) {
  285. http_callinfo.strQueueName = m_strQueueName;
  286. http_callinfo.strAddClientLevel = m_strAddClientLevel;
  287. }
  288. else {
  289. http_callinfo.strQueueName = NULL;
  290. http_callinfo.strAddClientLevel = NULL;
  291. }
  292. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("call type is %d, http call route queue name is %s, and client level is %s.", m_CallingParam.nCallType, http_callinfo.strQueueName.GetData(), http_callinfo.strAddClientLevel.GetData());
  293. http_callinfo.strTerminalNo = m_strTerminalId;
  294. do {
  295. m_pCallRouteList = get_http_callroute_list(&http_callinfo, m_iHttpTimeOut, m_bHttpPrinttDbg);
  296. ihttpcount++;
  297. } while (!m_pCallRouteList && ihttpcount < CALLROUTE_MAX_TRY_COUNT);
  298. if (ihttpcount > 1) {
  299. LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALLROUTE_TIMES, CSimpleStringA::Format("request http call route address{%s} %d times.", m_strHttpCallRouteAddr.GetData(), ihttpcount).GetData());
  300. }
  301. }
  302. if (NULL != m_pCallRouteList) {
  303. iret = 0;
  304. }
  305. else {
  306. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CALLROUTE_FAILED, "call route request failed!");
  307. }
  308. return iret;
  309. }
  310. int ACMCallFSM::GetDelayTime()
  311. {
  312. ErrorCodeEnum error= Error_Unexpect;
  313. SyncService_GetMachineData_Req req;
  314. req.key = "DelayTime";
  315. SyncService_GetMachineData_Ans ans;
  316. DWORD Timeout = 500;
  317. if (m_pSyncServiceClient)
  318. {
  319. error = (*m_pSyncServiceClient)(EntityResource::getLink().upgradeLink())->GetMachineData(req,ans,Timeout);
  320. }
  321. if (error == Error_Succeed)
  322. {
  323. int delaytime = atoi(ans.value.GetData());
  324. return delaytime;
  325. }
  326. else
  327. {
  328. return -1;
  329. }
  330. }
  331. void ACMCallFSM::SetDelayTime()
  332. {
  333. if (m_pSyncServiceClient)
  334. {
  335. SyncService_SetMachineData_Info info;
  336. info.key = "DelayTime";
  337. info.data = "0";
  338. (*m_pSyncServiceClient)(EntityResource::getLink().upgradeLink())->SetMachineData(info);
  339. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set delay time to 0");
  340. }
  341. }
  342. static int CStringSplit(char* str, char** result, size_t ucount, const char* del)
  343. {
  344. char* ptr = NULL;
  345. size_t unum = ucount;
  346. char* p = strtok_s(str, del, &ptr);
  347. while (p != NULL && unum > 0) {
  348. *result++ = p;
  349. p = strtok_s(NULL, del, &ptr);
  350. unum--;
  351. }
  352. return ucount - unum;
  353. }
  354. static int GetCallInfoFromConfig(char* strcallurl, uint32_t ucalllen, char* strassist, uint32_t assitlen, int *iport, const char* psrc)
  355. {
  356. int iRet = -1;
  357. if (NULL == psrc || NULL == strcallurl || NULL == strassist){
  358. return iRet;
  359. }
  360. char *result[MAX_VOIP_SERVER_NUM] = {0};
  361. int icount = CStringSplit((char*)psrc, result, MAX_VOIP_SERVER_NUM, ",");
  362. if(2 == icount){
  363. snprintf(strcallurl, ucalllen, "%s", result[0]);
  364. char *assitresult[MAX_VOIP_SERVER_NUM] = {0};
  365. icount = CStringSplit(result[1], assitresult, MAX_VOIP_SERVER_NUM, " ");
  366. if(2 == icount){
  367. snprintf(strassist, assitlen, "%s", assitresult[0]);
  368. *iport = atoi(assitresult[1]);
  369. iRet = 0;
  370. }
  371. }
  372. return iRet;
  373. }
  374. int ACMCallFSM::ParseDefaultServer(const char* strServer)
  375. {
  376. int iRet = 0;
  377. if(NULL == strServer){
  378. return iRet;
  379. }
  380. char *result[MAX_VOIP_SERVER_NUM] = {0};
  381. int icount = CStringSplit((char*)strServer, result, MAX_VOIP_SERVER_NUM, "|");
  382. int index = 0;
  383. while(index < icount && result[index]){
  384. m_voipserver.push_back(result[index]);
  385. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("result[%d] = [%s].", index, result[index]);
  386. index++;
  387. }
  388. iRet = m_voipserver.size();
  389. return iRet;
  390. }
  391. ErrorCodeEnum ACMCallFSM::OnExit()
  392. {
  393. return Error_Succeed;
  394. }
  395. int ACMCallFSM::GetFailedErrorCode(int iSrcState)
  396. {
  397. int iState = 0;
  398. if (s20 != iSrcState){
  399. switch (m_iFailedLastState) {
  400. case s11:
  401. if(Error_Succeed != m_LastSipError){
  402. iState = 5;
  403. }
  404. else{
  405. iState = 1;
  406. }
  407. break;
  408. case s12:
  409. if (Error_Succeed != m_LastAssistError){
  410. iState = 5;
  411. }
  412. else{
  413. iState = 2;
  414. }
  415. break;
  416. default:
  417. break;
  418. }
  419. }
  420. return iState;
  421. }
  422. int ACMCallFSM::LogFailedWarns(int iFailedCode, const char* strmsg)
  423. {
  424. int iRet = 0;
  425. if (m_bHangup){
  426. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s",strmsg);
  427. }
  428. else{
  429. switch (iFailedCode) {
  430. case 1:
  431. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_NETWORK_FAILURE, strmsg);
  432. break;
  433. case 2:
  434. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_AGENT_BUSY, strmsg);
  435. break;
  436. case 5:
  437. if (s11 == m_iFailedLastState){
  438. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_SIPPHONE_LOST, strmsg);
  439. }
  440. else if(s12 == m_iFailedLastState){
  441. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_ASSISTCHANNEL_LOST, strmsg);
  442. }
  443. break;
  444. default:
  445. break;
  446. }
  447. }
  448. return iRet;
  449. }
  450. void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
  451. {
  452. if (CheckBeginRing(iSrcState, iDstState)) {
  453. StartRing();
  454. } else {
  455. if (CheckEndRing(iSrcState, iDstState))
  456. StopRing();
  457. }
  458. if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT) {
  459. int st1 = TranslateState(iSrcState);
  460. int st2 = TranslateState(iDstState);
  461. if (eState_Fail == st2){
  462. m_iFailedLastState = iSrcState;
  463. }
  464. if (st1 != st2) {
  465. PhoneState evt;
  466. evt.state = st2;
  467. evt.status = CSimpleStringA::Format("OnStateTrans from state %d to %d", st1, st2);
  468. evt.errinfo = "";
  469. //LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_STATE_TRANS, evt.status.GetData());
  470. //LOG_TRACE(evt.status);
  471. if (!((st2 == eState_Fail)&&(m_nCurChanServer != CurServerNum::Error_Server)&&(m_nCurSipServer != CurServerNum::Error_Server))||m_bHangup)
  472. {
  473. if (eState_Fail != st1 || eState_Connecting != st2){
  474. //char strmsg[MAX_PATH] = {0};
  475. //snprintf(strmsg, MAX_PATH,"Broadcast state from %d to %d", st1, st2);
  476. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strmsg);
  477. if (eState_Fail == st2){
  478. int ierrcode = GetFailedErrorCode(iSrcState);
  479. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("connect_failed_case_table size is %d, and ierrcode = %d.", sizeof(connect_failed_case_table)/ sizeof(char*), ierrcode);
  480. if (ierrcode >= 0 && ierrcode < sizeof(connect_failed_case_table)/ sizeof(char*)){
  481. evt.errinfo = CSimpleStringA2W(connect_failed_case_table[ierrcode]);
  482. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect failed for %s.", CSimpleStringW2A(evt.errinfo).GetData());
  483. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(connect_failed_rtamsg_table[ierrcode])(connect_failed_case_table[ierrcode]);
  484. }
  485. char strerrmsg[MAX_PATH] = {0};
  486. if (m_bHangup){
  487. snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.","接通前客户主动挂机", m_iFailedLastState, iSrcState);
  488. }
  489. else{
  490. snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.",CSimpleStringW2A(evt.errinfo).GetData(), m_iFailedLastState, iSrcState);
  491. }
  492. LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_FAILED, strerrmsg);
  493. LogFailedWarns(ierrcode, strerrmsg);
  494. }
  495. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(PhoneState), SP_MSG_SIG_OF(PhoneState), evt);
  496. //LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_BROADCAST_CALL_STATE, strmsg);
  497. }
  498. else{
  499. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(CSimpleString::Format("state from %d to %d, auto reconnect, not broadcast state to ui.", st1, st2).GetData());
  500. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C5")("system auto reconnect.");
  501. }
  502. if (eState_HandFree == st2 || eState_Pickup == st2){
  503. if (eState_Connecting == st1){
  504. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("connect success!");
  505. }
  506. }
  507. }
  508. SetCallState(st2);
  509. }
  510. }
  511. }
  512. ErrorCodeEnum ACMCallFSM::SetCallState(int state)
  513. {
  514. char *sts[] = {
  515. "O", // Offline
  516. "C", // Connecting
  517. "H", // HandFree
  518. "P", // Pickup
  519. "B", // Broken
  520. "F", // Fail
  521. "R", // Releasing
  522. "L", // LiveDetect
  523. "V" // Recording
  524. };
  525. char* strCallState = "O";
  526. if (0 <= state && state < sizeof(sts)/sizeof(char*)){
  527. strCallState = sts[state];
  528. }
  529. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set call state to [%s].", strCallState);
  530. return GetEntityBase()->GetFunction()->SetSysVar("CallState", strCallState);
  531. }
  532. void ACMCallFSM::s0_on_entry()
  533. {
  534. m_strHintCallNum.Clear();
  535. m_nCurChanServer = CurServerNum::MAIN_SERVER;
  536. m_nCurSipServer = CurServerNum::MAIN_SERVER;
  537. memset(&m_CallingParam,0,sizeof(m_CallingParam));
  538. if(m_pCallRouteList != NULL){
  539. free_node_list(m_pCallRouteList);
  540. m_pCallRouteList = NULL;
  541. }
  542. m_iFailedLastState = 0;
  543. }
  544. void ACMCallFSM::s0_on_exit()
  545. {
  546. m_bHangup = false;
  547. }
  548. unsigned int ACMCallFSM::s0_on_event(FSMEvent* event)
  549. {
  550. if (event->iEvt == USER_EVT_PICKUP_CALL)
  551. {
  552. memset(&m_CallingParam,0,sizeof(m_CallingParam)); //正常呼叫
  553. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin pickup call");
  554. m_nStarttime = y2k_time_now();
  555. }
  556. else if (event->iEvt == USER_EVT_HANDFREE_CALL)
  557. {
  558. memset(&m_CallingParam,0,sizeof(m_CallingParam)); // 正常呼叫
  559. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin hand free call");
  560. m_nStarttime = y2k_time_now();
  561. }
  562. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  563. {
  564. if (ReConnectionAssistchan()) {
  565. m_bConAssist = true;
  566. }
  567. }
  568. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  569. {
  570. if (ReConnectionSipphone()) {
  571. m_bConSipphone = true;
  572. }
  573. }
  574. else if (event->iEvt == USER_EVT_STARTVIDEODISPLAY)
  575. {
  576. StartVideoDisplayEvent *e = static_cast<StartVideoDisplayEvent *>(event);
  577. #ifdef RVC_OS_WIN
  578. StartVideo(e->m_param.GetData());
  579. #else
  580. StartVideoRender(e->m_param.GetData());
  581. #endif
  582. }
  583. else if (event->iEvt == USER_EVT_SHOWLOACALVIDEO)
  584. {
  585. ShowLocalVideoEvent *e = static_cast<ShowLocalVideoEvent *>(event);
  586. SetCallingType(NORMAL_CALLTYPE);
  587. #ifdef RVC_OS_WIN
  588. StartVideo(e->m_param.GetData());
  589. #else
  590. StartVideoRender(e->m_param.GetData());
  591. #endif
  592. }
  593. else if (event->iEvt == USER_EVT_SHOWLOACALREMOTEVIDEO)
  594. {
  595. ShowLocalAndRemoteVideoEvent *e = static_cast<ShowLocalAndRemoteVideoEvent *>(event);
  596. SetCallingType(NORMAL_CALLTYPE);
  597. #ifdef RVC_OS_WIN
  598. StartVideo(e->m_param.GetData());
  599. #else
  600. StartVideoRender(e->m_param.GetData());
  601. #endif
  602. }
  603. else if (event->iEvt == USER_EVT_DOUBLE_RECORD_CALL)
  604. {
  605. m_CallingParam.nCallType = DOUBLERECORD_CALLTYPE;
  606. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin double record call");
  607. m_nStarttime = y2k_time_now();
  608. }
  609. else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
  610. {
  611. #ifdef RVC_OS_WIN
  612. StopVideo();
  613. SetCallingType(NORMAL_CALLTYPE);
  614. #endif
  615. }
  616. return 0;
  617. }
  618. void ACMCallFSM::s7_on_entry()
  619. {
  620. }
  621. void ACMCallFSM::s7_on_exit()
  622. {
  623. }
  624. unsigned int ACMCallFSM::s7_on_event(FSMEvent* event)
  625. {
  626. if (event->iEvt == USER_EVT_STOPLOCALVIDEO)
  627. {
  628. StopVideo();
  629. }
  630. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  631. {
  632. if (ReConnectionSipphone()) {
  633. m_bConSipphone = true;
  634. }
  635. }
  636. return 0;
  637. }
  638. void ACMCallFSM::s8_on_entry()
  639. {
  640. //get call route,采用直接总行方式
  641. if (0 != GetCallRouteList()) {
  642. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get call route list failed.");
  643. }
  644. m_lConnectCostTime = SP::Module::Comm::RVCGetTickCount();
  645. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C1")("start remote video call");
  646. int time = GetDelayTime();
  647. if (time > 0){
  648. ScheduleTimer(8,time*1000);
  649. }
  650. else{
  651. PostEventFIFO(new FSMEvent(EVT_TIMER));
  652. }
  653. }
  654. void ACMCallFSM::s8_on_exit()
  655. {
  656. CancelTimer(8);
  657. }
  658. unsigned int ACMCallFSM::s8_on_event(FSMEvent* event)
  659. {
  660. return 0;
  661. }
  662. void ACMCallFSM::s10_on_entry()
  663. {
  664. ErrorCodeEnum Error = Error_Succeed;
  665. if (m_nCurSipServer == CurServerNum::Error_Server)
  666. {
  667. Error = Error_NetBroken;
  668. }
  669. if (Error != Error_Succeed)
  670. {
  671. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  672. }
  673. }
  674. void ACMCallFSM::s10_on_exit() {}
  675. unsigned int ACMCallFSM::s10_on_event(FSMEvent* event)
  676. {
  677. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  678. {
  679. if (ReConnectionAssistchan()) {
  680. m_bConAssist = true;
  681. }
  682. }
  683. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  684. {
  685. if (ReConnectionSipphone()) {
  686. m_bConSipphone = true;
  687. }
  688. }
  689. else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
  690. {
  691. PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
  692. m_bHangup=true;
  693. StopVideo();
  694. }
  695. return 0;
  696. }
  697. void ACMCallFSM::s11_on_entry()
  698. {
  699. m_LastSipError = Error_Succeed;
  700. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("begin make call");
  701. m_uConnectTime = y2k_time_now();
  702. m_bConnected = false;
  703. if (m_nCurSipServer == CurServerNum::Error_Server){
  704. m_LastSipError = Error_NetBroken;
  705. }
  706. if (m_LastSipError == Error_Succeed){
  707. char ipstr[MAX_PATH] = {0};
  708. GetLocalIP(ipstr, MAX_PATH);
  709. //get call route,采用直接总行方式
  710. callurl_node_t *node = get_no_used_node(m_pCallRouteList);
  711. char callid_str[64] = { 0 };
  712. str_get_format_uuid(callid_str, 64);
  713. if (node != NULL){
  714. m_LastSipError = MakeCall(node->strcallurl, CSimpleStringA::Format("sip:%s@%s;transport=UDP", node->strnewcallernum, ipstr),
  715. callid_str, m_CallingParam);
  716. m_iChanProxyPort[0] = node->uassistport;
  717. m_iChanProxyPort[1] = node->uassistport;
  718. m_strChanProxyIP[0] = node->strassistip;
  719. m_strChanProxyIP[1] = node->strassistip;
  720. node->bused = true;
  721. }
  722. else{
  723. std::size_t icount = m_voipserver.size();
  724. if (icount > 0){
  725. int index = SP::Module::Comm::RVCGetTickCount()%icount;
  726. char strcallurl[MAX_PATH] = {0};
  727. char strassistip[32] = {0};
  728. int iport = 0;
  729. char strserver[MAX_PATH] = { 0 };
  730. snprintf(strserver, MAX_PATH, "%s", m_voipserver[index].c_str());
  731. if (0 == GetCallInfoFromConfig(strcallurl, MAX_PATH, strassistip, 32, &iport, strserver)){
  732. char strassitinter[32] = {0};
  733. str_get_interger_netaddr(strassitinter, 32, strassistip);
  734. m_LastSipError = MakeCall(strcallurl, CSimpleStringA::Format("sip:%s#%s@%s;transport=UDP", m_strTerminalId.GetData(), strassitinter, ipstr),
  735. callid_str, m_CallingParam);
  736. m_iChanProxyPort[0] = iport;
  737. m_iChanProxyPort[1] = iport;
  738. m_strChanProxyIP[0] = strassistip;
  739. m_strChanProxyIP[1] = strassistip;
  740. LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALLROUTE_CONFIG, CSimpleStringA::Format("head office mode no more call router, use default config(call url is %s, assistip is %s).", strcallurl, strassistip).GetData());
  741. }
  742. else {
  743. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetCallInfoFromConfig failed!");
  744. m_LastSipError = Error_Param;
  745. }
  746. }
  747. else {
  748. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no default voip server config!");
  749. m_LastSipError = Error_Param;
  750. }
  751. }
  752. if (m_LastSipError!=Error_Succeed){
  753. (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
  754. }
  755. m_nCurChanServer = CurServerNum::BACK_SERVER;
  756. }
  757. if (m_LastSipError != Error_Succeed)
  758. {
  759. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  760. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3421")("send sip failed!");
  761. }
  762. else
  763. {
  764. ScheduleTimer(11,SIP_CALL_TIMER);
  765. }
  766. }
  767. void ACMCallFSM::s11_on_exit()
  768. {
  769. CancelTimer(11);
  770. }
  771. unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
  772. {
  773. if (event->iEvt == USER_EVT_HANGUP)
  774. {
  775. m_bHangup = true;
  776. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sip connecting, customer active hangup after %ds.", y2k_time_now()- m_nStarttime);
  777. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C6")("connect failed for user hangup");
  778. }
  779. else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
  780. {
  781. if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
  782. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect main server failed");
  783. }
  784. else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
  785. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect bak server failed");
  786. }
  787. else{
  788. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect error server failed");
  789. }
  790. (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
  791. m_nSipErrorNum++;
  792. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3432")("sip connect failed for server error.");
  793. }
  794. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  795. {
  796. if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
  797. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, main server");
  798. }
  799. else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
  800. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, bak server");
  801. }
  802. else{
  803. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, error server");
  804. }
  805. if (ReConnectionAssistchan()) {
  806. m_bConAssist = true;
  807. }
  808. }
  809. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  810. {
  811. if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
  812. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
  813. }
  814. else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
  815. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
  816. }
  817. else{
  818. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
  819. }
  820. if (ReConnectionSipphone()) {
  821. m_bConSipphone = true;
  822. }
  823. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3434")("sip connect failed for entity error");
  824. }
  825. else if (event->iEvt == EVT_TIMER)
  826. {
  827. if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
  828. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_TIMEOUT,"sipphone connect timeout, main server");
  829. }
  830. else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
  831. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_TIMEOUT,"sipphone connect timeout, bak server");
  832. }
  833. else{
  834. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_TIMEOUT,"sipphone connect timeout, error server");
  835. }
  836. m_nSipErrorNum++;
  837. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3435")("sip connect failed for timeout");
  838. }
  839. else if (event->iEvt == USER_EVT_JMP_FAIL)
  840. {
  841. if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
  842. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, main server");
  843. }
  844. else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
  845. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, bak server");
  846. }
  847. else{
  848. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, error server");
  849. }
  850. m_nSipErrorNum++;
  851. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C2").setResultCode("RTA3436")("sip connect failed for entity error");
  852. }
  853. else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
  854. {
  855. PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
  856. m_bHangup= true;
  857. StopVideo();
  858. }
  859. return 0;
  860. }
  861. void ACMCallFSM::s12_on_entry()
  862. {
  863. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C2")("sip channel connect success!");
  864. m_LastAssistError = Error_Succeed;
  865. if (m_nCurChanServer == CurServerNum::Error_Server)
  866. {
  867. m_LastAssistError = Error_NetBroken;
  868. }
  869. m_nSipErrorNum = 0;
  870. Sleep(200);
  871. if (m_LastAssistError == Error_Succeed)
  872. {
  873. if (m_CallingParam.nCallType == NORMAL_CALLTYPE && m_CallingParam.nCallType != DOUBLERECORD_CALLTYPE)
  874. {
  875. m_LastAssistError = StartChannel((int)m_nCurChanServer);
  876. }
  877. else
  878. {
  879. m_LastAssistError = StartChannel((int)m_nCurChanServer,m_CallingParam);
  880. }
  881. if (m_LastAssistError != Error_Succeed)
  882. {
  883. HangupCall();
  884. (bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
  885. }
  886. }
  887. if (m_LastAssistError != Error_Succeed) {
  888. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  889. if (Error_NetBroken == m_LastAssistError) {
  890. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3441")("assistant channel connect failed for net broken");
  891. }
  892. else if (Error_Param == m_LastAssistError) {
  893. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3442")("assistant channel connect failed error param");
  894. }
  895. else {
  896. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3443")("assistant channel connect failed");
  897. }
  898. }
  899. }
  900. void ACMCallFSM::s12_on_exit() {}
  901. unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
  902. {
  903. if (event->iEvt == USER_EVT_HANGUP)
  904. {
  905. m_bHangup = true;
  906. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_HANGUP, CSimpleStringA::Format("chan connecting, customer active hangup after %ds.", y2k_time_now() - m_nStarttime).GetData());
  907. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304C6")("connect failed for user hangup");
  908. }
  909. else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
  910. {
  911. if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
  912. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, main server");
  913. }
  914. else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
  915. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, bak server");
  916. }
  917. else{
  918. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, error server");
  919. }
  920. (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
  921. StopChannel();
  922. if (!m_bHangup) {
  923. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3455")("assistant channel bridge failed for timeout");
  924. }
  925. }
  926. else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
  927. {
  928. if (!m_bHangup)
  929. {
  930. if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
  931. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, main server");
  932. }
  933. else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
  934. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, bak server");
  935. }
  936. else{
  937. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, error server");
  938. }
  939. (bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
  940. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3452")("assistant channel bridge failed for server error");
  941. }
  942. HangupCall();
  943. //StopVideo();
  944. }
  945. else if (event->iEvt == USER_EVT_CHAN_STATE_CONNECTED)
  946. {
  947. ChanStateConnectedEvent *e = static_cast<ChanStateConnectedEvent *>(event);
  948. StartVideo(e->m_param.GetData());
  949. long lnowtime = SP::Module::Comm::RVCGetTickCount();
  950. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(lnowtime - m_lConnectCostTime).setLogCode("QLR0402304C3")("assistant channel bridge success!");
  951. m_lConnectCostTime = lnowtime;
  952. }
  953. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  954. {
  955. if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
  956. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, main server");
  957. }
  958. else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
  959. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, bak server");
  960. }
  961. else{
  962. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, error server");
  963. }
  964. if (ReConnectionAssistchan()) {
  965. m_bConAssist = true;
  966. }
  967. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
  968. }
  969. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  970. {
  971. if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
  972. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
  973. }
  974. else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
  975. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
  976. }
  977. else{
  978. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
  979. }
  980. if (ReConnectionSipphone()) {
  981. m_bConSipphone = true;
  982. }
  983. }
  984. else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
  985. {
  986. PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
  987. m_bHangup=true;
  988. StopVideo();
  989. }
  990. else if (event->iEvt == USER_EVT_JMP_FAIL)
  991. {
  992. if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
  993. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_FUNC_FAILED,"chan connect func failed, main server");
  994. }
  995. else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
  996. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_FUNC_FAILED,"chan connect func failed, bak server");
  997. }
  998. else{
  999. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED,"chan connect func failed, error server");
  1000. }
  1001. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C3").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
  1002. }
  1003. return 0;
  1004. }
  1005. void ACMCallFSM::s13_on_entry()
  1006. {
  1007. if (m_bHandFree)
  1008. {
  1009. PostEventLIFO(new FSMEvent(USER_EVT_JMP_HANDFREE));
  1010. }
  1011. else
  1012. {
  1013. PostEventLIFO(new FSMEvent(USER_EVT_JMP_PICKUP));
  1014. }
  1015. }
  1016. void ACMCallFSM::s13_on_exit() {}
  1017. unsigned int ACMCallFSM::s13_on_event(FSMEvent* event)
  1018. {
  1019. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1020. {
  1021. if (ReConnectionAssistchan()) {
  1022. m_bConAssist = true;
  1023. }
  1024. }
  1025. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1026. {
  1027. if (ReConnectionSipphone()) {
  1028. m_bConSipphone = true;
  1029. }
  1030. }
  1031. return 0;
  1032. }
  1033. void ACMCallFSM::s14_on_entry()
  1034. {
  1035. }
  1036. void ACMCallFSM::s14_on_exit()
  1037. {
  1038. }
  1039. unsigned int ACMCallFSM::s14_on_event(FSMEvent* event)
  1040. {
  1041. if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
  1042. {
  1043. #ifdef RVC_OS_WIN
  1044. StopVideo();
  1045. #else
  1046. StopVideoRender();
  1047. #endif
  1048. }
  1049. else if (event->iEvt == USER_EVT_STOP_RECORD_BROADCAST)
  1050. {
  1051. }
  1052. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1053. {
  1054. if (ReConnectionSipphone()) {
  1055. m_bConSipphone = true;
  1056. }
  1057. }
  1058. return 0;
  1059. }
  1060. void ACMCallFSM::s20_on_entry()
  1061. {
  1062. StopChannel();
  1063. }
  1064. void ACMCallFSM::s20_on_exit() {}
  1065. unsigned int ACMCallFSM::s20_on_event(FSMEvent* event)
  1066. {
  1067. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
  1068. {
  1069. StopVideo();
  1070. }
  1071. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1072. {
  1073. if (ReConnectionAssistchan()) {
  1074. m_bConAssist = true;
  1075. }
  1076. }
  1077. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1078. {
  1079. if (ReConnectionSipphone()) {
  1080. m_bConSipphone = true;
  1081. }
  1082. }
  1083. return 0;
  1084. }
  1085. void ACMCallFSM::s21_on_entry()
  1086. {
  1087. ScheduleTimer(21,RELEASEING_SIP_TIMER);
  1088. HangupCall();
  1089. }
  1090. void ACMCallFSM::s21_on_exit()
  1091. {
  1092. CancelTimer(21);
  1093. CancelTimer(210);
  1094. }
  1095. unsigned int ACMCallFSM::s21_on_event(FSMEvent* event)
  1096. {
  1097. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1098. {
  1099. if (ReConnectionAssistchan()) {
  1100. m_bConAssist = true;
  1101. }
  1102. }
  1103. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1104. {
  1105. if (ReConnectionSipphone()) {
  1106. m_bConSipphone = true;
  1107. }
  1108. }
  1109. else if (event->iEvt == EVT_TIMER)
  1110. {
  1111. if(event->param1 == 21)
  1112. {
  1113. ScheduleTimer(210,RELEASEING_SIP_TIMEOUT);
  1114. ReleaseCall(0);
  1115. }
  1116. else if (event->param1 == 210)
  1117. {
  1118. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  1119. //RealSipErrorCheck();
  1120. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone");
  1121. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE, "restart sipphone");
  1122. }
  1123. }
  1124. return 0;
  1125. }
  1126. void ACMCallFSM::s22_on_entry()
  1127. {
  1128. StopChannel();
  1129. }
  1130. void ACMCallFSM::s22_on_exit() {}
  1131. unsigned int ACMCallFSM::s22_on_event(FSMEvent* event)
  1132. {
  1133. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
  1134. {
  1135. StopVideo();
  1136. }
  1137. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1138. {
  1139. if (ReConnectionAssistchan()) {
  1140. m_bConAssist = true;
  1141. }
  1142. }
  1143. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1144. {
  1145. if (ReConnectionSipphone()) {
  1146. m_bConSipphone = true;
  1147. }
  1148. }
  1149. return 0;
  1150. }
  1151. void ACMCallFSM::s23_on_entry()
  1152. {
  1153. if((!m_bHangup)&&(((m_nCurSipServer== CurServerNum::BACK_SERVER)&&(m_nCurChanServer!= CurServerNum::Error_Server))||((m_nCurChanServer== CurServerNum::BACK_SERVER)&&(m_nCurSipServer!= CurServerNum::Error_Server))))
  1154. {
  1155. PostEventLIFO(new FSMEvent(USER_EVT_RECONNECT));
  1156. }
  1157. else
  1158. {
  1159. ScheduleTimer(23, RELEASEING_TIMER_INTERVAL);
  1160. }
  1161. }
  1162. void ACMCallFSM::s23_on_exit()
  1163. {
  1164. CancelTimer(23);
  1165. }
  1166. unsigned int ACMCallFSM::s23_on_event(FSMEvent* event)
  1167. {
  1168. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1169. {
  1170. if (ReConnectionAssistchan()) {
  1171. m_bConAssist = true;
  1172. }
  1173. }
  1174. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1175. {
  1176. if (ReConnectionSipphone()) {
  1177. m_bConSipphone = true;
  1178. }
  1179. }
  1180. else if (event->iEvt == EVT_TIMER)
  1181. {
  1182. if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
  1183. {
  1184. m_nSipErrorNum = 0;
  1185. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
  1186. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone ");
  1187. }
  1188. }
  1189. return 0;
  1190. }
  1191. void ACMCallFSM::s24_on_entry()
  1192. {
  1193. ScheduleTimer(24, RELEASEING_TIMER_INTERVAL);
  1194. }
  1195. void ACMCallFSM::s24_on_exit()
  1196. {
  1197. CancelTimer(24);
  1198. }
  1199. unsigned int ACMCallFSM::s24_on_event(FSMEvent* event)
  1200. {
  1201. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1202. {
  1203. if (ReConnectionAssistchan()) {
  1204. m_bConAssist = true;
  1205. }
  1206. }
  1207. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1208. {
  1209. if (ReConnectionSipphone()) {
  1210. m_bConSipphone = true;
  1211. }
  1212. }
  1213. return 0;
  1214. }
  1215. void ACMCallFSM::s3_on_entry()
  1216. {
  1217. if (false == m_bConnected) {
  1218. m_bConnected = true;
  1219. unsigned int unowtime = y2k_time_now();
  1220. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("handfree call connecting time is %us.", unowtime - m_uConnectTime);
  1221. m_uConnectTime = unowtime;
  1222. }
  1223. }
  1224. void ACMCallFSM::s3_on_exit() {}
  1225. unsigned int ACMCallFSM::s3_on_event(FSMEvent* event)
  1226. {
  1227. if (event->iEvt == USER_EVT_TO_HANDFREE)
  1228. {
  1229. //m_bHandFree = TRUE;
  1230. }
  1231. else if (event->iEvt == USER_EVT_TO_PICKUP)
  1232. {
  1233. //m_bHandFree = FALSE;
  1234. }
  1235. else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
  1236. {
  1237. StopChannel();
  1238. }
  1239. else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
  1240. {
  1241. HangupCall();
  1242. StopVideo();
  1243. }
  1244. else if (event->iEvt == USER_EVT_AGENT_WRITABLE)
  1245. {
  1246. AllowAgentWrite();
  1247. }
  1248. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1249. {
  1250. if (ReConnectionAssistchan()) {
  1251. m_bConAssist = true;
  1252. }
  1253. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C4").setResultCode("RTA3461")("handfree mode disconnect the video connection for assist channel entity error");
  1254. }
  1255. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1256. {
  1257. if (ReConnectionSipphone()) {
  1258. m_bConSipphone = true;
  1259. }
  1260. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C4").setResultCode("RTA3462")("handfree mode disconnect the video connection for sipphone entity error");
  1261. }
  1262. return 0;
  1263. }
  1264. void ACMCallFSM::s4_on_entry()
  1265. {
  1266. if (false == m_bConnected) {
  1267. m_bConnected = true;
  1268. unsigned int unowtime = y2k_time_now();
  1269. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("pickup call connecting time is %us.", unowtime - m_uConnectTime);
  1270. m_uConnectTime = unowtime;
  1271. }
  1272. }
  1273. void ACMCallFSM::s4_on_exit() {}
  1274. unsigned int ACMCallFSM::s4_on_event(FSMEvent* event)
  1275. {
  1276. if (event->iEvt == USER_EVT_TO_HANDFREE)
  1277. {
  1278. //m_bHandFree = TRUE;
  1279. }
  1280. else if (event->iEvt == USER_EVT_TO_PICKUP)
  1281. {
  1282. //m_bHandFree = FALSE;
  1283. }
  1284. else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) {
  1285. StopChannel();
  1286. }
  1287. else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
  1288. HangupCall();
  1289. StopVideo();
  1290. }
  1291. else if (event->iEvt == USER_EVT_AGENT_WRITABLE) {
  1292. AllowAgentWrite();
  1293. }
  1294. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL){
  1295. if (ReConnectionAssistchan()) {
  1296. m_bConAssist = true;
  1297. }
  1298. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C4").setResultCode("RTA3463")("pickup mode disconnect the video connection for assist channel entity error");
  1299. }
  1300. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1301. {
  1302. if (ReConnectionSipphone()) {
  1303. m_bConSipphone = true;
  1304. }
  1305. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304C4").setResultCode("RTA3464")("pickup mode disconnect the video connection for sipphone entity error");
  1306. }
  1307. return 0;
  1308. }
  1309. void ACMCallFSM::s50_on_entry() {}
  1310. void ACMCallFSM::s50_on_exit() {}
  1311. unsigned int ACMCallFSM::s50_on_event(FSMEvent* event)
  1312. {
  1313. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
  1314. StopVideo();
  1315. }
  1316. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1317. {
  1318. if (ReConnectionAssistchan()) {
  1319. m_bConAssist = true;
  1320. }
  1321. }
  1322. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1323. {
  1324. if (ReConnectionSipphone()) {
  1325. m_bConSipphone = true;
  1326. }
  1327. }
  1328. return 0;
  1329. }
  1330. void ACMCallFSM::s51_on_entry()
  1331. {
  1332. if (m_bConnected) {
  1333. m_bConnected = false;
  1334. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("call connected time is %us.", y2k_time_now() - m_uConnectTime);
  1335. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
  1336. }
  1337. }
  1338. void ACMCallFSM::s51_on_exit() {}
  1339. unsigned int ACMCallFSM::s51_on_event(FSMEvent* event)
  1340. {
  1341. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
  1342. StopVideo();
  1343. }
  1344. return 0;
  1345. }
  1346. void ACMCallFSM::s52_on_entry()
  1347. {
  1348. ScheduleTimer(52,RELEASEING_SIP_TIMER);
  1349. if (m_bConnected) {
  1350. m_bConnected = false;
  1351. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("call connected time is %us.", y2k_time_now() - m_uConnectTime);
  1352. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
  1353. }
  1354. }
  1355. void ACMCallFSM::s52_on_exit()
  1356. {
  1357. CancelTimer(52);
  1358. CancelTimer(520);
  1359. }
  1360. unsigned int ACMCallFSM::s52_on_event(FSMEvent* event)
  1361. {
  1362. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1363. {
  1364. if (ReConnectionAssistchan()) {
  1365. m_bConAssist = true;
  1366. }
  1367. }
  1368. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1369. {
  1370. if (ReConnectionSipphone()) {
  1371. m_bConSipphone = true;
  1372. }
  1373. }
  1374. else if (event->iEvt == EVT_TIMER)
  1375. {
  1376. if (event->param1 == 52)
  1377. {
  1378. ScheduleTimer(520,RELEASEING_SIP_TIMEOUT);
  1379. ReleaseCall(0);
  1380. }
  1381. else if (event->param1 == 520)
  1382. {
  1383. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  1384. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
  1385. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"restart sipphone ");
  1386. }
  1387. }
  1388. return 0;
  1389. }
  1390. void ACMCallFSM::s53_on_entry()
  1391. {
  1392. ScheduleTimer(53, RELEASEING_TIMER_INTERVAL);
  1393. }
  1394. void ACMCallFSM::s53_on_exit()
  1395. {
  1396. CancelTimer(53);
  1397. }
  1398. unsigned int ACMCallFSM::s53_on_event(FSMEvent* event)
  1399. {
  1400. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1401. {
  1402. if (ReConnectionAssistchan()) {
  1403. m_bConAssist = true;
  1404. }
  1405. }
  1406. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1407. {
  1408. if (ReConnectionSipphone()) {
  1409. m_bConSipphone = true;
  1410. }
  1411. }
  1412. else if (event->iEvt == EVT_TIMER)
  1413. {
  1414. if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
  1415. {
  1416. m_nSipErrorNum = 0;
  1417. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
  1418. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone ");
  1419. }
  1420. }
  1421. return 0;
  1422. }
  1423. void ACMCallFSM::s60_on_entry()
  1424. {
  1425. StopChannel();
  1426. HangupCall();
  1427. if (m_bConnected) {
  1428. m_bConnected = false;
  1429. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("call connected time is %us.", y2k_time_now() - m_uConnectTime);
  1430. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setCostTime(SP::Module::Comm::RVCGetTickCount() - m_lConnectCostTime).setLogCode("QLR0402304C4")("disconnect the video connection.");
  1431. }
  1432. }
  1433. void ACMCallFSM::s60_on_exit() {}
  1434. unsigned int ACMCallFSM::s60_on_event(FSMEvent* event)
  1435. {
  1436. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
  1437. {
  1438. StopVideo();
  1439. }
  1440. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1441. {
  1442. if (ReConnectionAssistchan()) {
  1443. m_bConAssist = true;
  1444. }
  1445. }
  1446. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1447. {
  1448. if (ReConnectionSipphone()) {
  1449. m_bConSipphone = true;
  1450. }
  1451. }
  1452. return 0;
  1453. }
  1454. void ACMCallFSM::s61_on_entry() {}
  1455. void ACMCallFSM::s61_on_exit() {}
  1456. unsigned int ACMCallFSM::s61_on_event(FSMEvent* event)
  1457. {
  1458. if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
  1459. StopVideo();
  1460. }
  1461. else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1462. {
  1463. if (ReConnectionAssistchan()) {
  1464. m_bConAssist = true;
  1465. }
  1466. }
  1467. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1468. {
  1469. if (ReConnectionSipphone()) {
  1470. m_bConSipphone = true;
  1471. }
  1472. }
  1473. return 0;
  1474. }
  1475. void ACMCallFSM::s62_on_entry()
  1476. {
  1477. ScheduleTimer(62,RELEASEING_SIP_TIMER);
  1478. }
  1479. void ACMCallFSM::s62_on_exit()
  1480. {
  1481. CancelTimer(62);
  1482. CancelTimer(620);
  1483. }
  1484. unsigned int ACMCallFSM::s62_on_event(FSMEvent* event)
  1485. {
  1486. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1487. {
  1488. if (ReConnectionAssistchan()) {
  1489. m_bConAssist = true;
  1490. }
  1491. }
  1492. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1493. {
  1494. if (ReConnectionSipphone()) {
  1495. m_bConSipphone = true;
  1496. }
  1497. }
  1498. else if (event->iEvt == EVT_TIMER)
  1499. {
  1500. if (event->param1 == 62)
  1501. {
  1502. ScheduleTimer(620,RELEASEING_SIP_TIMEOUT);
  1503. ReleaseCall(0);
  1504. }
  1505. else if (event->param1 == 620)
  1506. {
  1507. PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
  1508. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
  1509. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"restart sipphone ");
  1510. }
  1511. }
  1512. return 0;
  1513. }
  1514. void ACMCallFSM::s63_on_entry()
  1515. {
  1516. ScheduleTimer(63, RELEASEING_TIMER_INTERVAL);
  1517. }
  1518. void ACMCallFSM::s63_on_exit()
  1519. {
  1520. CancelTimer(63);
  1521. }
  1522. unsigned int ACMCallFSM::s63_on_event(FSMEvent* event)
  1523. {
  1524. if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
  1525. {
  1526. if (ReConnectionAssistchan()) {
  1527. m_bConAssist = true;
  1528. }
  1529. }
  1530. else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
  1531. {
  1532. if (ReConnectionSipphone()) {
  1533. m_bConSipphone = true;
  1534. }
  1535. }
  1536. else if (event->iEvt == EVT_TIMER)
  1537. {
  1538. if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
  1539. {
  1540. m_nSipErrorNum = 0;
  1541. //RealSipErrorCheck();
  1542. LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone");
  1543. LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone");
  1544. }
  1545. }
  1546. return 0;
  1547. }
  1548. int ACMCallFSM::TranslateState( int innerState )
  1549. {
  1550. switch (innerState) {
  1551. case s0:
  1552. return eState_Offline;
  1553. case s8:
  1554. case s10:
  1555. case s11:
  1556. case s12:
  1557. case s13:
  1558. return eState_Connecting;
  1559. case s20:
  1560. case s21:
  1561. case s22:
  1562. case s23:
  1563. case s24:
  1564. return eState_Fail;
  1565. case s3:
  1566. return eState_HandFree;
  1567. case s4:
  1568. return eState_Pickup;
  1569. case s50:
  1570. case s51:
  1571. case s52:
  1572. case s53:
  1573. return eState_Broken;
  1574. case s60:
  1575. case s61:
  1576. case s62:
  1577. case s63:
  1578. return eState_Releasing;
  1579. case s7:
  1580. case s14:
  1581. return eState_Recording;
  1582. default:
  1583. assert(0);
  1584. return 0;
  1585. }
  1586. }