244 lines
8.4 KiB
C
244 lines
8.4 KiB
C
/************************************************************************/
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
|
/************************************************************************/
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
|
/* 1994 - 2004, All Rights Reserved */
|
|
/* */
|
|
/* MODULE NAME : c_read.c */
|
|
/* PRODUCT(S) : MMSEASE-LITE */
|
|
/* */
|
|
/* MODULE DESCRIPTION : */
|
|
/* */
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
|
/* mvl_read_variables */
|
|
/* mvla_read_variables */
|
|
/* _mvl_process_read_conf */
|
|
/* */
|
|
/* MODIFICATION LOG : */
|
|
/* Date Who Rev Comments */
|
|
/* -------- --- ------ ------------------------------------------- */
|
|
/* 04/09/07 MDE 20 Enhanced filtered logging */
|
|
/* 08/09/04 JRB 19 Log if type_id invalid. */
|
|
/* 11/01/01 JRB 18 mvl_wait_req_done now returns ST_RET. */
|
|
/* 09/21/01 JRB 17 Alloc global bufs only once at startup. */
|
|
/* 03/07/01 JRB 16 Del LOCK on sync functs: caused deadlocks. */
|
|
/* 03/08/00 JRB 15 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 14 Now use MEM_SMEM for dynamic memory */
|
|
/* 01/21/00 MDE 13 Use '_mvl_get_req_buf' for MVL_REQ_BUF_EN.. */
|
|
/* 11/19/99 NAV 12 Add #ifdef MVL_REQ_BUF_ENABLED */
|
|
/* 10/20/99 NAV 11 Add maxpend_req support to aynsc functions */
|
|
/* 09/13/99 MDE 10 Added SD_CONST modifiers */
|
|
/* 12/08/98 MDE 09 Added client alternate access support */
|
|
/* 11/17/98 MDE 08 Now use MVL_ERR_COMM_SERVE_ACTIVE error code */
|
|
/* Use MVL_SYNC_REQ_INTERFACE */
|
|
/* 11/16/98 MDE 07 Renamed internal functions (prefix '_') */
|
|
/* 09/21/98 MDE 06 Minor lint cleanup */
|
|
/* 06/15/98 MDE 05 Changes to allow compile under C++ */
|
|
/* 05/22/98 JRB 04 Pass (MVL_REQ_PEND**) to sync function also. */
|
|
/* 04/16/98 JRB 03 Conf func: Let caller do "common" stuff. */
|
|
/* Always set (*req_out) so user can always free*/
|
|
/* 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 "glbsem.h"
|
|
|
|
#include "mmsdefs.h"
|
|
#include "mms_pvar.h"
|
|
#include "mms_vvar.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
|
|
|
|
/************************************************************************/
|
|
/************************************************************************/
|
|
|
|
#if defined(MVL_SYNC_REQ_INTERFACE)
|
|
|
|
ST_RET mvl_read_variables (MVL_NET_INFO *net_info,
|
|
READ_REQ_INFO *read_info,
|
|
ST_INT num_data,
|
|
MVL_READ_RESP_PARSE_INFO *parse_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_read_variables (net_info, read_info, num_data, parse_info, req_out);
|
|
if (rc == SD_SUCCESS)
|
|
rc = mvl_wait_req_done (*req_out);
|
|
return (rc);
|
|
}
|
|
|
|
#endif
|
|
|
|
/************************************************************************/
|
|
|
|
ST_RET mvla_read_variables (MVL_NET_INFO *net_info,
|
|
READ_REQ_INFO *read_info,
|
|
ST_INT num_data,
|
|
MVL_READ_RESP_PARSE_INFO *parse_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);
|
|
if (!req_pend)
|
|
return (MVL_ERR_REQ_CONTROL);
|
|
req_pend->u.rd.parse_info = parse_info;
|
|
req_pend->u.rd.num_data = num_data;
|
|
|
|
S_LOCK_COMMON_RESOURCES ();
|
|
rc = _mvla_send_read_variables (net_info, read_info, num_data, parse_info, req_pend);
|
|
S_UNLOCK_COMMON_RESOURCES ();
|
|
return (rc);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* _mvla_send_read_variables */
|
|
/************************************************************************/
|
|
|
|
ST_RET _mvla_send_read_variables (MVL_NET_INFO *net_info,
|
|
READ_REQ_INFO *read_info,
|
|
ST_INT num_data,
|
|
MVL_READ_RESP_PARSE_INFO *parse_info,
|
|
MVL_REQ_PEND *req_pend)
|
|
{
|
|
ST_RET rc;
|
|
VARIABLE_LIST *vl;
|
|
ST_INT i;
|
|
|
|
#if defined(MVL_AA_SUPP)
|
|
if (read_info->va_spec.var_acc_tag == VAR_ACC_VARLIST)
|
|
{
|
|
vl = (VARIABLE_LIST *) (read_info + 1);
|
|
for (i = 0; i < num_data; ++i, ++vl)
|
|
{
|
|
if (parse_info[i].alt_acc_pres == SD_TRUE)
|
|
{
|
|
rc = _mvl_get_asn1_aa (parse_info[i].alt_acc, vl);
|
|
if (rc != SD_SUCCESS)
|
|
{
|
|
MVL_LOG_NERR0 ("Error creating ASN.1 encoded Alternate Access");
|
|
return (SD_FAILURE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/* Build a read request */
|
|
rc = mpl_read (read_info);
|
|
if (rc == SD_SUCCESS)
|
|
mpl_req_log (req_pend, read_info);
|
|
|
|
#if defined(MVL_AA_SUPP)
|
|
_m_free_aa_asn1_buf ();
|
|
#endif
|
|
|
|
rc = _mvl_send_req (net_info, req_pend, rc);
|
|
return (rc);
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
ST_VOID _mvl_process_read_conf (MVL_REQ_PEND *req)
|
|
{
|
|
ST_INT i;
|
|
RUNTIME_TYPE *rt;
|
|
ST_INT rt_len;
|
|
READ_RESP_INFO *read_info;
|
|
ACCESS_RESULT *ar_ptr;
|
|
MVL_READ_RESP_PARSE_INFO *parse_table;
|
|
ST_INT num_variables;
|
|
ST_BOOLEAN packed_save;
|
|
|
|
read_info = (READ_RESP_INFO *) req->event->u.mms.dec_rslt.data_ptr;
|
|
ar_ptr = read_info->acc_rslt_list;
|
|
|
|
/* retrieve parse information */
|
|
parse_table = req->u.rd.parse_info;
|
|
num_variables = req->u.rd.num_data;
|
|
|
|
/* just a sanity check */
|
|
if (num_variables != read_info->num_of_acc_result)
|
|
{
|
|
MVL_LOG_NERR0 ("Read Confirmation : num var != num result");
|
|
req->result = SD_FAILURE;
|
|
return;
|
|
}
|
|
|
|
/* For each variable returned in the read response ... */
|
|
|
|
for (i = 0; i < num_variables; ++i, ++ar_ptr, ++parse_table)
|
|
{ /* check for successfull read of this variable */
|
|
if (ar_ptr->acc_rslt_tag == ACC_RSLT_SUCCESS)
|
|
{
|
|
/* convert data in read buffer to local representation */
|
|
/* and store in local buffer */
|
|
|
|
if (mvl_get_runtime (parse_table->type_id,&rt, &rt_len) == SD_SUCCESS)
|
|
{
|
|
if (parse_table->descr_arr)
|
|
{
|
|
mvl_mod_arr_size (rt, parse_table->arr_size);
|
|
}
|
|
#if defined(MVL_AA_SUPP)
|
|
if (parse_table->alt_acc_pres == SD_TRUE &&
|
|
parse_table->alt_acc_type_aa == SD_FALSE)
|
|
{
|
|
packed_save = m_alt_acc_packed;
|
|
m_alt_acc_packed = parse_table->alt_acc_data_packed;
|
|
parse_table->result = ms_asn1_to_local_aa (rt, rt_len,
|
|
parse_table->alt_acc,
|
|
ar_ptr->va_data.data,
|
|
ar_ptr->va_data.len,
|
|
(ST_CHAR *) parse_table->dest);
|
|
m_alt_acc_packed = packed_save;
|
|
}
|
|
else /* No alternate access */
|
|
{
|
|
parse_table->result = ms_asn1_to_local (rt, rt_len,
|
|
ar_ptr->va_data.data,
|
|
ar_ptr->va_data.len,
|
|
(ST_CHAR *) parse_table->dest);
|
|
|
|
}
|
|
#else /* We don't support alternate access */
|
|
parse_table->result = ms_asn1_to_local (rt, rt_len,
|
|
ar_ptr->va_data.data,
|
|
ar_ptr->va_data.len,
|
|
(ST_CHAR *) parse_table->dest);
|
|
|
|
#endif /* #if defined(MVL_AA_SUPP) */
|
|
}
|
|
else /* bad type ID */
|
|
{
|
|
MVL_LOG_NERR2 ("Read Confirmation : type_id %d invalid for variable #%d", parse_table->type_id, i);
|
|
parse_table->result = SD_FAILURE;
|
|
}
|
|
}
|
|
else /* access result == failure */
|
|
parse_table->result = SD_FAILURE;
|
|
} /* for each variable */
|
|
}
|
|
|