/* @(#)48	1.3  src/somk/somcorba.h, somk.api, som2.1.1 1/27/95 15:19:08  */
/*
 *   COMPONENT_NAME: somk
 *
 *   ORIGINS: 27
 *
 *
 *   10H9767, 10H9769  (C) COPYRIGHT International Business Machines Corp. 1994
 *   All Rights Reserved
 *   Licensed Materials - Property of IBM
 *   US Government Users Restricted Rights - Use, duplication or
 *   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

/*
 *    SOMCORBA.H
 *    Typedefs, structs, & prototypes in support of CORBA extensions
 *    to the SOM run-time
 */

#ifndef SOMCorba_h
#define SOMCorba_h
#include <string.h>  /* needed for memset, used below */

#ifdef CORBA_FUNCTION_NAMES
#define CORBAObject Object
#endif

/* in SOM, a CORBA object is a SOM object */
typedef SOMObject CORBAObject;

/* CORBA 5.7, p.89 */
#ifndef SOM_BOOLEAN
  #define SOM_BOOLEAN
  typedef unsigned char boolean;
#endif /* SOM_BOOLEAN */
typedef unsigned char octet;
typedef char *string;

/* CORBA 7.5.1, p. 129 */
typedef string Identifier;

/* CORBA 4.13, p. 80 */
/*
 * Generated SOM usage bindings for IDL enums start at 1, but
 * somcorba.h is not generated, and the original SOM 2.0 somcorba.h
 * used C typedefs to define the exception_type and completion_
 * status enumerations. As a result, to maintain backwards binary
 * compatability, the mapping for these enums, here, starts at 0.
 */

typedef unsigned long exception_type;
  #define NO_EXCEPTION     0
  #define USER_EXCEPTION   1
  #define SYSTEM_EXCEPTION 2

typedef unsigned long completion_status;
  #define YES              0
  #define NO               1
  #define MAYBE            2

typedef struct StExcep {
    unsigned long minor;
    completion_status completed;
} StExcep;

typedef struct Environment {
    exception_type	       _major;
    struct {
	char *		       _exception_name;
	void *		       _params;
    } exception;
    void *		       _somdAnchor;
} Environment;

/* CORBA 7.6.1, p.139 plus 5.7, p.89 enum Data Type Mapping */
typedef unsigned long TCKind;
  #define TypeCode_tk_null	1
  #define TypeCode_tk_void	2
  #define TypeCode_tk_short	3
  #define TypeCode_tk_long	4
  #define TypeCode_tk_ushort	5
  #define TypeCode_tk_ulong	6
  #define TypeCode_tk_float	7
  #define TypeCode_tk_double	8
  #define TypeCode_tk_boolean	9
  #define TypeCode_tk_char	10
  #define TypeCode_tk_octet	11
  #define TypeCode_tk_any	12
  #define TypeCode_tk_TypeCode	13
  #define TypeCode_tk_Principal 14
  #define TypeCode_tk_objref	15
  #define TypeCode_tk_struct	16
  #define TypeCode_tk_union	17
  #define TypeCode_tk_enum	18
  #define TypeCode_tk_string	19
  #define TypeCode_tk_sequence	20
  #define TypeCode_tk_array	21

  #define TypeCode_tk_pointer	101 /* SOM extension */
  #define TypeCode_tk_self	102 /* SOM extension */
  #define TypeCode_tk_foreign	103 /* SOM extension */

/* Short forms of tk_<x> enumerators */

  #define tk_null	TypeCode_tk_null
  #define tk_void	TypeCode_tk_void
  #define tk_short	TypeCode_tk_short
  #define tk_long	TypeCode_tk_long
  #define tk_ushort	TypeCode_tk_ushort
  #define tk_ulong	TypeCode_tk_ulong
  #define tk_float	TypeCode_tk_float
  #define tk_double	TypeCode_tk_double
  #define tk_boolean	TypeCode_tk_boolean
  #define tk_char	TypeCode_tk_char
  #define tk_octet	TypeCode_tk_octet
  #define tk_any	TypeCode_tk_any
  #define tk_TypeCode	TypeCode_tk_TypeCode
  #define tk_Principal	TypeCode_tk_Principal
  #define tk_objref	TypeCode_tk_objref
  #define tk_struct	TypeCode_tk_struct
  #define tk_union	TypeCode_tk_union
  #define tk_enum	TypeCode_tk_enum
  #define tk_string	TypeCode_tk_string
  #define tk_sequence	TypeCode_tk_sequence
  #define tk_array	TypeCode_tk_array
  #define tk_pointer	TypeCode_tk_pointer
  #define tk_self	TypeCode_tk_self
  #define tk_foreign	TypeCode_tk_foreign

