2 #include "ace/Reactor.h"
3 #include "tao/RTPortableServer/RTPortableServer.h"
4 #include "tao/ORB_Core.h"
5 #include "tao/Utils/PolicyList_Destroyer.h"
9 #include "Stock_PriorityMapping.h"
10 #include "Stock_Database.h"
12 // Implementation skeleton constructor
13 Stock_StockBroker_i::Stock_StockBroker_i (CORBA::ORB_ptr orb
,
14 Stock::StockDistributor_ptr dist
,
15 const char *stock_name
)
16 : orb_ (CORBA::ORB::_duplicate (orb
)),
17 quoter_ (Stock::StockQuoter::_nil()),
19 distributor_ (Stock::StockDistributor::_duplicate (dist
))
21 // Get a reference to the <RTORB>.
22 CORBA::Object_var obj
= orb
->resolve_initial_references ("RTORB");
23 RTCORBA::RTORB_var rt_orb
= RTCORBA::RTORB::_narrow (obj
.in ());
25 // Create a <CORBA::PolicyList> for the child POA.
26 TAO::Utils::PolicyList_Destroyer
consumer_policies (1);
27 consumer_policies
.length (1);
29 // Create a <CLIENT_PROPAGATED> priority model policy.
30 consumer_policies
[0] =
31 rt_orb
->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED
,
32 Stock::Priority_Mapping::MEDIUM
);
34 PortableServer::POA_var poa
= this->_default_POA ();
35 PortableServer::POAManager_var poa_mgr
= poa
->the_POAManager ();
37 // Create a child POA with CLIENT_PROPAGATED policies. The name of
38 // the POA will be <StockNameConsumer_POA>. Instances of the
39 // Stock_StockNameConsumer_i will be activated under this POA.
40 PortableServer::POA_var child_poa
=
41 poa
->create_POA ("StockNameConsumer_POA",
45 // Narrow the POA to a <RTPortableServer::POA>.
46 RTPortableServer::POA_var rt_poa
=
47 RTPortableServer::POA::_narrow (child_poa
.in ());
49 // Create and activate the <consumer_>.
51 new Stock_StockNameConsumer_i (*this, stock_name
);
52 PortableServer::ServantBase_var nameconsumer_owner_transfer
=
54 rt_poa
->activate_object (this->consumer_
);
57 // Implementation skeleton destructor
58 Stock_StockBroker_i::~Stock_StockBroker_i ()
62 ::Stock::StockNameConsumer_ptr
Stock_StockBroker_i::get_consumer_notifier ()
64 Stock::StockNameConsumer_var consumer
= this->consumer_
->_this ();
65 return consumer
._retn();
68 void Stock_StockBroker_i::connect_quoter_info (::Stock::StockQuoter_ptr c
)
70 this->quoter_
= Stock::StockQuoter::_duplicate (c
);
73 ::Stock::StockQuoter_ptr
Stock_StockBroker_i::disconnect_quoter_info ()
75 Stock::StockQuoter_var old_quoter
= this->quoter_
;
76 this->quoter_
= Stock::StockQuoter::_nil();
77 return old_quoter
._retn ();
80 ::Stock::StockQuoter_ptr
Stock_StockBroker_i::get_connection_quoter_info ()
82 return Stock::StockQuoter::_duplicate (this->quoter_
.in ());
86 Stock_StockBroker_i::shutdown ()
89 ACE_DEBUG ((LM_DEBUG
, "Shutdown unsubscribing notifiers\n"));
90 this->distributor_
->unsubscribe_notifier
91 (this->consumer_
->cookie_ ());
93 ACE_DEBUG ((LM_DEBUG
, "Shutdown deactivating object\n"));
94 ::Stock::StockBroker_var broker
= this->_this ();
95 PortableServer::ObjectId_var oid
=
96 this->_default_POA ()->reference_to_id (broker
.in ());
98 this->_default_POA ()->deactivate_object (oid
.in ());
101 // Implementation skeleton constructor
102 Stock_StockBrokerHome_i::Stock_StockBrokerHome_i (CORBA::ORB_ptr orb
)
104 orb_ (CORBA::ORB::_duplicate (orb
))
106 // Register the necessary factories and mappings with the specified
107 // <orb>. If we neglect to perform these registrations then the app
109 Stock::StockNames_init
*stockname_factory
=
110 new Stock::StockNames_init
;
111 orb
->register_value_factory (stockname_factory
->tao_repository_id (),
114 Stock::Cookie_init
*cookie_factory
=
115 new Stock::Cookie_init
;
116 orb
->register_value_factory (cookie_factory
->tao_repository_id (),
119 Stock::Priority_Mapping::register_mapping (orb
);
121 // Register this class as an event handler with the ORB to catch
122 // ctrl-c from the command line.
123 if (orb_
->orb_core ()->reactor ()->register_handler (SIGINT
, this) == -1)
124 ACE_DEBUG ((LM_DEBUG
, "ERROR: Failed to register as a signal handler: %p\n",
125 "register_handler\n"));
128 // Implementation skeleton destructor
129 Stock_StockBrokerHome_i::~Stock_StockBrokerHome_i ()
133 ::Stock::StockBroker_ptr
134 Stock_StockBrokerHome_i::create (Stock::StockDistributor_ptr dist
,
135 const char *stock_name
)
137 if (CORBA::is_nil (this->broker_
.in ()))
139 // Since the broker has nothing to do with any of the RTCORBA
140 // mechanisms, we can activate it under the <default_POA>, which
142 Stock_StockBroker_i
*broker
=
143 new Stock_StockBroker_i (orb_
.in (), dist
, stock_name
);
144 PortableServer::ServantBase_var owner_transfer
146 this->broker_
= broker
->_this ();
149 return Stock::StockBroker::_duplicate (this->broker_
.in ());
153 Stock_StockBrokerHome_i::handle_signal (int,
157 ACE_DEBUG ((LM_DEBUG
, "Disconnecting all brokers..\n"));
159 this->broker_
->shutdown ();
161 ACE_DEBUG ((LM_DEBUG
, "Shutting down the ORB\n"));
163 this->orb_
->shutdown (false);