
#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 cxt;
      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, CannotProceed, InvalidName, AlreadyBound);

    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 b);
    
    void destroy();

  };

};
