public void AddSubscriber(Subscriber sub) { subscribers.Add(sub); if (!hasSubscribers) { // Reset some variables so we can start fresh bytesReceived = 0; expectedFragment = 0; // receiver.GetNewBytesEvent().AddObserver(this); receiver.Open(); hasSubscribers = true; SetupTransportThread(); } }
public void SubscriberNewData(Subscriber sender, OPSObject data) { if (!(data is ParticipantInfoData)) return; ParticipantInfoData partInfo = (ParticipantInfoData)data; // Is it on our domain? if (partInfo.domain.Equals(participant.domainID)) { foreach (TopicInfoData tid in partInfo.subscribeTopics) { // We are only interrested in topics with UDP as transport if ( (tid.transport.Equals(Topic.TRANSPORT_UDP)) && (participant.HasPublisherOn(tid.name)) ) { udpSendDataHandler.AddSink(tid.name, partInfo.ip, partInfo.mc_udp_port); } } } }
public void RemoveSubscriber(Subscriber subscriber) { subscribers.Remove(subscriber); }
public void AddSubscriber(Subscriber subscriber) { subscribers.Add(subscriber); }
///LA TODO Protection ?? What if several subscribers at the same time /// Not needed since all calls go through the participant which is synched public ISendDataHandler GetSendDataHandler(Topic t, Participant participant) { // In the case that we use the same port for several topics, we need to find the sender for the transport::address::port used string key = t.GetTransport() + "::" + t.GetDomainAddress() + "::" + t.GetPort(); if (SendDataHandlers.ContainsKey(key)) { return SendDataHandlers[key]; } try { // Get the local interface, doing a translation from subnet if necessary string localIF = Domain.DoSubnetTranslation(participant.getDomain().GetLocalInterface()); ISendDataHandler sender = null; if (t.GetTransport().Equals(Topic.TRANSPORT_MC)) { sender = new McSendDataHandler(t, localIF); } else if (t.GetTransport().Equals(Topic.TRANSPORT_TCP)) { sender = new TcpSendDataHandler(t, localIF); } if (sender != null) { SendDataHandlers.Add(key, sender); return sender; } // We don't want to add the udp handler to the handler list, so handle this last if (t.GetTransport().Equals(Topic.TRANSPORT_UDP)) { if (udpSendDataHandler == null) { // We have only one sender for all topics, so use the domain value for buffer size udpSendDataHandler = new McUdpSendDataHandler( participant.getDomain().GetOutSocketBufferSize(), localIF); // Setup a listener on the participant info data published by participants on our domain. // We use the information for topics with UDP as transport, to know the destination for UDP sends // ie. we extract ip and port from the information and add it to our McUdpSendDataHandler partInfoListener = new ParticipantInfoDataListener(participant, udpSendDataHandler); partInfoSub = new Subscriber(participant.CreateParticipantInfoTopic()); partInfoSub.newDataDefault += new NewDataDefaultEventHandler(partInfoListener.SubscriberNewData); partInfoSub.Start(); } return udpSendDataHandler; } throw new CommException("No such Transport " + t.GetTransport()); } catch (System.IO.IOException ex) { throw new CommException("Error creating SendDataHandler. IOException -->" + ex.Message); } }
public bool RemoveSubscriber(Subscriber sub) { bool result = subscribers.Remove(sub); if (subscribers.Count == 0) { receiver.GetNewBytesEvent().DeleteObserver(this); hasSubscribers = false; receiver.Close(); } return result; }