/// <summary> /// /// </summary> /// <param name="sipCallId"></param> /// <param name="info"></param> /// <param name="inInfo"></param> /// <returns></returns> public int HandleIncomingCall(int sipCallId, CORESIP_CallInfo info, CORESIP_CallInInfo inInfo) { SipCallInfo inCall = SipCallInfo.NewIncommingCall(_Channels, sipCallId, info, inInfo, false); if (inCall != null) { if ((Top.ScreenSaverEnabled) || Top.Hw.LCSpeaker == false) { return(SipAgent.SIP_DECLINE); } // Si la telefonía va por altavoz y hay llamada de LC se quita // el estado "en espera de cuelgue" if (Top.Mixer.RxTlfAudioVia == TlfRxAudioVia.Speaker) { Top.Tlf.SetHangToneOff(); } MakeHangUpRx(); RxState = LcRxState.Idle; if ((_ActiveRx != null) || ((_ActiveTx != null) && (_ActiveTx != this))) { // Notificamos el Mem y lo borramos _OldRxState = _RxState; RxState = LcRxState.Mem; _RxState = LcRxState.Idle; return(SipAgent.SIP_BUSY); } else { _SipCallRx = inCall; _ActiveRx = this; _Channels.Sort(delegate(SipChannel a, SipChannel b) { return(b.First.CompareTo(a.First)); } ); return(SipAgent.SIP_OK); } } return(SipAgent.SIP_DECLINE); }
public override int HandleIncomingCall(int sipCallId, int call2replace, CORESIP_CallInfo info, CORESIP_CallInInfo inInfo) { bool replacedCall = false; if ((Top.ScreenSaverEnabled) || (Top.Mixer.RxTlfAudioVia == TlfRxAudioVia.Speaker && !Top.Hw.LCSpeaker)) { return(SipAgent.SIP_DECLINE); } if ((call2replace >= 0) && (CallId == call2replace)) { MakeHangUp(SipAgent.SIP_GONE); replacedCall = true; } if ((info.Priority == CORESIP_Priority.CORESIP_PR_EMERGENCY) && ((Top.Cfg.Permissions & Permissions.Intruded) == Permissions.Intruded) && (_SipCall != null)) { if (_State == TlfState.Out) { //En teclas de 19+1, se admiten llamada con los datos que no coincidan con configuracion SipCallInfo inCall = SipCallInfo.NewIncommingCall(_Channels, sipCallId, info, inInfo, true); if (inCall != null) { if (((int)inCall.Priority < (int)_SipCall.Priority) || ((inCall.Priority == _SipCall.Priority) && (string.Compare(inInfo.SrcIp, Top.SipIp) < 0))) { _CallTout.Enabled = false; SipAgent.HangupCall(_SipCall.Id); _SipCall = inCall; CORESIP_CallFlags flags = Settings.Default.EnableEchoCanceller && (_SipCall.Ch.Prefix == Cd40Cfg.PP_DST || (_SipCall.Ch.Prefix >= Cd40Cfg.RTB_DST && _SipCall.Ch.Prefix < Cd40Cfg.EyM_DEST)) ? CORESIP_CallFlags.CORESIP_CALL_EC : CORESIP_CallFlags.CORESIP_CALL_NO_FLAGS; return(SipAgent.SIP_OK | ((int)flags << 16)); } } } if (EfectivePriority != CORESIP_Priority.CORESIP_PR_EMERGENCY && info.Priority != CORESIP_Priority.CORESIP_PR_EMERGENCY) { MakeHangUp(0); } } if ((_SipCall == null) && !InOperation()) // && PermisoRed((uint)(((SipChannel)inCall.Ch).Type),true)) { if (FillData(info, inInfo) == false) { return(SipAgent.SIP_DECLINE); } } int result = base.HandleIncomingCall(sipCallId, call2replace, info, inInfo); //Si no se acepta llamada entrante y se trataba de un replace que ya se ha colgado, se señaliza con error if (replacedCall && ((result == SipAgent.SIP_DECLINE) || (result == SipAgent.SIP_BUSY))) { State = TlfState.Busy; } return(result); }