/* wincpic.h */
/* Copyright Data Connection Ltd. 1992 */
/* Copyright (c) 1992, Microsoft Corporation.  All rights reserved.          */
/*****************************************************************************/
/* CPI-Communications constants and function prototypes file                 */
/*****************************************************************************/

#ifndef CMCH_INCLUDED
#define CMCH_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif

/*****************************************************************************/
/* Ensure the correct packing of structures                                  */
/*****************************************************************************/
#ifdef WIN32
  #pragma pack(4)
#endif

/*****************************************************************************/
/* Type Definitions                                                          */
/*****************************************************************************/


#ifdef DOS5
#define CM_INT32 signed long int
#define CM_ENTRY extern void pascal far _loadds
#define CM_PTR   far *
#endif

#ifdef WINDOWS
#define WINSNA
#define CM_INT32 signed long int
#define CM_ENTRY extern void pascal far _loadds
#define CM_PTR   far *
#endif

#ifdef WIN32
#define WINSNA
#ifdef SET_UNALIGNED_ACCESS_FOR_THUNK
#define CM_INT32 signed long int UNALIGNED
#else
#define CM_INT32 signed long int
#endif
#define CM_ENTRY extern void WINAPI
#define CM_PTR   *
#define CM_EVENT_HANDLE HANDLE
#endif

typedef CM_INT32 CM_CONVERSATION_STATE;
typedef CM_INT32 CM_CONVERSATION_TYPE;
typedef CM_INT32 CM_DATA_RECEIVED_TYPE;
typedef CM_INT32 CM_DEALLOCATE_TYPE;
typedef CM_INT32 CM_ERROR_DIRECTION;
typedef CM_INT32 CM_FILL;
typedef CM_INT32 CM_PREPARE_TO_RECEIVE_TYPE;
typedef CM_INT32 CM_RECEIVE_TYPE;
typedef CM_INT32 CM_REQUEST_TO_SEND_RECEIVED;
typedef CM_INT32 CM_RETURN_CODE;
typedef CM_INT32 CM_RETURN_CONTROL;
typedef CM_INT32 CM_SEND_TYPE;
typedef CM_INT32 CM_STATUS_RECEIVED;
typedef CM_INT32 CM_SYNC_LEVEL;
typedef CM_INT32 CM_END_TYPE;
typedef CM_INT32 CM_PROCESSING_MODE;

typedef CM_INT32 XC_CONVERSATION_SECURITY_TYPE;
typedef CM_INT32 XC_TP_NAME_TYPE;

/**STRUCT+********************************************************************/
/* Side information struct used by xcmssi to define side information         */
/*****************************************************************************/
typedef struct side_info_entry
{
  unsigned char   sym_dest_name[8];            /* symbolic destination name  */
  unsigned char   partner_LU_name[17];         /* fully Q'd PLU name         */
  unsigned char   reserved[3];                 /* future expansion ??        */
  XC_TP_NAME_TYPE TP_name_type;                /* set to XC_APPLICATION_TP   */
                                               /*  or to XC_SNA_SERVICE_TP   */
  unsigned char   TP_name[64];                 /* TP name                    */
  unsigned char   mode_name[8];                /* mode name                  */
  XC_CONVERSATION_SECURITY_TYPE
                  conversation_security_type;  /* set to XC_SECURITY_NONE    */
                                               /*  or to XC_SECURITY_SAME    */
                                               /*  or to XC_SECURITY_PROGRAM */
  unsigned char   security_user_ID[8];         /* user_ID                    */
  unsigned char   security_password[8];        /* password                   */
} SIDE_INFO;
/**STRUCT-********************************************************************/


/*****************************************************************************/
/* Constant Definitions                                                      */
/*****************************************************************************/

/*****************************************************************************/
/* Values for the conversation_state                                         */
/*****************************************************************************/
#define CM_INITIALIZE_STATE              (CM_CONVERSATION_STATE) 2
#define CM_SEND_STATE                    (CM_CONVERSATION_STATE) 3
#define CM_RECEIVE_STATE                 (CM_CONVERSATION_STATE) 4
#define CM_SEND_PENDING_STATE            (CM_CONVERSATION_STATE) 5
#define CM_CONFIRM_STATE                 (CM_CONVERSATION_STATE) 6
#define CM_CONFIRM_SEND_STATE            (CM_CONVERSATION_STATE) 7
#define CM_CONFIRM_DEALLOCATE_STATE      (CM_CONVERSATION_STATE) 8

