12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844 |
- #include "stdafx.h"
- #include "ConnectorFSM.h"
- #include "ModuleMix.h"
- #include "EventCode.h"
- #include "json/json.h"
- #define RELEASEING_TIMER_INTERVAL 1200
- #define RELEASEING_SIP_TIMER 20000
- #define SIP_CALL_TIMER 70000 //sip呼叫超时时间,20170314,增加超时时间解决坐席忽闪问题
- #define RELEASEING_SIP_TIMEOUT 30000
- #define SIP_CONNECT_FAIL_TIMES 10
- #define LIVEDETECT_CONNECT_INTERVAL 5000 //live detection实体检测间隔5s
- #define LIVEDETECTION_TIMEOUT 60000 //活体检测超时时间60s
- #define CALLROUTE_MAX_TRY_COUNT 3
- #ifndef MAX_PATH
- #define MAX_PATH 260
- #endif
- #ifndef RVC_CALLROUTE_HTTP_API
- #define RVC_CALLROUTE_HTTP_API "/api/route/query"
- #endif // !RVC_CALLROUTE_HTTP_API
- static const char* connect_failed_case_table[] = {
- "",
- "[RTA3401] 连线失败,请检查网络",
- "[RTA3402] 坐席忙,请稍后再试",
- "[RTA3403] 声卡故障,请使用话筒重新办理",
- "[RTA3404] 声卡故障,请使用免提重新办理",
- "[RTA3405] 连线失败,系统忙,请稍后再试",
- "[RTA3406] 连接坐席失败,系统忙,请稍后再试",
- "[RTA3407] 连线失败,服务端异常,请稍后再试",
- "[RTA3408] 连线失败,检测到机器有多张网卡,请禁用无效网卡后再试"
- };
- #ifdef RVC_OS_LINUX
- unsigned long GetTickCount()
- {
- struct timespec ts;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
- }
- #endif
- class SyncServiceClient:public SyncService_ClientBase
- {
- public:
- SyncServiceClient(CEntityBase *pEntity, ACMCallFSM* fsm) : SyncService_ClientBase(pEntity), m_fsm(fsm) {}
- ACMCallFSM *m_fsm;
- };
- class MyPhoneClient : public PhoneService_ClientBase
- {
- public:
- MyPhoneClient(CEntityBase *pEntity, ACMCallFSM* fsm) : PhoneService_ClientBase(pEntity), m_fsm(fsm) {m_bSipConnected = false;}
- virtual void OnMessage(ErrorCodeEnum Error, PhoneService_PhoneState_Info &Msg, CSmartPointer<IReleasable> pData)
- {
- //LOG_TRACE("rx sip phone state = %d", Msg.state);
- if (Error == Error_Succeed) {
- switch (Msg.state) {
- case ePhone_Init:
- case ePhone_Terminated:
- {
- FSMEvent *e = new FSMEvent(USER_EVT_SIP_STATE_IDLE);
- m_fsm->PostEventFIFO(e);
- }
- break;
- case ePhone_Ready:
- {
- FSMEvent *e = new FSMEvent(USER_EVT_SIP_STATE_CONNECTED);
- m_fsm->PostEventFIFO(e);
- m_bSipConnected = true;
- }
- break;
- case ePhone_Calling:
- {
- m_bSipConnected = false;
- }
- break;
- default:
- break;
- }
- if (ePhone_Terminated == Msg.state){
- if (!m_bSipConnected){
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_SIP_CONNECT_FAILED, CSimpleStringA::Format("sip connect failed for %s.", Msg.status.GetData()).GetData());
- }
- }
- }
- }
- public:
- ACMCallFSM *m_fsm;
- int m_bSipConnected;
- };
- class MyChannelClient : public ChannelService_ClientBase
- {
- public:
- MyChannelClient(CEntityBase *pEntity, ACMCallFSM* fsm) : ChannelService_ClientBase(pEntity), m_fsm(fsm) {}
- virtual void OnMessage(ErrorCodeEnum Error, ChannelService_State_Info &Msg, CSmartPointer<IReleasable> pData)
- {
- if (Error == Error_Succeed) {
- switch (Msg.state) {
- case eChannelState_Idle:
- {
- FSMEvent *e = new FSMEvent(USER_EVT_CHAN_STATE_IDLE);
- m_fsm->PostEventFIFO(e);
- }
- break;
- case eChannelState_Connected:
- {
- FSMEvent *e = new ChanStateConnectedEvent(Msg.param);
- m_fsm->PostEventFIFO(e);
- }
- break;
- default:
- break;
- }
- }
- }
- ACMCallFSM *m_fsm;
- };
- ACMCallFSM::ACMCallFSM()
- : m_pPhoneClient(NULL), m_pChannelClient(NULL), m_bRing(FALSE),m_iFailedLastState(0)
- {
- m_nCurSipServer = CurServerNum::MAIN_SERVER;
- m_nCurChanServer = CurServerNum::MAIN_SERVER;
- m_iNetAdapterNum = 1;
- m_pSyncServiceClient = NULL;
- m_bConAssist = FALSE;
- m_bConSipphone = FALSE;
- memset(m_strSIPProxyIP, 0, sizeof(m_strSIPProxyIP));
- memset(m_strSIPCallNum, 0, sizeof(m_strSIPCallNum));
- memset(m_iSIPProxyPort, 0, sizeof(m_iSIPProxyPort));
- memset(m_strChanCallNum, 0, sizeof(m_strChanCallNum));
- memset(m_strChanProxyIP, 0, sizeof(m_strChanProxyIP));
- memset(m_iChanProxyPort, 0, sizeof(m_iChanProxyPort));
- m_pCallRouteList = NULL;
- m_strDefaultServer = NULL;
- m_strHttpCallRouteAddr = NULL;
- m_strHttpServerAPI = RVC_CALLROUTE_HTTP_API;
- m_strQueueName = NULL;
- m_strAddClientLevel = NULL;
- m_iCallRouteType = 0;
- m_LastSipError = Error_Succeed;
- m_LastAssistError = Error_Succeed;
- m_bNeedQueueName = FALSE;
- m_iHttpTimeOut = RVC_DEFAULT_HTTPTIMEOUT;
- m_bHttpPrinttDbg = false;
- }
- ACMCallFSM::~ACMCallFSM()
- {
- }
- ErrorCodeEnum ACMCallFSM::OnInit()
- {
- ErrorCodeEnum Error = LoadConfig();
- if (Error != Error_Succeed) {
- goto on_error;
- }
-
- GetEntityBase()->GetFunction()->SetSysVar("CallState", "O"); // set to offline state
- Error = LoadTerminalId();
- if (Error != Error_Succeed) {
- goto on_error;
- }
-
- //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]);
- //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]);
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("TerminalId: %s", (LPCSTR)m_strTerminalId);
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("default_voip_server: %s", m_strDefaultServer.GetData());
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HttpCallRouteAddr: %s", m_strHttpCallRouteAddr.GetData());
- if(m_strDefaultServer.GetLength() > 0){
- ParseDefaultServer(m_strDefaultServer.GetData());
- }
- m_bHangup = false;
- m_bHandFree = true;
- m_bAgentHandFree = true;
- m_bIsAgentControl = false;
- m_nSipErrorNum = 0;
- m_nLiveDetctionTime = 0;
- memset(&m_CallingParam,0,sizeof(m_CallingParam));
- m_nSysCallType = 0;
- AddStateHooker(this);
- return Error;
- on_error:
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on_error");
- FSMEvent *e = new FSMEvent(USER_EVT_ERROR);
- PostEventFIFO(e); // jump to error state
- return Error;
- }
- bool ACMCallFSM::ReConnectionAssistchan()
- {
- if (m_pChannelClient != NULL){
- m_pChannelClient->GetFunction()->CloseSession();
- #ifdef RVC_OS_WIN
- m_pChannelClient->SafeDelete();
- #endif
- m_pChannelClient = NULL;
- }
- if (m_pChannelClient == NULL){
- m_pChannelClient = new MyChannelClient(m_pEntity, this);
- ErrorCodeEnum Error = m_pChannelClient->Connect();
- if (Error != Error_Succeed) {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_channelClient connect fail!");
- #ifdef RVC_OS_WIN
- m_pChannelClient->SafeDelete();
- #endif
- m_pChannelClient = NULL;
- return false;
- }
- if (Error == Error_Succeed){
- ChannelService_BeginState_Sub ChannelSub;
- Error = (*m_pChannelClient)(EntityResource::getLink().upgradeLink())->BeginState(ChannelSub);
- if (Error != Error_Succeed){
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState biz channel failed!");
- m_pChannelClient->GetFunction()->CloseSession();
- #ifdef RVC_OS_WIN
- m_pChannelClient->SafeDelete();
- #endif
- m_pChannelClient = NULL;
- return false;
- }
- }
- }
- return true;
- }
- bool ACMCallFSM::ReConnectionSipphone(bool bLog)
- {
- if (m_pPhoneClient != NULL){
- m_pPhoneClient->GetFunction()->CloseSession();
- #ifdef RVC_OS_WIN
- m_pPhoneClient->SafeDelete();
- #endif
- m_pPhoneClient = NULL;
- }
- if (m_pPhoneClient == NULL){
- m_pPhoneClient = new MyPhoneClient(m_pEntity, this);
- ErrorCodeEnum Error = m_pPhoneClient->Connect();
- if (Error != Error_Succeed) {
- if (bLog) {
- LogWarn(Severity_Low, Error_Debug, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
- }
- #ifdef RVC_OS_WIN
- m_pPhoneClient->SafeDelete();
- #endif
- m_pPhoneClient = NULL;
- return false;
- }
- if (Error == Error_Succeed)
- {
- PhoneService_BeginState_Sub PhoneSub;
- Error = (*m_pPhoneClient)(EntityResource::getLink().upgradeLink())->BeginState(PhoneSub);
- if (Error != Error_Succeed) {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("BeginState sip failed!");
- m_pPhoneClient->GetFunction()->CloseSession();
- #ifdef RVC_OS_WIN
- m_pPhoneClient->SafeDelete();
- #endif
- m_pPhoneClient = NULL;
- return false;
- }
- }
- }
- return true;
- }
- bool ACMCallFSM::ReConnectionSyncService()
- {
- if (NULL != m_pSyncServiceClient){
- m_pSyncServiceClient->GetFunction()->CloseSession();
- #ifdef RVC_OS_WIN
- m_pSyncServiceClient->SafeDelete();
- #endif
- m_pSyncServiceClient = NULL;
- }
- m_pSyncServiceClient = new SyncServiceClient(m_pEntity, this);
- ErrorCodeEnum Error = m_pSyncServiceClient->Connect();
- if (Error_Succeed != Error){
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect SyncService Fail!");
- #ifdef RVC_OS_WIN
- m_pSyncServiceClient->SafeDelete();
- #endif
- m_pSyncServiceClient = NULL;
- return false;
- }
- return true;
- }
- int ACMCallFSM::GetCallRouteList()
- {
- int iret = -1;
- if (m_strHttpCallRouteAddr.GetLength() != 0) {
- int ihttpcount = 0;
- http_call_info_t http_callinfo;
- http_callinfo.strServerURL = m_strHttpCallRouteAddr;
- http_callinfo.strAPI = m_strHttpServerAPI;
- if (m_bNeedQueueName) {
- http_callinfo.strQueueName = m_strQueueName;
- http_callinfo.strAddClientLevel = m_strAddClientLevel;
- }
- else {
- http_callinfo.strQueueName = NULL;
- http_callinfo.strAddClientLevel = NULL;
- }
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_QUEUE_INFO, CSimpleStringA::Format("call type is %d, http call route queue name is %s, and client level is %s.", m_CallingParam.nCallType, http_callinfo.strQueueName.GetData(), http_callinfo.strAddClientLevel.GetData()).GetData());
- http_callinfo.strTerminalNo = m_strTerminalId;
- do {
- m_pCallRouteList = get_http_callroute_list(&http_callinfo, m_iHttpTimeOut, m_bHttpPrinttDbg);
- ihttpcount++;
- } while (!m_pCallRouteList && ihttpcount < CALLROUTE_MAX_TRY_COUNT);
- if (ihttpcount > 1) {
- 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());
- }
- }
- if (NULL != m_pCallRouteList) {
- iret = 0;
- }
- else {
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CALLROUTE_FAILED, "call route request failed!");
- }
- return iret;
- }
- int ACMCallFSM::GetDelayTime()
- {
- ErrorCodeEnum error= Error_Unexpect;
- SyncService_GetMachineData_Req req;
- req.key = "DelayTime";
- SyncService_GetMachineData_Ans ans;
- DWORD Timeout = 500;
- if (m_pSyncServiceClient)
- {
- error = (*m_pSyncServiceClient)(EntityResource::getLink().upgradeLink())->GetMachineData(req,ans,Timeout);
- }
- if (error == Error_Succeed)
- {
- int delaytime = atoi(ans.value);
- return delaytime;
- }
- else
- {
- return -1;
- }
- }
- void ACMCallFSM::SetDelayTime()
- {
- if (m_pSyncServiceClient)
- {
- SyncService_SetMachineData_Info info;
- info.key = "DelayTime";
- info.data = "0";
- (*m_pSyncServiceClient)(EntityResource::getLink().upgradeLink())->SetMachineData(info);
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set delay time to 0");
- }
- }
- static int CStringSplit(char* str, char** result, size_t ucount, const char* del)
- {
- char* ptr = NULL;
- size_t unum = ucount;
- #if defined(RVC_OS_WIN)
- char* p = strtok_s(str, del, &ptr);
- while (p != NULL && unum > 0) {
- *result++ = p;
- p = strtok_s(NULL, del, &ptr);
- unum--;
- }
- #else
- char* p = strtok_r(str, del, &ptr);
- while (p != NULL && unum > 0) {
- *result++ = p;
- p = strtok_r(NULL, del, &ptr);
- unum--;
- }
- #endif //RVC_OS_WIN
- return ucount - unum;
- }
- static int GetCallInfoFromConfig(char* strcallurl, size_t ucalllen, char* strassist, size_t assitlen, size_t *uport, const char* psrc)
- {
- int iRet = -1;
- if (NULL == psrc || NULL == strcallurl || NULL == strassist){
- return iRet;
- }
- char *result[MAX_VOIP_SERVER_NUM] = {0};
- int icount = CStringSplit((char*)psrc, result, MAX_VOIP_SERVER_NUM, ",");
- if(2 == icount){
- snprintf(strcallurl, ucalllen, "%s", result[0]);
- char *assitresult[MAX_VOIP_SERVER_NUM] = {0};
- icount = CStringSplit(result[1], assitresult, MAX_VOIP_SERVER_NUM, " ");
- if(2 == icount){
- snprintf(strassist, assitlen, "%s", assitresult[0]);
- *uport = atoi(assitresult[1]);
- iRet = 0;
- }
- }
- return iRet;
- }
- /*无符号长整形转字符型*/
- #if defined(RVC_OS_LINUX)
- namespace
- {
- char* _ultoa(unsigned long value, char* pstring, int radix)
- {
- char tmp[33] = { 0 };
- char* tp = tmp;
- long i;
- unsigned long v = value;
- char* sp;
- if (radix > 36 || radix <= 1 || NULL == pstring) {
- return 0;
- }
- while (v || tp == tmp) {
- i = v % radix;
- v = v / radix;
- if (i < 10)
- *tp++ = i + '0';
- else
- *tp++ = i + 'a' - 10;
- }
- sp = pstring;
- while (tp > tmp)
- *sp++ = *--tp;
- *sp = 0;
- return pstring;
- }
- }
- #endif //RVC_OS_LINUX
- static int get_interger_netaddr(char *strbuf, size_t ubufszie, const char* szip)
- {
- int ret = -1;
- unsigned long ulip = 0;
- if (NULL == strbuf || NULL == szip){
- return ret;
- }
- ulip = inet_addr(szip);
- _ultoa(ulip, strbuf, 10);
- ret = 0;
- return ret;
- }
- int ACMCallFSM::ParseDefaultServer(const char* strServer)
- {
- int iRet = 0;
- if(NULL == strServer){
- return iRet;
- }
- char *result[MAX_VOIP_SERVER_NUM] = {0};
- int icount = CStringSplit((char*)strServer, result, MAX_VOIP_SERVER_NUM, "|");
- int index = 0;
- while(index < icount && result[index]){
- m_voipserver.push_back(result[index]);
- index++;
- }
- iRet = m_voipserver.size();
- return iRet;
- }
- ErrorCodeEnum ACMCallFSM::OnExit()
- {
- return Error_Succeed;
- }
- int ACMCallFSM::GetFailedErrorCode(int iSrcState)
- {
- int iState = 0;
- if (s20 != iSrcState){
- switch (m_iFailedLastState) {
- case s11:
- if(Error_Succeed != m_LastSipError){
- iState = 5;
- }
- else{
- iState = 1;
- }
- break;
- case s12:
- if (Error_Succeed != m_LastAssistError){
- iState = 5;
- }
- else{
- iState = 2;
- }
- break;
- default:
- break;
- }
- }
- return iState;
- }
- int ACMCallFSM::LogFailedWarns(int iFailedCode, const char* strmsg)
- {
- int iRet = 0;
- if (m_bHangup){
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_USER_HANGUP, strmsg);
- }
- else{
- switch (iFailedCode) {
- case 1:
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_NETWORK_FAILURE, strmsg);
- break;
- case 2:
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_AGENT_BUSY, strmsg);
- break;
- case 5:
- if (s11 == m_iFailedLastState){
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_SIPPHONE_LOST, strmsg);
- }
- else if(s12 == m_iFailedLastState){
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_FAILED_ASSISTCHANNEL_LOST, strmsg);
- }
- break;
- default:
- break;
- }
- }
- return iRet;
- }
- void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
- {
- if (CheckBeginRing(iSrcState, iDstState)) {
- StartRing();
- } else {
- if (CheckEndRing(iSrcState, iDstState))
- StopRing();
- }
- if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT) {
- int st1 = TranslateState(iSrcState);
- int st2 = TranslateState(iDstState);
- if (eState_Fail == st2){
- m_iFailedLastState = iSrcState;
- }
- if (st1 != st2) {
- PhoneState evt;
- evt.state = st2;
- evt.status = CSimpleStringA::Format("OnStateTrans from state %d to %d", st1, st2);
- evt.errinfo = "";
- //LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CALL_STATE_TRANS, evt.status.GetData());
- //LOG_TRACE(evt.status);
- if (!((st2 == eState_Fail)&&(m_nCurChanServer != CurServerNum::Error_Server)&&(m_nCurSipServer != CurServerNum::Error_Server))||m_bHangup)
- {
- if (eState_Fail != st1 || eState_Connecting != st2){
- //char strmsg[MAX_PATH] = {0};
- //snprintf(strmsg, MAX_PATH,"Broadcast state from %d to %d", st1, st2);
- //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)(strmsg);
- if (eState_Fail == st2){
- int ierrcode = GetFailedErrorCode(iSrcState);
- //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);
- if (ierrcode >= 0 && ierrcode < sizeof(connect_failed_case_table)/ sizeof(char*)){
- evt.errinfo = CSimpleStringA2W(connect_failed_case_table[ierrcode]);
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect failed for %s.", CSimpleStringW2A(evt.errinfo).GetData());
- }
- char strerrmsg[MAX_PATH] = {0};
- if (m_bHangup){
- snprintf(strerrmsg, MAX_PATH, "connect failed for %s and last state is %d, and current src state is %d.","接通前客户主动挂机", m_iFailedLastState, iSrcState);
- }
- else{
- 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);
- }
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_FAILED, strerrmsg);
-
- LogFailedWarns(ierrcode, strerrmsg);
- }
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(PhoneState), SP_MSG_SIG_OF(PhoneState), evt);
- //LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_BROADCAST_CALL_STATE, strmsg);
- }
- else{
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_AUTO_RECONNECT,CSimpleString::Format("state from %d to %d, auto reconnect, not broadcast state to ui.", st1, st2).GetData());
- }
- if (eState_HandFree == st2 || eState_Pickup == st2){
- if (eState_Connecting == st1){
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_SUCCESS, "connect success!");
- }
- }
- }
- SetCallState(st2);
- GetEntityBase()->GetFunction()->SetUserDefineState(st2+USER_SIP_OFFLINE);
- }
- }
- }
- ErrorCodeEnum ACMCallFSM::SetCallState(int state)
- {
- char *sts[] = {
- "O", // Offline
- "C", // Connecting
- "H", // HandFree
- "P", // Pickup
- "B", // Broken
- "F", // Fail
- "R", // Releasing
- "L", // LiveDetect
- "V" // Recording
- };
- char* strCallState = "O";
- if (0 <= state && state < sizeof(sts)/sizeof(char*)){
- strCallState = sts[state];
- }
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("set call state to [%s].", strCallState);
- return GetEntityBase()->GetFunction()->SetSysVar("CallState", strCallState);
- }
- void ACMCallFSM::s0_on_entry()
- {
- m_strHintCallNum.Clear();
- m_nCurChanServer = CurServerNum::MAIN_SERVER;
- m_nCurSipServer = CurServerNum::MAIN_SERVER;
- memset(&m_CallingParam,0,sizeof(m_CallingParam));
- GetEntityBase()->GetFunction()->SetSysVar("CallType", "N"); //进入初始状态时设置呼叫模式为常规呼叫
- m_nSysCallType = 0;
- if(m_pCallRouteList != NULL){
- free_node_list(m_pCallRouteList);
- m_pCallRouteList = NULL;
- }
- m_iFailedLastState = 0;
- }
- void ACMCallFSM::s0_on_exit()
- {
- m_bHangup = FALSE;
- m_nStarttime = GetTickCount();
- }
- unsigned int ACMCallFSM::s0_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_PICKUP_CALL)
- {
- memset(&m_CallingParam,0,sizeof(m_CallingParam)); //正常呼叫
- GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_CALLTYPE, CALLTYPE_NORMAL); // 设置呼叫模式为常规呼叫
- m_nSysCallType = 0;
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_PICKUPCALL,"begin pickup call");
- }
- else if (event->iEvt == USER_EVT_HANDFREE_CALL)
- {
- GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_CALLTYPE,CALLTYPE_NORMAL); // 设置呼叫模式为常规呼叫
- m_nSysCallType = 0;
- memset(&m_CallingParam,0,sizeof(m_CallingParam)); // 正常呼叫
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_HANDFREECALL,"begin hand free call");
- }
- else if (event->iEvt == USER_EVT_COMMAND_CALL)
- {
- //由指令模块触发呼叫
- GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_CALLTYPE, CALLTYPE_MOBILE); // 设置呼叫模式为手机呼叫
- m_nSysCallType = 1;
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = true;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = true;
- }
- }
- else if (event->iEvt == USER_EVT_STARTVIDEODISPLAY)
- {
- StartVideoDisplayEvent *e = static_cast<StartVideoDisplayEvent *>(event);
- #ifdef RVC_OS_WIN
- StartVideo((LPCSTR)e->m_param);
- #else
- StartVideoRender((LPCSTR)e->m_param);
- #endif
- }
- else if (event->iEvt == USER_EVT_SHOWLOACALVIDEO)
- {
- ShowLocalVideoEvent *e = static_cast<ShowLocalVideoEvent *>(event);
- SetCallingType(NORMAL_CALLTYPE);
- #ifdef RVC_OS_WIN
- StartVideo((LPCSTR)e->m_param);
- #else
- StartVideoRender((LPCSTR)e->m_param);
- #endif
- }
- else if (event->iEvt == USER_EVT_SHOWLOACALREMOTEVIDEO)
- {
- ShowLocalAndRemoteVideoEvent *e = static_cast<ShowLocalAndRemoteVideoEvent *>(event);
- SetCallingType(NORMAL_CALLTYPE);
- #ifdef RVC_OS_WIN
- StartVideo((LPCSTR)e->m_param);
- #else
- StartVideoRender((LPCSTR)e->m_param);
- #endif
- }
- else if (event->iEvt == USER_EVT_DOUBLE_RECORD_CALL)
- {
- m_CallingParam.nCallType = DOUBLERECORD_CALLTYPE;
- //GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_CALLTYPE,CALLTYPE_RECORD); // 设置呼叫模式为双录呼叫
- m_nSysCallType = 0;
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start double record call,call type is %d.", m_CallingParam.nCallType);
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_DOUBLERECORDCALL,"begin double record call");
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- #ifdef RVC_OS_WIN
- StopVideo();
- SetCallingType(NORMAL_CALLTYPE);
- #else
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s:%d, stop show local and remote video.", __FUNCTION__, __LINE__);
- #endif
- }
- return 0;
- }
- void ACMCallFSM::s7_on_entry()
- {
-
- }
- void ACMCallFSM::s7_on_exit()
- {
- }
- unsigned int ACMCallFSM::s7_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_STOPLOCALVIDEO)
- {
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("stop show local video");
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s9_on_entry()
- {
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("start liveness detection.");
- m_nLiveDetctionTime = 0;
- ScheduleTimer(9, 2*LIVEDETECT_CONNECT_INTERVAL);
- }
- void ACMCallFSM::s9_on_exit()
- {
- CancelTimer(9);
- m_nLiveDetctionTime = 0;
- }
- unsigned int ACMCallFSM::s9_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_STOPVIDEODISPLAY)
- {
- //ScheduleTimer(9,3000);
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("stop live detection display");
- StopVideo();
- LogEvent(Severity_Middle,LOG_EVT_RELEASELIVEDETECTION,"release live detection");
- }
- else if (event->iEvt == EVT_TIMER)
- {
- m_nLiveDetctionTime += LIVEDETECT_CONNECT_INTERVAL;
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s8_on_entry()
- {
- //get call route,采用直接总行方式
- if (0 == GetCallRouteList()) {
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("get call route list success.");
- }
- else {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("get call route list failed.");
- }
-
- int time = GetDelayTime();
- if (time > 0){
- ScheduleTimer(8,time*1000);
- }
- else{
- PostEventFIFO(new FSMEvent(EVT_TIMER));
- }
- }
- void ACMCallFSM::s8_on_exit()
- {
- CancelTimer(8);
- }
- unsigned int ACMCallFSM::s8_on_event(FSMEvent* event)
- {
- return 0;
- }
- void ACMCallFSM::s10_on_entry()
- {
- //LOG_FUNCTION();
- ErrorCodeEnum Error = Error_Succeed;
- if (m_nCurSipServer == CurServerNum::Error_Server)
- {
- Error = Error_NetBroken;
- }
- if (Error != Error_Succeed)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- }
- }
- void ACMCallFSM::s10_on_exit() {}
- unsigned int ACMCallFSM::s10_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- return 0;
- }
- void ACMCallFSM::s11_on_entry()
- {
- m_LastSipError = Error_Succeed;
- LogWarn(Severity_Low, Error_Debug, LOG_WARN_COUNTERCONNECT_MAKECALL,"begin make call");
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80101")("begin remote video call");
- if (m_nCurSipServer == CurServerNum::Error_Server){
- m_LastSipError = Error_NetBroken;
- }
- if (m_LastSipError == Error_Succeed){
- char ipstr[MAX_PATH] = {0};
- GetLocalIP(ipstr, MAX_PATH);
- //get call route,采用直接总行方式
- callurl_node_t *node = get_no_used_node(m_pCallRouteList);
- char callid_str[64] = { 0 };
- get_format_uuid(callid_str, 64);
- if (node != NULL){
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Begin Head Office Make Call!");
- m_LastSipError = MakeCall(node->strcallurl, CSimpleStringA::Format("sip:%s@%s;transport=UDP", node->strnewcallernum, ipstr),
- callid_str, m_CallingParam);
- m_iChanProxyPort[0] = node->uassistport;
- m_iChanProxyPort[1] = node->uassistport;
- m_strChanProxyIP[0] = node->strassistip;
- m_strChanProxyIP[1] = node->strassistip;
- node->bused = TRUE;
- }
- else{
- int icount = m_voipserver.size();
- if (icount > 0){
- int index = GetTickCount()%icount;
- char strcallurl[MAX_PATH] = {0};
- char strassistip[32] = {0};
- size_t uport = 0;
- char strserver[MAX_PATH] = { 0 };
- snprintf(strserver, MAX_PATH, "%s", m_voipserver[index].c_str());
- if (0 == GetCallInfoFromConfig(strcallurl, MAX_PATH, strassistip, 32, &uport, strserver)){
- char strassitinter[32] = {0};
- get_interger_netaddr(strassitinter, 32, strassistip);
- m_LastSipError = MakeCall(strcallurl, CSimpleStringA::Format("sip:%s#%s@%s;transport=UDP", m_strTerminalId.GetData(), strassitinter, ipstr),
- callid_str, m_CallingParam);
- m_iChanProxyPort[0] = uport;
- m_iChanProxyPort[1] = uport;
- m_strChanProxyIP[0] = strassistip;
- m_strChanProxyIP[1] = strassistip;
- 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());
- }
- else {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetCallInfoFromConfig failed!");
- m_LastSipError = Error_Param;
- }
- }
- else {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("no default voip server config!");
- m_LastSipError = Error_Param;
- }
- }
- if (m_LastSipError!=Error_Succeed){
- (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
- }
- m_nCurChanServer = CurServerNum::BACK_SERVER;
- }
- if (m_LastSipError != Error_Succeed)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80201").setResultCode("RTA3421")("send sip failed!");
- }
- else
- {
- ScheduleTimer(11,SIP_CALL_TIMER);
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80201")("send sip success!");
- }
- }
- void ACMCallFSM::s11_on_exit()
- {
- CancelTimer(11);
- }
- unsigned int ACMCallFSM::s11_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_HANGUP)
- {
- m_bHangup = TRUE;
- DWORD now = GetTickCount();
- int interval = now - m_nStarttime;
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_HANGUP, CSimpleStringA::Format("sip connecting, customer active hangup after %d ms.", interval).GetData());
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3431")("sip connect failed for user hangup");
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
- {
- if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect main server failed");
- }else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect bak server failed");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect error server failed");
- }
- (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
- m_nSipErrorNum++;
- //StopChannel();
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3432")("sip connect failed for server error.");
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, main server");
- }else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, bak server");
- }else{
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, error server");
- }
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
- }else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
- }else{
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
- }
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3434")("sip connect failed for entity error");
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_TIMEOUT,"sipphone connect timeout, main server");
- }else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_TIMEOUT,"sipphone connect timeout, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_TIMEOUT,"sipphone connect timeout, error server");
- }
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("sip call timeout,release call");
- m_nSipErrorNum++;
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3435")("sip connect failed for timeout");
- }
- else if (event->iEvt == USER_EVT_JMP_FAIL)
- {
- if (m_nCurSipServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, main server");
- }else if (m_nCurSipServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, error server");
- }
- m_nSipErrorNum++;
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80301").setResultCode("RTA3436")("sip connect failed for entity error");
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- return 0;
- }
- void ACMCallFSM::s12_on_entry()
- {
- //ErrorCodeEnum Error = Error_Succeed;
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80301")("sip connect success!");
- m_LastAssistError = Error_Succeed;
- if (m_nCurChanServer == CurServerNum::Error_Server)
- {
- m_LastAssistError = Error_NetBroken;
- }
- m_nSipErrorNum = 0;
- Sleep(200);
- if (m_LastAssistError == Error_Succeed)
- {
- if (m_CallingParam.nCallType == NORMAL_CALLTYPE && m_CallingParam.nCallType != DOUBLERECORD_CALLTYPE)
- {
- m_LastAssistError = StartChannel((int)m_nCurChanServer);
- }
- else
- {
- m_LastAssistError = StartChannel((int)m_nCurChanServer,m_CallingParam);
- #ifdef RVC_OS_WIN
- if (DOUBLERECORD_CALLTYPE == m_CallingParam.nCallType){
- if (FALSE == m_bHandFree){
- StopSpeakerAudioCapture();
- }
- }
- #endif
- }
- if (m_LastAssistError != Error_Succeed)
- {
- HangupCall();
- (bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
- }
- }
- if (m_LastAssistError != Error_Succeed) {
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- if (Error_NetBroken == m_LastAssistError) {
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3441")("assistant channel connect failed for net broken");
- }
- else if (Error_Param == m_LastAssistError) {
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3442")("assistant channel connect failed error param");
- }
- else {
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80401").setResultCode("RTA3443")("assistant channel connect failed!");
- }
- }
- else {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80401")("assistant channel connect success!");
- }
- }
- void ACMCallFSM::s12_on_exit() {}
- unsigned int ACMCallFSM::s12_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_HANGUP)
- {
- m_bHangup = TRUE;
- DWORD now = GetTickCount();
- int interval = now - m_nStarttime;
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_HANGUP, CSimpleStringA::Format("chan connecting, customer active hangup after %d ms.", interval).GetData());
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3451")("assistant channel bridge failed for user hangup");
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
- {
- if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, main server");
- }else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, error server");
- }
- (bool)m_nCurSipServer?(m_nCurSipServer= CurServerNum::Error_Server):(m_nCurSipServer= CurServerNum::BACK_SERVER);
- StopChannel();
- }
- else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- if (!m_bHangup)
- {
- if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, main server");
- }else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, error server");
- }
- (bool)m_nCurChanServer?(m_nCurChanServer= CurServerNum::Error_Server):(m_nCurChanServer= CurServerNum::BACK_SERVER);
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3452")("assistant channel bridge failed for server error");
- }
- HangupCall();
- //StopVideo();
- }
- else if (event->iEvt == USER_EVT_CHAN_STATE_CONNECTED)
- {
- ChanStateConnectedEvent *e = static_cast<ChanStateConnectedEvent *>(event);
- StartVideo((LPCSTR)e->m_param);
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402304Z80501")("assistant channel bridge success!");
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, main server");
- }else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, error server");
- }
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3453")("assistant channel bridge failed for entity restart");
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
- }else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
- }
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_JMP_FAIL)
- {
- if (m_nCurChanServer == CurServerNum::MAIN_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_FUNC_FAILED,"chan connect func failed, main server");
- }else if (m_nCurChanServer == CurServerNum::BACK_SERVER){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_FUNC_FAILED,"chan connect func failed, bak server");
- }else{
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED,"chan connect func failed, error server");
- }
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402304Z80501").setResultCode("RTA3454")("assistant channel bridge failed for entity error");
- }
-
- return 0;
- }
- void ACMCallFSM::s13_on_entry()
- {
- if (m_bHandFree)
- {
- PostEventLIFO(new FSMEvent(USER_EVT_JMP_HANDFREE));
- }
- else
- {
- PostEventLIFO(new FSMEvent(USER_EVT_JMP_PICKUP));
- }
- }
- void ACMCallFSM::s13_on_exit() {}
- unsigned int ACMCallFSM::s13_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s14_on_entry()
- {
- }
- void ACMCallFSM::s14_on_exit()
- {
- }
- unsigned int ACMCallFSM::s14_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- #ifdef RVC_OS_WIN
- StopVideo();
- #else
- StopVideoRender();
- #endif
- }
- else if (event->iEvt == USER_EVT_STOP_RECORD_BROADCAST)
- {
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s20_on_entry()
- {
- StopChannel();
- }
- void ACMCallFSM::s20_on_exit() {}
- unsigned int ACMCallFSM::s20_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s21_on_entry()
- {
- ScheduleTimer(21,RELEASEING_SIP_TIMER);
- HangupCall();
- }
- void ACMCallFSM::s21_on_exit()
- {
- CancelTimer(21);
- CancelTimer(210);
- }
- unsigned int ACMCallFSM::s21_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if(event->param1 == 21)
- {
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hangupcall timeout,release call");
- ScheduleTimer(210,RELEASEING_SIP_TIMEOUT);
- ReleaseCall(0);
- }
- else if (event->param1 == 210)
- {
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- //RealSipErrorCheck();
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"restart sipphone");
- }
- }
- return 0;
- }
- void ACMCallFSM::s22_on_entry()
- {
- StopChannel();
- }
- void ACMCallFSM::s22_on_exit() {}
- unsigned int ACMCallFSM::s22_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s23_on_entry()
- {
- if((!m_bHangup)&&(((m_nCurSipServer== CurServerNum::BACK_SERVER)&&(m_nCurChanServer!= CurServerNum::Error_Server))||((m_nCurChanServer== CurServerNum::BACK_SERVER)&&(m_nCurSipServer!= CurServerNum::Error_Server))))
- {
- PostEventLIFO(new FSMEvent(USER_EVT_RECONNECT));
- }
- else
- {
- ScheduleTimer(23, RELEASEING_TIMER_INTERVAL);
- }
- }
- void ACMCallFSM::s23_on_exit()
- {
- CancelTimer(23);
- }
- unsigned int ACMCallFSM::s23_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
- {
- m_nSipErrorNum = 0;
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone ");
- }
- }
- return 0;
- }
- void ACMCallFSM::s24_on_entry()
- {
- ScheduleTimer(24, RELEASEING_TIMER_INTERVAL);
- }
- void ACMCallFSM::s24_on_exit()
- {
- CancelTimer(24);
- }
- unsigned int ACMCallFSM::s24_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s3_on_entry() {}
- void ACMCallFSM::s3_on_exit() {}
- unsigned int ACMCallFSM::s3_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_TO_HANDFREE)
- {
- //m_bHandFree = TRUE;
- }
- else if (event->iEvt == USER_EVT_TO_PICKUP)
- {
- //m_bHandFree = FALSE;
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
- {
- StopChannel();
- }
- else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- HangupCall();
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_AGENT_WRITABLE)
- {
- AllowAgentWrite();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s4_on_entry() {}
- void ACMCallFSM::s4_on_exit() {}
- unsigned int ACMCallFSM::s4_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_TO_HANDFREE)
- {
- //m_bHandFree = TRUE;
- }
- else if (event->iEvt == USER_EVT_TO_PICKUP)
- {
- //m_bHandFree = FALSE;
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE) {
- StopChannel();
- } else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
- HangupCall();
- StopVideo();
- } else if (event->iEvt == USER_EVT_AGENT_WRITABLE) {
- AllowAgentWrite();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s50_on_entry() {}
- void ACMCallFSM::s50_on_exit() {}
- unsigned int ACMCallFSM::s50_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s51_on_entry() {}
- void ACMCallFSM::s51_on_exit() {}
- unsigned int ACMCallFSM::s51_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
- StopVideo();
- }
- return 0;
- }
- void ACMCallFSM::s52_on_entry()
- {
- ScheduleTimer(52,RELEASEING_SIP_TIMER);
- }
- void ACMCallFSM::s52_on_exit()
- {
- CancelTimer(52);
- CancelTimer(520);
- }
- unsigned int ACMCallFSM::s52_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (event->param1 == 52)
- {
- ScheduleTimer(520,RELEASEING_SIP_TIMEOUT);
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sip finished timeout,release call");
- ReleaseCall(0);
- }
- else if (event->param1 == 520)
- {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"restart sipphone ");
- }
- }
- return 0;
- }
- void ACMCallFSM::s53_on_entry()
- {
- ScheduleTimer(53, RELEASEING_TIMER_INTERVAL);
- }
- void ACMCallFSM::s53_on_exit()
- {
- CancelTimer(53);
- }
- unsigned int ACMCallFSM::s53_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
- {
- m_nSipErrorNum = 0;
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone ");
- }
- }
- return 0;
- }
- void ACMCallFSM::s60_on_entry()
- {
- StopChannel();
- HangupCall();
- }
- void ACMCallFSM::s60_on_exit() {}
- unsigned int ACMCallFSM::s60_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s61_on_entry() {}
- void ACMCallFSM::s61_on_exit() {}
- unsigned int ACMCallFSM::s61_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_CHAN_STATE_IDLE) {
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- return 0;
- }
- void ACMCallFSM::s62_on_entry()
- {
- ScheduleTimer(62,RELEASEING_SIP_TIMER);
- }
- void ACMCallFSM::s62_on_exit()
- {
- CancelTimer(62);
- CancelTimer(620);
- }
- unsigned int ACMCallFSM::s62_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (event->param1 == 62)
- {
- ScheduleTimer(620,RELEASEING_SIP_TIMEOUT);
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sip hangup timeout,release call");
- ReleaseCall(0);
- }
- else if (event->param1 == 620)
- {
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"restart sipphone ");
- }
- }
- return 0;
- }
- void ACMCallFSM::s63_on_entry()
- {
- ScheduleTimer(63, RELEASEING_TIMER_INTERVAL);
- }
- void ACMCallFSM::s63_on_exit()
- {
- CancelTimer(63);
- }
- unsigned int ACMCallFSM::s63_on_event(FSMEvent* event)
- {
- if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (ReConnectionAssistchan()) {
- m_bConAssist = TRUE;
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (ReConnectionSipphone()) {
- m_bConSipphone = TRUE;
- }
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (m_nSipErrorNum >= SIP_CONNECT_FAIL_TIMES)
- {
- m_nSipErrorNum = 0;
- //RealSipErrorCheck();
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone");
- LogWarn(Severity_Middle, Error_Unexpect, LOG_WARN_COUNTERCONNECT_RESTART_SIPPHONE,"FAIL TIMES, restart sipphone");
- }
- }
- return 0;
- }
- int ACMCallFSM::TranslateState( int innerState )
- {
- switch (innerState) {
- case s0:
- return eState_Offline;
- case s8:
- case s10:
- case s11:
- case s12:
- case s13:
- return eState_Connecting;
- case s20:
- case s21:
- case s22:
- case s23:
- case s24:
- return eState_Fail;
- case s3:
- return eState_HandFree;
- case s4:
- return eState_Pickup;
- case s50:
- case s51:
- case s52:
- case s53:
- return eState_Broken;
- case s60:
- case s61:
- case s62:
- case s63:
- return eState_Releasing;
- case s9:
- return eState_LiveDetect;
- case s7:
- case s14:
- return eState_Recording;
- default:
- assert(0);
- return 0;
- }
- }
|