4 * Created on: Jun 7, 2010
10 #include <plp/retval.h>
12 #include "BusClient.hh"
13 #include "ClientServerCommon.hh"
14 #include "BusMessageInternal.hh"
15 #include "RequestResponseBus.hh"
18 using namespace plpbus;
19 using namespace plpbus_orb;
21 class OrbClientImpl : public virtual POA_plpbus_orb::OrbClient {
23 IClientListener *listener;
25 OrbClientImpl(IClientListener *listener_param) {
26 listener = listener_param;
28 virtual ~OrbClientImpl() {}
30 virtual void receive_event_message(const char *event_param) {
31 if (listener != NULL) {
32 listener->event_received(event_param);
36 virtual void receive_event_dataitem_sequence(const ::plpbus_orb::DataItemSequence& event_param) {
37 BusMessageInternal *bus_msg;
39 if (listener != NULL) {
40 bus_msg = new BusMessageInternal(event_param);
41 listener->event_received(bus_msg);
45 virtual void receive_response_message(const char *msg_rsp_param) {
46 if (listener != NULL) {
47 listener->response_received(msg_rsp_param);
51 virtual void receive_response_dataitem_sequence(const ::plpbus_orb::DataItemSequence& msg_rsp_param) {
52 const BusMessageInternal *bus_msg;
54 if (listener != NULL) {
55 bus_msg = new BusMessageInternal(msg_rsp_param);
56 listener->response_received(bus_msg);
62 BusClient::BusClient()
64 log_debug("created\n");;
69 BusClient::~BusClient()
72 //_poa->destroy(true, true);
78 log_debug("destroyed\n");
81 int BusClient::init(const char *server_name) {
84 CORBA::Object_var server_obj;
90 log_info("CORBA client init() started\n");
91 _orb = CORBA::ORB_init(argc, argv);
92 if (CORBA::is_nil(_orb) == false) {
93 log_debug("ORB_init() done, finding server: %s\n", server_name);
94 server_obj = find_server_object_by_name(_orb,
95 CONST_CONTEXT_NAME__PLPBUS,
96 CONST_CONTEXT_KIND__PLPBUS,
98 CONST_CONTEXT_NAME__PLPBUS);
99 if (CORBA::is_nil(server_obj) == false) {
100 _server = plpbus_orb::OrbServer::_narrow(server_obj);
101 if (CORBA::is_nil(_server) == false) {
102 log_info("CORBA service found: %s", server_name);
107 log_error("Could not find CORBA service: %s\n", server_name);
111 log_error("Could not init CORBA client\n");
116 int BusClient::add_client_listener(IClientListener *listener_param) {
117 log_debug("add_client_listener() started\n");
119 OrbClientImpl *client_cb;
120 PortableServer::ObjectId_var oid;
122 _poa = create_poa(_orb);
123 client_cb = new OrbClientImpl(listener_param);
124 oid = _poa->activate_object(client_cb);
125 _client = client_cb->_this();
126 client_cb->_remove_ref();
127 _server->add_event_listener(_client, "event_message", CONST_DEFAULT_EVENT_INTERVAL);
129 log_debug("add_client_listener() done\n");
133 int BusClient::send_message_and_request_response(const char *msg_req_param) {
134 _server->send_message_and_request_response(_client, msg_req_param);
138 int BusClient::send_message_and_wait_response(const char *msg_req_param, char **msg_rsp_param) {
142 rsp = _server->send_message_and_wait_response(msg_req_param, ret_val);
143 *msg_rsp_param = strdup(rsp);
144 CORBA::string_free(rsp);
148 int BusClient::send_message_and_request_response(const BusMessage *msg_req_param) {
149 DataItemSequence *seq;
151 seq = (DataItemSequence *)msg_req_param->_dataItemSeq;
152 _server->send_dataitem_message_and_request_response(_client, *seq);
156 int BusClient::send_message_and_wait_response(const BusMessage *msg_req_param, BusMessage **msg_rsp_param) {
157 DataItemSequence *seq_rsp;
158 DataItemSequence *seq;
161 seq = (DataItemSequence *)msg_req_param->_dataItemSeq;
162 _server->send_dataitem_message_and_wait_response(*seq, seq_rsp);
163 *msg_rsp_param = new BusMessageInternal(*seq_rsp);
167 void BusClient::request_shutdown() {
168 if (CORBA::is_nil(_server) == false) {
173 PortableServer::POA_var BusClient::create_poa(CORBA::ORB_var orb) {
174 PortableServer::POA_var ret_val;
175 CORBA::Object_var poa_obj;
176 CORBA::PolicyList policy_list;
177 CORBA::Any policyVal;
178 PortableServer::POAManager_var poa_man;
179 PortableServer::POA_var rootpoa;
182 poa_obj = orb->resolve_initial_references(CONST_ROOT_POA_NAME);
183 if (poa_obj != NULL) {
184 rootpoa = PortableServer::POA::_narrow(poa_obj);
185 if (rootpoa != NULL) {
186 poa_man = rootpoa->the_POAManager();
187 if (poa_man != NULL) {
189 // bidirectional policy
190 policy_list.length(1);
191 policyVal <<= BiDirPolicy::BOTH;
192 policy_list[0] = orb->create_policy(BiDirPolicy::BIDIRECTIONAL_POLICY_TYPE, policyVal);
193 ret_val = rootpoa->create_POA(CONST_ROOT_POA_BIDIR_POLICY_NAME,
200 cerr << "Failed to create RootPOA." << endl;
205 CosNaming::NamingContext_var BusClient::get_name_service_context(CORBA::ORB_var orb_param,
206 const char *nameservice_name_param) {
207 CORBA::Object_var ns_obj;
208 CosNaming::NamingContext_var ret_val;
212 ns_obj = orb_param->resolve_initial_references(nameservice_name_param);
213 if (CORBA::is_nil(ns_obj) == false) {
214 // narrow the object reference
215 ret_val = CosNaming::NamingContext::_narrow(ns_obj);
218 catch (CORBA::ORB::InvalidName&) {
219 // This should not happen!
220 cerr << "Could not find name service." << endl;
222 catch(CORBA::TRANSIENT& ex) {
223 cerr << "Could not find name service, verify that name service is running. " << endl;
225 catch (CORBA::NO_RESOURCES&) {
226 cerr << "Could not find name service, verify that name service is running. " << endl;
228 catch(CORBA::SystemException& ex) {
229 cerr << "Could not find name service, unknown reason. " << endl;
234 CORBA::Object_var BusClient::find_server_object_by_name(CORBA::ORB_var orb_param,
235 const char *leaf_name_param,
236 const char *leaf_kind_param,
237 const char *service_name_param,
238 const char *service_kind_param)
240 CORBA::Object_var ret_val;
241 CosNaming::NamingContext_var ns_root_context;
242 CosNaming::Name service_data;
245 ret_val = CORBA::Object::_nil();
246 n = strdup(CONST_NAME_SERVICE_NAME);
247 ns_root_context = get_name_service_context(orb_param, n);
249 if (CORBA::is_nil(ns_root_context) == false) {
250 // define search criteria
251 service_data.length(2);
252 service_data[0].id = leaf_name_param;
253 service_data[0].kind = leaf_kind_param;
254 service_data[1].id = service_name_param;
255 service_data[1].kind = service_kind_param;
257 ret_val = ns_root_context->resolve(service_data);
259 catch(CosNaming::NamingContext::NotFound& ex) {
260 log_error("Could not find service from the name server.\n");
262 catch(CORBA::TRANSIENT& ex) {
263 log_error("Could not find service from the name server.\n");
265 catch(CORBA::SystemException& ex) {
266 log_error("Could not find service from the name server, unknown error.\n");
270 log_error("Could not find naming service.\n");