#define CM_DEFER_RECEIVE_STATE           (CM_CONVERSATION_STATE) 9
#define CM_DEFER_DEALLOCATE_STATE        (CM_CONVERSATION_STATE) 10
#define CM_SYNC_POINT_STATE              (CM_CONVERSATION_STATE) 11
#define CM_SYNC_POINT_SEND_STATE         (CM_CONVERSATION_STATE) 12
#define CM_SYNC_POINT_DEALLOCATE_STATE   (CM_CONVERSATION_STATE) 13
#define CM_INITIALIZE_INCOMING_STATE     (CM_CONVERSATION_STATE) 14

/*****************************************************************************/
/* Values for the conversation_type                                          */
/*****************************************************************************/
#define CM_BASIC_CONVERSATION   (CM_CONVERSATION_TYPE) 0
#define CM_MAPPED_CONVERSATION  (CM_CONVERSATION_TYPE) 1


/*****************************************************************************/
/* Values for data_received                                                  */
/*****************************************************************************/
#define CM_NO_DATA_RECEIVED          (CM_DATA_RECEIVED_TYPE) 0
#define CM_DATA_RECEIVED             (CM_DATA_RECEIVED_TYPE) 1
#define CM_COMPLETE_DATA_RECEIVED    (CM_DATA_RECEIVED_TYPE) 2
#define CM_INCOMPLETE_DATA_RECEIVED  (CM_DATA_RECEIVED_TYPE) 3


/*****************************************************************************/
/* Values for the deallocate_type                                            */
/*****************************************************************************/
#define CM_DEALLOCATE_SYNC_LEVEL  (CM_DEALLOCATE_TYPE) 0
#define CM_DEALLOCATE_FLUSH       (CM_DEALLOCATE_TYPE) 1
#define CM_DEALLOCATE_CONFIRM     (CM_DEALLOCATE_TYPE) 2
#define CM_DEALLOCATE_ABEND       (CM_DEALLOCATE_TYPE) 3


/*****************************************************************************/
/* Values for the error_direction                                            */
/*****************************************************************************/
#define CM_RECEIVE_ERROR  (CM_ERROR_DIRECTION) 0
#define CM_SEND_ERROR     (CM_ERROR_DIRECTION) 1


/*****************************************************************************/
/* Values for fill type                                                      */
/*****************************************************************************/
#define CM_FILL_LL      (CM_FILL) 0
#define CM_FILL_BUFFER  (CM_FILL) 1


/*****************************************************************************/
/* Values for specify_processing_mode                                        */
/*****************************************************************************/
#define CM_BLOCKING                    (CM_PROCESSING_MODE) 0
#define CM_NON_BLOCKING                (CM_PROCESSING_MODE) 1


/*****************************************************************************/
/* Values for prepare_to_receive_type                                        */
/*****************************************************************************/
#define CM_PREP_TO_RECEIVE_SYNC_LEVEL  (CM_PREPARE_TO_RECEIVE_TYPE) 0
#define CM_PREP_TO_RECEIVE_FLUSH       (CM_PREPARE_TO_RECEIVE_TYPE) 1
#define CM_PREP_TO_RECEIVE_CONFIRM     (CM_PREPARE_TO_RECEIVE_TYPE) 2


/*****************************************************************************/
/* Values for the receive_type                                               */
/*****************************************************************************/
#define CM_RECEIVE_AND_WAIT   (CM_RECEIVE_TYPE) 0
#define CM_RECEIVE_IMMEDIATE  (CM_RECEIVE_TYPE) 1


/*****************************************************************************/
/* Values for request_to_send_received                                       */
/*****************************************************************************/
#define CM_REQ_TO_SEND_NOT_RECEIVED  (CM_REQUEST_TO_SEND_RECEIVED) 0
#define CM_REQ_TO_SEND_RECEIVED      (CM_REQUEST_TO_SEND_RECEIVED) 1

