/* fprintf(of, " return "FORB_RETVAL_VAR_NAME";\n"); */
/* } */
fprintf(of, " if (ev) ev->major = FORB_EX_NONE;\n");
- fprintf(of, " if (_obj->implementation) {\n"
- " /* in-proc object */\n");
+ fprintf(of, " if (forb_object_is_local(_obj) &&\n"
+ "forb_get_current_executor() == forb_object_get_executor(_obj)) {\n");
fprintf(of, " if (!_obj->interface ||\n"
- " strncmp(_obj->interface->name, \"%s\", %d) != 0) {\n"
+ " strncmp(_obj->interface->name, \"%s\", %zd) != 0) {\n"
" ev->major = FORB_EX_BAD_OPERATION;\n"
" return %s;\n"
" }\n", iface_id, strlen(iface_id), has_retval ? FORB_RETVAL_VAR_NAME : "");
fprintf(of, " } else {\n");
fprintf(of, " /* remote object */\n"
- " CDR_Codec codec;\n"
- " forb_request_t req;\n"
- " CDR_codec_init_static(&codec);\n"
- " ex_on_fail(CDR_buffer_init(&codec, 256, forb_iop_MESSAGE_HEADER_SIZE), FORB_EX_NO_MEMORY);\n");
- fprintf(of, " ex_on_fail(forb_request_init(&req, _obj->orb) == 0, FORB_EX_INTERNAL);\n");
- fprintf(of, " forb_iop_prepare_request(&req, &codec, \"%s\", _obj, FORB_METHOD_INDEX(%s), ev);\n",
+ " forb_request_t req;\n");
+ fprintf(of, " ex_on_fail(forb_request_init(&req, _obj) == 0, FORB_EX_INTERNAL);\n");
+ fprintf(of, " forb_iop_prepare_request(&req, \"%s\", FORB_METHOD_INDEX(%s), ev);\n",
iface_id, opname);
- fprintf(of, " if (forb_exception_occured(ev)) goto exception;\n");
+ fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
for (sub = IDL_OP_DCL (tree).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
IDL_tree parm = IDL_LIST (sub).data;
IDL_ParamRole role;
role = oidl_attr_to_paramrole(IDL_PARAM_DCL(parm).attr);
if (role == DATA_IN || role == DATA_INOUT) {
- char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
+ char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
+ gboolean isSlice;
+ IDL_tree ts = forb_cbe_get_typespec(parm);
+ int n = oidl_param_info (ts, role, &isSlice);
fprintf(of, " ex_on_fail(");
forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
- fprintf(of, "_serialize(&codec, %s%s), FORB_EX_IMP_LIMIT);\n",
- role == DATA_IN ? "&":"",
- name);
+ fprintf(of, "_serialize(&req.cdr_request, %s%s), FORB_EX_IMP_LIMIT);\n",
+ n == 0 ? "&":"", name);
}
}
- fprintf(of, " forb_proto_send_request(&req, ev);\n");
- fprintf(of, " if (forb_exception_occured(ev)) goto exception;\n");
+ fprintf(of, " forb_request_send(&req, ev);\n");
+ fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
fprintf(of, " forb_request_wait_for_reply(&req);\n");
- fprintf(of, " if (forb_exception_occured(ev)) goto exception;\n");
+ fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
if (has_retval) {
fprintf(of, " ");
forb_cbe_write_typespec(of, IDL_OP_DCL(tree).op_type_spec);
role = oidl_attr_to_paramrole(IDL_PARAM_DCL(parm).attr);
if (role == DATA_OUT || role == DATA_INOUT) {
char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
+ gboolean isSlice;
+ IDL_tree ts = forb_cbe_get_typespec(parm);
+ int n = oidl_param_info (ts, role, &isSlice);
+ if (IDL_NODE_TYPE(forb_cbe_get_typespec(parm)) == IDLN_TYPE_SEQUENCE &&
+ role == DATA_OUT) { /* Allocate out sequence */
+ fprintf(ci->fh, " *%s = forb_malloc(sizeof(**%s));\n", name, name);
+ fprintf(ci->fh, " if (!*%s) { ev->major = FORB_EX_NO_MEMORY; goto exception; }\n", name);
+ fprintf(ci->fh, " memset(*%s, 0, sizeof(**%s));\n", name, name);
+ fprintf(ci->fh, " CORBA_sequence_set_release(*%s, CORBA_TRUE);\n", name);
+ /* TODO: Free previously allocated parameters on no memory error. */
+ }
fprintf(of, " ");
forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
- fprintf(of, "_deserialize(req.cdr_reply, %s);\n", name);
+ fprintf(ci->fh, "_deserialize(req.cdr_reply, %s%s);\n", n==2?"*":"", name);
}
}
- fprintf(of, "exception:\n"
- " forb_request_signal_processed(&req);\n"
- " forb_request_destroy(&req);\n"
- " CDR_codec_release_buffer(&codec);\n");
+ fprintf(of, " forb_request_signal_processed(&req);\n"
+ "exception:\n"
+ " forb_request_destroy(&req);\n");
fprintf(of, " }\n");
if (has_retval) {
fprintf(of, " return " FORB_RETVAL_VAR_NAME ";\n");
fprintf (ci->fh, OIDL_C_WARNING);
fprintf (ci->fh, "#include <string.h>\n");
/* fprintf (ci->fh, "#define FORB2_STUBS_API\n"); */
- fprintf (ci->fh, "#include <forb/forb-idl.h>\n");
fprintf (ci->fh, "#include <forb/forb-internal.h>\n");
fprintf (ci->fh, "#include <forb/request.h>\n");
fprintf (ci->fh, "#include <forb/iop.h>\n");
+ fprintf (ci->fh, "#include <forb/cdr.h>\n");
+ fprintf (ci->fh, "#include <forb/object.h>\n\n");
fprintf (ci->fh, "#include \"%s.h\"\n\n", ci->base_name);
fprintf (ci->fh, "#define ex_on_fail(command, ex) if (!(command)) do { ev->major = (ex); goto exception; } while(0)\n");