//
// Naming.idl		     
//                            
//
//
// Description:
//	IDL interfaces for COSS Naming Service
//	

/*
  $Id: CosNaming.idl,v 1.3 1999/02/05 03:10:05 janssen Exp $
*/


#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 {
	   //NameComponent binding_name;
	   Name		 binding_name;
	   BindingType   binding_type;
	};

	typedef sequence <Binding> BindingList;


	interface BindingIterator;
	interface NamingContext;

	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 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, AlreadyBound);

	};

	interface BindingIterator {
	   
	    boolean next_one (out Binding b);

            boolean next_n (in unsigned long how_many,
	                     out BindingList bl);

	    void destroy ();
	};

};