/*****************************************************************************/
/* Values for return_code (including CPI-RR value, which start at 100)       */
/*****************************************************************************/
#define CM_OK                            (CM_RETURN_CODE) 0
#define CM_ALLOCATE_FAILURE_NO_RETRY     (CM_RETURN_CODE) 1
#define CM_ALLOCATE_FAILURE_RETRY        (CM_RETURN_CODE) 2
#define CM_CONVERSATION_TYPE_MISMATCH    (CM_RETURN_CODE) 3
#define CM_PIP_NOT_SPECIFIED_CORRECTLY   (CM_RETURN_CODE) 5
#define CM_SECURITY_NOT_VALID            (CM_RETURN_CODE) 6
#define CM_SYNC_LVL_NOT_SUPPORTED_LU     (CM_RETURN_CODE) 7
#define CM_SYNC_LVL_NOT_SUPPORTED_PGM    (CM_RETURN_CODE) 8
#define CM_TPN_NOT_RECOGNIZED            (CM_RETURN_CODE) 9

#define CM_SYNC_LEVEL_NOT_SUPPORTED_LU   (CM_RETURN_CODE) 7
#define CM_SYNC_LEVEL_NOT_SUPPORTED_PGM  (CM_RETURN_CODE) 8
#define CM_TPN_NOT_RECOGNISED            (CM_RETURN_CODE) 9

#define CM_TP_NOT_AVAILABLE_NO_RETRY     (CM_RETURN_CODE) 10
#define CM_TP_NOT_AVAILABLE_RETRY        (CM_RETURN_CODE) 11
#define CM_DEALLOCATED_ABEND             (CM_RETURN_CODE) 17
#define CM_DEALLOCATED_NORMAL            (CM_RETURN_CODE) 18
#define CM_PARAMETER_ERROR               (CM_RETURN_CODE) 19
#define CM_PRODUCT_SPECIFIC_ERROR        (CM_RETURN_CODE) 20
#define CM_PROGRAM_ERROR_NO_TRUNC        (CM_RETURN_CODE) 21
#define CM_PROGRAM_ERROR_PURGING         (CM_RETURN_CODE) 22
#define CM_PROGRAM_ERROR_TRUNC           (CM_RETURN_CODE) 23
#define CM_PROGRAM_PARAMETER_CHECK       (CM_RETURN_CODE) 24
#define CM_PROGRAM_STATE_CHECK           (CM_RETURN_CODE) 25
#define CM_RESOURCE_FAILURE_NO_RETRY     (CM_RETURN_CODE) 26
#define CM_RESOURCE_FAILURE_RETRY        (CM_RETURN_CODE) 27
#define CM_UNSUCCESSFUL                  (CM_RETURN_CODE) 28
#define CM_DEALLOCATED_ABEND_SVC         (CM_RETURN_CODE) 30
#define CM_DEALLOCATED_ABEND_TIMER       (CM_RETURN_CODE) 31
#define CM_SVC_ERROR_NO_TRUNC            (CM_RETURN_CODE) 32
#define CM_SVC_ERROR_PURGING             (CM_RETURN_CODE) 33
#define CM_SVC_ERROR_TRUNC               (CM_RETURN_CODE) 34

#define CM_OPERATION_INCOMPLETE          (CM_RETURN_CODE) 35
#define CM_SYSTEM_EVENT                  (CM_RETURN_CODE) 36
#define CM_OPERATION_NOT_ACCEPTED        (CM_RETURN_CODE) 37

#define CM_TAKE_BACKOUT                  (CM_RETURN_CODE) 100
#define CM_DEALLOCATED_ABEND_BO          (CM_RETURN_CODE) 130
#define CM_DEALLOCATED_ABEND_SVC_BO      (CM_RETURN_CODE) 131
#define CM_DEALLOCATED_ABEND_TIMER_BO    (CM_RETURN_CODE) 132
#define CM_RESOURCE_FAIL_NO_RETRY_BO     (CM_RETURN_CODE) 133
#define CM_RESOURCE_FAILURE_RETRY_BO     (CM_RETURN_CODE) 134
#define CM_DEALLOCATED_NORMAL_BO         (CM_RETURN_CODE) 135

