4 * Created on: Jun 7, 2010
8 #include "BusClient.hh"
9 #include "BusMessageInternal.hh"
12 using namespace plpbus;
14 class OrbClientImpl : public virtual POA_plpbus_orb::OrbClient
17 IClientListener *listener;
19 OrbClientImpl(IClientListener *listener_param) {
20 listener = listener_param;
22 virtual ~OrbClientImpl() {}
24 virtual void receive_event_message(const char *event_param) {
25 if (listener != NULL) {
26 listener->event_received(event_param);
30 virtual void receive_event_dataitem_sequence(const ::plpbus_orb::DataItemSequence& event_param) {
31 BusMessageInternal *bus_msg;
33 if (listener != NULL) {
34 bus_msg = new BusMessageInternal(event_param);
35 listener->event_received(bus_msg);
39 virtual void receive_response_message(const char *msg_rsp_param) {
40 if (listener != NULL) {
41 listener->response_received(msg_rsp_param);
45 virtual void receive_response_dataitem_sequence(const ::plpbus_orb::DataItemSequence& msg_rsp_param) {
46 BusMessageInternal *bus_msg;
48 if (listener != NULL) {
49 bus_msg = new BusMessageInternal(msg_rsp_param);
50 listener->response_received(bus_msg);
55 BusClient::BusClient()
57 cout << "created" << endl;
62 BusClient::~BusClient()
68 cout << "destroyed" << endl;
71 int BusClient::init(const char *server_name) {
74 CORBA::Object_var server_obj;
78 cout << "init() started" << endl;
79 _orb = CORBA::ORB_init(argc, argv);
81 cout << "ORB_init() done, finding server: " << server_name << endl;
82 server_obj = find_server_object_by_name(_orb,
83 CONST_CONTEXT_NAME__PLPBUS,
84 CONST_CONTEXT_KIND__PLPBUS,
86 CONST_CONTEXT_NAME__PLPBUS);
87 if (CORBA::is_nil(server_obj) == false) {
88 _server = plpbus_orb::OrbServer::_narrow(server_obj);
89 cout << "Server object found: " << server_name << endl;
92 cerr << "Could not find server object: " << server_name << endl;
98 int BusClient::add_client_listener(IClientListener *listener_param) {
99 cout << "add_client_listener() started" << endl;
101 OrbClientImpl *client_cb;
102 PortableServer::ObjectId_var oid;
104 cout << "register_callback() 1" << endl;
105 _poa = create_poa(_orb);
106 client_cb = new OrbClientImpl(listener_param);
107 oid = _poa->activate_object(client_cb);
108 _client = client_cb->_this();
109 client_cb->_remove_ref();
110 _server->add_event_listener(_client, "event_message", CONST_DEFAULT_EVENT_INTERVAL);
112 cout << "add_client_listener() done" << endl;
116 int BusClient::send_message_and_request_response(const char *msg_req_param) {
117 _server->send_message_and_request_response(_client, msg_req_param);
121 int BusClient::send_message_and_wait_response(const char *msg_req_param, char **msg_rsp_param) {
124 *msg_rsp_param = _server->send_message_and_wait_response(msg_req_param, ret_val);
128 int BusClient::send_message_and_request_response(BusMessage *msg_req_param) {
129 _server->send_dataitem_message_and_request_response(_client, msg_req_param->_dataItemSeq);
133 int BusClient::send_message_and_wait_response(BusMessage *msg_req_param, BusMessage **msg_rsp_param) {
134 plpbus_orb::DataItemSequence *seq_rsp;
137 _server->send_dataitem_message_and_wait_response(msg_req_param->_dataItemSeq, seq_rsp);
140 void BusClient::request_shutdown() {
141 if (CORBA::is_nil(_server) == false) {
146 PortableServer::POA_var BusClient::create_poa(CORBA::ORB_var orb) {
147 PortableServer::POA_var ret_val;
148 CORBA::Object_var poa_obj;
149 CORBA::PolicyList policy_list;
150 CORBA::Any policyVal;
151 PortableServer::POAManager_var poa_man;
152 PortableServer::POA_var rootpoa;
155 poa_obj = orb->resolve_initial_references(CONST_ROOT_POA_NAME);
156 if (poa_obj != NULL) {
157 rootpoa = PortableServer::POA::_narrow(poa_obj);
158 if (rootpoa != NULL) {
159 poa_man = rootpoa->the_POAManager();
160 if (poa_man != NULL) {
162 // bidirectional policy
163 policy_list.length(1);
164 policyVal <<= BiDirPolicy::BOTH;
165 policy_list[0] = orb->create_policy(BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE, policyVal);
166 ret_val = rootpoa->create_POA(CONST_ROOT_POA_BIDIR_POLICY_NAME,
173 cerr << "Failed to create RootPOA." << endl;
178 CosNaming::NamingContext_var BusClient::get_name_service_context(CORBA::ORB_var orb_param) {
179 CORBA::Object_var ns_obj;
180 CosNaming::NamingContext_var ret_val;
184 ns_obj = orb_param->resolve_initial_references(CONST_NAME_SERVICE_NAME);
185 if (CORBA::is_nil(ns_obj) == false) {
186 // narrow the object reference
187 ret_val = CosNaming::NamingContext::_narrow(ns_obj);
190 catch (CORBA::ORB::InvalidName&) {
191 // This should not happen!
192 cerr << "Could not find name service." << endl;
194 catch(CORBA::TRANSIENT& ex) {
195 cerr << "Could not find name service, verify that name service is running. " << endl;
197 catch (CORBA::NO_RESOURCES&) {
198 cerr << "Could not find name service, verify that name service is running. " << endl;
200 catch(CORBA::SystemException& ex) {
201 cerr << "Could not find name service, unknown reason. " << endl;
206 CORBA::Object_var BusClient::find_server_object_by_name(CORBA::ORB_var orb_param,
207 const char *leaf_name_param,
208 const char *leaf_kind_param,
209 const char *service_name_param,
210 const char *service_kind_param)
212 CORBA::Object_var ret_val;
213 CosNaming::NamingContext_var ns_root_context;
214 CosNaming::Name service_data;
216 ret_val = CORBA::Object::_nil();
217 ns_root_context = get_name_service_context(orb_param);
218 if (CORBA::is_nil(ns_root_context) == false) {
219 // define search criteria
220 service_data.length(2);
221 service_data[0].id = leaf_name_param;
222 service_data[0].kind = leaf_kind_param;
223 service_data[1].id = service_name_param;
224 service_data[1].kind = service_kind_param;
226 ret_val = ns_root_context->resolve(service_data);
228 catch(CosNaming::NamingContext::NotFound& ex) {
229 cerr << "Could not find service from the name server. " << endl;
231 catch(CORBA::TRANSIENT& ex) {
232 cerr << "Could not find service from the name server. " << endl;
234 catch(CORBA::SystemException& ex) {
235 cerr << "Could not find service from the name server, unknown error." << endl;
239 cerr << "Could not find naming service. " << endl;