ConnectorFSM.cpp 48 KB

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