/*****************************************************************************/
/* Values for return_control                                                 */
/*****************************************************************************/
#define CM_WHEN_SESSION_ALLOCATED  (CM_RETURN_CONTROL) 0
#define CM_IMMEDIATE               (CM_RETURN_CONTROL) 1


/*****************************************************************************/
/* Values for the send_type                                                  */
/*****************************************************************************/
#define CM_BUFFER_DATA               (CM_SEND_TYPE) 0
#define CM_SEND_AND_FLUSH            (CM_SEND_TYPE) 1
#define CM_SEND_AND_CONFIRM          (CM_SEND_TYPE) 2
#define CM_SEND_AND_PREP_TO_RECEIVE  (CM_SEND_TYPE) 3
#define CM_SEND_AND_DEALLOCATE       (CM_SEND_TYPE) 4


/*****************************************************************************/
/* Values for status_received                                                */
/*****************************************************************************/
#define CM_NO_STATUS_RECEIVED        (CM_STATUS_RECEIVED) 0
#define CM_SEND_RECEIVED             (CM_STATUS_RECEIVED) 1
#define CM_CONFIRM_RECEIVED          (CM_STATUS_RECEIVED) 2
#define CM_CONFIRM_SEND_RECEIVED     (CM_STATUS_RECEIVED) 3
#define CM_CONFIRM_DEALLOC_RECEIVED  (CM_STATUS_RECEIVED) 4

#define CM_TAKE_COMMIT               (CM_STATUS_RECEIVED) 5
#define CM_TAKE_COMMIT_SEND          (CM_STATUS_RECEIVED) 6
#define CM_TAKE_COMMIT_DEALLOCATE    (CM_STATUS_RECEIVED) 7

/*****************************************************************************/
/* Values for the sync_level                                                 */
/*****************************************************************************/
#define CM_NONE     (CM_SYNC_LEVEL) 0
#define CM_CONFIRM  (CM_SYNC_LEVEL) 1

/*****************************************************************************/
/* Values for maximum sizes of strings and buffers                           */
/*****************************************************************************/
#define CM_CID_SIZE   (8)         /* conversation ID           */
#define CM_CTX_SIZE   (32)        /* context ID                */
#define CM_LD_SIZE    (512)       /* log data                  */
#define CM_MN_SIZE    (8)         /* mode name                 */
#define CM_PLN_SIZE   (17)        /* partner LU name           */
#define CM_PW_SIZE    (10)        /* password                  */
#define CM_SDN_SIZE   (8)         /* symbolic destination name */
#define CM_TPN_SIZE   (64)        /* TP name                   */
#define CM_UID_SIZE   (10)        /* userid ID                 */

/*****************************************************************************/
/* Values for the conversation_security_type (NS/2 compatible)               */
/*****************************************************************************/
#define XC_SECURITY_NONE     (XC_CONVERSATION_SECURITY_TYPE) 0
#define XC_SECURITY_SAME     (XC_CONVERSATION_SECURITY_TYPE) 1
#define XC_SECURITY_PROGRAM  (XC_CONVERSATION_SECURITY_TYPE) 2


/*****************************************************************************/
/* Values for the TP_name_type (NS/2 compatible)                             */
/*****************************************************************************/
#define XC_APPLICATION_TP  (XC_TP_NAME_TYPE) 0
#define XC_SNA_SERVICE_TP  (XC_TP_NAME_TYPE) 1


/*****************************************************************************/
/* Function prototypes for CPIC call routines                                */
/*****************************************************************************/

