3 #include "forb-idl-c-backend.h"
8 cs_output_stub (IDL_tree tree,
17 gboolean has_retval, has_args;
19 g_return_if_fail (idx != NULL);
21 iface_id = IDL_ns_ident_to_qstring (
22 IDL_IDENT_TO_NS (IDL_INTERFACE (
23 IDL_get_parent_node (tree, IDLN_INTERFACE, NULL)
25 opname_plain = IDL_IDENT(IDL_OP_DCL (tree).ident).str;
26 opname = IDL_ns_ident_to_qstring (IDL_IDENT_TO_NS (IDL_OP_DCL (tree).ident), "_", 0);
28 has_retval = IDL_OP_DCL (tree).op_type_spec != NULL;
29 has_args = IDL_OP_DCL (tree).parameter_dcls != NULL;
31 forb_cbe_op_write_proto (of, tree, "", FALSE);
33 fprintf (of, "\n{\n");
37 forb_cbe_write_param_typespec (of, tree);
38 fprintf (of, " " FORB_RETVAL_VAR_NAME ";\n");
41 /* fprintf(of, " if (_obj->type != %s_type) {\n" */
42 /* " ev->major = FORB_EX_BAD_OPERATION;\n", iface_id); */
43 /* if (has_retval) { */
44 /* fprintf(of, " return "FORB_RETVAL_VAR_NAME";\n"); */
46 fprintf(of, " if (ev) ev->major = FORB_EX_NONE;\n");
47 fprintf(of, " if (forb_object_is_local(_obj)) {\n");
48 fprintf(of, " if (!_obj->interface ||\n"
49 " strncmp(_obj->interface->name, \"%s\", %zd) != 0) {\n"
50 " ev->major = FORB_EX_BAD_OPERATION;\n"
52 " }\n", iface_id, strlen(iface_id), has_retval ? FORB_RETVAL_VAR_NAME : "");
55 fprintf(of, FORB_RETVAL_VAR_NAME " = ");
57 fprintf(of, "_%s_impl(_obj)->%s(_obj, ",
58 iface_id, opname_plain);
59 for (sub = IDL_OP_DCL (tree).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
60 IDL_tree parm = IDL_LIST (sub).data;
61 fprintf (of, "%s, ", IDL_IDENT (IDL_PARAM_DCL (parm).simple_declarator).str);
63 fprintf(of, "ev);\n");
65 fprintf(of, " } else {\n");
66 fprintf(of, " /* remote object */\n"
67 " forb_request_t req;\n");
68 fprintf(of, " ex_on_fail(forb_request_init(&req, _obj) == 0, FORB_EX_INTERNAL);\n");
69 fprintf(of, " forb_iop_prepare_request(&req, \"%s\", FORB_METHOD_INDEX(%s), ev);\n",
71 fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
72 for (sub = IDL_OP_DCL (tree).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
73 IDL_tree parm = IDL_LIST (sub).data;
75 role = oidl_attr_to_paramrole(IDL_PARAM_DCL(parm).attr);
76 if (role == DATA_IN || role == DATA_INOUT) {
77 char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
79 IDL_tree ts = forb_cbe_get_typespec(parm);
80 int n = oidl_param_info (ts, role, &isSlice);
81 fprintf(of, " ex_on_fail(");
82 forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
83 fprintf(of, "_serialize(&req.cdr_request, %s%s), FORB_EX_IMP_LIMIT);\n",
84 n == 0 ? "&":"", name);
87 fprintf(of, " forb_request_send(&req, ev);\n");
88 fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
89 fprintf(of, " forb_request_wait_for_reply(&req);\n");
90 fprintf(of, " if (forb_exception_occurred(ev)) goto exception;\n");
93 forb_cbe_write_typespec(of, IDL_OP_DCL(tree).op_type_spec);
94 fprintf(of, "_deserialize(req.cdr_reply, &"FORB_RETVAL_VAR_NAME");\n");
96 for (sub = IDL_OP_DCL (tree).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
97 IDL_tree parm = IDL_LIST (sub).data;
99 role = oidl_attr_to_paramrole(IDL_PARAM_DCL(parm).attr);
100 if (role == DATA_OUT || role == DATA_INOUT) {
101 char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
103 IDL_tree ts = forb_cbe_get_typespec(parm);
104 int n = oidl_param_info (ts, role, &isSlice);
105 if (IDL_NODE_TYPE(forb_cbe_get_typespec(parm)) == IDLN_TYPE_SEQUENCE &&
106 role == DATA_OUT) { /* Allocate out sequence */
107 fprintf(ci->fh, " *%s = forb_malloc(sizeof(**%s));\n", name, name);
108 fprintf(ci->fh, " if (!*%s) { ev->major = FORB_EX_NO_MEMORY; goto exception; }\n", name);
109 fprintf(ci->fh, " memset(*%s, 0, sizeof(**%s));\n", name, name);
110 fprintf(ci->fh, " CORBA_sequence_set_release(*%s, CORBA_TRUE);\n", name);
111 /* TODO: Free previously allocated parameters on no memory error. */
114 forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
115 fprintf(ci->fh, "_deserialize(req.cdr_reply, %s%s);\n", n==2?"*":"", name);
118 fprintf(of, " forb_request_signal_processed(&req);\n"
120 " forb_request_destroy(&req);\n");
123 fprintf(of, " return " FORB_RETVAL_VAR_NAME ";\n");
126 fprintf (of, "}\n\n");
135 cs_output_stubs (IDL_tree tree,
142 switch (IDL_NODE_TYPE (tree)) {
144 cs_output_stubs (IDL_MODULE (tree).definition_list, ci, idx);
149 for (sub = tree; sub; sub = IDL_LIST (sub).next)
150 cs_output_stubs (IDL_LIST (sub).data, ci, idx);
153 case IDLN_ATTR_DCL: {
156 /* for (node = IDL_ATTR_DCL (tree).simple_declarations; node; node = IDL_LIST (node).next) { */
157 /* OIDL_Attr_Info *ai; */
159 /* ai = IDL_LIST (node).data->data; */
161 /* cs_output_stubs (ai->op1, ci, idx); */
164 /* cs_output_stubs (ai->op2, ci, idx); */
168 case IDLN_INTERFACE: {
171 /* Do not output skeletons for PIDL interfaces */
172 if ((tree->declspec & IDLF_DECLSPEC_PIDL) == 0) {
173 id = IDL_ns_ident_to_qstring (IDL_INTERFACE (tree).ident, "_", 0);
174 fprintf(ci->fh, "#define _%s_impl(obj) ((struct forb_%s_impl*)(obj)->implementation)\n\n",
177 cs_output_stubs (IDL_INTERFACE (tree).body, ci, &real_idx);
182 cs_output_stub (tree, ci, idx);
190 forb_idl_output_c_stubs (IDL_tree tree,
191 OIDL_Run_Info *rinfo,
194 fprintf (ci->fh, OIDL_C_WARNING);
195 fprintf (ci->fh, "#include <string.h>\n");
196 /* fprintf (ci->fh, "#define FORB2_STUBS_API\n"); */
197 fprintf (ci->fh, "#include <forb/forb-internal.h>\n");
198 fprintf (ci->fh, "#include <forb/request.h>\n");
199 fprintf (ci->fh, "#include <forb/iop.h>\n");
200 fprintf (ci->fh, "#include <forb/cdr.h>\n");
201 fprintf (ci->fh, "#include <forb/object.h>\n\n");
202 fprintf (ci->fh, "#include \"%s.h\"\n\n", ci->base_name);
204 fprintf (ci->fh, "#define ex_on_fail(command, ex) if (!(command)) do { ev->major = (ex); goto exception; } while(0)\n");
205 fprintf (ci->fh, "#define FORB_REQEST_HDR_SIZE (forb_iop_MESSAGE_HEADER_SIZE + forb_iop_REQUEST_HEADER_SIZE)\n\n");
207 cs_output_stubs (tree, ci, NULL);