#ifndef SOM_TYPECODE
  #define SOM_TYPECODE
  typedef void * TypeCode;
#endif /* SOM_TYPECODE */

/* CORBA 5.7, p.89 */
typedef struct any {
    TypeCode _type;
    void   * _value;
    } any;

/* Convenience macros for sequences */
#define sequence(type) _IDL_SEQUENCE_ ## type
#define SOM_SEQUENCE_NAME(name,type)\
    struct name {\
	unsigned long _maximum;\
	unsigned long _length;\
	type	 *    _buffer;\
    }
#define SOM_SEQUENCE(type)\
    struct {\
	unsigned long _maximum;\
	unsigned long _length;\
	type	 *    _buffer;\
    }

#define SOM_SEQUENCE_TYPEDEF(type) typedef SOM_SEQUENCE(type) sequence(type)
#define SOM_SEQUENCE_TYPEDEF_NAME(type, name) typedef SOM_SEQUENCE(type) name

/* per CORBA 5.10, p.91 */
#ifndef _IDL_SEQUENCE_void_defined
#define _IDL_SEQUENCE_void_defined
SOM_SEQUENCE_TYPEDEF (void);
#endif /* _IDL_SEQUENCE_void_defined */

/* SOM extensions for sequence manipulation */
#define GENERIC_SEQUENCE	sequence(void)
#define sequenceNew(type,max)	(*(sequence(type) *)tcSequenceNew(TC_##type,max))
/* Note that sequenceNew macro assumes that a TypeCode constant of the	*/
/* form TC_xxx exists for any type xxx used as an argument		*/
#define sequenceElement(s,elem) (s._buffer[elem])
#define sequenceLength(s)	(s._length)
#define sequenceMaximum(s)	(s._maximum)

SOMEXTERN char * SOMLINK somExceptionId    (Environment *ev);
SOMEXTERN void * SOMLINK somExceptionValue (Environment *ev);
SOMEXTERN void	 SOMLINK somExceptionFree  (Environment *ev);
SOMEXTERN void	 SOMLINK somSetException   (Environment *ev,
    exception_type major, char *exception_name, void *params);
SOMEXTERN Environment * SOMLINK somGetGlobalEnvironment (void);

/* Exception function names per CORBA 5.19, p.99 */
#define exception_id	somExceptionId
#define exception_value somExceptionValue
#define exception_free	somExceptionFree

#ifndef    TRUE
#define    TRUE 1
#endif	/* TRUE */
#ifndef    FALSE
#define    FALSE 0
#endif	/* FALSE */

#define SOM_InterfaceRepository\
    (__get_somInterfaceRepository(SOMClassMgrObject))

/*  Convenience macros for manipulating environment structures
 *
 *  SOM_CreateLocalEnvironment returns a pointer to an Environment.
 *  The other 3 macros all expect a single argument that is also
 *  a pointer to an Environment.  Use the create/destroy forms for
 *  a dynamic local environment and the init/uninit forms for a stack-based
 *  local environment.
 *
 *  For example
 *
 *	Environment *ev;
 *	ev = SOM_CreateLocalEnvironment ();
 *	... Use ev in methods
 *	SOM_DestroyLocalEnvironment (ev);
 *
 *  or
 *
 *	Environment ev;
 *	SOM_InitEnvironment (&ev);
 *	... Use &ev in methods
 *	SOM_UninitEnvironment (&ev);
 */
#define SOM_CreateLocalEnvironment()\
    ((Environment *) SOMCalloc (1, sizeof (Environment)))
#define SOM_DestroyLocalEnvironment(ev)\
    (somExceptionFree ((ev)), (somGetGlobalEnvironment() == (ev)) ?\
	(void) 0 : SOMFree ((ev)))
#define SOM_InitEnvironment(ev)\
    ((somGetGlobalEnvironment() == (ev)) ?\
	(void *) NULL : memset (((char *)((ev))), 0, sizeof (Environment)))
#define SOM_UninitEnvironment(ev)\
    (somExceptionFree ((ev)))

#endif /* SOMCorba_h */
