ConnectorFSM.cpp 48 KB

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