Files
microser/mmslib/mvlu/c_jread.c
2026-06-15 15:48:16 +08:00

203 lines
7.5 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1998 - 1998, All Rights Reserved */
/* */
/* MODULE NAME : c_jread.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* mvl_jread */
/* mvla_jread */
/* _mvl_process_jread_conf */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 04/09/07 MDE 15 Enhanced filtered logging */
/* 11/01/01 JRB 14 mvl_wait_req_done now returns ST_RET. */
/* 09/21/01 JRB 13 Alloc global bufs only once at startup. */
/* 03/07/01 JRB 12 Del LOCK on sync functs: caused deadlocks. */
/* 03/08/00 JRB 11 Del #ifdef MVL_REQ_BUF_ENABLED: not used. */
/* Del mvl_free_req_ctrl call. User must call. */
/* Del invoke_id, numpend_req: see mvl_send_req.*/
/* 01/21/00 MDE 10 Now use MEM_SMEM for dynamic memory */
/* 01/21/00 MDE 09 Use '_mvl_get_req_buf' for MVL_REQ_BUF_EN.. */
/* 11/19/99 NAV 08 Add #ifdef MVL_REQ_BUF_ENABLED */
/* 11/03/99 NAV 07 Add maxpend_req support to aynsc functions */
/* 09/13/99 MDE 06 Added SD_CONST modifiers */
/* 11/17/98 MDE 05 Now use MVL_ERR_COMM_SERVE_ACTIVE error code */
/* Use MVL_SYNC_REQ_INTERFACE */
/* 11/16/98 MDE 04 Renamed internal functions (prefix '_') */
/* 10/09/98 JRB 03 Chg MVL_CLI_JOURNAL_ENTRY to MVL_JOURNAL_ENTRY,*/
/* just like server (entry_id is now array */
/* instead of pointer). */
/* 06/15/98 MDE 02 Changes to allow compile under C++ */
/* 03/27/98 JRB 01 MMS-LITE V4.0 Release */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "glbsem.h"
#include "mmsdefs.h"
#include "mms_pvmd.h"
#include "mvl_defs.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
/************************************************************************/
/* mvl_jread */
/************************************************************************/
#if defined(MVL_SYNC_REQ_INTERFACE)
ST_RET mvl_jread (
MVL_NET_INFO *net_info,
JREAD_REQ_INFO *req_info,
MVL_REQ_PEND **req_out)
{
ST_RET rc;
if (_mvl_comm_serve_active == SD_TRUE)
{
MVL_LOG_NERR0 ("Error: mvl_comm_serv active");
return (MVL_ERR_COMM_SERVE_ACTIVE);
}
rc = mvla_jread (net_info, req_info, req_out);
if (rc == SD_SUCCESS)
rc = mvl_wait_req_done (*req_out);
return (rc);
}
#endif
/************************************************************************/
/* mvla_jread */
/************************************************************************/
ST_RET mvla_jread (
MVL_NET_INFO *net_info,
JREAD_REQ_INFO *req_info,
MVL_REQ_PEND **req_out)
{
ST_RET rc;
MVL_REQ_PEND *req_pend;
*req_out = req_pend = _mvl_get_req_ctrl (net_info, MMSOP_READ_JOURNAL);
if (!req_pend)
return (MVL_ERR_REQ_CONTROL);
req_pend->u.jread.resp_info = NULL; /* Confirm funct must allocate */
S_LOCK_COMMON_RESOURCES ();
rc = _mvla_send_jread (net_info, req_info, req_pend);
S_UNLOCK_COMMON_RESOURCES ();
return (rc);
}
/************************************************************************/
/* _mvla_send_jread */
/************************************************************************/
ST_RET _mvla_send_jread (MVL_NET_INFO *net_info,
JREAD_REQ_INFO *req_info,
MVL_REQ_PEND *req_pend)
{
ST_RET rc;
/* Build a jread request */
rc = mpl_jread (req_info);
if (rc == SD_SUCCESS)
mpl_req_log (req_pend, req_info);
rc = _mvl_send_req (net_info, req_pend, rc);
return (rc);
}
/************************************************************************/
/* _mvl_process_jread_conf */
/* Set "req_pend->u.jread.resp_info" to POINT to response info. */
/************************************************************************/
ST_VOID _mvl_process_jread_conf (MVL_REQ_PEND *req_pend)
{
JREAD_RESP_INFO *jread_resp;
JOURNAL_ENTRY *jou_entry;
MVL_JREAD_RESP_INFO *mvl_jread_resp;
MVL_JOURNAL_ENTRY *mvl_jou_entry;
ST_INT j;
ST_INT info_size;
jread_resp = (JREAD_RESP_INFO *) req_pend->event->u.mms.dec_rslt.data_ptr;
info_size = sizeof (MVL_JREAD_RESP_INFO) +
jread_resp->num_of_jou_entry * sizeof (MVL_JOURNAL_ENTRY);
/* Allocate and fill in "req_pend->u.jread.resp_info". */
/* CRITICAL: mvl_free_req_ctrl () must free it. */
req_pend->u.jread.resp_info =
(MVL_JREAD_RESP_INFO *) M_CALLOC (MSMEM_GEN, 1, info_size);
mvl_jread_resp = req_pend->u.jread.resp_info; /* Local ptr to it. */
mvl_jread_resp->num_of_jou_entry = jread_resp->num_of_jou_entry;
mvl_jread_resp->more_follows = jread_resp->more_follows;
mvl_jread_resp->jou_entry = (MVL_JOURNAL_ENTRY *) (mvl_jread_resp + 1);
if (mvl_jread_resp->num_of_jou_entry)
{
jou_entry = (JOURNAL_ENTRY *)(jread_resp + 1); /* point to first.*/
mvl_jou_entry = mvl_jread_resp->jou_entry; /* point to first.*/
for (j = 0; j < jread_resp->num_of_jou_entry; j++)
{
mvl_jou_entry->entry_id_len = jou_entry->entry_id_len;
memcpy (mvl_jou_entry->entry_id, jou_entry->entry_id, jou_entry->entry_id_len);
if (ms_asn1_to_appref (&mvl_jou_entry->orig_app, jou_entry->orig_ae,
jou_entry->orig_ae_len))
{
MVL_LOG_ERR0 ("Error: ReadJournal-Resp: orig_app decode failed");
}
memcpy (&mvl_jou_entry->occur_time, &jou_entry->ent_content.occur_time,
sizeof (MMS_BTOD));
mvl_jou_entry->entry_form_tag = jou_entry->ent_content.entry_form_tag;
if (mvl_jou_entry->entry_form_tag == 2) /* DATA */
{
mvl_jou_entry->ef.data.event_pres = jou_entry->ent_content.ef.data.event_pres;
memcpy (&mvl_jou_entry->ef.data.evcon_name,
&jou_entry->ent_content.ef.data.evcon_name, sizeof (OBJECT_NAME));
mvl_jou_entry->ef.data.cur_state = jou_entry->ent_content.ef.data.cur_state;
mvl_jou_entry->ef.data.list_of_var_pres = jou_entry->ent_content.ef.data.list_of_var_pres;
if (mvl_jou_entry->ef.data.list_of_var_pres)
{
mvl_jou_entry->ef.data.num_of_var = jou_entry->ent_content.ef.data.num_of_var;
mvl_jou_entry->ef.data.list_of_var = (VAR_INFO *)(jou_entry + 1);
}
}
else /* MUST BE ANNOTATION */
{
mvl_jou_entry->ef.annotation = jou_entry->ent_content.ef.annotation;
}
/* Point to next src and dst entry. */
jou_entry++;
if (mvl_jou_entry->entry_form_tag == 2 && /* DATA */
mvl_jou_entry->ef.data.list_of_var_pres)
jou_entry = (JOURNAL_ENTRY *) ( ((ST_CHAR *)jou_entry) +
mvl_jou_entry->ef.data.num_of_var * sizeof (VAR_INFO));
mvl_jou_entry++;
} /* end "loop" */
} /* end "if num_of_jou_entry" */
}