// CosNaming Module, p 3-6 CORBAservices, Naming Service V1.0, 3/94
#ifndef __COS_NAMING
#define __COS_NAMING
#endif

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

// Names Library interface in PIDL,   
// CORBAservices p 3- 14, Naming Service V1.0 3/94 

	pseudo interface LNameComponent { // PIDL
		exception NotSet{};
		string get_id() 
			raises(NotSet);
		void set_id(in string i);
		string get_kind() 
			raises(NotSet);
		void set_kind(in string k);
		void destroy();
	};
	
	pseudo interface LName { // PIDL
		exception NoComponent{};
		exception OverFlow{};
		exception InvalidName{};                                
		LName insert_component(in unsigned long i, 
						in LNameComponent n) 
				raises(NoComponent, OverFlow);
		LNameComponent get_component(in unsigned long i)
			 raises(NoComponent);                           
		LNameComponent delete_component(in unsigned long i)
			 raises(NoComponent);                           
		unsigned long num_components();
		boolean equal(in LName ln);
		boolean less_than(in LName ln);
		Name to_idl_form()
				raises(InvalidName);                             
		void from_idl_form(in Name n);
		void destroy();
	};
	
	/*
	LName create_lname();                      // C/C++
	LNameComponent create_lname_component();   // C/C++
	*/
}; // end CosNaming

#endif
