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