Merge pull request #1844 from jrw972/monterey
[ACE_TAO.git] / TAO / docs / tutorials / Quoter / RTCORBA / Broker_i.cpp
blob8f582cda86689abea42420fd72cf45191d7ce70a
1 // ACE+TAO headers
2 #include "ace/Reactor.h"
3 #include "tao/RTPortableServer/RTPortableServer.h"
4 #include "tao/ORB_Core.h"
5 #include "tao/Utils/PolicyList_Destroyer.h"
7 // local headers
8 #include "Broker_i.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()),
18 consumer_ (0),
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",
42 poa_mgr. in(),
43 consumer_policies);
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_>.
50 this->consumer_ =
51 new Stock_StockNameConsumer_i (*this, stock_name);
52 PortableServer::ServantBase_var nameconsumer_owner_transfer =
53 this->consumer_;
54 rt_poa->activate_object (this->consumer_);
57 // Implementation skeleton destructor
58 Stock_StockBroker_i::~Stock_StockBroker_i (void)
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 ());
85 void
86 Stock_StockBroker_i::shutdown (void)
88 // Unsubscribe
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)
103 : broker_ (0),
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
108 // will not execute.
109 Stock::StockNames_init *stockname_factory =
110 new Stock::StockNames_init;
111 orb->register_value_factory (stockname_factory->tao_repository_id (),
112 stockname_factory);
114 Stock::Cookie_init *cookie_factory =
115 new Stock::Cookie_init;
116 orb->register_value_factory (cookie_factory->tao_repository_id (),
117 cookie_factory);
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 (void)
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
141 // is the <RootPOA>.
142 Stock_StockBroker_i *broker =
143 new Stock_StockBroker_i (orb_.in (), dist, stock_name);
144 PortableServer::ServantBase_var owner_transfer
145 = broker;
146 this->broker_ = broker->_this ();
149 return Stock::StockBroker::_duplicate (this->broker_.in ());
153 Stock_StockBrokerHome_i::handle_signal (int,
154 siginfo_t *,
155 ucontext_t *)
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 (0);
165 return 0;