ConnectorFSM.cpp 53 KB

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