/// <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());
     }
 }
Esempio n. 2
0
 /// <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>
 /// 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());
                    }
                }
            }
        }