/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
#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();
	};
};
