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;
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_occured(ev)) goto exception;\n");
89 fprintf(of, " forb_request_wait_for_reply(&req);\n");
90 fprintf(of, " if (forb_exception_occured(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 forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
104 if (IDL_NODE_TYPE(forb_cbe_get_typespec(parm)) == IDLN_INTERFACE) {
105 fprintf(ci->fh, "_deserialize(req.cdr_reply, %s, _obj->orb);\n", name);
107 fprintf(ci->fh, "_deserialize(req.cdr_reply, %s);\n", name);
111 fprintf(of, " forb_request_signal_processed(&req);\n"
113 " forb_request_destroy(&req);\n");
116 fprintf(of, " return " FORB_RETVAL_VAR_NAME ";\n");
119 fprintf (of, "}\n\n");
128 cs_output_stubs (IDL_tree tree,
135 switch (IDL_NODE_TYPE (tree)) {
137 cs_output_stubs (IDL_MODULE (tree).definition_list, ci, idx);
142 for (sub = tree; sub; sub = IDL_LIST (sub).next)
143 cs_output_stubs (IDL_LIST (sub).data, ci, idx);
146 case IDLN_ATTR_DCL: {
149 /* for (node = IDL_ATTR_DCL (tree).simple_declarations; node; node = IDL_LIST (node).next) { */
150 /* OIDL_Attr_Info *ai; */
152 /* ai = IDL_LIST (node).data->data; */
154 /* cs_output_stubs (ai->op1, ci, idx); */
157 /* cs_output_stubs (ai->op2, ci, idx); */
161 case IDLN_INTERFACE: {
164 /* Do not output skeletons for PIDL interfaces */
165 if ((tree->declspec & IDLF_DECLSPEC_PIDL) == 0) {
166 id = IDL_ns_ident_to_qstring (IDL_INTERFACE (tree).ident, "_", 0);
167 fprintf(ci->fh, "#define _%s_impl(obj) ((struct forb_%s_impl*)(obj)->implementation)\n\n",
170 cs_output_stubs (IDL_INTERFACE (tree).body, ci, &real_idx);
175 cs_output_stub (tree, ci, idx);
183 forb_idl_output_c_stubs (IDL_tree tree,
184 OIDL_Run_Info *rinfo,
187 fprintf (ci->fh, OIDL_C_WARNING);
188 fprintf (ci->fh, "#include <string.h>\n");
189 /* fprintf (ci->fh, "#define FORB2_STUBS_API\n"); */
190 fprintf (ci->fh, "#include <forb/forb-internal.h>\n");
191 fprintf (ci->fh, "#include <forb/request.h>\n");
192 fprintf (ci->fh, "#include <forb/iop.h>\n");
193 fprintf (ci->fh, "#include <forb/cdr.h>\n");
194 fprintf (ci->fh, "#include <forb/object.h>\n\n");
195 fprintf (ci->fh, "#include \"%s.h\"\n\n", ci->base_name);
197 fprintf (ci->fh, "#define ex_on_fail(command, ex) if (!(command)) do { ev->major = (ex); goto exception; } while(0)\n");
198 fprintf (ci->fh, "#define FORB_REQEST_HDR_SIZE (forb_iop_MESSAGE_HEADER_SIZE + forb_iop_REQUEST_HEADER_SIZE)\n\n");
200 cs_output_stubs (tree, ci, NULL);