void
VOmniORBHelper::nsRegisterObject(CORBA::Object_ptr obj,
				 const char* program, const char* object,
				 int telescopenumber)
  throw(CORBA::SystemException, 
	CosNaming::NamingContext::NotFound,
	CosNaming::NamingContext::CannotProceed,
	CosNaming::NamingContext::InvalidName,
	CosNaming::NamingContext::AlreadyBound)
{
  ZThread::Guard<ZThread::RecursiveMutex> guard(m_mutex);
  CosNaming::NamingContext_var root = nsRootContext();
  CosNaming::Name_var name = 
    nsPathToObjectName(program, object, telescopenumber);

  for(unsigned int n=0; n<name->length()-1; n++)
    {
      CosNaming::Name_var child_name = name;
      child_name->length(n+1);
      
      try
	{
	  CORBA::Object_var object = root->resolve(child_name);
	}
      catch(CosNaming::NamingContext::NotFound)
	{
	  CosNaming::NamingContext_var 
	    child = root->bind_new_context(child_name);
	}
    }

  root->rebind(name,obj);
}
  /*!
   * @if jp
   * @brief 与えられた文字列表現を NameComponent に分解する
   * @else
   * @brief Resolve given string representation to NameComponent
   * @endif
   */
  CosNaming::Name CorbaNaming::toName(const char* sname)
    throw (SystemException, InvalidName)
  {
    if (!sname)         throw InvalidName();
    if (*sname == '\0') throw InvalidName();
    
    std::string string_name(sname);
    std::vector<std::string> name_comps;
    
    // String name should include 1 or more names
    CORBA::ULong nc_length = 0;
    nc_length = split(string_name, std::string("/"), name_comps);
    if (!(nc_length > 0)) throw InvalidName();
    
    // Name components are allocated
    CosNaming::Name_var    name = new CosNaming::Name();
    name->length(nc_length);
    
    // Insert id and kind to name components
    for (CORBA::ULong i = 0; i < nc_length; ++i)
      {
	std::string::size_type pos;
	pos = name_comps[i].find_last_of(".");
	if (pos != name_comps[i].npos)
	  {
	    name[i].id   = 
	      CORBA::string_dup(name_comps[i].substr(0, pos).c_str());
	    name[i].kind = 
	      CORBA::string_dup(name_comps[i].substr(pos + 1).c_str());
	  }
	else
	  {
	    name[i].id   = CORBA::string_dup(name_comps[i].c_str());
#ifndef ORB_IS_RTORB
	    name[i].kind = "";
#else // ORB_IS_RTORB
	    name[i].kind = (char*)"";
#endif // ORB_IS_RTORB
	  }
      }
    return name;
  }