コード例 #1
0
        public override void RecibePDU(PDU received_pdu)
        {
            STrace.Debug(GetType().FullName, String.Format("MRS: ReceivePDU: Estado={0} ReceivedPDU.CH={1} PDU.CH={2}", Estado, received_pdu.CH, pdu.CH));
            switch (Estado)
            {
            case Estados.CONFIRMANDO:
                if (received_pdu.CH == pdu.CH)
                {
                    if (pdu.CH == 0x10 && Transporte.UseSeqCache && Transporte.SeqCache != pdu.Seq)
                    {
                        break;
                    }
                    Transporte.Send(rta);
                }
                break;

            case Estados.RESPONDIENDO:
                if (received_pdu.CH != pdu.CH)
                {
                    Estado = Estados.TERMINADO;
                    TransactionUser.RespuestaEntregada(received_pdu, this, Transporte);
                    Transporte.TransaccionCompleta(this, pdu);
                }
                break;

            default:
                STrace.Debug(GetType().FullName, String.Format("MRS: Error en recibo PDU, el estado es inconsistente state={0}", Estado));
                Estado = Estados.TERMINADO;
                Transporte.TransaccionCompleta(this, pdu);
                break;
            }
        }
コード例 #2
0
 public MRS(PDU _pdu, Transporte t, TransactionUser ut)
     : base(t, ut)
 {
     pdu           = _pdu;
     Seq           = pdu.Seq;
     IdDispositivo = pdu.IdDispositivo;
 }
コード例 #3
0
ファイル: Transaccion.cs プロジェクト: jesumarquez/lt
 protected Transaccion(Transporte t, TransactionUser ut)
 {
     CustomTV        = 0;
     Transporte      = t;
     TransactionUser = ut;
     Estado          = Estados.INICIO;
 }
コード例 #4
0
ファイル: MRC.cs プロジェクト: jesumarquez/lt
 public MRC(PDU _pdu, Transporte t, TransactionUser ut)
     : base(t, ut)
 {
     pdu           = _pdu;
     Seq           = pdu.Seq;
     IdDispositivo = pdu.IdDispositivo;
     Estado        = Estados.INICIO;
 }
コード例 #5
0
ファイル: MRC.cs プロジェクト: jesumarquez/lt
        public override void VencimientoTV(int timer_id)
        {
            switch (Estado)
            {
            case Estados.ENVIANDO:
                Estado = Estados.TERMINADO;
                TransactionUser.SolicitudNoEnviada(pdu, this, Transporte);
                Transporte.TransaccionCompleta(this, pdu);
                break;

            case Estados.CONFIRMANDO:
                Estado = Estados.TERMINADO;
                Transporte.TransaccionCompleta(this, pdu);
                break;

            case Estados.CANCELADO:
                Estado = Estados.TERMINADO;
                TransactionUser.SolicitudCancelada(pdu, this, Transporte);
                Transporte.TransaccionCompleta(this, pdu);
                break;
            }
        }
コード例 #6
0
        public override void VencimientoTV(int timer_id)
        {
            //Marshall.Debug("MSR: TV vencido.");
            switch (Estado)
            {
            case Estados.CONFIRMANDO:
                Estado = Estados.TERMINADO;
                Transporte.TransaccionCompleta(this, pdu);
                break;

            case Estados.RESPONDIENDO:
                Estado = Estados.TERMINADO;
                TransactionUser.RespuestaNoEntregada(rta, this, Transporte);
                Transporte.TransaccionCompleta(this, pdu);
                break;

            default:
                STrace.Debug(GetType().FullName, String.Format("MRS: Error en timer de vencimeinto, el estado es inconsistente state={0}", Estado));
                Estado = Estados.TERMINADO;
                Transporte.TransaccionCompleta(this, pdu);
                break;
            }
        }
コード例 #7
0
ファイル: MRC.cs プロジェクト: jesumarquez/lt
        public override void RecibePDU(PDU response)
        {
            switch (Estado)
            {
            case Estados.ENVIANDO:
                if (response.CH == (byte)Codes.HighCommand.OKACK)
                {
                    Estado = Estados.TERMINADO;
                    TransactionUser.SolicitudEntregada(response, pdu, this, Transporte);
                    Transporte.TransaccionCompleta(this, pdu);
                    return;
                }
                if (response.RequiereACK)
                {
                    Estado      = Estados.CONFIRMANDO;
                    pdu         = TransactionUser.RequieroACK(response, this, Transporte);
                    pdu.Destino = response.Destino;
                    Transporte.Send(pdu);
                }
                else
                {
                    Estado = Estados.TERMINADO;
                    TransactionUser.SolicitudEntregada(response, pdu, this, Transporte);
                    Transporte.TransaccionCompleta(this, pdu);
                }
                break;

            case Estados.CONFIRMANDO:
                Transporte.Send(pdu);
                break;

            case Estados.CANCELADO:
                STrace.Debug(GetType().FullName, String.Format("MRC/DEVICE[id={0}]: Recibio una rta en estado CANCELADO, se ignora.", pdu.IdDispositivo));
                break;
            }
        }
コード例 #8
0
        public void Start()
        {
            if (TransactionUser == null)
            {
                STrace.Debug(GetType().FullName, "MRS: Usuario Transaccion es NULO.");
            }
            if (pdu == null)
            {
                STrace.Debug(GetType().FullName, "MRS: PDU es NULO.");
            }
            if (Transporte == null)
            {
                STrace.Debug(GetType().FullName, "MRS: Transporte es NULO.");
            }

            //AbortaSeqCache();

            var replay_required = TransactionUser.NuevaSolicitud(pdu, this, Transporte);

            if (pdu.RequiereRespuesta)
            {
                rta = TransactionUser.RequieroRespuesta(pdu, this, Transporte);
                if (rta == null)
                {
                    Estado = Estados.TERMINADO;
                    Transporte.TransaccionCompleta(this, pdu);
                    return;
                }
                replay_required   = true;
                rta.IdDispositivo = pdu.IdDispositivo;
                rta.Destino       = pdu.Destino;
                rta.Seq           = pdu.Seq;
            }
            else
            {
                rta = new PDU
                {
                    IdDispositivo = pdu.IdDispositivo,
                    Seq           = pdu.Seq,
                    Options       = pdu.Options,
                    Destino       = pdu.Destino,
                    CH            = ((byte)Codes.HighCommand.OKACK),
                    CL            = CLdeRespuesta
                };
            }
            if (!replay_required)
            {
                Estado = Estados.TERMINADO;
                Transporte.TransaccionCompleta(this, pdu);
                return;
            }
            rta.SourcePdu = pdu;
            if (pdu.CH == 0x10 && Transporte.UseSeqCache)
            {
                Transporte.SeqCache = pdu.Seq;
            }
            Transporte.Send(rta);
            LanzaTV();
            //Transporte.Send(rta);
            if (pdu.RequiereACK)
            {
                Estado = Estados.RESPONDIENDO;
                LanzaTR();
            }
            else
            {
                if (Transporte.UseSeqCache)
                {
                    LanzaSeqCache(100);
                }
                Estado = Estados.CONFIRMANDO;
            }
        }