ConnectorFSM.cpp 49 KB

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