/* * %CopyrightBegin% * * Copyright Ericsson AB 2004-2009. All Rights Reserved. * * The contents of this file are subject to the Erlang Public License, * Version 1.1, (the "License"); you may not use this file except in * compliance with the License. You should have received a copy of the * Erlang Public License along with this software. If not, it can be * retrieved online at http://www.erlang.org/. * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * %CopyrightEnd% * */ #include static int oe_send_tmo(CORBA_Environment *env, unsigned int ms); /* Client send message (Erlang distribution protocol) */ static int oe_send_tmo(CORBA_Environment *env, unsigned int ms) { if (strlen(env->_regname) == 0) { if (ei_send_encoded_tmo(env->_fd, env->_to_pid, env->_outbuf, env->_iout, ms) < 0) { /* XXX Cannot send to peer? */ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot connect to server"); return -1; } } else { if (ei_send_reg_encoded_tmo(env->_fd, env->_from_pid, env->_regname, env->_outbuf, env->_iout, ms) < 0) { /* XXX Cannot send to peer? */ CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, NO_RESPONSE, "Cannot connect to server"); return -1; } } return 0; } /* Send notification (gen_server client) */ int oe_send_notification_tmo(CORBA_Environment *env, unsigned int send_ms) { return oe_send_tmo(env, send_ms); } /* Send request and receive reply (gen_server client) */ int oe_send_request_and_receive_reply_tmo(CORBA_Environment *env, unsigned int send_ms, unsigned int recv_ms) { int msgType = 0; erlang_msg msg; if (oe_send_tmo(env, send_ms) < 0) return -1; do { if ((msgType = ei_receive_encoded_tmo(env->_fd, &env->_inbuf, &env->_inbufsz, &msg, &env->_iin, recv_ms)) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Cannot decode message"); return -1; } } while (msgType != ERL_SEND && msgType != ERL_REG_SEND); /* Extracting return message header */ if (oe_prepare_reply_decoding(env) < 0) { CORBA_exc_set(env, CORBA_SYSTEM_EXCEPTION, MARSHAL, "Bad message"); return -1; } return 0; } /* Server receive (possibly) send reply (gen_server server) */ int oe_server_receive_tmo(CORBA_Environment *env, oe_map_t *map, unsigned int send_ms, unsigned int recv_ms) { int res = 0, loop = 1; erlang_msg msg; while (res >= 0 && loop > 0) { res = ei_receive_encoded_tmo(env->_fd, &env->_inbuf, &env->_inbufsz, &msg, &env->_iin, recv_ms); switch(res) { case ERL_SEND: case ERL_REG_SEND: oe_exec_switch(NULL, env, map); switch(env->_major) { case CORBA_NO_EXCEPTION: break; case CORBA_SYSTEM_EXCEPTION: /* XXX stderr */ fprintf(stderr, "Request failure, reason : %s\n", (char *) CORBA_exception_value(env)); CORBA_exception_free(env); break; default: /* Should not happen */ CORBA_exception_free(env); break; } /* send reply */ /* XXX We are required to set env->_iout = 0 if oneway?? */ if (env->_iout > 0) ei_send_encoded_tmo(env->_fd, &env->_caller, env->_outbuf, env->_iout, send_ms); loop = 0; break; case ERL_TICK: break; default: /* XXX */ if (res < 0) { fprintf(stderr, "Result negative: %d\n", res); loop = 0; } break; } } return 0; }