]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Objref deserialization is now handled the same way as for other types
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 4 Nov 2008 08:05:30 +0000 (09:05 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 4 Nov 2008 08:05:30 +0000 (09:05 +0100)
This was necessary for having object references in structures and other
constructed types. Now, we put the orb object reference to CDR_Codec
structure, so that forb_object_deserialize() can get the information
from there.

13 files changed:
forb-idl/forb-idl-c-headers.c
forb-idl/forb-idl-c-skels.c
forb-idl/forb-idl-c-stubs.c
src/cdr.c
src/cdr.h
src/exec_req.c
src/forb-internal.h
src/forb.c
src/iop.c
src/object.c
src/object.h
src/port.c
src/request.c

index 155712f2bea1a48dbe87193a6897dbf4d6d3b357..78b45496cb345e3025eba1141e489a253c742a88 100644 (file)
@@ -474,7 +474,7 @@ ch_output_interface(IDL_tree tree, OIDL_Run_Info *rinfo, OIDL_C_Info *ci)
        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);
index a105f59781c4abf10ec14764479178cb0225c887..e3fbab3d66069976cd84f7c50e1137265b8706e8 100644 (file)
@@ -306,11 +306,7 @@ static void ck_output_op_skel(IDL_tree op, char *intf_id, OIDL_Run_Info *rinfo,
                        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"); */
                }
        }
index 9aef1a5712124fc8cbce8be490c35db6e940b449..d9542e5980b51314fd5f7122a756866552f09756 100644 (file)
@@ -102,22 +102,16 @@ cs_output_stub (IDL_tree     tree,
                  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"
index 7c46a1403128c45caa2cdde526ecef0fef1e188c..0bf15d4bac9929cccb66d43f07b9b098035d2940 100644 (file)
--- a/src/cdr.c
+++ b/src/cdr.c
@@ -463,24 +463,25 @@ CDR_get_seq_begin(CDR_Codec *codec, CORBA_unsigned_long *ul)
 }
 
 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);
index 03b663517246bd75ece79aca98977a05d7ae194f..c947c073f5a8b6386f7955ef133db43f59a45865 100644 (file)
--- a/src/cdr.h
+++ b/src/cdr.h
@@ -45,6 +45,7 @@
 
 #include "basic_types.h"
 #include "cdr_codec.h"
+#include "object_type.h"
 
 /*
  * Alignment of CORBA types mapped to C.
@@ -80,6 +81,7 @@ typedef enum {
  * @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.
  */
@@ -94,6 +96,7 @@ struct CDR_Codec {
        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)
@@ -107,8 +110,8 @@ static inline CORBA_long CDR_data_size(CDR_Codec *codec)
 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 *);
 
index f6cc16f558956f5254c2ea0b185249bc74c20840..20d0de41e4015ff74390e0af387c8ff11c94ec21 100644 (file)
@@ -71,7 +71,7 @@ void forb_exec_req_process(forb_exec_req_t *exec_req)
        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);
index b4fea905e6e9d8299e8b09ec7e4be3505b6ffcbb..ab4e10b5c0d395c88d682d279ac4d9ed2b039791 100644 (file)
@@ -85,6 +85,7 @@
 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 */
index c4b2c909828be6607098e53d712524fc32a90476..ebc8a25b11416352f1d4a5986a6585ba8ad19969 100644 (file)
@@ -191,6 +191,8 @@ forb_init(int *argc, char **argv[], const char *orb_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);
index 0e8df356e23552eaca866fcbc3d4bd0c1d7fba7d..9e9c487db22fbd0e46b2b7b85470f602689d6f20 100644 (file)
--- a/src/iop.c
+++ b/src/iop.c
@@ -287,7 +287,7 @@ process_request(forb_port_t *port, CDR_Codec *codec, uint32_t message_size)
                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);
@@ -312,7 +312,7 @@ out:
        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);
@@ -545,8 +545,8 @@ void *forb_iop_discovery_thread(void *arg)
        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);
index db46277bafe60fb0f86774e642b6a8f99ab2e8ca..0d459b63e44d0af4ace9da16a1a9bda49e17d79f 100644 (file)
@@ -301,14 +301,13 @@ forb_object_serialize(CDR_Codec *codec, const forb_object *obj)
 /** 
  * 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;
@@ -316,6 +315,8 @@ forb_object_deserialize(CDR_Codec *codec, forb_object *obj, forb_orb orb)
                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;
 }
index dc5af81cf107b1527a3a5bc71105a4894126b5ba..992f34371b75c88773242302531a2f0ff3ac2644 100644 (file)
@@ -252,6 +252,6 @@ forb_object_is_remote(forb_object obj)
 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
index 5919ef2e6f22718a0e6973d82c11214d62d4fac5..74f985c92a0c39788b1d626404e630af4bbe8d7d 100644 (file)
@@ -91,7 +91,7 @@ int forb_register_port(forb_t *forb, forb_port_t *port)
        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;
index abfd0cd73c3a9be0ed3b21b2ce9cd7124738b0b8..7be87db04b8ea594f589b47eea809456ba5e8ef6 100644 (file)
@@ -103,7 +103,7 @@ forb_request_init(forb_request_t *req, forb_object obj)
        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;