//File: CosNaming.idl
//The only module of the Naming Service
//OMG File: 04-10-07

#ifndef _COS_NAMING_IDL_
#define _COS_NAMING_IDL_

#ifdef _PRE_3_0_COMPILER_
#pragma prefix "omg.org"
#endif // _PRE_3_0_COMPILER_

module CosNaming {

#ifndef _PRE_3_0_COMPILER_
	typeprefix CosNaming "omg.org";
#endif // _PRE_3_0_COMPILER_

    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 sn)
						raises(
							NotFound, CannotProceed,
							InvalidName 
							//PolyORB:WA: the OMG's IDL states "InvalidaName,"
							//            which is not syntanxically correct
						);

	};
};
#endif /* ifndef _COS_NAMING_IDL_ */
