254 lines
9.2 KiB
C
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 */
|
|
}
|
|
|