
#ifndef _CosNaming_IDL_
#define _CosNaming_IDL_

#pragma prefix "omg.org"

module CosNaming {
  typedef string Istring;
  struct NameComponent {
    Istring id;
    Istring kind;
  };
  
  typedef sequence<NameComponent> Name;
  
  enum BindingType {
    nobject,
    ncontext
  };
  
  struct Binding {
    Name binding_name;
    BindingType binding_type;
  };
  
  typedef sequence<Binding> BindingList;
  
  interface BindingIterator;
  
  interface NamingContext {
    enum NotFoundReason {
      missing_node,
      not_context,
      not_object
    };
    
    exception NotFound {
      NotFoundReason why;
      Name rest_of_name;
    };
    
    exception CannotProceed {
      NamingContext ctx;
      Name rest_of_name;
    };
    
    exception InvalidName{};
    exception AlreadyBound{};
    exception NotEmpty{};
    
    void bind(in Name n, in Object obj)
      raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
    void rebind(in Name n, in Object obj)
      raises(NotFound, CannotProceed, InvalidName);
    void bind_context(in Name n, in NamingContext nc)
      raises(NotFound, CannotProceed, InvalidName, AlreadyBound);
    void rebind_context(in Name n, in NamingContext nc)
      raises(NotFound, CannotProceed, InvalidName);
    Object resolve(in Name n)
      raises(NotFound, CannotProceed, InvalidName);
    void unbind(in Name n)
      raises(NotFound, CannotProceed, InvalidName);
    NamingContext new_context();
    NamingContext bind_new_context(in Name n)
      raises(NotFound, AlreadyBound, CannotProceed, InvalidName);
    void destroy()
      raises(NotEmpty);
    void list(in unsigned long how_many, out BindingList bl, 
	      out BindingIterator bi);
  };
  
  interface BindingIterator {
    boolean next_one(out Binding b);
    boolean next_n(in unsigned long how_many, out BindingList bl);
    void destroy();
  };

  interface NamingContextExt: NamingContext { 
    typedef string StringName; 
    typedef string Address; 
    typedef string URLString;
    
    StringName to_string(in Name n) 
      raises(InvalidName); 
    Name to_name(in StringName sn) 
      raises(InvalidName); 

    exception InvalidAddress {}; 

    URLString to_url(in Address addr, in StringName sn) 
      raises(InvalidAddress, InvalidName); 
    Object resolve_str(in StringName n) 
      raises( NotFound, CannotProceed, InvalidName ); 
  }; 

};
#endif /* !_CosNaming_IDL_ */
