Files
microser/mmslib/mvlu/c_info.c

293 lines
10 KiB
C
Raw Normal View History

2026-06-15 15:48:16 +08:00
/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1994 - 2002, All Rights Reserved */
/* */
/* MODULE NAME : c_info.c */
/* PRODUCT(S) : MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* _mvl_process_info_ind */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 02/25/04 MDE 16 Tweaked logging */
/* 10/28/03 JRB 15 Move mvl_free_comm_event call from */
/* mvl_info_data.. to _mvl_process_info_ind. */
/* mvl_info_data..: use num_va arg (ignored before)*/
/* 01/30/02 JRB 14 Del use of stack_sel. */
/* 06/22/00 MDE 13 Minor log change */
/* 01/21/00 MDE 12 Now use MEM_SMEM for dynamic memory */
/* 09/13/99 MDE 11 Added SD_CONST modifiers */
/* 04/07/99 MDE 10 Added '#ifdef MVL_INFO_RPT_CLIENT' */
/* 02/22/99 JRB 09 BUG FIX: Don't access "va" if it is NULL. */
/* 01/08/99 JRB 08 Use new "bsearch" object model. */
/* 12/09/98 MDE 07 'mvl_info_rpt_rem_process' now frees event */
/* 11/16/98 MDE 06 Renamed internal functions (prefix '_') */
/* 07/10/98 JRB 05 Don't use net_info->rem_vmd for CLACSE, not set.*/
/* 06/30/98 MDE 04 Added more flexable CLient Info Rpt code */
/* 06/15/98 MDE 03 Changes to allow compile under C++ */
/* 02/10/98 MDE 02 Removed NEST_RT_TYPES support */
/* 09/10/97 MDE 01 MMS-LITE V4.0 Release */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "mmsdefs.h"
#include "mms_pvar.h"
#include "mms_vvar.h"
#include "mvl_defs.h"
#include "mvl_log.h"
/************************************************************************/
#ifdef MVL_INFO_RPT_CLIENT
/************************************************************************/
/************************************************************************/
/* 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_process_info_ind */
/* A info indication has been received, process it and respond */
/************************************************************************/
ST_VOID u_mvl_info_rpt_ind (MVL_COMM_EVENT *event);
ST_VOID _mvl_process_info_ind (MVL_COMM_EVENT *event)
{
INFO_REQ_INFO *info_ptr;
VAR_ACC_SPEC *va_spec;
/* Do a sanity check to make sure the number of data is correct */
info_ptr = (INFO_REQ_INFO *) event->u.mms.dec_rslt.data_ptr;
va_spec = &info_ptr->va_spec;
if (va_spec->var_acc_tag == VAR_ACC_VARLIST)
{
if (va_spec->num_of_variables != info_ptr->num_of_acc_result)
{
MVL_LOG_NERR2 ("InfoRpt Ind : NumVar (%d) vs. NumAccRslt (%d)mismatch",
va_spec->num_of_variables, info_ptr->num_of_acc_result);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
}
/* OK, just give the info report to the user. */
/* NOTE: User must finish processing the event in u_mvl_info_rpt_ind, */
/* because it is freed immediately after this function returns. */
u_mvl_info_rpt_ind (event);
_mvl_free_comm_event (event); /* done with this event, free it */
}
/************************************************************************/
/* mvl_info_data_to_local */
/************************************************************************/
/* This function is used to convert Info Report data to local format */
/* The user supplies a table of variable associations, which speify the */
/* data type, destination, and pre/post processing functions. */
/* This function free's the info report resources when the conversion */
/* are complete. */
ST_VOID mvl_info_data_to_local (MVL_COMM_EVENT *event,
ST_INT num_va,
MVL_VAR_ASSOC **info_va)
{
INFO_REQ_INFO *info_ptr;
ST_INT j;
ACCESS_RESULT *ar_ptr;
MVL_VAR_ASSOC *va;
RUNTIME_TYPE *rt;
ST_INT rt_len;
info_ptr = (INFO_REQ_INFO *) event->u.mms.dec_rslt.data_ptr;
ar_ptr = info_ptr->acc_rslt_list;
for (j = 0; j < num_va; ++j, ++ar_ptr)
{
va = info_va[j];
if (!va)
{
MVLU_LOG_FLOW1 ("InfoRpt Ind : No VA provided for AccessResult %d, ignoring", j);
continue;
}
if (ar_ptr->acc_rslt_tag == ACC_RSLT_SUCCESS)
{
/* Call the preprocessing function for this variable, if it exists */
if (va->proc && va->proc->pre_info)
(*va->proc->pre_info)(va, event->net_info);
/* convert data in read buffer to local representation */
/* and store in local buffer */
if (mvl_get_runtime (va->type_id, &rt, &rt_len) == SD_SUCCESS)
{
va->result = ms_asn1_to_local (rt,
rt_len,
ar_ptr->va_data.data,
ar_ptr->va_data.len,
(ST_CHAR *) va->data);
if (va->result != SD_SUCCESS)
{
MVL_LOG_NERR1 ("InfoRpt Ind : Data conversion error for variable '%s'",
va->name);
}
}
else /* bad type ID */
{
MVL_LOG_NERR1 ("InfoRpt Ind : Bad Type ID '%d'", va->type_id);
va->result = SD_FAILURE;
}
}
else /* access result == failure */
{
MVL_LOG_NERR0 ("InfoRpt Ind : Access Result == SD_FAILURE");
va->result = SD_FAILURE;
}
if ((va->result == SD_SUCCESS) && va->proc && va->proc->post_info)
{
(*va->proc->post_info)(va, event->net_info);
}
}
}
/************************************************************************/
/* mvl_info_rpt_rem_process */
/************************************************************************/
#if defined(MVL_REM_VMD_SUPPORT)
MVL_VMD_CTRL *(*u_mvl_get_rem_vmd_fun) (MVL_NET_INFO *net_info);
ST_VOID mvl_info_rpt_rem_process (MVL_COMM_EVENT *event)
{
INFO_REQ_INFO *info_ptr;
ST_INT i;
ST_INT j;
OBJECT_NAME *vobj;
VARIABLE_LIST *vl;
VAR_ACC_SPEC *va_spec;
MVL_VMD_CTRL *rem_vmd;
MVL_VAR_ASSOC **info_va;
ST_INT num_va;
MVL_NVLIST_CTRL *nvlist;
ST_CHAR *name;
/* To handle information reports, the user must have set up a remote */
/* VMD object control structure, and the MVL_NET_INFO must reference it. */
if (event->net_info->rem_vmd)
rem_vmd = (MVL_VMD_CTRL *) event->net_info->rem_vmd;
else
{
if (u_mvl_get_rem_vmd_fun)
rem_vmd = (*u_mvl_get_rem_vmd_fun) (event->net_info);
}
if (!rem_vmd)
{
MVL_LOG_NERR1 ("InfoRpt Ind : No rem_vmd for MVL_NET_INFO 0x%08lx",
event->net_info);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
/* We want to get a table of pointers to VARIABLE_ASSOCIATIONS so we */
/* can convert the received data to local format and tell the user */
/* about it. */
info_ptr = (INFO_REQ_INFO *) event->u.mms.dec_rslt.data_ptr;
va_spec = &info_ptr->va_spec;
if (va_spec->var_acc_tag == VAR_ACC_NAMEDLIST)
{
vobj = &va_spec->vl_name;
for (i = 0; i < rem_vmd->num_nvlist; ++i)
{ /* search for the NVL */
if (!strcmp(rem_vmd->nvlist_tbl[i].name, vobj->obj_name.vmd_spec))
{
/* Found the named variable list, create the response */
nvlist = rem_vmd->nvlist_tbl[i];
info_va = nvlist->entries;
num_va = nvlist->num_of_entries;
break;
}
}
if ((i >= rem_vmd->num_nvlist) ||
(num_va != info_ptr->num_of_acc_result))
{
MVL_LOG_NERR2 ("InfoRpt Ind : NumVar (%d) vs. NumAccRslt (%d)mismatch",
num_va, info_ptr->num_of_acc_result);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
}
else if (va_spec->var_acc_tag == VAR_ACC_VARLIST)
{
if (va_spec->num_of_variables != info_ptr->num_of_acc_result)
{
MVL_LOG_NERR2 ("InfoRpt Ind : NumVar (%d) vs. NumAccRslt (%d)mismatch",
va_spec->num_of_variables, info_ptr->num_of_acc_result);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
num_va = info_ptr->num_of_acc_result;
info_va =
(MVL_VAR_ASSOC **) M_CALLOC (MSEM_GEN, num_va, sizeof (MVL_VAR_ASSOC *));
vl = (VARIABLE_LIST *) (info_ptr + 1);
for (j = 0; j < info_ptr->num_of_acc_result; ++j, ++vl)
{
if (vl->var_spec.var_spec_tag == VA_SPEC_NAMED)
{
vobj = &vl->var_spec.vs.name;
name = vobj->obj_name.vmd_spec;
for (i = 0; i < rem_vmd->num_var_assoc; ++i)
{
if (!strcmp (rem_vmd->var_assoc_tbl[i].name, name))
{
info_va[j] = rem_vmd->var_assoc_tbl[i];
break;
}
}
if (i >= rem_vmd->num_var_assoc)
{
MVL_LOG_NERR1 ("InfoRpt Ind : Variable '%s' not found", name);
M_FREE (MSMEM_GEN, info_va);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
}
else
{
MVL_LOG_NERR0 ("InfoRpt Ind : VA Spec not named");
M_FREE (MSMEM_GEN, info_va);
_mvl_free_comm_event (event); /* All done with this event */
return;
}
}
}
mvl_info_data_to_local (event, num_va, info_va);
M_FREE (MSMEM_GEN, info_va);
_mvl_free_comm_event (event); /* All done with this event */
}
#endif /* MVL_REM_VMD_SUPPORT */
/************************************************************************/
#endif /* MVL_INFO_RPT_CLIENT */
/************************************************************************/