#ifndef __pi_idl__
#define __pi_idl__

#include <mico/ioptypes.idl>
#include <mico/basic_seq.idl>
#include <mico/current.idl>
#include <mico/policy.idl>
#include <mico/typecode_seq.idl>

#pragma prefix "omg.org"

module CORBA {
    typedef sequence<string> StringSeq;
};

module Messaging {
    enum SyncScope {
	SYNC_NONE,
	SYNC_WITH_TRANSPORT,
	SYNC_WITH_SERVER,
	SYNC_WITH_TARGET
    };
};

module Dynamic {
    struct Parameter {
	any argument;
	CORBA::ParameterMode mode;
    };
    typedef sequence<Parameter> ParameterList;
    typedef CORBA::StringSeq ContextList;
    typedef CORBA::TypeCodeSeq ExceptionList;
    typedef CORBA::StringSeq RequestContext;
};


module IOP {
    typedef sequence<IOP::TaggedComponent> TaggedComponentSeq;

    local interface Codec {
	exception InvalidTypeForEncoding {
	};
	exception FormatMismatch {
	};
	exception TypeMismatch {
	};
	CORBA::OctetSeq encode (in any data)
	    raises (InvalidTypeForEncoding);
	any decode (in CORBA::OctetSeq data)
	    raises (FormatMismatch);
	CORBA::OctetSeq encode_value (in any data)
	    raises (InvalidTypeForEncoding);
	any decode_value (in CORBA::OctetSeq data,
			  in CORBA::TypeCode tc)
	    raises (FormatMismatch, TypeMismatch);
    };

    typedef short EncodingFormat;
    const EncodingFormat ENCODING_CDR_ENCAPS = 0;
    struct Encoding {
	EncodingFormat format;
	octet major_version;
	octet minor_version;
    };

    local interface CodecFactory {
	exception UnknownEncoding {
	};
	Codec create_codec (in Encoding enc)
	    raises (UnknownEncoding);
    };
};


module PortableInterceptor {
	
    local interface Interceptor {
	readonly attribute string name;
	void destroy();
    };

    exception ForwardRequest {
	Object forward;
	boolean permanent;
    };
	
    typedef short ReplyStatus;
	
    // Valid reply_status values:
    const ReplyStatus SUCCESSFUL = 0;
    const ReplyStatus SYSTEM_EXCEPTION = 1;
    const ReplyStatus USER_EXCEPTION = 2;
    const ReplyStatus LOCATION_FORWARD = 3;
    const ReplyStatus LOCATION_FORWARD_PERMANENT = 4;
    const ReplyStatus TRANSPORT_RETRY = 5;
    typedef unsigned long SlotId;
	
    exception InvalidSlot {
    };
	
    local interface Current : CORBA::Current {
	any get_slot (in SlotId id)
	    raises (InvalidSlot);
	void set_slot (in SlotId id, in any data)
	    raises (InvalidSlot);
    };

    local interface RequestInfo {
	readonly attribute unsigned long request_id;
	readonly attribute string operation;
	readonly attribute Dynamic::ParameterList arguments;
	readonly attribute Dynamic::ExceptionList exceptions;
	readonly attribute Dynamic::ContextList contexts;
	readonly attribute Dynamic::RequestContext operation_context;
	readonly attribute any result;
	readonly attribute boolean response_expected;
	readonly attribute Messaging::SyncScope sync_scope;
	readonly attribute ReplyStatus reply_status;
	readonly attribute Object forward_reference;
	any get_slot (in SlotId id)
	    raises (InvalidSlot);
	IOP::ServiceContext get_request_service_context (in IOP::ServiceId id);
	IOP::ServiceContext get_reply_service_context (in IOP::ServiceId id);
    };
	
    local interface ClientRequestInfo : RequestInfo {
	readonly attribute Object target;
	readonly attribute Object effective_target;
	readonly attribute IOP::TaggedProfile effective_profile;
	readonly attribute any received_exception;
	readonly attribute CORBA::RepositoryId received_exception_id;
	IOP::TaggedComponent get_effective_component (in IOP::ComponentId id);
	IOP::TaggedComponentSeq get_effective_components (in IOP::ComponentId id);
	CORBA::Policy get_request_policy (in CORBA::PolicyType type);
	void add_request_service_context (in IOP::ServiceContext service_context,
					  in boolean replace);
    };
	
    local interface ServerRequestInfo : RequestInfo {
	readonly attribute any sending_exception;
	readonly attribute CORBA::OctetSeq object_id;
	readonly attribute CORBA::OctetSeq adapter_id;
	readonly attribute CORBA::RepositoryId
	target_most_derived_interface;
	CORBA::Policy get_server_policy (in CORBA::PolicyType type);
	void set_slot (in SlotId id, in any data)
	    raises (InvalidSlot);
	boolean target_is_a (in CORBA::RepositoryId id);
	void add_reply_service_context (in IOP::ServiceContext service_context,
					in boolean replace);
    };
	
    local interface ClientRequestInterceptor : Interceptor {
	void send_request (in ClientRequestInfo ri)
	    raises (ForwardRequest);
	void send_poll (in ClientRequestInfo ri);
	void receive_reply (in ClientRequestInfo ri);
	void receive_exception (in ClientRequestInfo ri)
	    raises (ForwardRequest);
	void receive_other (in ClientRequestInfo ri)
	    raises (ForwardRequest);
    };
	
    local interface ServerRequestInterceptor : Interceptor {
	void receive_request_service_contexts (in ServerRequestInfo ri)
	    raises (ForwardRequest);
	void receive_request (in ServerRequestInfo ri)
	    raises (ForwardRequest);
	void send_reply (in ServerRequestInfo ri);
	void send_exception (in ServerRequestInfo ri)
	    raises (ForwardRequest);
	void send_other (in ServerRequestInfo ri)
	    raises (ForwardRequest);
    };
	
    local interface IORInfo {
	CORBA::Policy get_effective_policy (in CORBA::PolicyType type);
	void add_ior_component (in IOP::TaggedComponent comp);
	void add_ior_component_to_profile (in IOP::TaggedComponent comp,
					   in IOP::ProfileId profile_id);
    };

    local interface IORInterceptor : Interceptor {
	void establish_components (in IORInfo info);
    };

    local interface PolicyFactory
    {
	CORBA::Policy create_policy (in CORBA::PolicyType type,
				     in any value)
	    raises (CORBA::PolicyError);
    };

    local interface ORBInitInfo {
	typedef string ObjectId;
	exception DuplicateName {
	    string name;
	};
	exception InvalidName {
	};

	readonly attribute CORBA::StringSeq arguments;
	readonly attribute string orb_id;
	readonly attribute IOP::CodecFactory codec_factory;
	void register_initial_reference (in ObjectId id, in Object obj)
	    raises (InvalidName);
	Object resolve_initial_references (in ObjectId id)
	    raises (InvalidName);
	void add_client_request_interceptor (in ClientRequestInterceptor interceptor)
	    raises (DuplicateName);
	void add_server_request_interceptor (in ServerRequestInterceptor interceptor)
	    raises (DuplicateName);
	void add_ior_interceptor (in IORInterceptor interceptor)
	    raises (DuplicateName);
	SlotId allocate_slot_id ();
	void register_policy_factory (in CORBA::PolicyType type, in PolicyFactory policy_factory);
    };

    local interface ORBInitializer {
	void pre_init (in ORBInitInfo info);
	void post_init (in ORBInitInfo info);
    };

};

#endif
