#ifdef AIX_PROD
/* @(#)59    1.4  src/rpc/sys_idl/ssrstubs.h, rpc.idl.src, os2dce21.dss, 960602a.1  5/17/95  09:47:28 */
/*
 * COMPONENT_NAME:  rpc.idl.src
 *
 * FUNCTIONS:
 *
 * ORIGINS: 72
 *
 */
#endif /* AIX_PROD */

/* IBMSSR, CMVC feature# 7130 */

#ifndef IBMSSR_STUBS_H
#define IBMSSR_STUBS_H

#include <dce/dce.h>

#define IDL_ssr_flags_t unsigned long

/* special addr specifies pointer to function result as comm/fault status */
/* this is a bad trick due to lack of one more flag bit */
#define IDL_SSRC_STAT_IS_FUNC_RESULT  2

/* client side */
#define IDL_SSRC_IMPL_HANDLE	      0x0001
#define IDL_SSRC_USER_HANDLE	      0x0002
#define IDL_SSRC_CONTEXT_HANDLE       0x0004
#define IDL_SSRC_AUTO_HANDLE	      0x0008
#define IDL_SSRC_NOT_AUTO_IDEM	      0x0010
#define IDL_SSRC_REPAS_HANDLE	      0x0020
#define IDL_SSRC_EXCEPTIONS	      0x0040
#define IDL_SSRC_EXCEPTIONS_DCLED     0x0080
#define IDL_SSRC_PTRS		      0x0100
#define IDL_SSRC_OUTPTRS	      0x0200
#define IDL_SSRC_MAYBE		      0x0400
#define IDL_SSRC_POINTER_RESULT       0x0800
#define IDL_SSRC_ICS		      0x1000
#define IDL_SSRC_COMM_STAT_ADDL       0x2000
#define IDL_SSRC_FAULT_STAT_ADDL      0x4000
#define IDL_SSRC_RESULT_STAT	      0x8000

#define IDL_SSRC_IMPL_HANDLE_SET      (flags & IDL_SSRC_IMPL_HANDLE)
#define IDL_SSRC_USER_HANDLE_SET      (flags & IDL_SSRC_USER_HANDLE)
#define IDL_SSRC_CONTEXT_HANDLE_SET   (flags & IDL_SSRC_CONTEXT_HANDLE)
#define IDL_SSRC_AUTO_HANDLE_SET      (flags & IDL_SSRC_AUTO_HANDLE)
#define IDL_SSRC_NOT_AUTO_IDEM_SET    (flags & IDL_SSRC_NOT_AUTO_IDEM)
#define IDL_SSRC_REPAS_HANDLE_SET     (flags & IDL_SSRC_REPAS_HANDLE)
#define IDL_SSRC_EXCEPTIONS_SET       (flags & IDL_SSRC_EXCEPTIONS)
#define IDL_SSRC_EXCEPTIONS_DCLED_SET (flags & IDL_SSRC_EXCEPTIONS_DCLED)
#define IDL_SSRC_PTRS_SET	      (flags & IDL_SSRC_PTRS)
#define IDL_SSRC_OUTPTRS_SET	      (flags & IDL_SSRC_OUTPTRS)
#define IDL_SSRC_MAYBE_SET	      (flags & IDL_SSRC_MAYBE)
#define IDL_SSRC_POINTER_RESULT_SET   (flags & IDL_SSRC_POINTER_RESULT)
#define IDL_SSRC_ICS_SET	      (flags & IDL_SSRC_ICS)
#define IDL_SSRC_COMM_STAT_ADDL_SET   (flags & IDL_SSRC_COMM_STAT_ADDL)
#define IDL_SSRC_FAULT_STAT_ADDL_SET  (flags & IDL_SSRC_FAULT_STAT_ADDL)
#define IDL_SSRC_RESULT_STAT_SET      (flags & IDL_SSRC_RESULT_STAT)

typedef struct IDL_ssrc_if_params1_t {
    handle_t		  *implicit_handle_p;		  /* implicit handle */
    idl_void_p_t	  IDL_interface_client_once_p;	  /* auto handle */
    idl_void_p_t	  IDL_auto_handle_mutex_p;
    rpc_ns_handle_t	  *IDL_import_cursor_p;
    rpc_binding_handle_t  *IDL_interface_binding_p;
    idl_boolean 	  *IDL_error_using_binding_p;
    error_status_t	  *IDL_auto_handle_status_p;
    void		  (*IDL_auto_handle_init)();
    void		  (*IDL_exceptions_init)();	  /* exceptions */
    idl_void_p_t	  IDL_ssr_thread_once_p;
    idl_void_p_t	  user_exception_addresses;
} IDL_ssrc_if_params1_t;

typedef struct IDL_ssrc_if_params_t {
    idl_byte		  *IDL_type_vec;
    idl_ulong_int	  *IDL_offset_vec;
    void		  (**IDL_rtn_vec)();
    rpc_if_handle_t	  ifspec;
    IDL_ssrc_if_params1_t *more_params;
} IDL_ssrc_if_params_t;

typedef struct IDL_ssrc_op_params_t {
    handle_t		  (*bind)();
    void		  (*unbind)();
    idl_ushort_int	  cs_stag_num;
    idl_ushort_int	  cs_drtag_num;
    idl_ushort_int	  cs_rtag_num;
    void		  (*cs_set_tags)();
} IDL_ssrc_op_params_t;


