12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469 |
- #include "stdafx.h"
- #include "ConnectorFSM.h"
- #include "../include/ModuleMix.h"
- #include "../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
- #ifndef MAX_PATH
- #define MAX_PATH 260
- #endif
- #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
- static int iHttpLogCount = 0;
- struct GrayLaunchReq : CHTTPReq{
- GrayLaunchReq(){m_timeOut = 5;}
- CSimpleStringA m_terminal_no;
- CSimpleStringA m_branch_no;
- CSimpleStringA m_modular;
- virtual string ToJson(){
- char reqcontent[512];
- //string reqcontent = "{\"terminal_no\":\"" + m_terminal_no.GetData() + "\",\"branch_no\":\"" + m_branch_no.GetData() +
- // "\",\"m_modular\":\"" + m_modular.GetData() + "\"}";
- sprintf(reqcontent, "{\"terminal_no\":\"%s\",\"branch_no\":\"%s\",\"modular\":\"%s\"}", m_terminal_no.GetData(),
- m_branch_no.GetData(), m_modular.GetData());
- return reqcontent;
- }
- };
- struct GrayLaunchResponse : CHTTPRet{
- GrayLaunchResponse():m_result(false){}
- bool m_result;
- virtual bool Parse(string strData){
- Dbg("GrayLaunchResponse: data = %s", strData.c_str());
- Json::Value root;
- Json::Reader reader;
- reader.parse(strData, root, false);
- if (root["data"].isBool()) {
- m_result = root["data"].asBool();
- }
- return m_result;
- }
- };
- static void HTTPLogCallback(const char* msg){
- if (0 == iHttpLogCount){
- LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_COUNTERCONNECT_GRAY_FAILED, msg);
- iHttpLogCount++;
- }
- }
- 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)
- {
- Dbg("rx sip phone state = %d, status = %s", Msg.state, (LPCSTR)Msg.status);
- //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:
- {
- Dbg("sip channel connected");
- 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){
- char strmsg[MAX_PATH] = { 0 };
- _snprintf(strmsg, MAX_PATH, "sip connect failed for %s.", Msg.status.GetData());
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_SIP_CONNECT_FAILED,strmsg);
- }
- }
- }
- }
- 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:
- {
- Dbg("CHAN_STATE_CONNECTED.param = %s", (LPCSTR)Msg.param);
- 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_nCurSipServer(MAIN_SERVER),m_nCurChanServer(MAIN_SERVER)
- {
- }
- ACMCallFSM::~ACMCallFSM()
- {
- }
- ErrorCodeEnum ACMCallFSM::OnInit()
- {
- 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_iSIPProxyPort,0,sizeof(m_iSIPProxyPort));
- m_strCallRouteIP = NULL;
- m_iCallRoutePort = 0;
- m_strCallRouteBranchNo = NULL;
- m_strCallRouteAccessNo = NULL;
- m_pCallRouteList = NULL;
- ErrorCodeEnum Error = LoadConfig();
- if (Error != Error_Succeed)
- goto on_error;
- Dbg("LoadConfig success");
- GetEntityBase()->GetFunction()->SetSysVar("CallState", "O"); // set to offline state
- Error = LoadTerminalId();
- if (Error != Error_Succeed)
- goto on_error;
- Dbg("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]);
- Dbg("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]);
- Dbg("CallRouteIP:%s,port:%d", (LPCSTR)m_strCallRouteIP,m_iCallRoutePort);
- Dbg("TerminalId: %s", (LPCSTR)m_strTerminalId);
- 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_pPhoneClient = new MyPhoneClient(m_pEntity, this);
- Error = m_pPhoneClient->Connect();
- if (Error != Error_Succeed)
- {
- LogError(Severity_Middle, Error_Hardware, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
- goto on_error;
- }
- PhoneService_BeginState_Sub PhoneSub;
- Error = m_pPhoneClient->BeginState(PhoneSub);
- if (Error != Error_Succeed)
- goto on_error;
- m_pSyncServiceClient = new SyncServiceClient(m_pEntity, this);
- Error = m_pSyncServiceClient->Connect();
- if (Error != Error_Succeed)
- {
- Dbg("Connect SyncService Fail!");
- m_pSyncServiceClient->SafeDelete();
- m_pSyncServiceClient = NULL;
- }
- m_nSysCallType = 0;
- m_pChannelClient = new MyChannelClient(m_pEntity, this);
- Error = m_pChannelClient->Connect();
- if (Error != Error_Succeed)
- {
- LogError(Severity_Middle, Error_Hardware, EVENT_MOD_CONNECT_ASSIST_ERROR, "connect assistant channel error");
- goto on_error;
- }
- ChannelService_BeginState_Sub ChannelSub;
- Error = m_pChannelClient->BeginState(ChannelSub);
- if (Error != Error_Succeed)
- goto on_error;
- Dbg("fsm init ok!");
- AddStateHooker(this);
- return Error;
- on_error:
- Dbg("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();
- m_pChannelClient = NULL;
- Dbg("Close AssistChannel Session ");
- }
- if (m_pChannelClient == NULL)
- {
- Dbg("ReConnection AssistChannel Session");
- ErrorCodeEnum Error;
- m_pChannelClient = new MyChannelClient(m_pEntity, this);
- Error = m_pChannelClient->Connect();
- if (Error != Error_Succeed)
- {
- m_pChannelClient->SafeDelete();
- Dbg("m_channelClient connect fail!");
- return FALSE;
- }
- if (Error == Error_Succeed)
- {
- ChannelService_BeginState_Sub ChannelSub;
- Error = m_pChannelClient->BeginState(ChannelSub);
- if (Error != Error_Succeed)
- {
- Dbg("BeginState biz channel failed!");
- m_pChannelClient->GetFunction()->CloseSession();
- m_pChannelClient = NULL;
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- BOOL ACMCallFSM::ReConnectionSipphone()
- {
- if (m_pPhoneClient != NULL)
- {
- m_pPhoneClient->GetFunction()->CloseSession();
- m_pPhoneClient = NULL;
- Dbg("Close sip Session ");
- }
- if (m_pPhoneClient == NULL)
- {
- Dbg("ReConnection sip Session");
- ErrorCodeEnum Error;
- m_pPhoneClient = new MyPhoneClient(m_pEntity, this);
- Error = m_pPhoneClient->Connect();
- if (Error != Error_Succeed)
- {
- LogError(Severity_Middle, Error_Hardware, EVENT_MOD_CONNECT_SIPPHONE_ERROR, "connect sip phone error");
- m_pPhoneClient->SafeDelete();
- Dbg("m_phoneClient connect fail!");
- return FALSE;
- }
- if (Error == Error_Succeed)
- {
- PhoneService_BeginState_Sub PhoneSub;
- Error = m_pPhoneClient->BeginState(PhoneSub);
- if (Error != Error_Succeed)
- {
- Dbg("BeginState sip failed!");
- m_pPhoneClient->GetFunction()->CloseSession();
- m_pPhoneClient = NULL;
- return FALSE;
- }
- }
- }
- return TRUE;
- }
- 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->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->SetMachineData(info);
- Dbg("set delay time to 0");
- }
- }
- ErrorCodeEnum ACMCallFSM::OnExit()
- {
- return Error_Succeed;
- }
- void ACMCallFSM::OnStateTrans(int iSrcState, int iDstState)
- {
- Dbg("FSM state from state %s to %s", GetStateName(iSrcState), GetStateName(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 (st1 != st2) {
- PhoneState evt;
- evt.state = st2;
- evt.status = CSimpleStringA::Format("OnStateTrans from state %d to %d", st1, st2);
- //LOG_TRACE(evt.status);
- if (!((st2 == eState_Fail)&&(m_nCurChanServer != Error_Server)&&(m_nCurSipServer != 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);
- Dbg(strmsg);
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(PhoneState), SP_MSG_SIG_OF(PhoneState), evt);
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_BROADCAST_CALL_STATE, strmsg);
- }
- else{
- char strinfo[MAX_PATH] = {0};
- _snprintf(strinfo, MAX_PATH,"state from %d to %d, auto reconnect, not broadcast state to ui.", st1, st2);
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_AUTO_RECONNECT,strinfo);
- }
- if (eState_HandFree == st2 || eState_Pickup == st2){
- if (eState_Connecting == st1){
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_SUCCESS, "connect success!");
- }
- }
- if (eState_Fail == st1 && eState_Offline == st2){
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_CONNECT_FAILED, "connect failed!");
- }
- }
- SetCallState(st2);
- GetEntityBase()->GetFunction()->SetUserDefineState(st2+USER_SIP_OFFLINE);
- }
- }
- }
- ErrorCodeEnum ACMCallFSM::SetCallState(int state)
- {
- LOG_FUNCTION();
- 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];
- }
- Dbg("set call state to [%s].", strCallState);
- return GetEntityBase()->GetFunction()->SetSysVar("CallState", strCallState);
- }
- void ACMCallFSM::s0_on_entry()
- {
- m_strHintCallNum.Clear();
- m_nCurChanServer = MAIN_SERVER;
- m_nCurSipServer = 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;
- }
- }
- 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_Middle, 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_Middle, 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;
- Dbg("start command call!");
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- else if (event->iEvt == USER_EVT_STARTVIDEODISPLAY)
- {
- StartVideoDisplayEvent *e = static_cast<StartVideoDisplayEvent *>(event);
- StartVideo((LPCSTR)e->m_param);
- }
- else if (event->iEvt == USER_EVT_SHOWLOACALVIDEO)
- {
- ShowLocalVideoEvent *e = static_cast<ShowLocalVideoEvent *>(event);
- SetCallingType(NORMAL_CALLTYPE);
- StartVideo((LPCSTR)e->m_param);
- }
- else if (event->iEvt == USER_EVT_SHOWLOACALREMOTEVIDEO)
- {
- ShowLocalAndRemoteVideoEvent *e = static_cast<ShowLocalAndRemoteVideoEvent *>(event);
- SetCallingType(NORMAL_CALLTYPE);
- StartVideo((LPCSTR)e->m_param);
- }
- else if (event->iEvt == USER_EVT_DOUBLE_RECORD_CALL)
- {
- m_CallingParam.nCallType = DOUBLERECORD_CALLTYPE;
- //GetEntityBase()->GetFunction()->SetSysVar(SYSVAR_CALLTYPE,CALLTYPE_RECORD); // 设置呼叫模式为双录呼叫
- m_nSysCallType = 0;
- Dbg("start double record call,call type is %d.", m_CallingParam.nCallType);
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_DOUBLERECORDCALL,"begin double record call");
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- Dbg("stop show local and remote video.");
- StopVideo();
- SetCallingType(NORMAL_CALLTYPE);
- }
- 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)
- {
- Dbg("stop show local video");
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- return 0;
- }
- void ACMCallFSM::s9_on_entry()
- {
- Dbg("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);
- Dbg("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;
- if (Error_InvalidState == GetLivenessDetectionStatus()){
- StopLivenessDetection();
- }
- else{
- if (m_nLiveDetctionTime > LIVEDETECTION_TIMEOUT){
- Dbg("liveness detection timeout.");
- StopLivenessDetection();
- }
- else{
- ScheduleTimer(9, LIVEDETECT_CONNECT_INTERVAL);
- }
- }
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- return 0;
- }
- void ACMCallFSM::s8_on_entry()
- {
- //get call route,采用直接总行方式
- call_info_t call_info;
- call_info.callroute_server_ip = m_strCallRouteIP;
- call_info.callroute_server_port = m_iCallRoutePort;
- call_info.szbranchno = m_strCallRouteBranchNo;
- call_info.szcaller_num = m_strTerminalId;
- call_info.szdest_num = m_strCallRouteAccessNo;
- m_pCallRouteList = get_callroute_list(&call_info);
-
- int time = GetDelayTime();
- Dbg("get Delay time = %d",time);
- 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 == 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- Dbg("hang up call and stop show local and remote video.");
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- return 0;
- }
- void ACMCallFSM::s11_on_entry()
- {
- ErrorCodeEnum Error = Error_Succeed;
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_MAKECALL,"begin make call");
- if (m_nCurSipServer == Error_Server){
- Error = Error_NetBroken;
- }
- if (Error == Error_Succeed){
- bool center_connect = FALSE;
- //get call route,采用直接总行方式
- if (m_strCallRouteIP.GetLength() != 0) {
- callurl_node_t *node = get_no_used_node(m_pCallRouteList);
- if (node != NULL){
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_HEADOFFICE_CALL, "Begin Head Office Make Call!");
- char ipstr[256] = {0};
- char callid_str[64] = { 0 };
- GetLocalIP(ipstr, 64);
- get_format_uuid(callid_str, 64);
- Error = 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;
- if (Error!=Error_Succeed){
- m_nCurSipServer?(m_nCurSipServer=Error_Server):(m_nCurSipServer=BACK_SERVER);
- }
- m_nCurChanServer = BACK_SERVER;
- node->bused = TRUE;
- char strmsg[256] = { 0 };
- _snprintf(strmsg, 256, "head office make call result:0x%08x", Error);
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_BRANCHMODE_CALL, strmsg);
- center_connect = TRUE;
- }
- else{
- LogWarn(Severity_Middle, Error_Debug, LOG_WARN_COUNTERCONNECT_BRANCHMODE_CALL, "head office mode no more call router, try to connect branch server.");
- //m_nCurSipServer = MAIN_SERVER;
- //m_nCurChanServer = MAIN_SERVER;
- center_connect = FALSE;
- }
- }
- //old call branch server方式
- if(!center_connect){
- if (m_CallingParam.nCallType != NORMAL_CALLTYPE && m_CallingParam.nCallType != DOUBLERECORD_CALLTYPE)
- {
- Dbg("Begin Branch Make Distribute Call!");
- Error = MakeCall(m_nCurSipServer,m_CallingParam);
- if (Error!=Error_Succeed)
- {
- m_nCurSipServer?(m_nCurSipServer=Error_Server):(m_nCurSipServer=BACK_SERVER);
- }
- Dbg("branch make call result:0x%08x", Error);
- }
- else
- {
- if (NORMAL_CALLTYPE == m_CallingParam.nCallType){
- Dbg("Begin Branch Make Normal Call!");
- }
- else{
- Dbg("Begin Branch Make Record Call!");
- }
-
- Error = MakeCall(m_strHintCallNum.GetLength() > 0 ? (LPCSTR)m_strHintCallNum : (LPCSTR)m_strSIPCallNum[m_nCurSipServer],m_nCurSipServer);
- if (Error!=Error_Succeed)
- {
- m_nCurSipServer?(m_nCurSipServer=Error_Server):(m_nCurSipServer=BACK_SERVER);
- }
- Dbg("branch make call result:0x%08x", Error);
- }
- }
- }
- if (Error != Error_Succeed)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- }
- else
- {
- ScheduleTimer(11,SIP_CALL_TIMER);
- }
- }
- 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;
- char msg[128];
- sprintf(msg, "sip connecting, customer active hangup after: %d", interval);
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_HANGUP, msg);
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
- {
- if (m_nCurSipServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect main server failed");
- }else if (m_nCurSipServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect bak server failed");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPSTATE_IDLE,"sipphone connect error server failed");
- }
- m_nCurSipServer?(m_nCurSipServer=Error_Server):(m_nCurSipServer=BACK_SERVER);
- m_nSipErrorNum++;
- //StopChannel();
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (m_nCurSipServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, main server");
- }else if (m_nCurSipServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_CHANSTATE_IDLE,"chan mod idle, error server");
- }
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (m_nCurSipServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
- }else if (m_nCurSipServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
- }
- ReConnectionSipphone();
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (m_nCurSipServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_TIMEOUT,"sipphone connect timeout, main server");
- }else if (m_nCurSipServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_TIMEOUT,"sipphone connect timeout, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_TIMEOUT,"sipphone connect timeout, error server");
- }
- Dbg("sip call timeout,release call");
- m_nSipErrorNum++;
- }
- else if (event->iEvt == USER_EVT_JMP_FAIL)
- {
- if (m_nCurSipServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, main server");
- }else if (m_nCurSipServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_SIPCONNECT_FUNC_FAILED,"sipphone connect func failed, error server");
- }
- m_nSipErrorNum++;
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- Dbg("hang up call and stop show local and remote video.");
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- return 0;
- }
- void ACMCallFSM::s12_on_entry()
- {
- ErrorCodeEnum Error = Error_Succeed;
- if (m_nCurChanServer == Error_Server)
- {
- Error = Error_NetBroken;
- }
- m_nSipErrorNum = 0;
- Sleep(200);
- if (Error == Error_Succeed)
- {
- Dbg("begin start channel,m_nCurChanServer=%d",m_nCurChanServer);
- if (m_CallingParam.nCallType == NORMAL_CALLTYPE && m_CallingParam.nCallType != DOUBLERECORD_CALLTYPE)
- {
- Error = StartChannel(m_nCurChanServer);
- }
- else
- {
- Error = StartChannel(m_nCurChanServer,m_CallingParam);
- if (DOUBLERECORD_CALLTYPE == m_CallingParam.nCallType){
- if (FALSE == m_bHandFree){
- StopSpeakerAudioCapture();
- Dbg("double record call type, current is pick up mode, stop speaker audio capture.");
- }
- }
- }
- Dbg("start channel result:0x%08x", Error);
- if (Error != Error_Succeed)
- {
- Dbg("start channel failed:0x%08x,start hangup", Error);
- HangupCall();
- m_nCurChanServer?(m_nCurChanServer=Error_Server):(m_nCurChanServer=BACK_SERVER);
- Dbg("hangup call result:0x%08x", Error);
- }
- }
- if (Error != Error_Succeed)
- {
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- }
- }
- 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;
- char msg[128];
- sprintf(msg, "chan connecting, customer active hangup after: %d", interval);
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_HANGUP, msg);
- }
- else if (event->iEvt == USER_EVT_SIP_STATE_IDLE)
- {
- if (m_nCurChanServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, main server");
- }else if (m_nCurChanServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPSTATE_IDLE,"sipphone connect server failed at channel connect, error server");
- }
- m_nCurSipServer?(m_nCurSipServer=Error_Server):(m_nCurSipServer=BACK_SERVER);
- StopChannel();
- }
- else if (event->iEvt == USER_EVT_CHAN_STATE_IDLE)
- {
- if (!m_bHangup)
- {
- if (m_nCurChanServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, main server");
- }else if (m_nCurChanServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANSTATE_IDLE,"chan connect server failed, error server");
- }
- m_nCurChanServer?(m_nCurChanServer=Error_Server):(m_nCurChanServer=BACK_SERVER);
- }
- HangupCall();
- //StopVideo();
- }
- else if (event->iEvt == USER_EVT_CHAN_STATE_CONNECTED)
- {
- ChanStateConnectedEvent *e = static_cast<ChanStateConnectedEvent *>(event);
- StartVideo((LPCSTR)e->m_param);
- }
- else if (event->iEvt == USER_EVT_ASSISTCHAN_IDEL)
- {
- if (m_nCurChanServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, main server");
- }else if (m_nCurChanServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_CHANENTITY_RESTART,"chan mod idle, error server");
- }
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- if (m_nCurChanServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, main server");
- }else if (m_nCurChanServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_SIPENTITY_RESTART,"sipphone mod idle, error server");
- }
- ReConnectionSipphone();
- }
- else if (event->iEvt == USER_EVT_STOPLOACALREMOTEVIDEO)
- {
- Dbg("hang up call and stop show local and remote video.");
- PostEventFIFO(new FSMEvent(USER_EVT_HANGUP));
- m_bHangup=TRUE;
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_JMP_FAIL)
- {
- if (m_nCurChanServer == MAIN_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_MAIN_CHANCONNECT_FUNC_FAILED,"chan connect func failed, main server");
- }else if (m_nCurChanServer == BACK_SERVER){
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_BAK_CHANCONNECT_FUNC_FAILED,"chan connect func failed, bak server");
- }else{
- LogWarn(Severity_High, Error_Unexpect, LOG_WARN_COUNTERCONNECT_CHANCONNECT_FUNC_FAILED,"chan connect func failed, error server");
- }
- }
-
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- Dbg("stop show local and remote video.");
- StopVideo();
- }
- else if (event->iEvt == USER_EVT_STOP_RECORD_BROADCAST)
- {
- Dbg("stop double record broadcast.");
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if(event->param1 == 21)
- {
- Dbg("hangupcall timeout,release call");
- ScheduleTimer(210,RELEASEING_SIP_TIMEOUT);
- ReleaseCall(0);
- }
- else if (event->param1 == 210)
- {
- Dbg("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- //重启mod_sipphone
- //RealSipErrorCheck();
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone");
- LogWarn(Severity_High, 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- return 0;
- }
- void ACMCallFSM::s23_on_entry()
- {
- if((!m_bHangup)&&(((m_nCurSipServer==BACK_SERVER)&&(m_nCurChanServer!=Error_Server))||((m_nCurChanServer==BACK_SERVER)&&(m_nCurSipServer!=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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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_High, 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- return 0;
- }
- void ACMCallFSM::s3_on_entry() {}
- void ACMCallFSM::s3_on_exit() {}
- unsigned int ACMCallFSM::s3_on_event(FSMEvent* event)
- {
- //LOG_TRACE("ACMCallFSM::s3_on_event, id = %d", event->iEvt);
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (event->param1 == 52)
- {
- ScheduleTimer(520,RELEASEING_SIP_TIMEOUT);
- Dbg("sip finished timeout,release call");
- ReleaseCall(0);
- }
- else if (event->param1 == 520)
- {
- Dbg("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- //重启mod_sipphone
- //RealSipErrorCheck();
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_High, 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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_High, 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- else if (event->iEvt == EVT_TIMER)
- {
- if (event->param1 == 62)
- {
- ScheduleTimer(620,RELEASEING_SIP_TIMEOUT);
- Dbg("sip hangup timeout,release call");
- ReleaseCall(0);
- }
- else if (event->param1 == 620)
- {
- Dbg("release call timeout,restart sipphone");
- PostEventFIFO(new FSMEvent(USER_EVT_JMP_FAIL));
- //重启mod_sipphone
- //RealSipErrorCheck();
- LogEvent(Severity_Middle, EVENT_MOD_RELEASESIP_TIMEOUT,"restart sipphone ");
- LogWarn(Severity_High, 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)
- {
- ReConnectionAssistchan();
- }
- else if (event->iEvt == USER_EVT_SIPPHONE_IDEL)
- {
- ReConnectionSipphone();
- }
- 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_High, 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;
- }
- }
|