338 lines
12 KiB
C
338 lines
12 KiB
C
/************************************************************************/
|
||
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
/************************************************************************/
|
||
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
/* 1996 - 1996, All Rights Reserved */
|
||
/* */
|
||
/* MODULE NAME : s_jread.c */
|
||
/* PRODUCT(S) : MMSEASE-LITE */
|
||
/* */
|
||
/* MODULE DESCRIPTION : */
|
||
/* */
|
||
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||
/* _mvl_process_jread_ind */
|
||
/* mvlas_jread_resp */
|
||
/* mplas_jread_resp */
|
||
/* */
|
||
/* MODIFICATION LOG : */
|
||
/* Date Who Rev Comments */
|
||
/* -------- --- ------ ------------------------------------------- */
|
||
/* 04/09/07 MDE 21 Enhanced filtered logging */
|
||
/* 10/30/06 JRB 20 Use new mvl_vmd_* object handling functions. */
|
||
/* 01/30/06 GLB 19 Integrated porting changes for VMS */
|
||
/* 03/28/05 JRB 18 Del suicacse header. */
|
||
/* 02/25/02 MDE 17 Now get max PDU size from mvl_cfg_info */
|
||
/* 09/21/01 JRB 16 Alloc global bufs only once at startup. */
|
||
/* 03/30/01 MDE 15 Changed MSMEM_ENC_INFO to MSMEM_ENC_OS_INFO */
|
||
/* 01/21/00 MDE 14 Now use MEM_SMEM for dynamic memory */
|
||
/* 09/13/99 MDE 13 Added SD_CONST modifiers */
|
||
/* 08/30/99 JRB 12 DON'T log after mplas_err_resp (causes GPF). */
|
||
/* 01/15/99 JRB 11 Call mvl_find_jou to find journal. */
|
||
/* 11/16/98 MDE 10 Renamed internal functions (prefix '_') */
|
||
/* 10/09/98 JRB 09 Use modified MVL_JOURNAL_ENTRY. */
|
||
/* 09/21/98 MDE 08 Minor lint cleanup */
|
||
/* 09/10/98 JRB 07 Make sure moreFollows set correctly. */
|
||
/* 07/16/98 MDE 06 More journal work */
|
||
/* 07/15/98 MDE 05 Changed Journal Read user functions */
|
||
/* 06/15/98 MDE 04 Changes to allow compile under C++ */
|
||
/* 05/14/98 JRB 03 Use MVL_IND_PEND. Add mvlas resp function. */
|
||
/* 05/14/98 JRB 02 Fixed uninitialized pointers, etc. */
|
||
/* 11/04/97 MDE 01 Created */
|
||
/************************************************************************/
|
||
|
||
#include "glbtypes.h"
|
||
#include "sysincs.h"
|
||
#include "mmsdefs.h"
|
||
#include "mms_pvmd.h"
|
||
#include "mvl_acse.h"
|
||
#include "mvl_log.h"
|
||
|
||
/************************************************************************/
|
||
/* For debug version, use a static pointer to avoid duplication of */
|
||
/* __FILE__ strings. */
|
||
/************************************************************************/
|
||
|
||
#ifdef DEBUG_SISCO
|
||
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
||
#endif
|
||
|
||
/************************************************************************/
|
||
/************************************************************************/
|
||
/* Local variables and functions */
|
||
|
||
static MVL_JREAD_BUF_CTRL _bufCtrl;
|
||
static ST_UCHAR *_asn1BufStart;
|
||
static ST_INT _asn1BufLeft;
|
||
|
||
static ST_RET mvlJe_to_je (JOURNAL_ENTRY *je, MVL_JOURNAL_ENTRY *mvlJe);
|
||
|
||
/************************************************************************/
|
||
/************************************************************************/
|
||
/* _mvl_process_jread_ind */
|
||
/* A Read Journal indication has been rcved, process and respond */
|
||
/************************************************************************/
|
||
|
||
ST_VOID _mvl_process_jread_ind (MVL_IND_PEND *indCtrl)
|
||
{
|
||
indCtrl->u.jread.req_info =
|
||
(JREAD_REQ_INFO *) indCtrl->event->u.mms.dec_rslt.data_ptr;
|
||
|
||
u_mvl_jread_ind (indCtrl);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* mvlas_jread_resp */
|
||
/* This is the Virtual Machine response function for ReadJournal. */
|
||
/* It calls the following user functions to manage the Journal data: */
|
||
/* u_mvl_start_jread */
|
||
/* u_mvl_get_next_jread_entry */
|
||
/* u_mvl_free_jread_entry */
|
||
/* u_mvl_end_jread */
|
||
/************************************************************************/
|
||
ST_RET app_start_jread(MVL_JOURNAL_CTRL *jCtrl,JREAD_REQ_INFO *reqInfo,MVL_JREAD_BUF_CTRL *bufCtrl,
|
||
void **usrHandleOut);
|
||
ST_VOID mvlas_jread_resp (MVL_IND_PEND *indCtrl)
|
||
{
|
||
ST_RET rc;
|
||
JREAD_REQ_INFO *reqInfo;
|
||
JREAD_RESP_INFO *respInfo;
|
||
JOURNAL_ENTRY *je;
|
||
ST_BOOLEAN moreFollows = SD_FALSE; /* Would never get set if 0 entries*/
|
||
MVL_JOURNAL_CTRL *jCtrl;
|
||
MVL_JOURNAL_ENTRY mvlJe;
|
||
MVL_JOURNAL_ENTRY *mvlJep;
|
||
ST_VOID *usrHandle;
|
||
ST_UCHAR *asn1_buf;
|
||
ST_INT i;
|
||
|
||
reqInfo = indCtrl->u.jread.req_info;
|
||
/* First find our Journal Control element */
|
||
jCtrl = mvl_vmd_find_jou (&mvl_vmd, &reqInfo->jou_name, indCtrl->event->net_info);
|
||
if (jCtrl == NULL)
|
||
{
|
||
MVL_LOG_NERR1 ("ReadJournal - could not find journal '%s'",
|
||
reqInfo->jou_name.obj_name.vmd_spec);
|
||
printf("ReadJournal - could not find journal '%s'\n",
|
||
reqInfo->jou_name.obj_name.vmd_spec);
|
||
_mplas_err_resp (indCtrl, 2, 1); /* object undefined */
|
||
return;
|
||
}
|
||
|
||
/* Give the user the JREAD request information */
|
||
memset (&_bufCtrl, 0, sizeof (MVL_JREAD_BUF_CTRL));
|
||
/* renxiaobao <20><>־*/
|
||
/*rc = u_mvl_start_jread (jCtrl, reqInfo, &_bufCtrl, &usrHandle);*/
|
||
rc = app_start_jread(jCtrl, reqInfo, &_bufCtrl, &usrHandle);
|
||
if (rc != SD_SUCCESS)
|
||
{
|
||
_mplas_err_resp (indCtrl, 2, 1); /* object undefined */
|
||
return;
|
||
}
|
||
|
||
/* Limit the number we will return */
|
||
if (_bufCtrl.numUsrEntries > MAX_JREAD_RESP_ENTRIES)
|
||
_bufCtrl.numUsrEntries = MAX_JREAD_RESP_ENTRIES;
|
||
|
||
if (_bufCtrl.numVarInfo > MAX_JREAD_RESP_VARS)
|
||
_bufCtrl.numVarInfo = MAX_JREAD_RESP_VARS;
|
||
|
||
/* Allocate the response information data buffer */
|
||
respInfo =
|
||
(JREAD_RESP_INFO *) M_CALLOC (MSMEM_ENC_OS_INFO, 1, sizeof (JREAD_RESP_INFO) +
|
||
(_bufCtrl.numUsrEntries * sizeof (JOURNAL_ENTRY)) +
|
||
(_bufCtrl.numVarInfo * sizeof (VAR_INFO)) );
|
||
|
||
/*
|
||
//printf("respInfo size=%d \n ",sizeof (JREAD_RESP_INFO) +
|
||
// (_bufCtrl.numUsrEntries * sizeof (JOURNAL_ENTRY)) +
|
||
// (_bufCtrl.numVarInfo * sizeof (VAR_INFO)));
|
||
*/
|
||
/* Set the storage buffer start locations */
|
||
#if defined (MVL_JREAD_ENTRYID_DYNAMIC)
|
||
_bufCtrl.nextEntryId = _bufCtrl.entryIdBuf;
|
||
#endif
|
||
#if defined (MVL_JREAD_VARTAG_DYNAMIC)
|
||
_bufCtrl.nextVarTag = _bufCtrl.varTagBuf;
|
||
#endif
|
||
#if defined (MVL_JREAD_ANNOTATION_DYNAMIC)
|
||
_bufCtrl.nextAnnotation = _bufCtrl.annotationBuf;
|
||
#endif
|
||
|
||
/* Allocate the ASN.1 data encode buffer */
|
||
asn1_buf = (ST_UCHAR *) M_MALLOC (MSMEM_ASN1_DATA_ENC, mvl_cfg_info->max_msg_size);
|
||
_asn1BufStart = asn1_buf;
|
||
_asn1BufLeft = mvl_cfg_info->max_msg_size;
|
||
|
||
/* Now get the journals from the user, one at a time */
|
||
respInfo->num_of_jou_entry = 0;
|
||
je = (JOURNAL_ENTRY *) (respInfo + 1);
|
||
for (i = 0; i < _bufCtrl.numUsrEntries; ++i)
|
||
{
|
||
/* get the next from the user */
|
||
mvlJep = &mvlJe;
|
||
rc = u_mvl_get_next_jread_entry (jCtrl, usrHandle, &moreFollows, &mvlJep);
|
||
if (rc != SD_SUCCESS)
|
||
{
|
||
moreFollows = SD_FALSE; /* Didn't get entry, so can't be more. */
|
||
break;
|
||
}
|
||
|
||
/* Map it onto the MMS-EASE JOURNAL_ENTRY */
|
||
|
||
rc = mvlJe_to_je (je, mvlJep);
|
||
/* Let the user free resources */
|
||
u_mvl_free_jread_entry (jCtrl, usrHandle, mvlJep);
|
||
|
||
/* Verify that the mapping was OK */
|
||
if (rc != SD_SUCCESS)
|
||
{
|
||
M_FREE (MSMEM_ASN1_DATA_ENC, asn1_buf);
|
||
M_FREE (MSMEM_ENC_OS_INFO, respInfo);
|
||
_mplas_err_resp (indCtrl, 1, 3); /* application reference invalid */
|
||
return;
|
||
}
|
||
|
||
++respInfo->num_of_jou_entry;
|
||
if (moreFollows == SD_FALSE)
|
||
break;
|
||
|
||
/* We need to adjust the MMS-EASE JE pointer to the next position */
|
||
/* Each JE is possibly followed by a array of VAR_INFO */
|
||
if (je->ent_content.entry_form_tag == 2 &&
|
||
je->ent_content.ef.data.list_of_var_pres)
|
||
{
|
||
je = (JOURNAL_ENTRY *) ((ST_CHAR *)je + sizeof (JOURNAL_ENTRY) +
|
||
je->ent_content.ef.data.num_of_var * sizeof (VAR_INFO));
|
||
}
|
||
else
|
||
++je; /* CRITICAL: don't try to access je after this */
|
||
}
|
||
respInfo->more_follows = moreFollows;
|
||
|
||
/* OK, the MMS-EASE data structure is ready to roll */
|
||
|
||
indCtrl->u.jread.resp_info = respInfo;
|
||
|
||
mplas_jread_resp (indCtrl);
|
||
|
||
M_FREE (MSMEM_ASN1_DATA_ENC, asn1_buf);
|
||
M_FREE (MSMEM_ENC_OS_INFO, respInfo);
|
||
/* Tell the user we are done */
|
||
u_mvl_end_jread (jCtrl, usrHandle, &_bufCtrl, reqInfo);
|
||
}
|
||
|
||
/************************************************************************/
|
||
/* mplas_jread_resp */
|
||
/************************************************************************/
|
||
ST_VOID mplas_jread_resp (MVL_IND_PEND *indCtrl)
|
||
{
|
||
ST_RET rc;
|
||
|
||
/* Build a jread response */
|
||
rc = mpl_jread_resp (indCtrl->event->u.mms.dec_rslt.id,
|
||
indCtrl->u.jread.resp_info);
|
||
if (rc == SD_SUCCESS)
|
||
mpl_resp_log (indCtrl, indCtrl->u.jread.resp_info);
|
||
|
||
_mvl_send_resp_i (indCtrl, rc);
|
||
}
|
||
|
||
|
||
/************************************************************************/
|
||
/* mvlJe_to_je */
|
||
/************************************************************************/
|
||
|
||
static ST_RET mvlJe_to_je (JOURNAL_ENTRY *je, MVL_JOURNAL_ENTRY *mvlJe)
|
||
{
|
||
ST_UCHAR *appRefAsn1Start;
|
||
ST_INT appRefAsn1Len;
|
||
ST_INT i;
|
||
ST_INT numVar;
|
||
ST_RET rc;
|
||
VAR_INFO *varInfo;
|
||
|
||
/* First take care of the entry ID */
|
||
#if defined (MVL_JREAD_ENTRYID_DYNAMIC)
|
||
je->entry_id_len = mvlJe->entry_id_len;
|
||
je->entry_id = _bufCtrl.nextEntryId;
|
||
memcpy (_bufCtrl.nextEntryId, mvlJe->entry_id, mvlJe->entry_id_len);
|
||
_bufCtrl.nextEntryId += mvlJe->entry_id_len;
|
||
#else
|
||
je->entry_id_len = mvlJe->entry_id_len;
|
||
je->entry_id = mvlJe->entry_id;
|
||
#endif
|
||
|
||
/* Now take care of the application reference ... */
|
||
rc = ms_appref_to_asn1 (&(mvlJe->orig_app), _asn1BufStart, _asn1BufLeft,
|
||
&appRefAsn1Start, &appRefAsn1Len);
|
||
if (rc == SD_SUCCESS)
|
||
{
|
||
je->orig_ae_len = appRefAsn1Len;
|
||
je->orig_ae = appRefAsn1Start;
|
||
|
||
/* Adjust ASN.1 buffer control - this was built from the back, so */
|
||
/* don't need to change the buffer start pointer. */
|
||
_asn1BufLeft -= appRefAsn1Len;
|
||
}
|
||
else
|
||
{
|
||
MVL_LOG_ERR0 ("Error: ReadJournal.Resp: orig_app encode failed");
|
||
return (rc);
|
||
}
|
||
|
||
/* Now set up the entry content */
|
||
|
||
/* Occurance Time */
|
||
memcpy (&(je->ent_content.occur_time), &(mvlJe->occur_time),
|
||
sizeof (MMS_BTOD));
|
||
|
||
/* No additional detail */
|
||
je->ent_content.addl_detail_pres = SD_FALSE;
|
||
|
||
je->ent_content.entry_form_tag = mvlJe->entry_form_tag;
|
||
if (mvlJe->entry_form_tag == 2) /* event/data */
|
||
{
|
||
je->ent_content.ef.data.event_pres = mvlJe->ef.data.event_pres;
|
||
|
||
memcpy (&(je->ent_content.ef.data.evcon_name),
|
||
&(mvlJe->ef.data.evcon_name), sizeof (OBJECT_NAME));
|
||
je->ent_content.ef.data.cur_state = mvlJe->ef.data.cur_state;
|
||
|
||
je->ent_content.ef.data.list_of_var_pres = mvlJe->ef.data.list_of_var_pres;
|
||
if (je->ent_content.ef.data.list_of_var_pres)
|
||
{
|
||
numVar = mvlJe->ef.data.num_of_var;
|
||
je->ent_content.ef.data.num_of_var = numVar;
|
||
|
||
varInfo = (VAR_INFO *) (je + 1);
|
||
for (i = 0; i < numVar; ++i, ++varInfo)
|
||
{
|
||
/* OK, now tell MMS-EASE where the ASN.1 data is */
|
||
varInfo->value_spec.data = mvlJe->ef.data.list_of_var[i].value_spec.data;
|
||
varInfo->value_spec.len = mvlJe->ef.data.list_of_var[i].value_spec.len;
|
||
|
||
/* Now store the var_tag in our buffer and set the MMS pointer */
|
||
#if defined (MVL_JREAD_VARTAG_DYNAMIC)
|
||
varInfo->var_tag = _bufCtrl.nextVarTag;
|
||
strcpy (_bufCtrl.nextVarTag, mvlJe->ef.data.list_of_var[i].var_tag);
|
||
_bufCtrl.nextVarTag += (strlen (_bufCtrl.nextVarTag) + 1);
|
||
#else
|
||
varInfo->var_tag = mvlJe->ef.data.list_of_var[i].var_tag;
|
||
#endif
|
||
} /* end "loop" */
|
||
} /* end "if list_of_var_pres" */
|
||
}
|
||
else /* entry form is annotation */
|
||
{
|
||
#if defined (MVL_JREAD_ANNOTATION_DYNAMIC)
|
||
je->ent_content.ef.annotation = _bufCtrl.nextAnnotation;
|
||
strcpy (_bufCtrl.nextAnnotation, mvlJe->ef.annotation);
|
||
_bufCtrl.nextAnnotation += (strlen (_bufCtrl.nextAnnotation) + 1);
|
||
#else
|
||
je->ent_content.ef.annotation = mvlJe->ef.annotation;
|
||
#endif
|
||
}
|
||
return (SD_SUCCESS);
|
||
}
|
||
|