Package: orbit2
Version: 1:2.12.2-1
Severity: wishlist
Tags: patch, upstream

Alejandro Garcia Castro <acastro AT igalia.com> describes a
patch for INS here:
http://mail.gnome.org/archives/orbit-list/2004-November/msg00015.html

The patch is here:
http://community.igalia.com/twiki/pub/Fisterra/Orbit2Packages/ORBit_forw_bind_patch

Debian packages with the patch applied are here:
http://community.igalia.com/twiki/bin/view/Fisterra/Orbit2Packages

INS solves elegantly one of the most annoying difficulties
when working with CORBA: How do I get the reference to my
"first" object?  Other ORBs, e.g. omniORB do support INS.

Note: I did not yet test the patch.

? ORBit_forw_bind_patch
? ORBit_forw_bind_patch_HEAD
? depcomp
? examples
? gtk-doc.make
? orbit2-zip
Index: include/orbit/orb-core/corba-orb-type.h
===================================================================
RCS file: /cvs/gnome/ORBit2/include/orbit/orb-core/corba-orb-type.h,v
retrieving revision 1.21
diff -u -p -r1.21 corba-orb-type.h
--- include/orbit/orb-core/corba-orb-type.h     11 Mar 2005 14:22:22 -0000      
1.21
+++ include/orbit/orb-core/corba-orb-type.h     7 Jun 2005 11:51:45 -0000
@@ -67,6 +67,7 @@ struct CORBA_ORB_type {
        GSList                         *servers;
        GSList                         *profiles;
        GPtrArray                      *adaptors;
+       GHashTable                     *forw_binds;
        GSList                         *current_invocations;
        gpointer                        default_ctx;
        GHashTable                     *initial_refs;
Index: src/orb/orb-core/corba-orb.c
===================================================================
RCS file: /cvs/gnome/ORBit2/src/orb/orb-core/corba-orb.c,v
retrieving revision 1.111
diff -u -p -r1.111 corba-orb.c
--- src/orb/orb-core/corba-orb.c        18 Apr 2005 06:54:51 -0000      1.111
+++ src/orb/orb-core/corba-orb.c        7 Jun 2005 11:51:47 -0000
@@ -411,6 +411,13 @@ CORBA_ORB_init (int *argc, char **argv,
        retval->default_giop_version = GIOP_LATEST;
 
        retval->adaptors = g_ptr_array_new ();
+
+       /* init the forward bind hashtable*/
+       retval->forw_binds = g_hash_table_new_full (
+               g_str_hash, g_str_equal,
+               g_free,
+               NULL); 
+
        ORBit_init_internals (retval, ev);
        /* FIXME, handle exceptions */ 
 
@@ -1249,6 +1256,9 @@ CORBA_ORB_destroy (CORBA_ORB          or
                }
        }
 
+       /* destroy the forward bind hashtable*/
+       g_hash_table_destroy (orb->forw_binds);
+       
        orb->life_flags |= ORBit_LifeF_Destroyed;
 
        ORBit_RootObject_release (orb);
@@ -1319,7 +1329,13 @@ ORBit_ORB_forw_bind (CORBA_ORB          
                     CORBA_Object                obj,
                     CORBA_Environment          *ev)
 {
-       g_warning ("ORBit_ORB_forw_bind NYI");
+       
+       if (obj)
+               g_hash_table_insert (orb->forw_binds, objkey->_buffer, obj);
+       else {
+               g_hash_table_remove(orb->forw_binds, objkey->_buffer);
+       }
+       
 }
 
 gboolean
Index: src/orb/poa/orbit-adaptor.c
===================================================================
RCS file: /cvs/gnome/ORBit2/src/orb/poa/orbit-adaptor.c,v
retrieving revision 1.26
diff -u -p -r1.26 orbit-adaptor.c
--- src/orb/poa/orbit-adaptor.c 9 Feb 2004 20:24:17 -0000       1.26
+++ src/orb/poa/orbit-adaptor.c 7 Jun 2005 11:51:47 -0000
@@ -173,6 +173,40 @@ ORBit_adaptor_find (CORBA_ORB orb, ORBit
        return adaptor;
 }
 
+static CORBA_Object
+ORBit_forw_bind_find (CORBA_ORB orb, ORBit_ObjectKey *objkey)
+{
+       CORBA_Object object = NULL;
+       gchar *objectId = NULL; 
+
+       if (!objkey)
+               return NULL;
+
+       objectId = (gchar *) g_malloc0 (sizeof(gchar)*objkey->_length+1);
+
+       memcpy (objectId, objkey->_buffer, objkey->_length);
+
+       LINK_MUTEX_LOCK (ORBit_RootObject_lifecycle_lock);
+       {
+               const gchar *typeid;
+               object = g_hash_table_lookup (orb->forw_binds, objectId);
+               
+               if (object) {
+                       typeid = g_quark_to_string (object->type_qid);
+                       if (!typeid) {
+                               g_assert(g_hash_table_remove(orb->forw_binds,
+                                                            objectId));
+                               object = NULL;
+                       }
+               }
+       }
+       LINK_MUTEX_UNLOCK (ORBit_RootObject_lifecycle_lock);
+       
+       g_free (objectId);
+       
+       return object;
+}
+ 
 void
 ORBit_handle_locate_request (CORBA_ORB orb, GIOPRecvBuffer *recv_buffer)
 {
@@ -221,21 +255,39 @@ ORBit_handle_request (CORBA_ORB orb, GIO
        adaptor = ORBit_adaptor_find (orb, objkey);
 
        if (!adaptor || !objkey) {
-               CORBA_Environment env;
-
-               CORBA_exception_init (&env);
-
-               tprintf ("Error: failed to find adaptor or objkey for "
-                        "object while invoking method '%s'",
-                        giop_recv_buffer_get_opname (recv_buffer));
+               CORBA_Object forw_obj = ORBit_forw_bind_find (orb, objkey);
+               if (forw_obj) {                 
+                       GIOPSendBuffer *send_buffer = 
+                               giop_send_buffer_use_reply
+                               (recv_buffer->giop_version,
+                                giop_recv_buffer_get_request_id (recv_buffer),
+                                GIOP_LOCATION_FORWARD);
+                       
+                       ORBit_marshal_object(send_buffer, forw_obj);
+
+                       giop_send_buffer_write (send_buffer, 
recv_buffer->connection, FALSE);
+                       giop_send_buffer_unuse (send_buffer);
+
+                       giop_recv_buffer_unuse (recv_buffer);
+               }
+               else {
+                       
+                       CORBA_Environment env;
+                       
+                       CORBA_exception_init (&env);
+
+                       tprintf ("Error: failed to find adaptor or objkey for "
+                                "object while invoking method '%s'",
+                                giop_recv_buffer_get_opname (recv_buffer));
+               
+                       CORBA_exception_set_system (
+                               &env, ex_CORBA_OBJECT_NOT_EXIST, 
+                               CORBA_COMPLETED_NO);
+                       ORBit_recv_buffer_return_sys_exception (recv_buffer, 
&env);
+                       
+                       CORBA_exception_free (&env);
+               }
                
-               CORBA_exception_set_system (
-                       &env, ex_CORBA_OBJECT_NOT_EXIST, 
-                       CORBA_COMPLETED_NO);
-               ORBit_recv_buffer_return_sys_exception (recv_buffer, &env);
-
-               CORBA_exception_free (&env);
-
        } else {
                dprintf (MESSAGES, "p %d: handle request '%s'\n",
                         getpid (),

Reply via email to