public override bool CanHandleOutputCall(uint prefix, string dst, string number, string lit = null, bool unknownResource = false) { if ((_State == TlfState.In) || (_State == TlfState.InPrio) || (_State == TlfState.RemoteIn) || (_State == TlfState.Hold)) { return(base.CanHandleOutputCall(prefix, dst, number, lit, unknownResource)); } if (_SipCall == null) { CfgEnlaceInterno link = new CfgEnlaceInterno(); CfgRecursoEnlaceInterno rs; string literal; TlfManager.EncapsuleIaInfo(prefix, dst, out literal, out rs); _UnknownResource = unknownResource; if (_UnknownResource) { rs.NumeroAbonado = number; } link.Literal = lit; // literal; link.ListaRecursos.Add(rs); link.Prioridad = Top.Cfg.Priority; link.OrigenR2 = Top.Cfg.GetNumeroAbonado(Top.Cfg.MainId, Cd40Cfg.ATS_DST) ?? Top.Cfg.MainId; Reset(link); //Nuevo inicio de llamada saliente //Limpia el código recibido en la llamada anterior _LastCode = 0; _NumberWithPrefix = number; return(true); } return(false); }
public override void Reset(CfgEnlaceInterno cfg) { foreach (SipChannel ch in _Channels) { ch.RsChanged -= OnRsChanged; } base.Reset(cfg); }
/// <summary> /// Fill de data structure for an AID Position /// Search for resource in configuration if exist or create from scratch /// </summary> /// <param name="info"></param> /// <param name="inInfo"></param> /// <returns></returns> public bool FillData(CORESIP_CallInfo info, CORESIP_CallInInfo inInfo) { CfgEnlaceInterno link = new CfgEnlaceInterno(); string literal = null; CfgRecursoEnlaceInterno rs = Top.Cfg.GetResourceFromUri(inInfo.SrcId, inInfo.SrcIp, inInfo.SrcSubId, inInfo.SrcRs); if (rs != null) { _UnknownResource = false; //El literal, es el display name que procede del SIP o el numero en su defecto TlfManager.ExtractIaInfo(rs, out literal, out _NumberWithPrefix); _Logger.Debug("Incoming: {0} {1} {2} lit {3} numbPre {4}", rs.Prefijo, rs.NumeroAbonado, rs.NombreRecurso, literal, _NumberWithPrefix); } else // para que funcionen llamadas entrantes no configuradas de transito de un SCV { rs = Top.Cfg.GetATSResourceFromUri(inInfo.SrcId); if (rs != null) { _UnknownResource = true; //El literal, es el display name que procede del SIP o el numero en su defecto TlfManager.ExtractIaInfo(rs, out literal, out _NumberWithPrefix); } } if (rs == null) //No encuentro configurado el recurso { rs = new CfgRecursoEnlaceInterno(); rs.Prefijo = Cd40Cfg.UNKNOWN_DST; rs.NombreRecurso = inInfo.SrcId; rs.NumeroAbonado = string.Format("sip:{0}@{1}", inInfo.SrcId, inInfo.SrcIp); _UnknownResource = true; _NumberWithPrefix = string.Format("{0:D2}{1}", rs.Prefijo, inInfo.SrcId); literal = inInfo.SrcId; } if (!PermisoRed((uint)rs.Prefijo, true)) { return(false); } if (!String.IsNullOrEmpty(inInfo.DisplayName)) { literal = inInfo.DisplayName; } link.Literal = literal; link.ListaRecursos.Add(rs); link.Prioridad = Top.Cfg.Priority; link.OrigenR2 = Top.Cfg.GetNumeroAbonado(Top.Cfg.MainId, Cd40Cfg.ATS_DST) ?? Top.Cfg.MainId; Reset(link); return(true); }
public TlfIaPosition(uint prefix, string dst) : base(1000) { CfgEnlaceInterno link = new CfgEnlaceInterno(); CfgRecursoEnlaceInterno rs; string literal; TlfManager.EncapsuleIaInfo(prefix, dst, out literal, out rs); link.Literal = literal; link.ListaRecursos.Add(rs); link.Prioridad = Top.Cfg.Priority; link.OrigenR2 = Top.Cfg.MainId; base.Reset(link); }
public override void Reset(CfgEnlaceInterno cfg) { _Cfg = cfg; _Literal = cfg.Literal; _Priority = (CORESIP_Priority)cfg.Prioridad; _Channels.Clear(); TlfFocusChannel ch = null; ch = new TlfFocusChannel(cfg.OrigenR2, cfg.Literal); _ActiveState = true; _Member = false; foreach (CfgRecursoEnlaceInterno dst in cfg.ListaRecursos) { if (Top.Cfg.GetMainUser(Top.HostId) == dst.NombreRecurso) { //Soy miembro del grupo _Member = true; _ActiveState = false; ch.ImMember = true; } else { ch.AddFinalDestination(dst.NombreRecurso, dst.NumeroAbonado, dst.Prefijo); } } ch.RsChanged += OnRsChanged; _Channels.Add(ch); if ((_SipCall != null) && !_SipCall.IsValid(_Channels)) { MakeHangUp(0); // Cortamos llamadas y quitamos busy y congestion } if (_SipCall == null) { State = GetReachableState(); } }
/// <summary> /// /// </summary> /// <param name="cfg"></param> public void Reset(CfgEnlaceInterno cfg) { _Literal = cfg.Literal; _LastChannel = 0; _Channels.Clear(); foreach (CfgRecursoEnlaceInterno dst in cfg.ListaRecursos) { switch (dst.Prefijo) { case Cd40Cfg.INT_DST: string hostId = Top.Cfg.GetUserHost(dst.NombreRecurso); if (_Channels.Find(delegate(SipChannel channel) { return((channel.Prefix == dst.Prefijo) && (channel.Id == hostId)); }) == null) { SipChannel ch = new IntChannel(cfg.OrigenR2, hostId, dst.NombreRecurso, dst.Prefijo); ch.RsChanged += OnRsChanged; _Channels.Insert(0, ch); } break; case Cd40Cfg.PP_DST: if (_Channels.Find(delegate(SipChannel channel) { return((channel.Prefix == dst.Prefijo) && (channel.Id == dst.NombreRecurso)); }) == null) { SipChannel ch = dst.Interface == TipoInterface.TI_LCEN ? (SipChannel) new LcChannel(cfg.OrigenR2, dst.NombreRecurso, dst.Prefijo) : (SipChannel) new TlfPPChannel(cfg.OrigenR2, dst.NumeroAbonado, dst.NombreRecurso, dst.Prefijo, dst.Interface); ch.RsChanged += OnRsChanged; _Channels.Add(ch); } if (cfg.Dependencia != string.Empty) { _Dependencia = cfg.Dependencia; _Groups.Add(_Dependencia); } break; case Cd40Cfg.ATS_DST: string[] userId = Top.Cfg.GetUserFromAddress(dst.Prefijo, dst.NumeroAbonado); if (userId != null) { dst.NombreRecurso = userId[1]; dst.Prefijo = Cd40Cfg.INT_DST; goto case Cd40Cfg.INT_DST; } TlfNet net = Top.Cfg.GetIPNet(dst.Prefijo, dst.NumeroAbonado); if (net != null) { SipChannel ch = _Channels.Find(delegate(SipChannel channel) { return((channel.Prefix == dst.Prefijo) && (channel.Id == net.Id)); }); if (ch == null) { // Para Linea caliente en destinos ATS_DST, // solo se utilizan las lineas que vienen de un encaminamiento IP List <SipLine> listLines = net.Lines.FindAll(line => line.centralIP == false); foreach (SipLine line in listLines) { int index = net.Lines.IndexOf(line); net.Lines.RemoveAt(index); net.Routes.RemoveAt(index); net.RsTypes.RemoveAt(index); } //Caso de destino ATS de central no IP: no tiene canal ATS (no lo añado), solo canal LC if (net.Lines.Count > 0) { ch = new TlfNetChannel(net, cfg.OrigenR2, dst.NumeroAbonado, null, dst.Prefijo); ch.RsChanged += OnRsChanged; _Channels.Add(ch); } } else { ch.AddRemoteDestination(dst.NumeroAbonado, null); } } break; } } if ((_SipCallRx != null) && !_SipCallRx.IsValid(_Channels)) { MakeHangUpRx(); } if ((_SipCallTx != null) && !_SipCallTx.IsValid(_Channels)) { MakeHangUpTx(); } LcRxState rxSt = _RxState; LcTxState txSt = _TxState; if ((_SipCallRx == null) || (_SipCallTx == null)) { GetState(out rxSt, out txSt); } if (_SipCallRx != null) { rxSt = _RxState; } if (_SipCallTx != null) { txSt = _TxState; } SetState(rxSt, txSt); }
private static Cd40Cfg ConfiguracionGrupoUnMiembro(Cd40Cfg cfg) { //Usuario S2 ConfiguracionUsuario userCfg = new ConfiguracionUsuario(); //Tecla de grupo con 1 miembro CfgEnlaceInterno link = new CfgEnlaceInterno(); link.Literal = "grupotest1"; link.PosicionHMI = 45; link.TipoEnlaceInterno = "MD"; link.Prioridad = 4; link.OrigenR2 = "218002"; CfgRecursoEnlaceInterno rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 0; rec.NombreRecurso = "218001"; link.ListaRecursos.Add(rec); userCfg.TlfLinks.Add(link); //Tecla de AD normal CfgEnlaceInterno link2 = new CfgEnlaceInterno(); link2.Literal = "S1_SCV2"; link2.PosicionHMI = 44; link2.TipoEnlaceInterno = "DA"; link2.Prioridad = 4; link2.OrigenR2 = "218002"; userCfg.TlfLinks.Add(link2); cfg.ConfiguracionUsuarios.Add(userCfg); //Usuario S1 ConfiguracionUsuario userCfg2 = new ConfiguracionUsuario(); //Tecla de grupo con 1 miembro CfgEnlaceInterno link3 = new CfgEnlaceInterno(); link3.Literal = "grupotest1"; link3.PosicionHMI = 45; link3.TipoEnlaceInterno = "MD"; link3.Prioridad = 4; link3.OrigenR2 = "218001"; CfgRecursoEnlaceInterno rec2 = new CfgRecursoEnlaceInterno(); rec2.Prefijo = 0; rec2.NombreRecurso = "218001"; link3.ListaRecursos.Add(rec2); userCfg2.TlfLinks.Add(link3); //Tecla de AD normal CfgEnlaceInterno link4 = new CfgEnlaceInterno(); link4.Literal = "S2_SCV2"; link4.PosicionHMI = 44; link4.TipoEnlaceInterno = "DA"; link4.Prioridad = 4; link4.OrigenR2 = "218001"; userCfg2.TlfLinks.Add(link4); cfg.ConfiguracionUsuarios.Add(userCfg2); //Configuracion de sistema, numeracion de usuarios DireccionamientoSIP dirSIP = new DireccionamientoSIP(); StrNumeroAbonado num = new StrNumeroAbonado(); num.NumeroAbonado = "218001"; num.Prefijo = 0; dirSIP.IdUsuario = "S1_SCV2"; dirSIP.NumerosAbonadoQueAtiende.Add(num); cfg.ConfiguracionGeneral.PlanDireccionamientoSIP.Add(dirSIP); num = new StrNumeroAbonado(); num.NumeroAbonado = "218002"; num.Prefijo = 0; dirSIP = new DireccionamientoSIP(); dirSIP.IdUsuario = "S2_SCV2"; dirSIP.NumerosAbonadoQueAtiende.Add(num); cfg.ConfiguracionGeneral.PlanDireccionamientoSIP.Add(dirSIP); num = new StrNumeroAbonado(); num.NumeroAbonado = "218003"; num.Prefijo = 0; dirSIP = new DireccionamientoSIP(); dirSIP.IdUsuario = "S2_SCV3"; dirSIP.NumerosAbonadoQueAtiende.Add(num); cfg.ConfiguracionGeneral.PlanDireccionamientoSIP.Add(dirSIP); return cfg; }
///Tests para probar cuando se corta la llamada y pasa la tecla a reposo ///por una sectorización con cambios. ///La llamada no tiene canal public void ChangeConfig1() { //Initial configuration TlfPosition tlfTest = new TlfPosition(12); CfgEnlaceInterno link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; CfgRecursoEnlaceInterno rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Give it an incomplete call, , no channel tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); Assert.IsNotNull(tlfTest._SipCall); //1.Cambio configuracion origen R2 link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218002"; // Cambio rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Se corta la llamada Assert.IsNull(tlfTest._SipCall); //Give it an incomplete call, no channel tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); Assert.IsNotNull(tlfTest._SipCall); //2.Cambio configuracion Prioridad, literal link = new CfgEnlaceInterno(); link.Literal = "S1_"; //Cambio link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; // Cambio link.OrigenR2 = "218002"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No se corta la llamada Assert.IsNotNull(tlfTest._SipCall); //Give it an incomplete call, no channel tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); Assert.IsNotNull(tlfTest._SipCall); //3.Cambio configuracion prefijo recurso, nombre rec link = new CfgEnlaceInterno(); link.Literal = "S1_"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218002"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 3; // Cambio rec.NombreRecurso = "S1_"; //Cambio rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No Se corta la llamada Assert.IsNotNull(tlfTest._SipCall); }
///Tests para probar cuando se corta la llamada y pasa la tecla a reposo ///por una sectorización con cambios. ///Hay una llamada con canal, pero sin callId public void ChangeConfig3() { //Initial configuration TlfPosition tlfTest = new TlfPosition(12); CfgEnlaceInterno link = new CfgEnlaceInterno(); link.Literal = "BL"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; CfgRecursoEnlaceInterno rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "prubl"; rec.Interface = TipoInterface.TI_BL; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Give it an incomplete call, no callID tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); SipRemote remote = new SipRemote(rec.NombreRecurso); tlfTest._SipCall.Update(-1, link.OrigenR2, rec.NombreRecurso, tlfTest.Channels[0], remote, tlfTest.Channels[0].ListLines[0]); Assert.IsNotNull(tlfTest._SipCall); //1.Cambio configuracion origen R2 link = new CfgEnlaceInterno(); link.Literal = "BL"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218002"; // Cambio rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "prubl"; rec.Interface = TipoInterface.TI_BL; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Se corta la llamada Assert.IsNull(tlfTest._SipCall); //Give it an incomplete call, no callID tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); remote = new SipRemote(rec.NombreRecurso); tlfTest._SipCall.Update(-1, link.OrigenR2, rec.NombreRecurso, tlfTest.Channels[0], remote, tlfTest.Channels[0].ListLines[0]); tlfTest.State = TlfState.Busy; //2.Cambio configuracion Prioridad, literal link = new CfgEnlaceInterno(); link.Literal = "BL_"; //Cambio link.TipoEnlaceInterno = "DA"; link.Prioridad = 3; // Cambio link.OrigenR2 = "218002"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "prubl"; rec.Interface = TipoInterface.TI_BL; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Se corta la llamada porque no esta disponible la linea Assert.IsNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.Unavailable); //Give it an incomplete call, no channel tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); remote = new SipRemote(rec.NombreRecurso); tlfTest._SipCall.Update(-1, link.OrigenR2, rec.NombreRecurso, tlfTest.Channels[0], remote, tlfTest.Channels[0].ListLines[0]); tlfTest.State = TlfState.Busy; Assert.IsNotNull(tlfTest._SipCall); //3.Cambio configuracion prefijo recurso, nombre rec link = new CfgEnlaceInterno(); link.Literal = "BL_"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 3; link.OrigenR2 = "218002"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 0; // Cambio rec.NombreRecurso = "S4_SCV2"; //Cambio rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Se corta la llamada Assert.IsNull(tlfTest._SipCall); }
///Tests para probar que no se corta la llamada ni cambia de estado ///por una sectorización sin cambios public void ChangeConfig2() { //Initial configuration TlfPosition tlfTest = new TlfPosition(12); CfgEnlaceInterno link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; CfgRecursoEnlaceInterno rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //Give it an incomplete call, estado unavailable tlfTest._SipCall = SipCallInfo.NewTlfCall(tlfTest.Channels, CORESIP_Priority.CORESIP_PR_NORMAL, null); Assert.IsNotNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.Unavailable); //1.sin cambios, en estado unavailable link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No se corta la llamada Assert.IsNotNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.Unavailable); //2. Tecla en congestion, no cambia tlfTest.State = TlfState.Congestion; link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No se corta la llamada Assert.IsNotNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.Congestion); //3. Tecla en busy, no cambia tlfTest.State = TlfState.Busy; link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No se corta la llamada Assert.IsNotNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.Busy); //3. Tecla en InProcess, no cambia tlfTest.State = TlfState.InProcess; link = new CfgEnlaceInterno(); link.Literal = "S1"; link.TipoEnlaceInterno = "DA"; link.Prioridad = 4; link.OrigenR2 = "218001"; rec = new CfgRecursoEnlaceInterno(); rec.Prefijo = 2; rec.NombreRecurso = "S1"; rec.Interface = TipoInterface.TI_Radio; link.ListaRecursos.Add(rec); tlfTest.Reset(link); //No se corta la llamada Assert.IsNotNull(tlfTest._SipCall); Assert.AreEqual(tlfTest.State, TlfState.InProcess); }