summaryrefslogtreecommitdiff
path: root/CIAO/connectors/dds4ccm/impl/Reader_T.h
blob: b26e795901210c11f1b139b9b5c5b6b8baddab4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/**
 * @author William R. Otte <wotte@dre.vanderbilt.edu>
 * @author Johnny Willemsen (jwillemsen@remedy.nl)
 *
 * $Id$
 *
 * Wrapper facade for NDDS.
 */
#ifndef READER_T_H_
#define READER_T_H_

#include "dds4ccm/idl/ccm_ddsC.h"
#include "ace/Copy_Disabled.h"
#include "dds4ccm/impl/dds4ccm_conf.h"
#include "dds4ccm/impl/LocalObject.h"

namespace CIAO
{
  namespace DDS4CCM
  {
    class ConditionManager;

    template <typename READER_TYPE, typename TYPED_DDS_READER, typename VALUE_TYPE, typename SEQ_VALUE_TYPE>
    class Reader_T :
        public virtual READER_TYPE,
        public virtual LocalObject,
        private virtual ACE_Copy_Disabled
    {
    public:
      /// Constructor
      Reader_T (void);

      /// Destructor
      virtual ~Reader_T (void);

      virtual void read_last (
        SEQ_VALUE_TYPE& instances,
        ::CCM_DDS::ReadInfoSeq& infos);

      virtual void read_all (
        SEQ_VALUE_TYPE& instances,
        ::CCM_DDS::ReadInfoSeq& infos);

      virtual void read_one_last (
        VALUE_TYPE& an_instance,
        ::CCM_DDS::ReadInfo_out info,
        DDS_INSTANCE_HANDLE_T_IN instance_handle);

      virtual void read_one_all (
        const VALUE_TYPE& an_instance,
        SEQ_VALUE_TYPE& instances,
        ::CCM_DDS::ReadInfoSeq& infos,
        DDS_INSTANCE_HANDLE_T_IN instance_handle);

      virtual ::CCM_DDS::QueryFilter *query (void);

      virtual void query (const ::CCM_DDS::QueryFilter & filter);

      void set_dds_reader (::DDS::DataReader_ptr dr,
                              ::CIAO::DDS4CCM::ConditionManager * condition_manager);

      ::DDS::DataReader_ptr get_dds_reader (void);

    private:
      typename TYPED_DDS_READER::_var_type dds_reader_;
      ::CIAO::DDS4CCM::ConditionManager * condition_manager_;

      typename TYPED_DDS_READER::_ptr_type dds_reader (void);

      // Helper methods
      ::CORBA::ULong get_nr_valid_samples (
        const ::DDS::SampleInfoSeq& sample_infos,
        const bool determine_last);

      ::DDS::InstanceHandle_t check_handle (
        const VALUE_TYPE& an_instance,
        DDS_INSTANCE_HANDLE_T_IN instance_handle);

      void convert_data (
        const SEQ_VALUE_TYPE& all_data,
        SEQ_VALUE_TYPE& data_to_return,
        ::CCM_DDS::ReadInfoSeq& infos,
        const ::DDS::SampleInfoSeq & sample_info);

      void read_wo_instance (
        SEQ_VALUE_TYPE& data,
        ::DDS::SampleInfoSeq & sample_info,
        ::DDS::QueryCondition_ptr qc);

      void read_w_instance (
        SEQ_VALUE_TYPE& data,
        ::DDS::SampleInfoSeq & sample_info,
        DDS_INSTANCE_HANDLE_T_IN lookup_hnd);

      void return_loan (
        SEQ_VALUE_TYPE& data,
        ::DDS::SampleInfoSeq sample_info,
        bool throw_exception=true);
    };
  }
}

#include "dds4ccm/impl/Reader_T.cpp"

#endif /* READER_T_H_ */