private string ExtractTargetClientId(ITransportEnvelopeHeader header)
 {
     if (header.TargetId.Contains(","))
     {
         return(header.TargetId.Substring(header.TargetId.LastIndexOf(",") + 1));
     }
     return(header.TargetId);
 }
 private bool IsMessageTypeInReceivableTypesFilter(ITransportEnvelopeHeader header,
                                                   IClientConfiguration clientConfiguration)
 {
     // empty receivable types filter equates to getting all messages
     if (clientConfiguration.ReceivableTypesFilter.Count() == 0)
     {
         return(true);
     }
     // check receivable types filter
     return((from x in clientConfiguration.ReceivableTypesFilter
             where header.IsEnvelopeType(x)
             select x).FirstOrDefault() != null);
 }
        private bool CanSendEnvelope(ITransportEnvelopeHeader header,
                                     IClientConfiguration clientConfiguration,
                                     IEnumerable <IPayloadTypeInfo> overrideTypesFilter)
        {
            var sendMessage = false;

            // **** check for override message
            if (IsOverrideMessage(header, overrideTypesFilter))
            {
                sendMessage = true;
            }
            else
            {
                // **** check self-sent message flag
                if (clientConfiguration.Id == ExtractSourceClientId(header.ClientId))
                {
                    if ((clientConfiguration.ReceiveSelfSentMessages) &&
                        (IsMessageTypeInReceivableTypesFilter(header, clientConfiguration)))
                    {
                        sendMessage = true;
                    }
                }
                else
                {
                    var headerTargetClientId = ExtractTargetClientId(header);
                    if (!string.IsNullOrWhiteSpace(headerTargetClientId))
                    {
                        // ######## TARGETED MESSAGE
                        // check for valid receiver
                        if (clientConfiguration.Id == headerTargetClientId)
                        {
                            if (IsMessageTypeInReceivableTypesFilter(header, clientConfiguration))
                            {
                                sendMessage = true;
                            }
                        }
                    }
                    else
                    {
                        // ######## NON-TARGETED MESSAGE
                        if (IsMessageTypeInReceivableTypesFilter(header, clientConfiguration))
                        {
                            sendMessage = true;
                        }
                    }
                }
            }
            //
            return(sendMessage);
        }
Example #4
0
 public TransportEnvelopeGroup(string id, ITransportEnvelopeHeader header)
     : this()
 {
     Id     = id;
     Header = header;
 }
 private bool IsOverrideMessage(ITransportEnvelopeHeader header, IEnumerable <IPayloadTypeInfo> overrideTypesFilter)
 {
     return((from x in overrideTypesFilter
             where header.IsEnvelopeType(x)
             select x).FirstOrDefault() != null);
 }
        /// <summary>
        /// Transmits the <see cref="TransportEnvelope"/> to the server.
        /// </summary>
        /// <param name="envelope">The <see cref="TransportEnvelope"/> to send to the server.</param>
        public void PushEnvelopeToServer(TransportEnvelope envelope)
        {
            // ******** RECIEVED ENVELOPE FROM CLIENT ********

            if (envelope != null)
            {
                System.Threading.Tasks.Task.Run(() =>
                {
                    // extract header, update stats
                    ITransportEnvelopeHeader header = null;
                    lock (_SyncRootTransporterController)
                    {
                        TransporterController.TransportStatisticsLive.IncomingEnvelopes++;
                        TransporterController.TransportStatisticsLive.IncomingBytes += (envelope.Header.Length + envelope.Payload.Length);
                        header = TransporterController.ExtractHeader(envelope);
                    }
                    // get list of registered clients
                    List <KeyValuePair <string, DataHolder> > workerList = null;
                    var removableClients = new List <string>();
                    lock (_SyncRootRegisteredCallbackClients)
                    {
                        workerList = new List <KeyValuePair <string, DataHolder> >(_RegisteredCallbackClients);
                    }
                    // send envelope to each registered client, that will accept it
                    System.Threading.Tasks.Parallel.ForEach(workerList, new Action <KeyValuePair <string, DataHolder> >(
                                                                (x) =>
                    {
                        try
                        {
                            // handle type-based traffic filtering
                            if (CanSendEnvelope(header, x.Value.ClientConfiguration, OverrideTypesFilter))
                            {
                                lock (_SyncRootTransporterController)
                                {
                                    TransporterController.TransportStatisticsLive.OutgoingEnvelopes++;
                                    TransporterController.TransportStatisticsLive.OutgoingBytes += (envelope.Header.Length + envelope.Payload.Length);
                                }
                                InternalSendEnvelopeToClient(envelope, x.Value);
                            }
                            else
                            {
                            }
                        }
                        catch
                        {
                            removableClients.Add(x.Value.ClientConfiguration.Id);
                        }
                    }));
                    // **** unregister unresponsive clients
                    foreach (var clientId in removableClients)
                    {
                        if (clientId != null)
                        {
                            lock (_SyncRootRegisteredCallbackClients)
                            {
                                if (_RegisteredCallbackClients.ContainsKey(clientId))
                                {
                                    _RegisteredCallbackClients.Remove(clientId);
                                }
                            }
                        }
                    }
                });
            }
            else
            {
                // TODO: A null envelope? what could have caused this and what should I do about it?
            }
        }