/*
 * All DCEAPI changes are related to CMVC feature 4789 and defect 6857
 * DCEAPI changes are IBM specific.  For AIX, DCEAPI was defined when
 * the DCE 1.1 merge was done.
 */
#ifdef IBMOS2
#ifndef DCEAPI
#include <dce/dcedef.h>
#endif
#else  /* AIX_PROD */
#undef DCEAPI
#define DCEAPI
#endif

idl_void_p_t DCEAPI  rpc_ssr_cstub _DCE_PROTOTYPE_ (
   (
    IDL_ssr_flags_t	  flags,
    error_status_t	  *p_comm_status,
    error_status_t	  *p_fault_status,
    IDL_ssrc_if_params_t  *if_params,
    IDL_ssrc_op_params_t  *op_params,
    idl_ulong_int	  result_size,
    unsigned32		  operation_number,
    unsigned32		  call_options,
    idl_ulong_int	  in_parameter_count,
    idl_ulong_int	  in_type_index,
    idl_ulong_int	  out_parameter_count,
    idl_ulong_int	  out_type_index,
    idl_ulong_int	  num_params,
    idl_void_p_t	  p1, ...
   )
);

/***************
 * server ssr  *
 ***************/

#define IDL_SSRS_CTX		      0x0100
#define IDL_SSRS_CTX_RESULT	      0x0200
#define IDL_SSRS_PTRS		      0x0002
#define IDL_SSRS_PTRS_FULL	      0x0004
#define IDL_SSRS_PTRS_DEL	      0x0008
#define IDL_SSRS_PIPE		      0x0010
#define IDL_SSRS_EXCEPTIONS_DCLED     0x0040
#define IDL_SSRS_EXPLICIT_BINDING     0x1000
#define IDL_SSRS_ICS		      0x2000

#define IDL_SSRS_CTX_SET	      (op->flags & IDL_SSRS_CTX)
#define IDL_SSRS_CTX_RESULT_SET       (op->flags & IDL_SSRS_CTX_RESULT)
#define IDL_SSRS_PTRS_SET	      (op->flags & IDL_SSRS_PTRS)
#define IDL_SSRS_PTRS_FULL_SET	      (op->flags & IDL_SSRS_PTRS_FULL)
#define IDL_SSRS_PTRS_DEL_SET	      (op->flags & IDL_SSRS_PTRS_DEL)
#define IDL_SSRS_PIPE_SET	      (op->flags & IDL_SSRS_PIPE)
#define IDL_SSRS_EXCEPTIONS_DCLED_SET (op->flags & IDL_SSRS_EXCEPTIONS_DCLED)
#define IDL_SSRS_EXPLICIT_BINDING_SET (op->flags & IDL_SSRS_EXPLICIT_BINDING)
#define IDL_SSRS_ICS_SET	      (op->flags & IDL_SSRS_ICS)

typedef char * (* IDL_ssrs_common_sstub_t)(
  handle_t	h,
  idl_ulong_int op_num,
  idl_void_p_t	IDL_param_vec[],
  rpc_mgr_epv_t IDL_mgr_epv
);

typedef unsigned int IDL_ssrs_pipe_t[5];

typedef struct IDL_ssrs_ctx_t {
  idl_ulong_int   param_index;
  void		  (*rd_routine)();
  idl_ulong_int   in_set;
} IDL_ssrs_ctx_t;

typedef unsigned int IDL_ssrs_param_t[2];

typedef struct IDL_ssrs_op_t {
  IDL_ssr_flags_t  flags;
  idl_short_int    num_params_p_alloc;
  idl_ulong_int    result_size;
  idl_short_int    first_pipe_index;
  idl_short_int    num_pipe_inits;
  IDL_ssrs_pipe_t  *pipe_data;
  void		   (*ctx_result_rd_routine)();
  idl_short_int    num_out_ctx_params;
  IDL_ssrs_ctx_t   *ctx_data;
  idl_short_int    stag_param_num;
  idl_short_int    drtag_param_num;
  idl_short_int    rtag_param_num;
  void		   (*set_tags)();
  idl_short_int    num_params_alloc;
  IDL_ssrs_param_t *params_alloc;
  idl_ulong_int    num_ins_params;
  idl_ulong_int    ins_type_index;
  idl_ulong_int    num_outs_params;
  idl_ulong_int    outs_type_index;
} IDL_ssrs_op_t;

typedef struct IDL_ssrs_if_params_t {
  IDL_ssrs_common_sstub_t common_sstub;
  IDL_ssrs_op_t 	  *ops;
  idl_byte		  *IDL_type_vec;
  idl_ulong_int 	  *IDL_offset_vec;
  void			  (**IDL_rtn_vec)();
  void			  (*IDL_exceptions_init)();
  idl_void_p_t		  IDL_ssr_threads_once_p;
  idl_void_p_t		  user_exception_addresses;
  int			  num_total_exceptions;
} IDL_ssrs_if_params_t;

void DCEAPI rpc_ssr_sstub  _DCE_PROTOTYPE_ (
 (
  handle_t		  binding_handle,
  rpc_call_handle_t	  IDL_call_h,
  rpc_iovector_elt_p_t	  IDL_elt_p,
  ndr_format_p_t	  IDL_drep_p,
  rpc_transfer_syntax_p_t IDL_transfer_syntax_p,
  rpc_mgr_epv_t 	  IDL_mgr_epv,
  error_status_t	  *IDL_status_p,
  unsigned16		  opnum,
  IDL_ssrs_if_params_t	  *params
 )
);

#endif /* IBMSSR_STUBS_H */


