
#ifndef COS_NAMING_IDL
#define COS_NAMING_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 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, 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();
    };
};

#endif
