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\", %d) != 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_occured(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;
78 fprintf(of, " ex_on_fail(");
79 forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
80 fprintf(of, "_serialize(&req.cdr_request, %s%s), FORB_EX_IMP_LIMIT);\n",
81 role == DATA_IN ? "&":"",
85 fprintf(of, " forb_request_send(&req, ev);\n");
86 fprintf(of, " if (forb_exception_occured(ev)) goto exception;\n");
87 fprintf(of, " forb_request_wait_for_reply(&req);\n");
88 fprintf(of, " if (forb_exception_occured(ev)) goto exception;\n");
91 forb_cbe_write_typespec(of, IDL_OP_DCL(tree).op_type_spec);
92 fprintf(of, "_deserialize(req.cdr_reply, &"FORB_RETVAL_VAR_NAME");\n");
94 for (sub = IDL_OP_DCL (tree).parameter_dcls; sub; sub = IDL_LIST (sub).next) {
95 IDL_tree parm = IDL_LIST (sub).data;
97 role = oidl_attr_to_paramrole(IDL_PARAM_DCL(parm).attr);
98 if (role == DATA_OUT || role == DATA_INOUT) {
99 char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
101 forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
102 fprintf(of, "_deserialize(req.cdr_reply, %s);\n", name);
105 fprintf(of, " forb_request_signal_processed(&req);\n"
107 " forb_request_destroy(&req);\n");
110 fprintf(of, " return " FORB_RETVAL_VAR_NAME ";\n");
113 fprintf (of, "}\n\n");
122 cs_output_stubs (IDL_tree tree,
129 switch (IDL_NODE_TYPE (tree)) {
131 cs_output_stubs (IDL_MODULE (tree).definition_list, ci, idx);
136 for (sub = tree; sub; sub = IDL_LIST (sub).next)
137 cs_output_stubs (IDL_LIST (sub).data, ci, idx);
140 case IDLN_ATTR_DCL: {
143 /* for (node = IDL_ATTR_DCL (tree).simple_declarations; node; node = IDL_LIST (node).next) { */
144 /* OIDL_Attr_Info *ai; */
146 /* ai = IDL_LIST (node).data->data; */
148 /* cs_output_stubs (ai->op1, ci, idx); */
151 /* cs_output_stubs (ai->op2, ci, idx); */
155 case IDLN_INTERFACE: {
158 /* Do not output skeletons for PIDL interfaces */
159 if ((tree->declspec & IDLF_DECLSPEC_PIDL) == 0) {
160 id = IDL_ns_ident_to_qstring (IDL_INTERFACE (tree).ident, "_", 0);
161 fprintf(ci->fh, "#define _%s_impl(obj) ((struct forb_%s_impl*)(obj)->implementation)\n\n",
164 cs_output_stubs (IDL_INTERFACE (tree).body, ci, &real_idx);
169 cs_output_stub (tree, ci, idx);
177 forb_idl_output_c_stubs (IDL_tree tree,
178 OIDL_Run_Info *rinfo,
181 fprintf (ci->fh, OIDL_C_WARNING);
182 fprintf (ci->fh, "#include <string.h>\n");
183 /* fprintf (ci->fh, "#define FORB2_STUBS_API\n"); */
184 fprintf (ci->fh, "#include <forb/forb-internal.h>\n");
185 fprintf (ci->fh, "#include <forb/request.h>\n");
186 fprintf (ci->fh, "#include <forb/iop.h>\n");
187 fprintf (ci->fh, "#include <forb/cdr.h>\n");
188 fprintf (ci->fh, "#include <forb/object.h>\n\n");
189 fprintf (ci->fh, "#include \"%s.h\"\n\n", ci->base_name);
191 fprintf (ci->fh, "#define ex_on_fail(command, ex) if (!(command)) do { ev->major = (ex); goto exception; } while(0)\n");
192 fprintf (ci->fh, "#define FORB_REQEST_HDR_SIZE (forb_iop_MESSAGE_HEADER_SIZE + forb_iop_REQUEST_HEADER_SIZE)\n\n");
194 cs_output_stubs (tree, ci, NULL);