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 (),