// File: CosNaming.idl
#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;
    };

    // Note: In struct Binding, binding_name is incorrectly defined
    // as a Name instead of a NameComponent. This definition is
    // unchanged for compatibility reasons.

    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();
    };

    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_

