private TBufferedResponseReceiver GetResponseReceiver(string responseReceiverId)
 {
     using (EneterTrace.Entering())
     {
         TBufferedResponseReceiver aResponseReceiver = myResponseReceivers.FirstOrDefault(x => x.ResponseReceiverId == responseReceiverId);
         return(aResponseReceiver);
     }
 }
        public void SendResponseMessage(string responseReceiverId, object message)
        {
            using (EneterTrace.Entering())
            {
                // If it is a broadcast response message.
                if (responseReceiverId == "*")
                {
                    using (ThreadLock.Lock(myResponseReceivers))
                    {
                        TBroadcast aBroadcastMessage = new TBroadcast(message);
                        myBroadcasts.Add(aBroadcastMessage);

                        foreach (TBufferedResponseReceiver aResponseReceiver in myResponseReceivers)
                        {
                            // Note: it does not throw exception.
                            aResponseReceiver.SendResponseMessage(message);
                        }
                    }
                }
                else
                {
                    bool aNotifyOffline = false;
                    using (ThreadLock.Lock(myResponseReceivers))
                    {
                        TBufferedResponseReceiver aResponseReciever = GetResponseReceiver(responseReceiverId);
                        if (aResponseReciever == null)
                        {
                            aResponseReciever = CreateResponseReceiver(responseReceiverId, "", true);
                            aNotifyOffline    = true;
                        }

                        aResponseReciever.SendResponseMessage(message);

                        if (aNotifyOffline)
                        {
                            ResponseReceiverEventArgs anEvent = new ResponseReceiverEventArgs(responseReceiverId, "");
                            Dispatcher.Invoke(() => Notify(ResponseReceiverOffline, anEvent, false));
                        }
                    }
                }
            }
        }
        private TBufferedResponseReceiver CreateResponseReceiver(string responseReceiverId, string clientAddress, bool notifyWhenConnectedFlag)
        {
            using (EneterTrace.Entering())
            {
                TBufferedResponseReceiver aResponseReceiver = new TBufferedResponseReceiver(responseReceiverId, myInputChannel);

                // Note: if it is created as offline then when the client connects raise ResponseReceiverConnected event.
                aResponseReceiver.PendingResponseReceiverConnectedEvent = notifyWhenConnectedFlag;

                myResponseReceivers.Add(aResponseReceiver);

                // If it is the first response receiver, then start the timer checking which response receivers
                // are disconnected due to the timeout (i.e. max offline time)
                if (myResponseReceivers.Count == 1)
                {
                    myMaxOfflineChecker.Change(300, -1);
                }

                return(aResponseReceiver);
            }
        }
        private void OnResponseReceiverDisconnected(object sender, ResponseReceiverEventArgs e)
        {
            using (EneterTrace.Entering())
            {
                bool aNotify = false;
                using (ThreadLock.Lock(myResponseReceivers))
                {
                    TBufferedResponseReceiver aResponseReciever = GetResponseReceiver(e.ResponseReceiverId);
                    if (aResponseReciever != null)
                    {
                        aResponseReciever.IsOnline = false;
                        aNotify = true;
                    }
                }

                if (aNotify)
                {
                    Notify(ResponseReceiverOffline, e, false);
                }
            }
        }