// CORBA V2.2
// PORTABLE OBJECT ADAPTER, Chapter 9
// $Id: PortableServer.idl,v 1.3 2000/03/24 21:58:14 brose Exp $

#ifndef _MYPOA_IDL
#define _MYPOA_IDL

#pragma prefix "omg.org"
#include <Corba.idl>

module PortableServer
{
    // forward reference
    interface POA;
	
    native Servant;
	
    typedef sequence<octet> ObjectId;
	
    exception ForwardRequest
	{
	    Object forward_reference;
	};
	
    // **********************************************
    //
    // Policy interfaces
    //
    // **********************************************

    const CORBA::PolicyType THREAD_POLICY_ID = 16;
    const CORBA::PolicyType LIFESPAN_POLICY_ID = 17;
    const CORBA::PolicyType ID_UNIQUENESS_POLICY_ID = 18;
    const CORBA::PolicyType ID_ASSIGNMENT_POLICY_ID = 19;
    const CORBA::PolicyType IMPLICIT_ACTIVATION_POLICY_ID = 20;
    const CORBA::PolicyType SERVANT_RETENTION_POLICY_ID = 21;
    const CORBA::PolicyType REQUEST_PROCESSING_POLICY_ID = 22;

    enum ThreadPolicyValue {
	ORB_CTRL_MODEL,
	SINGLE_THREAD_MODEL
    };

    interface ThreadPolicy : CORBA::Policy
	{
#pragma local
	    readonly attribute ThreadPolicyValue value;
	};
	
    enum LifespanPolicyValue {
	TRANSIENT,
	PERSISTENT
    };

    interface LifespanPolicy : CORBA::Policy
	{
#pragma local
	    readonly attribute LifespanPolicyValue value;
	};
	
    enum IdUniquenessPolicyValue {
	UNIQUE_ID,
	MULTIPLE_ID
    };

    interface IdUniquenessPolicy : CORBA::Policy
    {
#pragma local
	readonly attribute IdUniquenessPolicyValue value;
    };
	
    enum IdAssignmentPolicyValue {
	USER_ID,
	SYSTEM_ID
    };

    interface IdAssignmentPolicy : CORBA::Policy
    {
#pragma local
	readonly attribute IdAssignmentPolicyValue value;
    };
	
    enum ImplicitActivationPolicyValue {
	IMPLICIT_ACTIVATION,
	NO_IMPLICIT_ACTIVATION
    };

    interface ImplicitActivationPolicy : CORBA::Policy
    {
#pragma local
	readonly attribute ImplicitActivationPolicyValue value;
    };
	
    enum ServantRetentionPolicyValue {
	RETAIN,
	NON_RETAIN
    };

    interface ServantRetentionPolicy : CORBA::Policy
    {
#pragma local
	readonly attribute ServantRetentionPolicyValue value;
    };
	
    enum RequestProcessingPolicyValue {
	USE_ACTIVE_OBJECT_MAP_ONLY,
	USE_DEFAULT_SERVANT,
	USE_SERVANT_MANAGER
    };

    interface RequestProcessingPolicy : CORBA::Policy
    {
#pragma local
	readonly attribute RequestProcessingPolicyValue value;
    };
	
    // **************************************************
    //
    // POAManager interface
    //
    // **************************************************
	
    interface POAManager
    {
#pragma local
	exception AdapterInactive{ };
	
	enum State { HOLDING, ACTIVE, DISCARDING, INACTIVE };

	void activate( ) 
	    raises( AdapterInactive );
	void hold_requests( in boolean wait_for_completion ) 
	    raises( AdapterInactive );
	void discard_requests( in boolean wait_for_completion )
	    raises( AdapterInactive );
	void deactivate( in boolean etherealize_objects,
			 in boolean wait_for_completion )
	    raises( AdapterInactive );
	
	State get_state( );
    };
	
    // **************************************************
    //
    // AdapterActivator interface
    //
    // **************************************************
	
    interface AdapterActivator
    {
#pragma local
	boolean unknown_adapter( in POA parent, in string name );
    };
	
    // **************************************************
    //
    // ServantManager interface
    //
    // **************************************************
	
    interface ServantManager
    {};
	
    interface ServantActivator : ServantManager 
    {
#pragma local
	Servant incarnate (in ObjectId oid,
			   in POA     adapter )
	    raises ( ForwardRequest );
	
	void etherealize (in ObjectId oid,
			  in POA		adapter,
			  in Servant 	serv,
			  in boolean	cleanup_in_progress,
			  in boolean 	remaining_activations );
    };
	

    /*  We don't generate code from the follwing definitions
	as the language mapping defines the classes explicitly

    interface ServantLocator : ServantManager 
    {
#pragma local

	
	native 	Cookie;

	Servant preinvoke(
			  in ObjectId	       	oid,
			  in POA	       	adapter,
			  in CORBA::Identifier	operation,
			  out Cookie	       	the_cookie )
	    raises ( ForwardRequest );
	
	void postinvoke(
			in ObjectId   		oid,
			in POA			adapter,
			in CORBA::Identifier	operation,
			in Cookie    	       	the_cookie,
			in Servant	       	the_servant	);
	    raises ( ForwardRequest ); // this exception is only in the Java mapping!
    };
    */
	
	
    // **************************************************
    //
    // POA interface
    //
    // **************************************************
	
