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;
}
Exemple #3
0
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;
}