CORBA_Object etk_name_service_resolve (CosNaming_NamingContext name_service, gchar *id_vec[], CORBA_Environment *ev) { CORBA_Object retval = CORBA_OBJECT_NIL; gint i = 0; gint len = id_vec_len (id_vec); /* Allocate a CosNaming::Name (sequence of CosNaming::NameComponent) */ CosNaming_Name *name = CosNaming_Name__alloc(); g_assert (id_vec_len (id_vec) > 0); name->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf(len); name->_maximum = len; name->_length = 0; /* Relinquish ownership of the NameComponent to the * sequence. When CORBA_free is called on it later, the * NameComponent will be freed */ CORBA_sequence_set_release (name, TRUE); /* iterate components of name and create sub-context * (directory) if needed */ for (i = 0; i < len; ++i) { name->_length = i+1; name->_buffer[i].id = CORBA_string_dup(id_vec[i]); name->_buffer[i].kind = CORBA_string_dup(""); /* don't know what 'kind' shall be good for */ } retval = CosNaming_NamingContext_resolve (name_service, name, ev); if (etk_raised_exception (ev)) { CORBA_free (name); return CORBA_OBJECT_NIL; } return retval; }
/* binds @servant object reference to unique @name at * @name_service. If error occures @ev points to exception object on * return. */ void etk_name_service_bind (CosNaming_NamingContext name_service, CORBA_Object servant, gchar *id_vec[], CORBA_Environment *ev) { gint i = 0; gint len = id_vec_len (id_vec); /* Allocate a CosNaming::Name (sequence of CosNaming::NameComponent) */ CosNaming_Name *name = CosNaming_Name__alloc(); name->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf(len); name->_maximum = len; name->_length = 0; /* Relinquish ownership of the NameComponent to the * sequence. When CORBA_free is called on it later, the * NameComponent will be freed */ CORBA_sequence_set_release (name, TRUE); /* iterate components of name and create sub-context * (directory) if needed */ for (i = 0; i < len; ++i) { name->_length = i+1; name->_buffer[i].id = CORBA_string_dup(id_vec[i]); name->_buffer[i].kind = CORBA_string_dup(""); /* don't know what 'kind' shall be good for */ if (name->_length < len) { /* create a sub-context */ CosNaming_NamingContext nc = CosNaming_NamingContext_bind_new_context (name_service, name, ev); if (etk_raised_exception_is_a (ev, ex_CosNaming_NamingContext_AlreadyBound)) { /* ignore - ctx allread exists, this * is not dramatic */ CORBA_exception_free (ev); } else if (etk_raised_exception (ev)) { /* critical - unexpected exception */ CORBA_free (name); return; } } else { /* Bind object to last context - use 'rebind' * operation in case the name has been * registered allready in context - note, this * might interfere with other service choosing * same name */ CosNaming_NamingContext_rebind (name_service, name, servant, ev); if (etk_raised_exception(ev)) { /* critical - can not bind object */ CORBA_free (name); return; } } } CORBA_free (name); return; }
CosNaming_Name* ORBit_string_to_CosNaming_Name (const CORBA_char *string, CORBA_Environment * ev) { CosNaming_Name *retval = CosNaming_Name__alloc (); GPtrArray *ids = g_ptr_array_new (); GPtrArray *kinds = g_ptr_array_new (); gint pos = 0, i, len; gboolean used = FALSE; GPtrArray *append_to; g_ptr_array_add (ids, g_string_new ("")); g_ptr_array_add (kinds, g_string_new ("")); append_to = ids; while (*string) { gchar append; switch (*string) { case '.': used = TRUE; g_return_val_if_fail (append_to != kinds, NULL); append_to = kinds; append = '\0'; break; case '/': if (used) { pos++; g_ptr_array_add (ids, g_string_new ("")); g_ptr_array_add (kinds, g_string_new ("")); g_assert (ids->len == pos + 1 && kinds->len == pos + 1); } used = FALSE; append_to = ids; append = '\0'; break; case '\\': string++; g_return_val_if_fail (*string == '.' || *string == '/' || *string == '\\', NULL); append = *string; break; default: append = *string; used = TRUE; break; } if (append) g_string_append_c (g_ptr_array_index (append_to, pos), append); string++; } len = used ? pos + 1 : pos; retval->_buffer = CORBA_sequence_CosNaming_NameComponent_allocbuf (len); retval->_length = len; retval->_maximum = len; for (i = 0; i < len; i++) { GString *id = g_ptr_array_index (ids, i); GString *kind = g_ptr_array_index (kinds, i); retval->_buffer[i].id = CORBA_string_dup (id->str); retval->_buffer[i].kind = CORBA_string_dup (kind->str); } for (i = 0; i <= pos; i++) { g_string_free (g_ptr_array_index (ids, i), TRUE); g_string_free (g_ptr_array_index (kinds, i), TRUE); } g_ptr_array_free (ids, TRUE); g_ptr_array_free (kinds, TRUE); return retval; }