fprintf(ci->fh, " typedef forb_object %s;\n"
" #endif\n", fullname);
fprintf(ci->fh, " #define %s_serialize(codec, obj) forb_object_serialize((codec), (obj))\n", fullname);
- fprintf(ci->fh, " #define %s_deserialize(codec, obj, orb) forb_object_deserialize((codec), (obj), (orb))\n", fullname);
+ fprintf(ci->fh, " #define %s_deserialize(codec, obj) forb_object_deserialize((codec), (obj))\n", fullname);
/* fprintf(ci->fh, "extern CORBA_unsigned_long %s__classid;\n", fullname); */
ch_output_impl_struct(tree, rinfo, ci);
char *name = IDL_IDENT(IDL_PARAM_DCL(parm).simple_declarator).str;
fprintf(ci->fh, /* " r = " */ " ");
forb_cbe_write_typespec(ci->fh, IDL_PARAM_DCL(parm).param_type_spec);
- if (IDL_NODE_TYPE(forb_cbe_get_typespec(parm)) == IDLN_INTERFACE) {
- fprintf(ci->fh, "_deserialize(cin, &%s, _obj->orb);\n", name);
- } else {
- fprintf(ci->fh, "_deserialize(cin, &%s);\n", name);
- }
+ fprintf(ci->fh, "_deserialize(cin, &%s);\n", name);
/* fprintf(ci->fh, " if (!r) { ev->major = FORB_EX_IMP_LIMIT; goto exception; }\n"); */
}
}
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_INTERFACE) {
- fprintf(of, " ");
- forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
- fprintf(ci->fh, "_deserialize(req.cdr_reply, %s, _obj->orb);\n", name);
- } else {
- 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);
- /* TODO: Free previously allocated parameters on no memory error. */
- }
- fprintf(of, " ");
- forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
- fprintf(ci->fh, "_deserialize(req.cdr_reply, %s%s);\n", n==2?"*":"", name);
+ 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);
+ /* TODO: Free previously allocated parameters on no memory error. */
}
+ fprintf(of, " ");
+ forb_cbe_write_typespec(of, IDL_PARAM_DCL(parm).param_type_spec);
+ fprintf(ci->fh, "_deserialize(req.cdr_reply, %s%s);\n", n==2?"*":"", name);
}
}
fprintf(of, " forb_request_signal_processed(&req);\n"
}
CDR_Codec *
-CDR_codec_init_static(CDR_Codec *codec)
+CDR_codec_init_static(CDR_Codec *codec, forb_orb orb)
{
memset(codec, 0, sizeof(CDR_Codec));
codec->host_endian = FLAG_ENDIANNESS;
codec->data_endian = FLAG_ENDIANNESS;
+ codec->orb = orb;
return codec;
}
CDR_Codec *
-CDR_codec_init(void)
+CDR_codec_init(forb_orb orb)
{
CDR_Codec *c;
c=forb_malloc(sizeof(CDR_Codec));
if (c) {
- CDR_codec_init_static(c);
+ CDR_codec_init_static(c, orb);
}
return(c);
#include "basic_types.h"
#include "cdr_codec.h"
+#include "object_type.h"
/*
* Alignment of CORBA types mapped to C.
* @rptr: read index
* @readonly: readonly attribute
* @release_buffer: use CORBA_TRUE if is necessary to free buffer memory after destruction of structure
+ * @orb: Needed for deserialization of object references.
*
* Struct @CDR_Codec is used by serialization and deserialization functions.
*/
unsigned int rptr;
CORBA_boolean readonly;
CORBA_boolean release_buffer;
+ forb_orb orb;
};
#define HEXDIGIT(c) (isdigit((guchar)(c))?(c)-'0':tolower((guchar)(c))-'a'+10)
extern CORBA_boolean CDR_buffer_init(CDR_Codec *codec, const unsigned int size, const unsigned int first);
extern CORBA_boolean CDR_buffer_reset(CDR_Codec *codec, const unsigned int first);
extern CORBA_boolean CDR_buffer_prepend(CDR_Codec *codec, const unsigned int len);
-extern CDR_Codec *CDR_codec_init(void);
-extern CDR_Codec *CDR_codec_init_static(CDR_Codec *codec);
+extern CDR_Codec *CDR_codec_init(forb_orb orb);
+extern CDR_Codec *CDR_codec_init_static(CDR_Codec *codec, forb_orb orb);
extern void CDR_codec_release_buffer(CDR_Codec *codec);
extern void CDR_codec_free(CDR_Codec *);
forb_t *forb = forb_object_to_forb(exec_req->obj);
CORBA_boolean ret;
- CDR_codec_init_static(&reply_codec);
+ CDR_codec_init_static(&reply_codec, exec_req->obj->orb);
ret = CDR_buffer_init(&reply_codec, 4096,
forb_iop_MESSAGE_HEADER_SIZE +
forb_iop_REPLY_HEADER_SIZE);
typedef struct forb {
forb_server_id server_id;
char server_id_str[sizeof(forb_server_id)*2+1]; /**< Server ID string - for easier debuggin messages */
+ forb_orb orb; /**< Object reference of this forb */
fosa_mutex_t request_id_mutex; /**< Mutex for request_id */
CORBA_long request_id; /**< Value of next sent request_id */
/* Server ID must be assigned manualy */
orb->server = forb->server_id;
+ forb->orb = orb;
+
/* Insert our object reference to objects tree, so that we
* can accept remote request to our new ORB. */
forb_objects_nolock_insert(forb, orb);
exec_req->obj = obj;
exec_req->method_index = request_header.method_index;
/* Copy the request to exec_req */
- CDR_codec_init_static(&exec_req->codec);
+ CDR_codec_init_static(&exec_req->codec, codec->orb);
ret = CDR_buffer_init(&exec_req->codec,
req_size,
0);
return;
send_execption:
- CDR_codec_init_static(&reply_codec);
+ CDR_codec_init_static(&reply_codec, codec->orb);
ret = CDR_buffer_init(&reply_codec, 4096,
forb_iop_MESSAGE_HEADER_SIZE +
forb_iop_REPLY_HEADER_SIZE);
fosa_abs_time_t hello_time;
fosa_rel_time_t hello_interval = fosa_msec_to_rel_time(1000*proto->hello_interval);
int ret;
-
- CDR_codec_init_static(&codec);
+
+ CDR_codec_init_static(&codec, port->forb->orb);
CDR_buffer_init(&codec, 1024, 0);
pthread_cleanup_push(discovery_cleanup, &codec);
/**
* Creates the object reference by deserialization from ::CDR_Codec.
*
- * @param orb The FORB where the new reference will be used.
* @param codec
* @param obj
*
* @return CORBA_TRUE on success, CORBA_FALSE on error.
*/
CORBA_boolean
-forb_object_deserialize(CDR_Codec *codec, forb_object *obj, forb_orb orb)
+forb_object_deserialize(CDR_Codec *codec, forb_object *obj)
{
forb_server_id server_id;
forb_object_key objkey;
return CORBA_FALSE;
if (!forb_object_key_deserialize(codec, &objkey))
return CORBA_FALSE;
- *obj = forb_object_new(orb, &server_id, objkey);
+ if (!codec->orb)
+ return CORBA_FALSE;
+ *obj = forb_object_new(codec->orb, &server_id, objkey);
return CORBA_TRUE;
}
CORBA_boolean
forb_object_serialize(CDR_Codec *codec, const forb_object *obj);
CORBA_boolean
-forb_object_deserialize(CDR_Codec *codec, forb_object *obj, forb_orb orb);
+forb_object_deserialize(CDR_Codec *codec, forb_object *obj);
#endif
forb_syncobj_init(&port->hello, 0);
forb_syncobj_init(&port->reply_processed, 0);
- CDR_codec_init_static(&port->codec);
+ CDR_codec_init_static(&port->codec, forb->orb);
if (!CDR_buffer_init(&port->codec, CONFIG_FORB_RECV_BUF_SIZE, 0)) {
ret = FOSA_ENOMEM;
goto err;
req->request_id = forb->request_id++;
fosa_mutex_unlock(&forb->request_id_mutex);
- CDR_codec_init_static(&req->cdr_request);
+ CDR_codec_init_static(&req->cdr_request, obj->orb);
bret = CDR_buffer_init(&req->cdr_request, 256, forb_iop_MESSAGE_HEADER_SIZE);
if (bret == CORBA_FALSE) {
return FOSA_ENOMEM;