ConnectorFSM.cpp 50 KB

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