]> rtime.felk.cvut.cz Git - frescor/forb.git/blobdiff - src/object.c
forb: Split forb_port_destroy() to stop and destroy phases
[frescor/forb.git] / src / object.c
index 0d459b63e44d0af4ace9da16a1a9bda49e17d79f..51ca531d6efaa7c541232a05eaaed7aa1d6f3cc4 100644 (file)
 #include <forb/cdr_codec.h>
 #include <forb/cdr.h>
 #include "forb_utils.h"
+#include <inttypes.h>
+#include "object_type.h"
+#include <forb/types.h>
+#include <forb/server_id.h>
 
 GAVL_CUST_NODE_INT_IMP(forb_objects_nolock /* cust_prefix */,
                       forb_t /* cust_root_t */,
-                      struct forb_object /* cust_item_t */,
+                      struct _forb_object /* cust_item_t */,
                       forb_object_key /* cust_key_t */,
                       objects /* cust_root_node */,
                       node /* cust_item_node */,
@@ -133,7 +137,7 @@ forb_object_new(forb_orb orb,
 static void
 forb_object_release_real(forb_ref_t *ref)
 {
-       forb_object obj = container_of(ref, struct forb_object, ref);
+       forb_object obj = container_of(ref, struct _forb_object, ref);
        
        if (obj->orb) {
                forb_t *forb = forb_object_to_forb(obj);
@@ -222,7 +226,7 @@ forb_object_to_string(const forb_object obj)
 
        forb_server_id_to_string(server_id, &obj->server, s);
        key = forb_object_to_key(obj);
-       snprintf(str, s, "%s-%llx", server_id, key);
+       snprintf(str, s, "%s-%"PRIu64, server_id, key);
 
        return str;
 }
@@ -253,11 +257,15 @@ forb_string_to_object(const forb_orb orb, const char *string)
        if (string[2*sizeof(server_id)] != '-')
                return NULL;
 
-       ret = sscanf(&string[2*sizeof(server_id)+1], "%llx", &key);
+       ret = sscanf(&string[2*sizeof(server_id)+1], "%"SCNu64, &key);
        if (ret == 0 || ret == EOF)
                return NULL;
-
-       obj = forb_object_new(orb, &server_id, key);
+       
+       // check if the object you want to create is local or not
+       if (!forb_server_id_cmp(&orb->server, &server_id))              
+               obj = forb_objects_find(forb_data(orb), key);
+       else
+               obj = forb_object_new(orb, &server_id, key);
        
        return obj;
 }
@@ -289,7 +297,7 @@ forb_object_duplicate(const forb_object obj)
  * @return CORBA_TRUE on success, CORBA_FALSE on error.
  */
 CORBA_boolean
-forb_object_serialize(CDR_Codec *codec, const forb_object *obj)
+forb_object_serialize(FORB_CDR_Codec *codec, const forb_object *obj)
 {
        if (!forb_server_id_serialize(codec, &(*obj)->server))
                return CORBA_FALSE;
@@ -299,7 +307,7 @@ forb_object_serialize(CDR_Codec *codec, const forb_object *obj)
 }
 
 /** 
- * Creates the object reference by deserialization from ::CDR_Codec.
+ * Creates the object reference by deserialization from ::FORB_CDR_Codec.
  * 
  * @param codec 
  * @param obj 
@@ -307,7 +315,7 @@ forb_object_serialize(CDR_Codec *codec, const forb_object *obj)
  * @return CORBA_TRUE on success, CORBA_FALSE on error.
  */
 CORBA_boolean
-forb_object_deserialize(CDR_Codec *codec, forb_object *obj)
+forb_object_deserialize(FORB_CDR_Codec *codec, forb_object *obj)
 {
        forb_server_id server_id;
        forb_object_key objkey;
@@ -317,6 +325,11 @@ forb_object_deserialize(CDR_Codec *codec, forb_object *obj)
                return CORBA_FALSE;
        if (!codec->orb)
                return CORBA_FALSE;
-       *obj = forb_object_new(codec->orb, &server_id, objkey);
+       
+       // check if the object you want to create is local or not
+       if (!forb_server_id_cmp(&codec->orb->server, &server_id))
+               *obj = forb_objects_find(forb_data(codec->orb), objkey);
+       else
+               *obj = forb_object_new(codec->orb, &server_id, objkey);
        return CORBA_TRUE;
 }