示例#1
0
 /// <summary>
 /// Dispara el evento RequestCancelled.
 /// </summary>
 /// <param name="request">
 /// Es el requerimiento que se ha cancelado.
 /// </param>
 protected virtual void OnRequestCancelled(PeerRequest request)
 {
     if (RequestCancelled != null)
     {
         RequestCancelled(this, new PeerRequestCancelledEventArgs(request));
     }
 }
示例#2
0
 /// <summary>
 /// Dispara el evento RequestDone.
 /// </summary>
 /// <param name="request">
 /// Es el requerimiento que se ha completado.
 /// </param>
 protected virtual void OnRequestDone(PeerRequest request)
 {
     if (RequestDone != null)
     {
         RequestDone(this, new PeerRequestDoneEventArgs(request));
     }
 }
示例#3
0
        /// <summary>
        /// Crea e inicializa una nueva clase del tipo <see cref="PeerRequestCancelledEventArgs"/>.
        /// </summary>
        /// <param name="request">
        /// Es el requerimiento que se ha completado.
        /// </param>
        /// <exception cref="ArgumentNullException">
        /// request contiene una referencia nula.
        /// </exception>
        public PeerRequestCancelledEventArgs(PeerRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            _request = request;
        }
示例#4
0
        /// <summary>
        /// Dispara el evento <see cref="Receive"/>, luego, si el mensaje
        /// recibido es la respuesta a un requerimiento dispara el evento
        /// <see cref="RequestDone"/> y finaliza la ejecución del método,
        /// en caso contrario invoca a cada procesador de mensajes hasta
        /// que alguno lo procese o no hayan mas procesadores de mensajes en
        /// la lista.
        /// </summary>
        /// <param name="message">
        /// Es el mensaje que se ha recibido.
        /// </param>
        protected virtual void OnReceive(Message message)
        {
            PeerRequest request = null;

            // Check if received message is response of a pending request.
            if ((_pendingRequests != null))
            {
                lock ( _pendingRequests ) {
                    if (_pendingRequests.Count > 0)
                    {
                        object messageKey = _messagesIdentifier.ComputeIdentifier(message);
                        if (messageKey != null)
                        {
                            request = ( PeerRequest )_pendingRequests[messageKey];
                            if (request != null)
                            {
                                _pendingRequests.Remove(messageKey);
                            }
                        }
                    }
                }
            }

            if (request == null)
            {
                // The received message not matched a pending request,
                // notify clients via Receive event and peer associated
                // processors.

                if (Receive != null)
                {
                    Receive(this, new ReceiveEventArgs(message));
                }

                IMessageProcessor processor = _messageProcessor;

                while ((processor != null) &&
                       !processor.Process(this, message))
                {
                    processor = processor.NextMessageProcessor;
                }
            }
            else
            {
                // The message is the response of a pending request.
                if (request.SetResponseMessage(message))
                {
                    OnRequestDone(request);
                }
                else
                {
                    // The peer request was signaled as expired by the request timer.
                    OnRequestCancelled(request);
                }
            }
        }
示例#5
0
        /// <summary>
        /// Cancela un requerimiento en progreso.
        /// </summary>
        /// <param name="request">
        /// Es el requerimiento a cancelar.
        /// </param>
        internal virtual void Cancel(PeerRequest request)
        {
            object messageKey = _messagesIdentifier.ComputeIdentifier(
                request.RequestMessage);

            if (_pendingRequests.Contains(messageKey))
            {
                lock ( _pendingRequests ) {
                    if (_pendingRequests.Contains(messageKey))
                    {
                        _pendingRequests.Remove(messageKey);
                        OnRequestCancelled(request);
                    }
                }
            }
        }
示例#6
0
        /// <summary>
        /// Envía un mensaje del que se espera respuesta.
        /// </summary>
        /// <param name="request">
        /// Es el requerimiento que encapsula el mensaje
        /// enviado y el mensaje recibido.
        /// </param>
        internal virtual void Send(PeerRequest request)
        {
            object messageKey = _messagesIdentifier.ComputeIdentifier(
                request.RequestMessage);

            lock ( _pendingRequests ) {
                if (_pendingRequests.Contains(messageKey))
                {
                    _pendingRequests.Remove(messageKey);
                }

                Send(request.RequestMessage);
                request.MarkAsTransmitted();
                _pendingRequests.Add(messageKey, request);
            }
        }
示例#7
0
        /// <summary>
        /// It's called to process the indicated message.
        /// </summary>
        /// <param name="source">
        /// It's the source of the message.
        /// </param>
        /// <param name="message">
        /// It's the message to be processed.
        /// </param>
        /// <returns>
        /// A logical value the same to true, if the messages processor
        /// processeced it, otherwise it returns false.
        /// </returns>
        /// <remarks>
        /// If the messages processor doesn't process it, the system
        /// delivers it to the next processor in the list, and so on until
        /// one process it, or there aren't other processors.
        ///
        /// This function handles all the messages received by the server.
        /// </remarks>
        public bool Process(IMessageSource source, Message message)
        {
            try {
                if ((_peer == null) || !_peer.IsConnected)
                {
                    return(false);
                }

                PeerRequest request = new PeerRequest(_peer, message);
                request.Payload = source;
                request.Send(_timeout);

                return(true);
            }
            catch (Exception e) {
                Logger.Error(e);
                return(false);
            }
        }