static GIOPConnection * do_demarshal (CV *cv, I32 ax, I32 items, CORBA_InterfaceDef_FullInterfaceDescription *desc, I32 index, GPtrArray *return_types, guint *return_count, CORBA_Object obj, GIOPConnection *connection, GIOP_unsigned_long request_id) { GIOPRecvBuffer *recv_buffer; SV *error_sv = NULL; SV **results = NULL; CORBA_unsigned_long i; CORBA_OperationDescription *opr = NULL; dTHR; if (index >= PORBIT_OPERATION_BASE && index < PORBIT_GETTER_BASE) opr = &desc->operations._buffer[index-PORBIT_OPERATION_BASE]; recv_buffer = giop_recv_reply_buffer_use_2(connection, request_id, TRUE); if (!recv_buffer) { error_sv = porbit_system_except ("IDL:omg.org/CORBA/COMM_FAILURE:1.0", 0, CORBA_COMPLETED_MAYBE); goto exception; } if (recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (obj->forward_locations != NULL) ORBit_delete_profiles(obj->forward_locations); obj->forward_locations = ORBit_demarshal_IOR(recv_buffer); connection = ORBit_object_get_forwarded_connection(obj); giop_recv_buffer_unuse(recv_buffer); return connection; } else if (recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) { error_sv = porbit_get_exception (recv_buffer, NULL, recv_buffer->message.u.reply.reply_status, opr); if (!error_sv) error_sv = porbit_system_except ("IDL:omg.org/CORBA/MARSHAL:1.0", 0, CORBA_COMPLETED_YES); goto exception; } /* Demarshal return parameters */ results = g_new0 (SV *, return_types->len); for (i=0; i<return_types->len; i++) { results[i] = porbit_get_sv (recv_buffer, return_types->pdata[i]); if (!results[i]) { warn ("Error demarshalling result"); error_sv = porbit_system_except ("IDL:omg.org/CORBA/MARSHAL:1.0", 0, CORBA_COMPLETED_YES); goto exception; } } if (index >= PORBIT_OPERATION_BASE && index < PORBIT_GETTER_BASE) { CORBA_unsigned_long i, st_index, ret_index; /* First write back INOUT parameters into their references. * (Is this safe? If we end up calling back to perl, could the * stack already be overridden?) */ st_index = 1; ret_index = (opr->result->kind == CORBA_tk_void) ? 0 : 1; for (i = 0 ; i<opr->parameters._length; i++) { switch (opr->parameters._buffer[i].mode) { case CORBA_PARAM_IN: st_index++; break; case CORBA_PARAM_INOUT: sv_setsv (SvRV(ST(st_index)), results[ret_index]); st_index++; ret_index++; break; case CORBA_PARAM_OUT: ret_index++; break; } } /* Now write out return value and OUT parameters to stack */ st_index = 0; ret_index = 0; if (opr->result->kind != CORBA_tk_void) { ST(st_index) = sv_2mortal(results[0]); st_index++; ret_index++; } for (i = 0 ; i<opr->parameters._length; i++) { switch (opr->parameters._buffer[i].mode) { case CORBA_PARAM_IN: break; case CORBA_PARAM_INOUT: ret_index++; break; case CORBA_PARAM_OUT: ST(st_index) = sv_2mortal (results[ret_index]); st_index++; ret_index++; break; } } *return_count = st_index; } else if (index >= PORBIT_GETTER_BASE && index < PORBIT_SETTER_BASE) { ST(0) = sv_2mortal(results[0]); } g_free (results); results = NULL; exception: if (results) { for (i=0; i < return_types->len; i++) if (results[i]) SvREFCNT_dec (results[i]); g_free (results); } g_ptr_array_free (return_types, TRUE); giop_recv_buffer_unuse(recv_buffer); if (error_sv) porbit_throw (error_sv); return NULL; }
Account factory_newAccount(factory _obj, const CORBA_unsigned_long balance, CORBA_Environment * ev) { register GIOP_unsigned_long _ORBIT_request_id, _ORBIT_system_exception_minor; register CORBA_completion_status _ORBIT_completion_status; register GIOPSendBuffer *_ORBIT_send_buffer; register GIOPRecvBuffer *_ORBIT_recv_buffer; register GIOPConnection *_cnx; Account _ORBIT_retval; if (_obj->servant && _obj->vepv && factory__classid) { _ORBIT_retval = ((POA_factory__epv *) _obj->vepv[factory__classid])-> newAccount(_obj->servant, balance, ev); return _ORBIT_retval; } _cnx = ORBit_object_get_connection(_obj); _ORBIT_retry_request: _ORBIT_send_buffer = NULL; _ORBIT_recv_buffer = NULL; _ORBIT_completion_status = CORBA_COMPLETED_NO; _ORBIT_request_id = GPOINTER_TO_UINT(alloca(0)); { /* marshalling */ static const struct { CORBA_unsigned_long len; char opname[11]; } _ORBIT_operation_name_data = { 11, "newAccount"}; static const struct iovec _ORBIT_operation_vec = { (gpointer) & _ORBIT_operation_name_data, 15 }; _ORBIT_send_buffer = giop_send_request_buffer_use(_cnx, NULL, _ORBIT_request_id, CORBA_TRUE, &(_obj->active_profile->object_key_vec), &_ORBIT_operation_vec, &ORBit_default_principal_iovec); _ORBIT_system_exception_minor = ex_CORBA_COMM_FAILURE; if (!_ORBIT_send_buffer) goto _ORBIT_system_exception; giop_message_buffer_do_alignment(GIOP_MESSAGE_BUFFER (_ORBIT_send_buffer), 4); giop_message_buffer_append_mem(GIOP_MESSAGE_BUFFER(_ORBIT_send_buffer), &(balance), sizeof(balance)); giop_send_buffer_write(_ORBIT_send_buffer); _ORBIT_completion_status = CORBA_COMPLETED_MAYBE; giop_send_buffer_unuse(_ORBIT_send_buffer); _ORBIT_send_buffer = NULL; } { /* demarshalling */ register guchar *_ORBIT_curptr; _ORBIT_recv_buffer = giop_recv_reply_buffer_use_2(_cnx, _ORBIT_request_id, TRUE); if (!_ORBIT_recv_buffer) goto _ORBIT_system_exception; _ORBIT_completion_status = CORBA_COMPLETED_YES; if (_ORBIT_recv_buffer->message.u.reply.reply_status != GIOP_NO_EXCEPTION) goto _ORBIT_msg_exception; _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; if (giop_msg_conversion_needed(GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer))) { GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr; _ORBIT_retval = ORBit_demarshal_object(_ORBIT_recv_buffer, GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection->orb_data); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; } else { GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur = _ORBIT_curptr; _ORBIT_retval = ORBit_demarshal_object(_ORBIT_recv_buffer, GIOP_MESSAGE_BUFFER(_ORBIT_recv_buffer)-> connection->orb_data); _ORBIT_curptr = GIOP_RECV_BUFFER(_ORBIT_recv_buffer)->cur; } giop_recv_buffer_unuse(_ORBIT_recv_buffer); return _ORBIT_retval; _ORBIT_system_exception: CORBA_exception_set_system(ev, _ORBIT_system_exception_minor, _ORBIT_completion_status); giop_recv_buffer_unuse(_ORBIT_recv_buffer); giop_send_buffer_unuse(_ORBIT_send_buffer); return _ORBIT_retval; _ORBIT_msg_exception: if (_ORBIT_recv_buffer->message.u.reply.reply_status == GIOP_LOCATION_FORWARD) { if (_obj->forward_locations != NULL) ORBit_delete_profiles(_obj->forward_locations); _obj->forward_locations = ORBit_demarshal_IOR(_ORBIT_recv_buffer); _cnx = ORBit_object_get_forwarded_connection(_obj); giop_recv_buffer_unuse(_ORBIT_recv_buffer); goto _ORBIT_retry_request; } else { ORBit_handle_exception(_ORBIT_recv_buffer, ev, NULL, _obj->orb); giop_recv_buffer_unuse(_ORBIT_recv_buffer); return _ORBIT_retval; } } }