/* Accept_Conversation */
CM_ENTRY cmaccp(unsigned char CM_PTR,               /* conversation_ID       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Allocate */
CM_ENTRY cmallc(unsigned char CM_PTR,               /* conversation_ID       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Cancel_Conversation */
CM_ENTRY cmcanc(unsigned char CM_PTR,               /* conversation_ID       */
                CM_INT32 CM_PTR);                   /* return_code     *WSNA1*/

/* Confirm */
CM_ENTRY cmcfm(unsigned char CM_PTR,                /* conversation_ID       */
               CM_REQUEST_TO_SEND_RECEIVED CM_PTR,  /* request_to_send_rec.. */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Confirmed */
CM_ENTRY cmcfmd(unsigned char CM_PTR,               /* conversation_ID       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Deallocate */
CM_ENTRY cmdeal(unsigned char CM_PTR,               /* conversation_ID       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_Conversation_State */
CM_ENTRY cmecs(unsigned char CM_PTR,                /* conversation_ID       */
               CM_CONVERSATION_STATE CM_PTR,        /* conversation_state    */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Extract_Conversation_Type */
CM_ENTRY cmect(unsigned char CM_PTR,                /* conversation_ID       */
               CM_CONVERSATION_TYPE CM_PTR,         /* conversation type     */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Extract_Mode_Name */
CM_ENTRY cmemn(unsigned char CM_PTR,                /* conversation_ID       */
               unsigned char CM_PTR,                /* mode_name             */
               CM_INT32 CM_PTR,                     /* mode_name_length      */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Extract_Partner_LU_Name */
CM_ENTRY cmepln(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* partner_LU_name       */
                CM_INT32 CM_PTR,                    /* partner_LU_name_len.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_Sync_Level */
CM_ENTRY cmesl(unsigned char CM_PTR,                /* conversation_ID       */
               CM_SYNC_LEVEL CM_PTR,                /* sync_level            */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Extract_TP_Name */
CM_ENTRY cmetpn(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* TP_name               */
                CM_INT32 CM_PTR,                    /* TP_name_length        */
                CM_INT32 CM_PTR);                   /* return_code     *WSNA1*/

/* Flush */
CM_ENTRY cmflus(unsigned char CM_PTR,               /* conversation_ID       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Initialize_Conversation */
CM_ENTRY cminit(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* sym_dest_name         */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Prepare_To_Receive */
CM_ENTRY cmptr(unsigned char CM_PTR,                /* conversation_ID       */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Receive */
CM_ENTRY cmrcv(unsigned char CM_PTR,                /* conversation_ID       */
               unsigned char CM_PTR,                /* buffer                */
               CM_INT32 CM_PTR,                     /* requested_length      */
               CM_DATA_RECEIVED_TYPE CM_PTR,        /* data_received         */
               CM_INT32 CM_PTR,                     /* received_length       */
               CM_STATUS_RECEIVED CM_PTR,           /* status_received       */
               CM_REQUEST_TO_SEND_RECEIVED CM_PTR,  /* request_to_send_rec.. */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Request_To_Send */
CM_ENTRY cmrts(unsigned char CM_PTR,                /* conversation_ID       */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Send */
CM_ENTRY cmsend(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* buffer                */
                CM_INT32 CM_PTR,                    /* send_length           */
                CM_REQUEST_TO_SEND_RECEIVED CM_PTR, /* request_to_send_rec.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Send_Error */
CM_ENTRY cmserr(unsigned char CM_PTR,               /* conversation_ID       */
                CM_REQUEST_TO_SEND_RECEIVED CM_PTR, /* request_to_send_rec.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Type */
CM_ENTRY cmsct(unsigned char CM_PTR,                /* conversation_ID       */
               CM_CONVERSATION_TYPE CM_PTR,         /* conversation_type     */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Deallocate_Type */
CM_ENTRY cmsdt(unsigned char CM_PTR,                /* conversation_ID       */
               CM_DEALLOCATE_TYPE CM_PTR,           /* deallocate_type       */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Error_Direction */
CM_ENTRY cmsed(unsigned char CM_PTR,                /* conversation_ID       */
               CM_ERROR_DIRECTION CM_PTR,           /* error_direction       */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Fill */
CM_ENTRY cmsf(unsigned char CM_PTR,                 /* conversation_ID       */
              CM_FILL CM_PTR,                       /* fill                  */
              CM_RETURN_CODE CM_PTR);               /* return_code           */

/* Set_Log_Data */
CM_ENTRY cmsld(unsigned char CM_PTR,                /* conversation_ID       */
               unsigned char CM_PTR,                /* log_data              */
               CM_INT32 CM_PTR,                     /* log_data_length       */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Specify_Local_TP_Name */
CM_ENTRY cmsltp(unsigned char CM_PTR,		    /* TP name		     */
		CM_INT32 CM_PTR,		     /* TP_name_length	      */
		CM_INT32 CM_PTR);		    /* return_code     *WSNA1*/

/* Set_Processing_Mode */
CM_ENTRY cmspm(unsigned char CM_PTR,                /* conversation_ID       */
               CM_INT32 CM_PTR,                     /* processing mode       */
               CM_INT32 CM_PTR);                    /* return_code     *WSNA1*/


/* Set_Mode_Name */
CM_ENTRY cmsmn(unsigned char CM_PTR,                /* conversation_ID       */
               unsigned char CM_PTR,                /* mode_name             */
               CM_INT32 CM_PTR,                     /* mode_name_length      */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Partner_LU_Name */
CM_ENTRY cmspln(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* partner_LU_name       */
                CM_INT32 CM_PTR,                    /* partner_LU_name_len.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Prepare_To_Receive_Type */
CM_ENTRY cmsptr(unsigned char CM_PTR,               /* conversation_ID       */
                CM_PREPARE_TO_RECEIVE_TYPE CM_PTR,  /* prepare_to_receive_.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Receive_Type */
CM_ENTRY cmsrt(unsigned char CM_PTR,                /* conversation_ID       */
               CM_RECEIVE_TYPE CM_PTR,              /* receive_type          */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Return_Control */
CM_ENTRY cmsrc(unsigned char CM_PTR,                /* conversation_ID       */
               CM_RETURN_CONTROL CM_PTR,            /* return_control        */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Send_Type */
CM_ENTRY cmsst(unsigned char CM_PTR,                /* conversation_ID       */
               CM_SEND_TYPE CM_PTR,                 /* send_type             */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_Sync_Level */
CM_ENTRY cmssl(unsigned char CM_PTR,                /* conversation_ID       */
               CM_SYNC_LEVEL CM_PTR,                /* sync_level            */
               CM_RETURN_CODE CM_PTR);              /* return_code           */

/* Set_TP_name */
CM_ENTRY cmstpn(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* TP_name               */
                CM_INT32 CM_PTR,                    /* TP_name_legth         */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Test_Request_To_Send_Received */
CM_ENTRY cmtrts(unsigned char CM_PTR,               /* conversation_ID       */
                CM_REQUEST_TO_SEND_RECEIVED CM_PTR, /* request_to_send_rec.. */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Wait_For_Conversation */
CM_ENTRY cmwait(unsigned char CM_PTR,               /* conversation_ID       */
                CM_INT32 CM_PTR,                    /* conversation ret code */
                CM_INT32 CM_PTR);                   /* return_code     *WSNA1*/

/*****************************************************************************/
/* Function Prototypes for additional NS/2 compatible call routines          */
/*****************************************************************************/

/* Delete_CPIC_Side_Information */
CM_ENTRY xcmdsi(unsigned char CM_PTR,               /* key_lock              */
                unsigned char CM_PTR,               /* sym_dest_name         */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_CPIC_Side_Information */
CM_ENTRY xcmesi(CM_INT32 CM_PTR,                    /* entry_number          */
                unsigned char CM_PTR,                       /* sym_dest_name         */
                SIDE_INFO CM_PTR,                   /* side_info_entry       */
                CM_INT32 CM_PTR,                    /* side_info_length      */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_CPIC_Side_Information */
CM_ENTRY xcmssi(unsigned char CM_PTR,               /* key_lock              */
                SIDE_INFO CM_PTR,                   /* side_info_entry       */
                CM_INT32 CM_PTR,                    /* side_info length      */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_Conversation_Security_Type */
CM_ENTRY xcecst(unsigned char CM_PTR,               /* conversation_ID       */
                XC_CONVERSATION_SECURITY_TYPE CM_PTR, /* conversation_sec... */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_Conversation_User_ID */
CM_ENTRY xcecsu(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* user_ID               */
                CM_INT32 CM_PTR,                    /* user_ID_length        */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_Password */
CM_ENTRY xcscsp(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* password              */
                CM_INT32 CM_PTR,                    /* password_length       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_Type */
CM_ENTRY xcscst(unsigned char CM_PTR,               /* conversation_ID       */
                XC_CONVERSATION_SECURITY_TYPE CM_PTR, /* conversation_sec... */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_User_ID */
CM_ENTRY xcscsu(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* user_ID               */
                CM_INT32 CM_PTR,                    /* user_ID_length        */
                CM_RETURN_CODE CM_PTR);             /* return_code           */


/*****************************************************************************/
/* Also have new prototypes with cm not xc                                   */
/*****************************************************************************/
/* Extract_Conversation_Security_Type */
CM_ENTRY cmecst(unsigned char CM_PTR,               /* conversation_ID       */
                XC_CONVERSATION_SECURITY_TYPE CM_PTR, /* conversation_sec... */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Extract_Conversation_User_ID */
CM_ENTRY cmecsu(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* user_ID               */
                CM_INT32 CM_PTR,                    /* user_ID_length        */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_Password */
CM_ENTRY cmscsp(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* password              */
                CM_INT32 CM_PTR,                    /* password_length       */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_Type */
CM_ENTRY cmscst(unsigned char CM_PTR,               /* conversation_ID       */
                XC_CONVERSATION_SECURITY_TYPE CM_PTR, /* conversation_sec... */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

/* Set_Conversation_Security_User_ID */
CM_ENTRY cmscsu(unsigned char CM_PTR,               /* conversation_ID       */
                unsigned char CM_PTR,               /* user_ID               */
                CM_INT32 CM_PTR,                    /* user_ID_length        */
                CM_RETURN_CODE CM_PTR);             /* return_code           */

#ifdef WINSNA
/* Specify_Windows_Handle */
CM_ENTRY xchwnd(HWND,                               /* Window HWND     *WSNA1*/
                CM_INT32 CM_PTR);                   /* return_code           */
#endif

/*****************************************************************************/
/* Function prototypes for undocumented NS/2 compatible call routines.  As   */
/* these routines are undocumented the prototypes do not include any         */
/* parameters.  These are needed to allow binary compatibility with NS/2     */
/* CPI-C applications, with the proviso that only documented calls are       */
/* actually used.                                                            */
/*****************************************************************************/

CM_ENTRY allocate_memory();
CM_ENTRY free_cpic_memory();
CM_ENTRY icmssi();


#ifdef WINSNA
/*---------------------------------------------------------------------------*/
/* Windows CPI-C Extention Return Codes.                                     */
/*---------------------------------------------------------------------------*/

#define WCPICALREADY         0xF000   /* An async call is already outstanding */
#define WCPICINVALID         0xF001   /* Async Task Id is invalid             */
#define WCPICCANCEL          0xF002   /* Blocking call was cancelled          */
#define WCPICSYSNOTREADY     0xF003   /* Underlying subsystem not started     */
#define WCPICVERNOTSUPPORTED 0xF004   /* Application version not supported    */


/*----------------------------------------------------------------------------*/
/* Api structre definitions                                                   */
/*----------------------------------------------------------------------------*/
#define WCPICDESCRIPTION_LEN    127

typedef struct tagWCPICDATA {
        WORD    wVersion;
        char    szDescription[WCPICDESCRIPTION_LEN+1];
} WCPICDATA, * PWCPICDATA, FAR * LPWCPICDATA;

/*****************************************************************************/
/* ------------- Windows CPI-C function prototypes ------------------------- */
/*****************************************************************************/

extern BOOL WINAPI    WinCPICCleanup(void);
extern BOOL WINAPI    WinCPICIsBlocking(void);
extern int WINAPI     WinCPICStartup(WORD, LPWCPICDATA );
extern FARPROC WINAPI WinCPICSetBlockingHook( FARPROC );
extern BOOL WINAPI    WinCPICUnhookBlockingHook(void);
#ifdef WIN32
extern VOID WINAPI    WinCPICSetEvent(unsigned char   CM_PTR,
                                      CM_EVENT_HANDLE CM_PTR,
                                      CM_RETURN_CODE CM_PTR);
extern VOID WINAPI    WinCPICExtractEvent(unsigned char   CM_PTR,
                                          CM_EVENT_HANDLE CM_PTR,
                                          CM_RETURN_CODE CM_PTR);
#endif

#define WIN_CPIC_ASYNC_COMPLETE_MESSAGE "WinAsyncCPI-C"

#endif

/*
 * These macros allow you to write programs that are easier to read, since
 * you can use the full name of the CPI-C call rather than its 6 character
 * entry point.
 *
 * When porting code that uses these macros, you will have to ensure that
 * the macros are defined on the target platform.
 */

#ifdef READABLE_MACROS

#define Accept_Conversation(v1,v2)            cmaccp(v1,v2)
#define Allocate(v1,v2)                       cmallc(v1,v2)
#define Cancel_Conversation(v1,v2)            cmcanc(v1,v2)
#define Confirm(v1,v2,v3)                     cmcfm(v1,v2,v3)
#define Confirmed(v1,v2)                      cmcfmd(v1,v2)
#define Deallocate(v1,v2)                     cmdeal(v1,v2)
#define Extract_Conversation_Security_User_ID(v1,v2,v3,v4)  cmecsu(v1,v2,v3,v4)
#define Extract_Conversation_Security_Type(v1,v2,v3) cmecst(v1,v2,v3)
#define Extract_Mode_Name(v1,v2,v3,v4)        cmemn(v1,v2,v3,v4)
#define Extract_Partner_LU_Name(v1,v2,v3,v4)  cmepln(v1,v2,v3,v4)
#define Extract_Sync_Level(v1,v2,v3)          cmesl(v1,v2,v3)
#define Extract_TP_Name(v1,v2,v3,v4)          cmetpn(v1,v2,v3,v4)
#define Flush(v1,v2)                          cmflus(v1,v2)
#define Initialize_Conversation(v1,v2,v3)     cminit(v1,v2,v3)
#define Prepare_To_Receive(v1,v2)             cmptr(v1,v2)
#define Receive(v1,v2,v3,v4,v5,v6,v7,v8)      cmrcv(v1,v2,v3,v4,v5,v6,v7,v8)
#define Request_To_Send(v1,v2)                cmrts(v1,v2)
#define Send_Error(v1,v2,v3)                  cmserr(v1,v2,v3)
#define Set_Conversation_Type(v1,v2,v3)       cmsct(v1,v2,v3)
#define Set_Deallocate_Type(v1,v2,v3)         cmsdt(v1,v2,v3)
#define Set_Error_Direction(v1,v2,v3)         cmsed(v1,v2,v3)
#define Send_Data(v1,v2,v3,v4,v5)             cmsend(v1,v2,v3,v4,v5)
#define Set_Fill(v1,v2,v3)                    cmsf(v1,v2,v3)
#define Set_Log_Data(v1,v2,v3,v4)             cmsld(v1,v2,v3,v4)
#define Set_Mode_Name(v1,v2,v3,v4)            cmsmn(v1,v2,v3,v4)
#define Set_Partner_LU_Name(v1,v2,v3,v4)      cmspln(v1,v2,v3,v4)
#define Set_Prepare_To_Receive_Type(v1,v2,v3) cmsptr(v1,v2,v3)
#define Set_Processing_Mode(v1,v2,v3)         cmspm(v1,v2,v3)
#define Set_Receive_Type(v1,v2,v3)            cmsrt(v1,v2,v3)
#define Set_Return_Control(v1,v2,v3)          cmsrc(v1,v2,v3)
#define Set_Send_Type(v1,v2,v3)               cmsst(v1,v2,v3)
#define Set_Sync_Level(v1,v2,v3)              cmssl(v1,v2,v3)
#define Set_TP_Name(v1,v2,v3,v4)              cmstpn(v1,v2,v3,v4)
#define Specify_Local_TP_Name(v1,v2,v3)       cmsltp(v1,v2,v3)
#define Set_Conversation_Security_Password(v1,v2,v3,v4) cmscsp(v1,v2,v3,v4)
#define Set_Conversation_Security_Type(v1,v2,v3) cmscst(v1,v2,v3)
#define Set_Conversation_Security_User_ID(v1,v2,v3,v4) cmscsu(v1,v2,v3,v4)
#define Test_Request_To_Send_Received(v1,v2,v3) cmtrts(v1,v2,v3)
#define Wait_For_Conversation(v1,v2,v3)       cmwait(v1,v2,v3)
#define Specify_Windows_Handle(v1,v2)         xchwnd(v1,v2)

#endif

#ifdef __cplusplus
}
#endif

/*****************************************************************************/
/* Restore to default packing of structures                                  */
/*****************************************************************************/
#ifdef WIN32
  #pragma pack()
#endif

#endif


