private bool CheckLastSentAndDequeueIt(String buffer, ulong msgId, ref IMessage salida) { var result = true; string LastCmd = LastSent.GetText(String.Empty); ulong LastId = LastSent.GetId(); if (buffer.StartsWith(Reporte.SdLocked)) { _sdSession = false; STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd BORRANDO_POR_LOCKED"); } else if (buffer.StartsWith(Reporte.SdPassword)) { //Debug.Assert(LastSent.IsOnTheFly() == true); if (LastCmd.StartsWith(Reporte.StartGgWriteSession) && (LastId == msgId)) { LastSent = null; _sdSession = true; STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd ABIERTA"); } else if (_sdSession) { STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd NO_MANEJADO"); } else if (LastId == msgId) { ulong mid = NextSequence; LastSent = new INodeMessage(mid, Mensaje.Factory(mid, this, String.Format("{0}{1}", Reporte.StartGgWriteSession.TrimStart('>'), buffer.Substring(8, 8))), DateTime.MinValue) { IsOnTheFly = true }; salida.AddStringToSend(LastSent.Text); STrace.Debug(typeof(Parser).FullName, Id, "Sesion de escritura en sd ABRIENDO"); } else { STrace.Debug(typeof(Parser).FullName, Id, String.Format("Sesion de escritura en sd NADA (LastSent.GetId()={0} msgId={1})", LastSent.GetId(), msgId)); } } else if (LastSent != null) { if (LastSent.IsExpired()) { LastSent = null; } else { var lastDC = BaseDeviceCommand.createFrom(LastCmd, this, null); var respStatus = lastDC.isExpectedResponse(BaseDeviceCommand.createFrom(buffer, this, null)); switch (respStatus) { case DeviceCommandResponseStatus.Valid: result = true; Fota.Dequeue(this, lastDC.MessageId ?? null); break; case DeviceCommandResponseStatus.Invalid: result = false; break; case DeviceCommandResponseStatus.Exception: Fota.RollbackLastTransaction(this, lastDC.MessageId ?? null); result = false; break; } } } return(result); }