summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp')
-rw-r--r--TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp b/TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp
new file mode 100644
index 00000000000..3e0463c1b8e
--- /dev/null
+++ b/TAO/orbsvcs/orbsvcs/LWFT/DDSStateReaderListener_T.cpp
@@ -0,0 +1,180 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file DDSStateReaderListener_T.cpp
+ *
+ * $Id$
+ *
+ * @author Friedhelm Wolf (fwolf@dre.vanderbilt.edu)
+ */
+//=============================================================================
+
+#ifndef _DDS_STATE_READER_LISTENER_T_CPP_
+#define _DDS_STATE_READER_LISTENER_T_CPP_
+
+template <typename DATA_TYPE>
+DDSStateReaderListener_T<DATA_TYPE>::DDSStateReaderListener_T (
+ const std::string & id,
+ ReplicatedApplication_ptr application)
+ : id_ (id),
+ application_ (ReplicatedApplication::_duplicate (application))
+{
+}
+
+template <typename DATA_TYPE>
+DDSStateReaderListener_T<DATA_TYPE>::~DDSStateReaderListener_T (void)
+{
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_requested_deadline_missed (
+ DDS::DataReader_ptr,
+ const DDS::RequestedDeadlineMissedStatus &)
+ throw (CORBA::SystemException)
+{
+ ACE_DEBUG ((LM_TRACE,
+ ACE_TEXT ("DDSStateReaderListener_T::")
+ ACE_TEXT ("on_requested_deadline_missed ()\n")));
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_requested_incompatible_qos (
+ DDS::DataReader_ptr,
+ const DDS::RequestedIncompatibleQosStatus &status)
+ throw (CORBA::SystemException)
+{
+ ACE_DEBUG ((LM_TRACE,
+ ACE_TEXT ("DDSStateReaderListener_T::")
+ ACE_TEXT ("on_requested_incompatible_qos ()")
+ ACE_TEXT ("count=%d id=%d\n"),
+ status.total_count_change,
+ status.last_policy_id));
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_liveliness_changed (
+ DDS::DataReader_ptr,
+ const DDS::LivelinessChangedStatus &)
+ throw (CORBA::SystemException)
+{
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_subscription_matched (
+ DDS::DataReader_ptr,
+ const DDS::SubscriptionMatchedStatus &)
+ throw (CORBA::SystemException)
+{
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_sample_rejected (
+ DDS::DataReader_ptr,
+ const DDS::SampleRejectedStatus &)
+ throw (CORBA::SystemException)
+{
+ ACE_DEBUG ((LM_TRACE,
+ ACE_TEXT ("DDSStateReaderListener_T::")
+ ACE_TEXT ("on_sample_rejected ()\n")));
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_data_available (
+ DDS::DataReader_ptr reader)
+ throw (CORBA::SystemException)
+{
+ typename DATA_TYPE::_data_reader_type::_var_type state_dr =
+ DATA_TYPE::_data_reader_type::_narrow (reader);
+
+ if (CORBA::is_nil (state_dr.in ()))
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("on_data_available(): ")
+ ACE_TEXT ("DDSStateReaderListener_T::_narrow() failed.\n")));
+ }
+
+ typename DATA_TYPE::_seq_type state_samples;
+ DDS::SampleInfoSeq sis;
+
+ DDS::ReturnCode_t status =
+ state_dr->take (state_samples,
+ sis,
+ 1,
+ DDS::NOT_READ_SAMPLE_STATE,
+ DDS::ANY_VIEW_STATE,
+ DDS::ANY_INSTANCE_STATE);
+
+ if (status == DDS::RETCODE_OK)
+ {
+ if (state_samples.length () > 0)
+ {
+ DATA_TYPE state_sample = state_samples[0];
+ DDS::SampleInfo si = sis[0];
+/*
+ ACE_DEBUG ((LM_TRACE,
+ ACE_TEXT ("DDSStateReaderListener_T ")
+ ACE_TEXT ("sample-id %s\n"),
+ state_sample.id.in ()));
+*/
+ // Update the state only if it is not
+ // sent from within the same process.
+ if (id_.compare (state_sample.id) != 0)
+ {
+ // Put state information into an any
+ // and send it to the application.
+ CORBA::Any_var state (new CORBA::Any);
+
+ // Insert state value into the any.
+ *state <<= state_sample;
+
+ try
+ {
+ application_->set_state (state.in ());
+ }
+ catch (CORBA::SystemException & ex)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("on_data_available(): ")
+ ACE_TEXT ("could not send state information ")
+ ACE_TEXT ("to application: %s"),
+ ex._info ().c_str ()));
+ }
+ }
+ }
+ }
+ else if (status == DDS::RETCODE_NO_DATA)
+ {
+ /*
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("on_data_available(): ")
+ ACE_TEXT ("reader received DDS::RETCODE_NO_DATA.\n")));
+ */
+ }
+ else
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("on_data_available(): ")
+ ACE_TEXT ("reader error: %d.\n"), status));
+ }
+}
+
+template <typename DATA_TYPE>
+void
+DDSStateReaderListener_T<DATA_TYPE>::on_sample_lost (
+ DDS::DataReader_ptr,
+ const DDS::SampleLostStatus &)
+ throw (CORBA::SystemException)
+{
+ ACE_DEBUG ((LM_TRACE,
+ ACE_TEXT ("DDSStateReaderListener_T::")
+ ACE_TEXT ("on_sample_lost ()\n")));
+}
+
+#endif /* _DDS_STATE_READER_LISTENER_T_CPP_ */