/// <summary> /// Procesa un mensaje que no ha podido ser envíado correctamente /// </summary> /// <param name="message">El mensaje</param> internal void routerMessageErrorHandler(Message message) { //ImAliveMessage if (message.Type == MessageType.IMALIVE) { ImAliveMessage imAliveMessage = (ImAliveMessage)message; produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + imAliveMessage.ToString()); } //AckMessage else if (message.Type == MessageType.ACK) { AckMessage ackMessage = (AckMessage)message; produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + ackMessage.ToString()); } //Resto de los mensajes else { SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType]; if (subProtocol != null) { eventQueuePC.put(new Event(new MessageEvent(subProtocol.errorMessage), message)); } else { produceEvent(CommunicationEvent.ERRORMESSAGE, message); } produceEvent(CommunicationEvent.NETINFORMATION, "ROUTER: message delivery fail " + message.ToString()); } }
/// <summary> /// Procesa un mensaje recibido /// </summary> /// <param name="message">El mensaje recibido</param> private void proccessMessage(Message message) { if (message != null) { //registra la ip del mensaje recibido en el manejador de Ips, previo chequeo de que el mensaje no es de //este mismo usuario if (!message.SenderNetUser.Id.Equals(configuration.NetUser.Id)) { netHandler.registerIp(message.SenderNetUser.Ip); } //verifica que se recibe el mensaje de un usuario conocido NetUser listedNetUser = netUserList.getUser(message.SenderNetUser.Ip); //ImAliveMessage if (message.Type == MessageType.IMALIVE) { if (listedNetUser == null) { newNetUser(message.SenderNetUser); } else if (!listedNetUser.Id.Equals(message.SenderNetUser.Id)) { disconnectNetUser(listedNetUser); } else { listedNetUser.qualityUp(configuration.NetData); listedNetUser.NeighborhoodIds = message.SenderNetUser.NeighborhoodIds; listedNetUser.JumpsAway = message.Jumps; listedNetUser.State = message.SenderNetUser.State; listedNetUser.UpLayerData = message.SenderNetUser.UpLayerData; } //produceEvent(CommunicationEvent.NETINFORMATION, "recibido: " + subProtocol.ToString()); } //AckMessage else if (message.Type == MessageType.ACK) { AckMessage ackMessage = (AckMessage)message; router.proccessAckMessage(ackMessage); //produceEvent(CommunicationEvent.NETINFORMATION, "recibidos: " + subProtocol.ToString()); } //Resto de los mensajes else { if (listedNetUser != null && listedNetUser.Id.Equals(message.SenderNetUser.Id)) { message.SenderNetUser = listedNetUser; SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType]; if (subProtocol != null) { eventQueuePC.put(new Event(new MessageEvent(subProtocol.proccessMessage), message)); } else { produceEvent(CommunicationEvent.PROCESSMESSAGE, message); } produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: received " + message.ToString()); } else { message.SenderNetUser.Name = "Unknown (" + message.SenderNetUser.Ip.ToString() + ")"; SubProtocolI subProtocol = (SubProtocolI)subProtocols[message.ProtocolType]; if (subProtocol != null) { eventQueuePC.put(new Event(new MessageEvent(subProtocol.proccessMessage), message)); } else { produceEvent(CommunicationEvent.PROCESSMESSAGE, message); } produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: unknown message " + message.ToString()); } } } }
/// <summary> /// Envía un mensaje de forma interna aplicando filtros /// </summary> /// <param name="message">el mensaje a enviar</param> internal void internalSendMessage(Message message) { try { if (configuration.NetUser.Ip != null) { message.SenderNetUser = configuration.NetUser; router.queueMessageToSend(message); if (message.Type != MessageType.IMALIVE && message.Type != MessageType.ACK) { produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: queued " + message.ToString()); } } } catch (ThreadAbortException e) { throw e; } catch (Exception e) { produceEvent(CommunicationEvent.NETINFORMATION, "COMMUNICATION: impossible to send this message " + e.Message); } }