/// <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> /// Agrega un sub protocolo a la lista /// </summary> /// <param name="subProtocolType">El tipo del subprotocolo (los numeros entre 0 y 1000 esta reservados para el sistema)</param> /// <param name="subProtocol">un objeto de sub protocolo inicializado</param> public void add(Int32 subProtocolType, SubProtocolI subProtocol) { lock (thisLock) { //Si no tengo el ip, entonces agrego al usuario como alguien nuevo if (!Collection.Contains(subProtocolType)) { Collection.Add(subProtocolType, subProtocol); } //Si ya la tengo, actualizo el objeto usuario else { Collection.Remove(subProtocolType); Collection.Add(subProtocolType, subProtocol); } } }
/// <summary> /// Constructo Parametrizado /// </summary> /// <param name="configuration">El objeto con los datos de configuración previamente llenado</param> /// <param name="subProtocols">Lista de SubProtocolos</param> /// <param name="extraMessageTypes">Tipos de mensajes no especificados en los sub protocolos</param> public Communication(Configuration configuration, SubProtocolList subProtocols, MessageTypeList extraMessageTypes) { try { this.configuration = configuration; if (extraMessageTypes != null) { messageTypes = extraMessageTypes.Collection; } else { messageTypes = new Hashtable(); } if (subProtocols != null) { Hashtable sub = subProtocols.Collection; foreach (DictionaryEntry en in sub) { SubProtocolI subProtocol = (SubProtocolI)en.Value; Hashtable spMessageTypes = subProtocol.getMessageTypes().Collection; foreach (DictionaryEntry de in spMessageTypes) { messageTypes.Add(de.Key, de.Value); } subProtocol.sendMessageEvent += internalSendMessage; } this.subProtocols = sub; } netHandler = new NetHandler(configuration.NetData, this); eventQueuePC = new EventQueuePC(); eventConsumer = new Thread(new ThreadStart(consumeEvent)); eventConsumerStarted = false; eventConsumerLock = new Object(); init(); } catch (ThreadAbortException e) { throw e; } catch (Exception e) { throw e; } }
/// <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: " + message.ToString()); } //AckMessage else if (message.Type == MessageType.ACK) { AckMessage ackMessage = (AckMessage)message; router.proccessAckMessage(ackMessage); //produceEvent(CommunicationEvent.NETINFORMATION, "recibidos: " + message.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: message 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 received: " + message.ToString()); } } } }