summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/CosEvent/ProxyPushSupplier_i.cpp
blob: 5465a53db85c18dfd768cce332c7d245d8cd726b (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
107
108
109
110
111
112
113
114
115
116
117
118
119
// $Id$
//
#include "orbsvcs/RtecEventChannelAdminC.h"
#include "orbsvcs/CosEventChannelAdminC.h"
#include "orbsvcs/CosEventChannelAdminS.h"
#include "orbsvcs/CosEventCommS.h"
#include "orbsvcs/RtecEventCommS.h"
#include "CosEvent/ProxyPushSupplier_i.h"

class PushConsumerWrapper : public POA_RtecEventComm::PushConsumer
{
  // = TITLE
  //   Wrapper class for the Rtec PushConsumer.
  // = DESCRIPTION
  //   The Rtec ProxyPushSupplier uses a Rtec PushConsumer.
  //   This class wraps the Cos PushConsumer to make it look like a Rtec PushConsumer.
public:
  // = Initialization and termination methods.
  PushConsumerWrapper (CosEventComm::PushConsumer_ptr consumer);
  ~PushConsumerWrapper ();

  virtual void push (const RtecEventComm::EventSet & data,
                     CORBA::Environment &TAO_TRY_ENV);

  virtual void disconnect_push_consumer (CORBA::Environment &TAO_TRY_ENV);
private:
  CosEventComm::PushConsumer_ptr consumer_;
  // The Cos PushConsumer that we're proxying for.
};

PushConsumerWrapper::PushConsumerWrapper
(CosEventComm::PushConsumer_ptr consumer)
    : consumer_ (CosEventComm::PushConsumer::_duplicate (consumer))
{
}

PushConsumerWrapper::~PushConsumerWrapper ()
{
  CORBA::release (this->consumer_);
}

void
PushConsumerWrapper::push (const RtecEventComm::EventSet& set,
                           CORBA::Environment &_env)
{
  for (CORBA::ULong i = 0; i < set.length (); ++i)
    {
      this->consumer_->push (set[i].data.any_value,
                             _env);
    }
}

void
PushConsumerWrapper::disconnect_push_consumer (CORBA::Environment &TAO_TRY_ENV)
{
  this->consumer_->disconnect_push_consumer (TAO_TRY_ENV);
 // Deactivate the supplier proxy
  PortableServer::POA_var poa =
    this->_default_POA (TAO_TRY_ENV);

  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  PortableServer::ObjectId_var id =
    poa->servant_to_id (this, TAO_TRY_ENV);
  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  poa->deactivate_object (id.in (), TAO_TRY_ENV);
  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  // @@ If we keep a list remember to remove this object from the list.
  delete this;
}


ProxyPushSupplier_i::ProxyPushSupplier_i
(const RtecEventChannelAdmin::ConsumerQOS &qos,
RtecEventChannelAdmin::ProxyPushSupplier_ptr pps)
  : qos_ (qos),
    pps_ (pps)
{
}

ProxyPushSupplier_i::~ProxyPushSupplier_i ()
{
}

void
ProxyPushSupplier_i::disconnect_push_supplier (CORBA::Environment &TAO_TRY_ENV)
{
  this->pps_->disconnect_push_supplier (TAO_TRY_ENV);
  // @@ Maybe we should do a "delete this" here? And consider POA deactivation...

  // Deactivate the supplier proxy
  PortableServer::POA_var poa =
    this->_default_POA (TAO_TRY_ENV);

  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  PortableServer::ObjectId_var id =
    poa->servant_to_id (this, TAO_TRY_ENV);
  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  poa->deactivate_object (id.in (), TAO_TRY_ENV);
  TAO_CHECK_ENV_RETURN_VOID (TAO_TRY_ENV);

  // @@ If we keep a list remember to remove this object from the list.
  delete this;
}

void ProxyPushSupplier_i::connect_push_consumer(
CosEventComm::PushConsumer_ptr push_consumer, CORBA::Environment &TAO_TRY_ENV)
{
 // Implements the RtecEventConsumer interface
  PushConsumerWrapper *wrapper = new PushConsumerWrapper(push_consumer);

  this->pps_->connect_push_consumer (wrapper->_this (TAO_TRY_ENV),
                                     this->qos_,
                                     TAO_TRY_ENV);
}