// -*- c++ -*-

#include "config.idl"

#ifdef USE_CSL2
#include <mico/security/odm.idl>
#else
#include <mico/policy.idl>
#endif // USE_CSL2
#include <mico/current.idl>
#include <mico/basic_seq.idl>

#pragma prefix "omg.org"

module PortableServer
{
  // forward reference

  interface POA;
  typedef sequence<POA> POAList;

  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,
    MAIN_THREAD_MODEL
  };

  interface ThreadPolicy : CORBA::Policy {
    readonly attribute ThreadPolicyValue value;
  };

  enum LifespanPolicyValue {
    TRANSIENT,
    PERSISTENT
  };

  interface LifespanPolicy : CORBA::Policy {
    readonly attribute LifespanPolicyValue value;
  };

  enum IdUniquenessPolicyValue {
    UNIQUE_ID,
    MULTIPLE_ID
  };

  interface IdUniquenessPolicy : CORBA::Policy {
    readonly attribute IdUniquenessPolicyValue value;
  };

  enum IdAssignmentPolicyValue {
    USER_ID,
    SYSTEM_ID
  };

  interface IdAssignmentPolicy : CORBA::Policy {
    readonly attribute IdAssignmentPolicyValue value;
  };

  enum ImplicitActivationPolicyValue {
    IMPLICIT_ACTIVATION,
    NO_IMPLICIT_ACTIVATION
  };

  interface ImplicitActivationPolicy : CORBA::Policy {
    readonly attribute ImplicitActivationPolicyValue value;
  };

  enum ServantRetentionPolicyValue {
    RETAIN,
    NON_RETAIN
  };

  interface ServantRetentionPolicy : CORBA::Policy {
    readonly attribute ServantRetentionPolicyValue value;
  };

  enum RequestProcessingPolicyValue {
    USE_ACTIVE_OBJECT_MAP_ONLY,
    USE_DEFAULT_SERVANT,
    USE_SERVANT_MANAGER
  };

  interface RequestProcessingPolicy : CORBA::Policy {
    readonly attribute RequestProcessingPolicyValue value;
  };

  /*
   * **************************************************
   *
   * POAManager interface
   *
   * **************************************************
   */

  interface POAManager {
    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 ();

    // begin-mico-extension
    void add_managed_poa (in POA managed);
    void del_managed_poa (in POA managed);
    // end-mico-extension
  };

  /*
   * **************************************************
   *
   * AdapterActivator interface
   *
   * **************************************************
   */

  interface AdapterActivator {
    boolean unknown_adapter (in POA parent, in string name);
  };

  /*
   * **************************************************
   *
   * ServantManager interface
   *
   * **************************************************
   */

  interface ServantManager {};

  interface ServantActivator : ServantManager {
    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);
  };

  interface ServantLocator : ServantManager {
    native Cookie;
    // typedef string Identifier;

    Servant preinvoke (in ObjectId oid,
		       in POA adapter,
		       in string operation,
		       out Cookie the_cookie)
      raises (ForwardRequest);

    void postinvoke (in ObjectId oid,
		     in POA adapter,
		     in string operation,
		     in Cookie the_cookie,
		     in Servant the_servant);
  };

  /*
   * **************************************************
   *
   * POA interface
   *
   * **************************************************
   */

  interface POA {
    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;
    readonly attribute POAList the_children;
    attribute AdapterActivator the_activator;

    /*
     * **************************************************
     *
     * ServantManager 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
     *
     * **************************************************
     */

    // typedef string RepositoryId;

    Object create_reference (in string intf)
      raises (WrongPolicy);

    Object create_reference_with_id (in ObjectId oid,
				     in string intf);

    /*
     * **************************************************
     *
     * 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);

    readonly attribute CORBA::OctetSeq id;

    // begin-mico-extension
    Object activate_for_this (in Servant serv);
    void poa_manager_callback (in POAManager::State newstate,
			       in boolean etherealize_objects,
			       in boolean wait_for_completion);
    Servant preinvoke (in Object for_obj);
    void postinvoke ();
    // end-mico-extension

#ifdef USE_CSL2
    void register_ODM_factory (in ::ObjectDomainMapping::_Factory fry);
    ::ObjectDomainMapping::Manager get_ODM ();
#endif // USE_CSL2
  };

  /*
   * **************************************************
   *
   * Current interface
   *
   * **************************************************
   */

  interface Current : CORBA::Current {
    exception NoContext {};

    POA get_POA ()
      raises (NoContext);

    ObjectId get_object_id ()
      raises (NoContext);

    Object get_reference()
	raises(NoContext);

    Servant get_servant()
	raises(NoContext);

    // begin-mico-extension
    boolean iscurrent ();
    // end-mico-extension
  };
};
