summaryrefslogtreecommitdiff
path: root/ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp')
-rw-r--r--ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp b/ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp
new file mode 100644
index 00000000000..a068e675c94
--- /dev/null
+++ b/ACE/TAO/CIAO/connectors/dds4ccm/impl/ndds/DataReaderHandler_T.cpp
@@ -0,0 +1,56 @@
+// $Id$
+
+#include "dds4ccm/impl/ndds/Utils.h"
+
+#include "dds4ccm/impl/ndds/DataReader.h"
+#include "ciao/Logger/Log_Macros.h"
+
+
+template <typename DDS_TYPE, typename CCM_TYPE>
+CIAO::DDS4CCM::RTI::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::DataReaderHandler_T (
+ typename CCM_TYPE::listener_type::_ptr_type listener,
+ typename DDS_TYPE::data_reader * reader)
+ : reader_ (reader),
+ listener_ (CCM_TYPE::listener_type::_duplicate (listener))
+{
+}
+
+template <typename DDS_TYPE, typename CCM_TYPE>
+CIAO::DDS4CCM::RTI::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::~DataReaderHandler_T (void)
+{
+}
+
+template <typename DDS_TYPE, typename CCM_TYPE>
+int
+CIAO::DDS4CCM::RTI::DataReaderHandler_T<DDS_TYPE, CCM_TYPE>::handle_exception (ACE_HANDLE)
+{
+ try
+ {
+ // Loop until there are messages available in the queue
+ for(;;)
+ {
+ typename DDS_TYPE::value_type instance;
+ ::DDS_SampleInfo sampleinfo;
+ ::DDS::ReturnCode_t const result = this->reader_->take_next_sample(instance,
+ sampleinfo);
+ if (result == DDS_RETCODE_NO_DATA)
+ break;
+ else if (result != DDS_RETCODE_OK)
+ {
+ CIAO_ERROR (1, (LM_ERROR, ACE_TEXT ("Unable to take data from data reader, error %d.\n"), result));
+ return 1;
+ }
+ if (sampleinfo.valid_data)
+ {
+ CIAO_DEBUG (6, (LM_DEBUG, ACE_TEXT ("DataReaderHandler_T : found valid data\n")));
+ ::CCM_DDS::ReadInfo readinfo;
+ readinfo <<= sampleinfo;
+ listener_->on_one_data (instance, readinfo);
+ }
+ }
+ }
+ catch (...)
+ {
+ }
+ return 0;
+}