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; } }
public MRS(PDU _pdu, Transporte t, TransactionUser ut) : base(t, ut) { pdu = _pdu; Seq = pdu.Seq; IdDispositivo = pdu.IdDispositivo; }
protected Transaccion(Transporte t, TransactionUser ut) { CustomTV = 0; Transporte = t; TransactionUser = ut; Estado = Estados.INICIO; }
public MRC(PDU _pdu, Transporte t, TransactionUser ut) : base(t, ut) { pdu = _pdu; Seq = pdu.Seq; IdDispositivo = pdu.IdDispositivo; Estado = Estados.INICIO; }
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; } }
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; } }
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; } }
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; } }