ConnectorFSM.cpp 53 KB

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