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

254 lines
9.2 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1986 - 2001, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : rq_namelist.c */
/* PRODUCT(S) : MMSEASE, MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* This module contains the requester portion of the GetNameList */
/* service. It decodes the GetNameList response (indication) and */
/* encodes the GetNameList request. */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 03/11/04 GLB 06 Remove "thisFileName" */
/* 12/20/01 JRB 05 Converted to use ASN1R (re-entrant ASN1) */
/* 09/13/99 MDE 04 Added SD_CONST modifiers */
/* 03/23/99 MDE 03 Changes to decode buffer allocation scheme */
/* 06/15/98 MDE 02 Changes to allow compile under C++ */
/* 07/03/97 MDE 01 Op-specific info buffer handling changes */
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
/* history. */
/************************************************************************/
#include "glbtypes.h"
#include "sysincs.h"
#include "mmsdefs.h"
#include "mms_pvmd.h"
#include "asn1defs.h"
/************************************************************************/
/* variables global to the DECODE portion : NONE */
static NAMELIST_RESP_INFO *info;
static ST_CHAR **nptr;
/************************************************************************/
/* variables global to the ENCODE portion : NONE */
static ST_VOID namelist_get_list_of_ident (ASN1_DEC_CTXT *aCtx);
static ST_VOID namelist_get_identifier (ASN1_DEC_CTXT *aCtx);
static ST_VOID namelist_list_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID namelist_more_follows (ASN1_DEC_CTXT *aCtx);
/************************************************************************/
/************************************************************************/
/* mms_namelist_rsp */
/* Function called to decode a GetNameList response PDU after the PDU */
/* type has been determined. Sets up state machine function pointers */
/* and returns, letting the ASN1DE tools take over. */
/************************************************************************/
ST_VOID mms_namelist_rsp (ASN1_DEC_CTXT *aCtx)
{
ST_INT rsp_size;
ST_INT max_vstr;
MLOG_CDEC0 ("Get Named List");
#if defined(FIXED_DECBUF)
max_vstr = m_cl_max_namel_names;
rsp_size = mmsl_dec_info_size;
#else
/* Allocate enough memory to hold the namelist_resp_info structure and */
/* a list of pointers to the names returned in the GetNameList response.*/
max_vstr = _mmsdec_msglen/2;
if (m_cl_max_namel_names && (max_vstr > m_cl_max_namel_names))
max_vstr = m_cl_max_namel_names;
rsp_size = sizeof(NAMELIST_RESP_INFO) + (sizeof(ST_CHAR *) * max_vstr);
#endif
/* get storage for request information */
info = (NAMELIST_RESP_INFO *) _m_get_dec_buf (aCtx, rsp_size);
ASN1R_TAG_ADD (aCtx, CTX|CONSTR,0,namelist_get_list_of_ident); /* declare next elmnt expected */
}
/************************************************************************/
/* namelist_get_list_of_ident */
/* GetNameList response is being decoded: the SEQUENCEOF Identifier has */
/* been encountered. */
/************************************************************************/
static ST_VOID namelist_get_list_of_ident (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("namelist_get_list_of_ident");
/* Initialize nptr to just after the namelist_resp_info structure, and */
/* initialize the number of names to zero. */
nptr = (ST_CHAR **) (info + 1);
info -> num_names = 0;
info -> more_follows = SD_TRUE; /* set the default value */
aCtx->asn1r_c_done_fun[aCtx->asn1r_msg_level] = namelist_list_done;
ASN1R_TAG_ADD (aCtx, UNI,VISTR_CODE,namelist_get_identifier);
}
/************************************************************************/
/* namelist_get_identifier */
/* GetNameList resp. is being decoded: model name has been encountered. */
/************************************************************************/
static ST_VOID namelist_get_identifier (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("namelist_get_identifier");
/* Increment the number of names, assign the pointer to the new name, */
/* and read the name into the space in the existing message. */
nptr[info->num_names] = (ST_CHAR *) aCtx->asn1r_field_ptr - 1;
if (asn1r_get_identifier (aCtx, nptr[info->num_names]))
asn1r_set_dec_err (aCtx, RESP_BAD_VALUE);
++info->num_names;
asn1r_tag_restore (aCtx);
}
/************************************************************************/
/* namelist_list_done */
/* GetNameList response is being decoded: end of name list encountered. */
/************************************************************************/
static ST_VOID namelist_list_done (ASN1_DEC_CTXT *aCtx)
{
ST_INT resp_size;
/* There are no other data elements in the message, resize the struct. */
/* find the exact size of the storage used */
resp_size = sizeof (NAMELIST_RESP_INFO) +
(info->num_names) * sizeof (ST_CHAR *);
/* give back unused storage */
_mms_dec_info = (*m_realloc_os_fun) (_mms_dec_info,resp_size);
info = (NAMELIST_RESP_INFO *) _mms_dec_info;
_ms_set_cs_check (aCtx); /* check for Companion Standard info */
ASN1R_TAG_ADD (aCtx, CTX,1,namelist_more_follows);
}
/************************************************************************/
/* namelist_more_follows */
/* GetNameList response is being decoded: the more follows parameter */
/* has been encountered. */
/************************************************************************/
static ST_VOID namelist_more_follows (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("namelist_more_follows");
if (aCtx->asn1r_elmnt_len != 1)
{ /* If not of length 1 (boolean),*/
asn1r_set_dec_err (aCtx, RESP_BAD_VALUE); /* stop parse, report error */
return; /* and return. */
}
if (asn1r_get_bool (aCtx, &info -> more_follows)) /* Read more_follows boolean. */
{ /* If error reading integer, */
asn1r_set_dec_err (aCtx, RESP_BAD_VALUE); /* stop parse, report error */
return; /* and return. */
}
_ms_set_cs_check (aCtx); /* check for Companion Standard info */
}
#ifndef MMS_LITE
/************************************************************************/
/************************************************************************/
/* mp_namelist */
/* ENCODE and send a GetNameList REQUEST: */
/************************************************************************/
MMSREQ_PEND *mp_namelist (ST_INT chan, NAMELIST_REQ_INFO *info_ptr)
{
return (_mms_req_send (MMSOP_GET_NAMLIST,
M_CAST_MK_FUN (_ms_mk_namel_req),
chan,(ST_CHAR *)info_ptr));
}
#else
/************************************************************************/
/************************************************************************/
/* mpl_namelist */
/* ENCODE a GetNameList REQUEST: */
/************************************************************************/
ST_RET mpl_namelist (NAMELIST_REQ_INFO *info_ptr)
{
return (_mms_req_fin (MMSOP_GET_NAMLIST,
M_CAST_MK_FUN (_ms_mk_namel_req),
(ST_CHAR *)info_ptr));
}
#endif
/************************************************************************/
/************************************************************************/
/* _ms_mk_namel_req */
/* ENCODE a GetNameList REQUEST: */
/************************************************************************/
ST_VOID _ms_mk_namel_req (ASN1_ENC_CTXT *aCtx, NAMELIST_REQ_INFO *info_ptr)
{
if (info_ptr->cont_after_pres)
{
asn1r_wr_vstr (aCtx, info_ptr->continue_after); /* write continue-after name */
asn1r_fin_prim (aCtx, 2,CTX);
}
asn1r_strt_constr (aCtx); /* start the object scope cstr */
if (info_ptr->objscope == DOM_SPEC) /* if domain specific */
asn1r_wr_vstr (aCtx, info_ptr->dname); /* write domain_name identifier */
asn1r_fin_prim (aCtx, info_ptr->objscope,CTX); /* either NULL or identifier */
asn1r_fin_constr (aCtx, 1,CTX,DEF); /* finish the object scope cstr */
asn1r_strt_constr (aCtx); /* start extendedObjectClass */
#ifdef CS_SUPPORT
if (info_ptr->cs_objclass_pres) /* if companion standard */
{
asn1r_wr_octstr (aCtx, info_ptr->obj.cs.cs_class,info_ptr->obj.cs.len);
asn1r_fin_constr (aCtx, 1,CTX,DEF);
}
else
{
asn1r_wr_i16 (aCtx, info_ptr->obj.mms_class); /* write the object scope */
asn1r_fin_prim (aCtx, 0,CTX);
}
#else
asn1r_wr_i16 (aCtx, info_ptr->obj.mms_class); /* write the object scope */
asn1r_fin_prim (aCtx, 0,CTX);
#endif
asn1r_fin_constr (aCtx, 0,CTX,DEF); /* finish the extendedObjClass */
/* write the context specific explicit tag for this opcode. */
asn1r_fin_constr (aCtx, MMSOP_GET_NAMLIST,CTX,DEF); /* complete GetNameList req */
}