    // not pseudo, because it must be returned as a subtype
    // of CORBA::Object in resolve_initial_references()

    interface POA
    {
#pragma local
	    exception AdapterAlreadyExists {};
	    exception AdapterInactive { };
	    exception AdapterNonExistent { };
	    exception InvalidPolicy { unsigned short index; };
	    exception NoServant { };
	    exception ObjectAlreadyActive { };
	    exception ObjectNotActive { };
	    exception ServantAlreadyActive { };
	    exception ServantNotActive { };
	    exception WrongAdapter { };
	    exception WrongPolicy { };
	
	    //--------------------------------------------------
	    //
	    // POA creation and destruction
	    //
	    //--------------------------------------------------
	
	    POA create_POA( in string adapter_name,
			    in POAManager a_POAManager,
			    in CORBA::PolicyList policies )
		raises ( AdapterAlreadyExists, InvalidPolicy );
	
	    POA find_POA( in string adapter_name, in boolean activate_it )
		raises ( AdapterNonExistent );
	
	    void destroy(	in boolean etherealize_objects,
				in boolean wait_for_completion );
	
	    // **************************************************
	    //
	    // Factories for Policy objects
	    //
	    // **************************************************
	    ThreadPolicy
		create_thread_policy( in ThreadPolicyValue value );
	    LifespanPolicy
		create_lifespan_policy( in LifespanPolicyValue value );
	    IdUniquenessPolicy
		create_id_uniqueness_policy
		( in IdUniquenessPolicyValue value );
	    IdAssignmentPolicy
		create_id_assignment_policy
		( in IdAssignmentPolicyValue value );
	    ImplicitActivationPolicy
		create_implicit_activation_policy
		( in ImplicitActivationPolicyValue value );
	    ServantRetentionPolicy
		create_servant_retention_policy
		( in ServantRetentionPolicyValue value );
	    RequestProcessingPolicy
		create_request_processing_policy
		( in RequestProcessingPolicyValue value );
	
	    //--------------------------------------------------
	    //
	    // POA attributes
	    //
	    //--------------------------------------------------
	
	    readonly attribute string		the_name;
	    readonly attribute POA			the_parent;
	    readonly attribute POAManager	the_POAManager;
	    attribute AdapterActivator		the_activator;
	
	
	    //--------------------------------------------------
	    //
	    // Servant Manager registration:
	    //
	    //--------------------------------------------------
	
	    ServantManager get_servant_manager( )
		raises ( WrongPolicy );
	
	    void set_servant_manager( in ServantManager imgr )
		raises ( WrongPolicy );
	
	    //--------------------------------------------------
	    //
	    // operations for the USE_DEFAULT_SERVANT policy
	    //
	    //--------------------------------------------------
	
	    Servant get_servant( )
		raises ( NoServant, WrongPolicy );
	
	    void set_servant( in Servant p_servant )
		raises ( WrongPolicy );
	
	    // **************************************************
	    //
	    // object activation and deactivation
	    //
	    // **************************************************
	
	    ObjectId activate_object( in Servant p_servant )
		raises ( ServantAlreadyActive, WrongPolicy );
	
	    void activate_object_with_id(
					 in ObjectId	id,
					 in Servant	p_servant )
		raises ( ServantAlreadyActive, ObjectAlreadyActive,
			 WrongPolicy );
	
	    void deactivate_object( in ObjectId oid )
		raises ( ObjectNotActive, WrongPolicy );
	
	    // **************************************************
	    //
	    // reference creation operations
	    //
	    // **************************************************
	
	    Object create_reference (
				     in CORBA::RepositoryId intf )
		raises ( WrongPolicy );
	
	    Object create_reference_with_id (
					     in ObjectId				oid,
					     in CORBA::RepositoryId	intf )
		raises ( WrongPolicy );
	
	
	    //--------------------------------------------------
	    //
	    // Identity mapping operations:
	    //
	    //--------------------------------------------------
	
	    ObjectId servant_to_id( in Servant p_servant )
		raises ( ServantNotActive, WrongPolicy );
	
	    Object servant_to_reference( in Servant p_servant )
		raises ( ServantNotActive, WrongPolicy );
	
	    Servant reference_to_servant( in Object reference )
		raises ( ObjectNotActive, WrongAdapter, WrongPolicy );
	
	    ObjectId reference_to_id( in Object reference )
		raises ( WrongAdapter, WrongPolicy );
	
	    Servant id_to_servant( in ObjectId oid )
		raises ( ObjectNotActive, WrongPolicy );
	
	    Object id_to_reference( in ObjectId oid )
		raises ( ObjectNotActive, WrongPolicy );
	
	};
	
	
    // **************************************************
    //
    // Current interface
    //
    // **************************************************

    // not pseudo, because it must be returned as a subtype
    // of CORBA::Object in resolve_initial_references()
	
    interface Current : CORBA::Current
    {
#pragma local
	exception NoContext { };
	
	POA get_POA( ) raises ( NoContext );
	ObjectId get_object_id( ) raises ( NoContext );
    };
	
};
#endif /* _MYPOA_IDL */
