private void OnCallIncoming(int call, int call2replace, CORESIP_CallInfo info, CORESIP_CallInInfo inInfo) { _Logger.Debug("Nueva llamada entrante [SrdId={0}] [SrcIp={1}] [SrcSubId={2}] [SrcRs={3}] [DstId={4}] [DstIp={5}] [DstSubId={6}]", inInfo.SrcId, inInfo.SrcIp, inInfo.SrcSubId, inInfo.SrcRs, inInfo.DstId, inInfo.DstIp, inInfo.DstSubId); Top.WorkingThread.Enqueue("OnCallIncoming", delegate() { CORESIP_Answer answer = new CORESIP_Answer(SipAgent.SIP_NOT_FOUND); string dstId = string.IsNullOrEmpty(inInfo.DstSubId) ? inInfo.DstId : inInfo.DstSubId; foreach (StrNumeroAbonado alias in Top.Cfg.HostAddresses) { if (string.Compare(dstId, alias.NumeroAbonado, true) == 0) { answer.Value = SipAgent.SIP_DECLINE; switch (info.Type) { case CORESIP_CallType.CORESIP_CALL_DIA: General.SafeLaunchEvent(IncomingTlfCall, this, call, call2replace, info, inInfo, answer); break; case CORESIP_CallType.CORESIP_CALL_IA: General.SafeLaunchEvent(IncomingLcCall, this, call, info, inInfo, answer); break; case CORESIP_CallType.CORESIP_CALL_GG_MONITORING: //ULISES solo soporta G/G monitoring General.SafeLaunchEvent(IncomingMonitoringCall, this, call, info, inInfo, answer); break; case CORESIP_CallType.CORESIP_CALL_MONITORING: case CORESIP_CallType.CORESIP_CALL_AG_MONITORING: answer.Value = SipAgent.SIP_BAD_REQUEST; //ULISES solo soporta G/G monitoring break; } break; } } try { if (answer.Value == SipAgent.SIP_MOVED_TEMPORARILY) { SipAgent.MovedTemporallyAnswerCall(call, answer.redirectTo, "unconditional"); } else if (answer.Value != 0 && answer.Value != SipAgent.SIP_DECLINE) { SipAgent.AnswerCall(call, answer.Value); } } catch (Exception exc) { _Logger.Error("SipAgent.AnswerCall", exc.Message); } }); }
private void OnTransferRequest(int call, CORESIP_CallInfo info, CORESIP_CallTransferInfo transferInfo) { Debug.Assert(info.Type == CORESIP_CallType.CORESIP_CALL_DIA); _Logger.Debug("Nueva peticion de transferencia [CallId={0}] [DstId={1}] [DstIp={2}] [DstSubId={3}] [DstRs={4}]", call, transferInfo.DstId, transferInfo.DstIp, transferInfo.DstSubId, transferInfo.DstRs); Top.WorkingThread.Enqueue("OnTransferRequest", delegate() { CORESIP_Answer answer = new CORESIP_Answer(SipAgent.SIP_DECLINE); General.SafeLaunchEvent(TlfTransferRequest, this, call, info, transferInfo, answer); if (answer.Value != 0) { SipAgent.TransferAnswer(transferInfo.TsxKey, transferInfo.TxData, transferInfo.EvSub, answer.Value); } }); }
private void OnIncomingMonitoringCall(object sender, int call, CORESIP_CallInfo info, CORESIP_CallInInfo inInfo, CORESIP_Answer answer) { Debug.Assert(!_Froms.ContainsKey(call)); TlfIaPosition from = new TlfIaPosition(1000); int code = from.HandleIncomingCall(call, -1, info, inInfo); Debug.Assert(code == SipAgent.SIP_RINGING); if (!from.IsTop) { answer.Value = SipAgent.SIP_NOT_ACCEPTABLE_HERE; return; } answer.Value = 0; from.TlfPosStateChanged += OnFromMonitoringCallStateChanged; _Froms[call] = from; General.SafeLaunchEvent(RemoteListenChanged, this, new ListenPickUpMsg(FunctionState.Executing, from.Literal, call)); }
private void OnIncomingCall(object sender, int call, CORESIP_CallInfo info, CORESIP_CallInInfo inInfo, CORESIP_Answer answer) { foreach (LcPosition lc in _LcPositions) { answer.Value = lc.HandleIncomingCall(call, info, inInfo); if (answer.Value != SipAgent.SIP_DECLINE) { break; } } }