static void Main(string[] args) { DDSEntityManager mgr = new DDSEntityManager("Listener"); ReturnCode status = ReturnCode.Error; ListenerDataListener myListener; String partitionName = "Listener Example"; int count = 0; Duration wait_timeout = new Duration(0, 200000000); // create Domain Participant mgr.createParticipant(partitionName); // create Type MsgTypeSupport msgTS = new MsgTypeSupport(); mgr.registerType(msgTS); // create Topic mgr.createTopic("ListenerData_Msg"); // create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(false); IDataReader dreader = mgr.getReader(); myListener = new ListenerDataListener(); myListener.MsgDR = dreader as MsgDataReader; Console.WriteLine("=== [ListenerDataSubscriber] SetListener"); StatusKind kind = StatusKind.DataAvailable | StatusKind.RequestedDeadlineMissed; status = myListener.MsgDR.SetListener(myListener, kind); ErrorHandler.checkStatus(status, "DataReader.SetListener"); Console.WriteLine("=== [ListenerDataSubscriber] Ready..."); myListener.terminated = false; WaitSet ws = new WaitSet(); ws.AttachCondition(myListener.guardCond); ICondition[] cond = null; while (!myListener.terminated && count < 1500) { Console.WriteLine("=== [SubscriberUsingListener] waiting waitset ..."); ws.Wait(ref cond, wait_timeout); myListener.guardCond.SetTriggerValue(false); ++count; } Console.WriteLine("===[ListenerDataSubscriber] Market Closed."); mgr.getSubscriber().DeleteDataReader(myListener.MsgDR); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); }
static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("*** [ContentFilteredTopicDataSubscriber] Subscription string not specified"); Console.WriteLine("*** usage : ContentFilteredTopicDataSubscriber <subscription_string>"); Environment.Exit(-1); } ITopic topic; DDSEntityManager mgr = new DDSEntityManager(); String partitionName = "ContentFilteredTopic example"; // Create DomainParticipant mgr.createParticipant(partitionName); // Create Type StockTypeSupport msgTS = new StockTypeSupport(); mgr.registerType(msgTS); // Create Topic topic = mgr.createTopic("StockTrackerExclusive", "ContentFilteredTopic"); // ContentFilteredTopic mgr.createContentFilter("MyStockTopic", topic, args[0]); Console.WriteLine("=== [ContentFilteredTopicDataSubscriber] Subscription filter : ticker = '{0}'",args[0]); // create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader("ContentFilteredTopic", true); // Read Events IDataReader dreader = mgr.getReader(); StockDataReader WaitSetReader = dreader as StockDataReader; // Create WaitSet IWaitSet w = new WaitSet(); // Status Condition IStatusCondition status; status = dreader.StatusCondition; status.SetEnabledStatuses(StatusKind.DataAvailable); ReturnCode result = ReturnCode.Error; result = w.AttachCondition(status); ErrorHandler.checkHandle(status, "DataReader.StatusCondition"); ErrorHandler.checkStatus(result, "WaitSet.AttachCondition"); DDS.ICondition[] conditionList; DDS.SampleInfo[] infoSeq; Stock[] stockSeq; Console.WriteLine("=== [ContentFilteredTopicDataSubscriber] Ready ..."); bool terminate = false; int count = 0; while (!terminate && count < 1500) { /** * Wait until data will be available */ Duration wait_timeout = new Duration(Duration.InfiniteSec, Duration.InfiniteNanoSec); conditionList = null; result = w.Wait(ref conditionList, wait_timeout); ErrorHandler.checkStatus(result, "WaitSet.Wait"); stockSeq = null; infoSeq = null; /** * Read Data */ result = WaitSetReader.Take(ref stockSeq, ref infoSeq, Length.Unlimited, SampleStateKind.Any, ViewStateKind.Any, InstanceStateKind.Any); ErrorHandler.checkStatus(result, "StockDataReader.Take"); /** * Display Data */ for (int i=0; i < stockSeq.Length; i++) { if (infoSeq[i].ValidData) { if (stockSeq[i].price == -1) { // We read the last expected sample => exit terminate = true; break; } Console.WriteLine("=== [ContentFilteredTopicDataSubscriber] receives stockQuote : ( {0} , {1} )", stockSeq[i].ticker, stockSeq[i].price); } } result = WaitSetReader.ReturnLoan(ref stockSeq, ref infoSeq); ErrorHandler.checkStatus(result, "StockDataReader.ReturnLoan"); Thread.Sleep(200); ++count; } Console.WriteLine("=== [ContentFilteredTopicDataSubscriber] Market Closed"); // clean up mgr.getSubscriber().DeleteDataReader(WaitSetReader); mgr.deleteSubscriber(); mgr.deleteContentFilteredTopic(); mgr.deleteTopic(); mgr.deleteParticipant(); }
static void Main(string[] args) { bool automatic = true; if (args.Length > 1) { automatic = args[0].Equals("true"); } string hostName; DDSEntityManager mgr = new DDSEntityManager(); // create domain participant mgr.createParticipant("BuiltInTopics"); // Resolve the built-in Subscriber ISubscriber builtInSubscriber = mgr.getParticipant().BuiltInSubscriber; // Lookup the DataReader for the DCPSParticipant built-in Topic IDataReader reader = builtInSubscriber.LookupDataReader("DCPSParticipant"); // Cast the DataReader to a ParticipantBuiltInTopicDataReader ParticipantBuiltinTopicDataDataReader participantReader = reader as ParticipantBuiltinTopicDataDataReader; ErrorHandler.checkHandle(participantReader, "ParticipantBuiltInTopicDataReader narrow"); // Allocate a new typed seq for data samples ParticipantBuiltinTopicData[] data = null; // Allocate a new seq for sample infos SampleInfo[] info = null; Console.WriteLine("=== [BuiltInTopicsDataSubscriber] : Waiting for historical data ... "); participantReader.WaitForHistoricalData(Duration.Infinite); Console.WriteLine("=== [BuiltInTopicsDataSubscriber] : done"); // Create a new ReadCondition for the reader that matches all samples IReadCondition readCond = participantReader.CreateReadCondition(SampleStateKind.Any, ViewStateKind.Any, InstanceStateKind.Any); ErrorHandler.checkHandle(readCond, "DataReader.CreateReadCondition"); // Create a waitset and add the ReadCondition created above WaitSet aWaitSet = new WaitSet(); ReturnCode status = aWaitSet.AttachCondition(readCond); ErrorHandler.checkStatus(status, "WaitSet.AttachCondition"); // Initialize and pre-allocate the seq used to obtain the triggered Conditions. ICondition[] condSeq = new ICondition[0]; // Allocate a map store node information later on // The key of map is the id of the node and the value is the // number of active participants on that node. A Dictionary is used // as an UnorderedMap. Dictionary<int, int> nodes = new Dictionary<int, int>(); // Allocate a map to store node information later on. // The key of the map is the id of the node and the value is the // name of the node. A Dictionary is used as an UnorderedMap. Dictionary<int, string> nodeNames = new Dictionary<int, string>(); Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Ready ..."); // Block the current thread until the attached condition becomes true // or the user interrupts. status = aWaitSet.Wait(ref condSeq, Duration.Infinite); ErrorHandler.checkStatus(status, "WaitSet.Wait"); bool done = false; // Continue processing until interrupted. while (!done) { // Take all the available data from the reader status = participantReader.Take(ref data, ref info, Length.Unlimited, SampleStateKind.Any, ViewStateKind.Any, InstanceStateKind.Any); ErrorHandler.checkStatus(status, "ParticipantBuiltinTopicDataDataReader.Take"); // Verify the data has been taken if (status == ReturnCode.Ok) { // Iterate the list of taken samples. for (int i = 0; i < data.Length ; i++) { // Resolve the node identification int nodeId = data[i].Key[0]; // Initialise the number of participants for a node int participantCount = 0; // Check if we saw a participant for the node before. if (nodes.ContainsKey(nodeId)) { participantCount = nodes[nodeId]; } // Check sample info to see whether the instance is ALIVE. if (info[i].InstanceState == InstanceStateKind.Alive) { // The splicedaemon publishes the host-name in the // user_data field if (data[i].UserData.Value.Length != 0) { hostName = Encoding.UTF8.GetString(data[i].UserData.Value); nodeNames[nodeId] = hostName; } else { hostName = null; } // Increase the number of participants. participantCount++; // Update the number of participants for the node. nodes[nodeId] = participantCount; // If it's the first participant, report the node is up. if (participantCount == 1) { Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Node ' {0} ' started (Total nodes running: {1} ) participantCount = {2}", nodeId, nodes.Count, participantCount); } if (hostName != null) { Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Hostname for node ' {0} ' is hostname: {1}", nodeId, hostName); } } else { // Decrease the number of participants. participantCount--; // If no more participants exist, report the node is down. if (participantCount == 0) { hostName = nodeNames[nodeId]; nodeNames.Remove(nodeId); nodes.Remove(nodeId); if (hostName != null) { Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Node {0} ({1}) stopped (Total nodes running: ({2})", nodeId, hostName, nodes.Count); } else { Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Node {0} stopped (Total nodes running : {1})", nodeId, nodes.Count); } } else if (participantCount > 0) { nodes[nodeId] = participantCount; } } } } status = participantReader.ReturnLoan(ref data, ref info); ErrorHandler.checkStatus(status, "ParticipantReader.ReturnLoan"); if (!automatic) { // Block the current thread until the attached condition becomes // true or the user interrupts. Console.WriteLine("=== [BuiltInTopicsDataSubscriber] Waiting ... "); status = aWaitSet.Wait(ref condSeq, Duration.Infinite); done = (status != ReturnCode.Ok); } else { done = true; } } // Recursively delete all entities in the DomainParticipant. mgr.getParticipant().DeleteContainedEntities(); // Delete DomainParticipant mgr.getDomainParticipantFactory().DeleteParticipant(mgr.getParticipant()); }
static void Main(string[] args) { DDSEntityManager mgr = new DDSEntityManager("WaitSet"); String partitionName = "WaitSet example"; // create Domain Participant mgr.createParticipant(partitionName); // create Type MsgTypeSupport msgTS = new MsgTypeSupport(); mgr.registerType(msgTS); // create Topic mgr.createTopic("WaitSetData_Msg"); // create Subscriber mgr.createSubscriber(); // create DataReader mgr.createReader(false); // Read Events IDataReader dreader = mgr.getReader(); MsgDataReader WaitSetReader = dreader as MsgDataReader; // Create a WaitSet WaitSet w = new WaitSet(); // Create a ReadCondition IReadCondition readCond = WaitSetReader.CreateReadCondition(SampleStateKind.NotRead, ViewStateKind.New, InstanceStateKind.Alive); ErrorHandler.checkHandle(readCond, "DataReader.CreateReadCondition"); // Create a QueryCondition String[] queryStr = { "Hello again" }; Console.WriteLine("=== [WaitSetDataSubscriber] Query : message = \"Hello again"); IQueryCondition queryCond = WaitSetReader.CreateQueryCondition("message=%0", queryStr); ErrorHandler.checkHandle(queryCond, "DataReader.CreateQueryCondition"); // Obtain a StatusCondition IStatusCondition statusCond; statusCond = dreader.StatusCondition; statusCond.SetEnabledStatuses(StatusKind.LivelinessChanged); ErrorHandler.checkHandle(statusCond, "DataReader.StatusCondition"); GuardCondition escape; escape = new GuardCondition(); ReturnCode result; result = w.AttachCondition(statusCond); ErrorHandler.checkStatus(result, "WaitSet.AttachCondition (status)"); result = w.AttachCondition(readCond); ErrorHandler.checkStatus(result, "WaitSet.AttachCondition (read)"); result = w.AttachCondition(queryCond); ErrorHandler.checkStatus(result, "WaitSet.AttachCondition (query)"); result = w.AttachCondition(escape); ErrorHandler.checkStatus(result, "WaitSet.AttachCondition (guard)"); /* Initialize and pre-allocate the GuardList used to obtain the triggered Conditions. */ ICondition[] guardList = new ICondition[4]; DDS.SampleInfo[] infoSeq = null; Msg[] msgSeq = null; bool escaped = false; bool writerLeft = false; int prevCount = 0; int count = 0; Console.WriteLine("=== [WaitSetDataSubscriber] Ready ..."); while (!escaped && count < 20 ) { /** * Wait until data will be available */ Duration wait_timeout = new Duration(Duration.InfiniteSec, Duration.InfiniteNanoSec); result = w.Wait(ref guardList, wait_timeout); ErrorHandler.checkStatus(result, "WaitSet.Wait"); /* Walk over all guards to display information */ foreach (ICondition guard in guardList) { if (guard == readCond) { result = WaitSetReader.ReadWithCondition(ref msgSeq, ref infoSeq, Length.Unlimited, readCond); ErrorHandler.checkStatus(result, "WaitSetReader.ReadWithCondition"); foreach (Msg msg in msgSeq) { Console.WriteLine(" --- New message received --- "); Console.WriteLine(" userID: {0}", msg.userID); Console.WriteLine(" Message : \"{0}", msg.message); } result = WaitSetReader.ReturnLoan(ref msgSeq, ref infoSeq); ErrorHandler.checkStatus(result, "WaitSet.ReturnLoan"); } else if (guard == queryCond) { result = WaitSetReader.TakeWithCondition(ref msgSeq, ref infoSeq, Length.Unlimited, queryCond); ErrorHandler.checkStatus(result, "WaitSetReader.TakeWithCondition"); foreach (Msg msg in msgSeq) { Console.WriteLine(" --- New message received with QueryCondition --- "); Console.WriteLine(" userID: {0}", msg.userID); Console.WriteLine(" Message : \" {0}", msg.message); } result = WaitSetReader.ReturnLoan(ref msgSeq, ref infoSeq); ErrorHandler.checkStatus(result, "WaitSet.ReturnLoan"); } else if (guard == statusCond) { LivelinessChangedStatus livelinessStatus = new LivelinessChangedStatus(); result = WaitSetReader.GetLivelinessChangedStatus(ref livelinessStatus); ErrorHandler.checkStatus(result, "DataReader.getLivelinessChangedStatus"); if (livelinessStatus.AliveCount < prevCount) { Console.WriteLine("!!! A WaitSetDataWriter lost its liveliness"); writerLeft = true; Console.WriteLine("Triggering escape condition."); ReturnCode status = escape.SetTriggerValue(true); } else { Console.WriteLine("!!! A WaitSetDataWriter joined"); } prevCount = livelinessStatus.AliveCount; } else if (guard == escape) { Console.WriteLine("WaitSetSubscriber has terminated."); escaped = true; ReturnCode status = escape.SetTriggerValue(false); } else { // Unknown Condition } } ++count; } // Detach all Conditions from the WaitSet result = w.DetachCondition(escape); ErrorHandler.checkStatus(result, "WaitSet.DetachCondition (escape)"); result = w.DetachCondition(readCond); ErrorHandler.checkStatus(result, "WaitSet.DetachCondition (readCond)"); result = w.DetachCondition(queryCond); ErrorHandler.checkStatus(result, "WaitSet.DetachCondition (queryCond)"); result = w.DetachCondition(statusCond); ErrorHandler.checkStatus(result, "WaitSet.DetachCondition (statusCond)"); Console.WriteLine("=== [Subscriber] Closed"); // clean up WaitSetReader.DeleteReadCondition(readCond); WaitSetReader.DeleteReadCondition(queryCond); mgr.getSubscriber().DeleteDataReader(WaitSetReader); mgr.deleteSubscriber(); mgr.deleteTopic(); mgr.deleteParticipant(); }
static void Main(string[] args) { string domain = null; /* Create a DomainParticipant */ DomainParticipantFactory dpf = DomainParticipantFactory.Instance; IDomainParticipant participant = dpf.CreateParticipant( domain, null, StatusKind.Any); ErrorHandler.checkHandle( participant, "DDS.DomainParticipantFactory.CreateParticipant"); /* Register the required datatype for ChatMessage. */ ChatMessageTypeSupport chatMessageTS = new ChatMessageTypeSupport(); string chatMessageTypeName = chatMessageTS.TypeName; ReturnCode status = chatMessageTS.RegisterType( participant, chatMessageTypeName); ErrorHandler.checkStatus( status, "Chat.ChatMessageTypeSupport.RegisterType"); /* Register the required datatype for NameService. */ NameServiceTypeSupport nameServiceTS = new NameServiceTypeSupport(); ErrorHandler.checkHandle( nameServiceTS, "new NameServiceTypeSupport"); string nameServiceTypeName = nameServiceTS.TypeName; status = nameServiceTS.RegisterType( participant, nameServiceTypeName); ErrorHandler.checkStatus( status, "Chat.NameServiceTypeSupport.RegisterType"); /* Set the ReliabilityQosPolicy to RELIABLE. */ TopicQos reliableTopicQos = new TopicQos(); status = participant.GetDefaultTopicQos(ref reliableTopicQos); ErrorHandler.checkStatus( status, "DDS.DomainParticipant.get_DefaultTopicQos"); reliableTopicQos.Reliability.Kind = ReliabilityQosPolicyKind.ReliableReliabilityQos; /* Make the tailored QoS the new default. */ status = participant.SetDefaultTopicQos(reliableTopicQos); ErrorHandler.checkStatus( status, "DDS.DomainParticipant.SetDefaultTopicQos"); /* Use the changed policy when defining the ChatMessage topic */ ITopic chatMessageTopic = participant.CreateTopic( "Chat_ChatMessage", chatMessageTypeName, reliableTopicQos); ErrorHandler.checkHandle( chatMessageTopic, "DDS.DomainParticipant.CreateTopic (ChatMessage)"); /* Set the DurabilityQosPolicy to TRANSIENT. */ TopicQos settingTopicQos = new TopicQos(); status = participant.GetDefaultTopicQos(ref settingTopicQos); ErrorHandler.checkStatus( status, "DDS.DomainParticipant.GetDefaultTopicQos"); settingTopicQos.Durability.Kind = DurabilityQosPolicyKind.TransientDurabilityQos; /* Create the NameService Topic. */ ITopic nameServiceTopic = participant.CreateTopic( "Chat_NameService", nameServiceTypeName, settingTopicQos); ErrorHandler.checkHandle( nameServiceTopic, "DDS.DomainParticipant.CreateTopic"); /* Adapt the default SubscriberQos to read from the "ChatRoom" Partition. */ SubscriberQos subQos = new SubscriberQos(); status = participant.GetDefaultSubscriberQos(ref subQos); ErrorHandler.checkStatus( status, "DDS.DomainParticipant.GetDefaultSubscriberQos"); subQos.Partition.Name = new string[1]; subQos.Partition.Name[0] = "ChatRoom"; /* Create a Subscriber for the UserLoad application. */ ISubscriber chatSubscriber = participant.CreateSubscriber(subQos); ErrorHandler.checkHandle( chatSubscriber, "DDS.DomainParticipant.CreateSubscriber"); /* Create a DataReader for the NameService Topic (using the appropriate QoS). */ DataReaderQos nsQos = null; status = chatSubscriber.GetDefaultDataReaderQos(ref nsQos); ErrorHandler.checkStatus( status, "DDS.Subscriber.GetDefaultDataReaderQos"); status = chatSubscriber.CopyFromTopicQos(ref nsQos, settingTopicQos); ErrorHandler.checkStatus( status, "DDS.Subscriber.CopyFromTopicQos"); IDataReader parentReader = chatSubscriber.CreateDataReader( nameServiceTopic, nsQos, null, StatusKind.Any); ErrorHandler.checkHandle( parentReader, "DDS.Subscriber.CreateDatareader (NameService)"); NameServiceDataReader nameServer = parentReader as NameServiceDataReader; /* Adapt the DataReaderQos for the ChatMessageDataReader to keep track of all messages. */ DataReaderQos messageQos = new DataReaderQos(); status = chatSubscriber.GetDefaultDataReaderQos(ref messageQos); ErrorHandler.checkStatus( status, "DDS.Subscriber.GetDefaultDataReaderQos"); status = chatSubscriber.CopyFromTopicQos( ref messageQos, reliableTopicQos); ErrorHandler.checkStatus( status, "DDS.Subscriber.CopyFromTopicQos"); messageQos.History.Kind = HistoryQosPolicyKind.KeepAllHistoryQos; /* Create a DataReader for the ChatMessage Topic (using the appropriate QoS). */ parentReader = chatSubscriber.CreateDataReader( chatMessageTopic, messageQos); ErrorHandler.checkHandle( parentReader, "DDS.Subscriber.CreateDataReader (ChatMessage)"); /* Narrow the abstract parent into its typed representative. */ ChatMessageDataReader loadAdmin = parentReader as ChatMessageDataReader; /* Initialize the Query Arguments. */ string[] parameters = { "0" }; /* Create a QueryCondition that will contain all messages with userID=ownID */ IQueryCondition singleUser = loadAdmin.CreateQueryCondition("userID=%0", parameters); ErrorHandler.checkHandle(singleUser, "DDS.DataReader.CreateQuerycondition"); /* Create a ReadCondition that will contain new users only */ IReadCondition newUser = nameServer.CreateReadCondition(SampleStateKind.NotRead, ViewStateKind.New, InstanceStateKind.Alive); ErrorHandler.checkHandle(newUser, "DDS.DataReader.create_readcondition"); /* Obtain a StatusCondition that triggers only when a Writer changes Liveliness */ IStatusCondition leftUser = loadAdmin.StatusCondition; ErrorHandler.checkHandle(leftUser, "DDS.DataReader.GetStatusCondition"); status = leftUser.SetEnabledStatuses(StatusKind.LivelinessChanged); ErrorHandler.checkStatus(status, "DDS.StatusCondition.SetEnabledStatuses"); /* Create a bare guard which will be used to close the room */ escape = new GuardCondition(); /* Create a waitset and add the ReadConditions */ WaitSet userLoadWS = new WaitSet(); status = userLoadWS.AttachCondition(newUser); ErrorHandler.checkStatus(status, "DDS.WaitSet.AttachCondition (newUser)"); status = userLoadWS.AttachCondition(leftUser); ErrorHandler.checkStatus(status, "DDS.WaitSet.AttachCondition (leftUser)"); status = userLoadWS.AttachCondition(escape); ErrorHandler.checkStatus(status, "DDS.WaitSet.AttachCondition (escape)"); /* Initialize and pre-allocate the GuardList used to obtain the triggered Conditions. */ ICondition[] guardList = new ICondition[3]; /* Remove all known Users that are not currently active. */ NameService[] nsMsgs = null; SampleInfo[] nsInfos = null; status = nameServer.Take(ref nsMsgs, ref nsInfos, Length.Unlimited, SampleStateKind.Any, ViewStateKind.Any, InstanceStateKind.NotAlive); ErrorHandler.checkStatus( status, "Chat.NameServiceDataReader.Take"); status = nameServer.ReturnLoan(ref nsMsgs, ref nsInfos); ErrorHandler.checkStatus( status, "Chat.NameServiceDataReader.ReturnLoan"); /* Start the sleeper thread. */ new Thread(new UserLoad().doWait).Start(); bool closed = false; int prevCount = 0; ChatMessage[] msgs = null; SampleInfo[] msgInfos = null; while (!closed) { /* Wait until at least one of the Conditions in the waitset triggers. */ status = userLoadWS.Wait(ref guardList, Duration.Infinite); ErrorHandler.checkStatus(status, "DDS.WaitSet.Wait"); /* Walk over all guards to display information */ foreach (ICondition guard in guardList) { if (guard == newUser) { /* The newUser ReadCondition contains data */ status = nameServer.ReadWithCondition(ref nsMsgs, ref nsInfos, newUser); ErrorHandler.checkStatus(status, "Chat.NameServiceDataReader.read_w_condition"); foreach (NameService ns in nsMsgs) { Console.WriteLine("New user: "******"Chat.NameServiceDataReader.ReturnLoan"); } else if (guard == leftUser) { // Some liveliness has changed (either a DataWriter // joined or a DataWriter left) LivelinessChangedStatus livelinessStatus = new LivelinessChangedStatus() ; status = loadAdmin.GetLivelinessChangedStatus(ref livelinessStatus); ErrorHandler.checkStatus(status, "DDS.DataReader.getLivelinessChangedStatus"); if (livelinessStatus.AliveCount < prevCount) { /* A user has left the ChatRoom, since a DataWriter lost its liveliness. Take the effected users so they will not appear in the list later on. */ status = nameServer.Take( ref nsMsgs, ref nsInfos, Length.Unlimited, SampleStateKind.Any, ViewStateKind.Any, InstanceStateKind.NotAliveNoWriters); ErrorHandler.checkStatus(status, "Chat.NameServiceDataReader.Take"); foreach (NameService nsMsg in nsMsgs) { /* re-apply query arguments */ parameters[0] = nsMsg.userID.ToString(); status = singleUser.SetQueryParameters(parameters); ErrorHandler.checkStatus(status, "DDS.QueryCondition.SetQueryParameters"); /* Read this user's history */ status = loadAdmin.TakeWithCondition( ref msgs, ref msgInfos, singleUser); ErrorHandler.checkStatus( status, "Chat.ChatMessageDataReader.TakeWithCondition"); /* Display the user and his history */ Console.WriteLine("Departed user {0} has sent {1} messages ", nsMsg.name, msgs.Length); status = loadAdmin.ReturnLoan(ref msgs, ref msgInfos); ErrorHandler.checkStatus(status, "Chat.ChatMessageDataReader.ReturnLoan"); } status = nameServer.ReturnLoan(ref nsMsgs, ref nsInfos); ErrorHandler.checkStatus(status, "Chat.NameServiceDataReader.ReturnLoan"); } prevCount = livelinessStatus.AliveCount; } else if (guard == escape) { Console.WriteLine("UserLoad has terminated."); closed = true; } else { //System.Diagnostics.Debug.Fail("Unknown Condition"); } } /* for */ } /* while (!closed) */ /* Remove all Conditions from the WaitSet. */ status = userLoadWS.DetachCondition(escape); ErrorHandler.checkStatus(status, "DDS.WaitSet.DetachCondition (escape)"); status = userLoadWS.DetachCondition(leftUser); ErrorHandler.checkStatus(status, "DDS.WaitSet.DetachCondition (leftUser)"); status = userLoadWS.DetachCondition(newUser); ErrorHandler.checkStatus(status, "DDS.WaitSet.DetachCondition (newUser)"); /* Free all resources */ status = participant.DeleteContainedEntities(); ErrorHandler.checkStatus(status, "DDS.DomainParticipant.DeleteContainedEntities"); status = dpf.DeleteParticipant(participant); ErrorHandler.checkStatus(status, "DDS.DomainParticipantFactory.DeleteParticipant"); }