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

937 lines
34 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1986 - 2001, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : mms_ced4.c */
/* PRODUCT(S) : MMSEASE, MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* This module contains common primitive encode/decode functions */
/* particular to getting and writing variables. */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 02/09/09 JRB 04 Allow any value for DataAccessError. */
/* 03/11/04 GLB 03 Remove "thisFileName" */
/* 12/20/01 JRB 02 Converted to use ASN1R (re-entrant ASN1) */
/* 09/13/99 MDE 01 Added SD_CONST modifiers */
/* 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_pvar.h"
#include "asn1defs.h"
/************************************************************************/
static ST_VOID va_spec_objname_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_spec_vlist_list_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_spec_vlist_name_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_vlist_alt_acc_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_vlist_alt_acc_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_vlist_useq_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_vlist_var_spec_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_vlist_useq_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_var_spec_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_type_spec (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_objname_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_address_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_var_descr_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_scat_acc_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_get_null (ASN1_DEC_CTXT *aCtx);
static ST_VOID alt_access_get_aa_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID scat_access_get_sa_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID type_spec_get_tspec_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID vdata_get_data_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID access_rslt_get_data_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID access_rslt_cstr_parse (ASN1_DEC_CTXT *aCtx, ST_UINT16 id);
static ST_VOID access_rslt_get_result (ASN1_DEC_CTXT *aCtx, ST_UINT16 id);
static ST_VOID address_unc_addr_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID address_get_num_addr (ASN1_DEC_CTXT *aCtx);
static ST_VOID address_get_sym_addr (ASN1_DEC_CTXT *aCtx);
static ST_VOID address_get_unc_addr (ASN1_DEC_CTXT *aCtx);
static ST_VOID address_unc_addr_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_address_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_access_rslt_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_data_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_type_spec_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_scat_access_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_alt_access_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_var_spec_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID (*get_va_spec_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID var_spec_cstr_get_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID va_spec_done (ASN1_DEC_CTXT *aCtx);
/************************************************************************/
/* global structures & functions */
/************************************************************************/
static VAR_ACC_ADDR *addr_ptr;
static ACCESS_RESULT *acc_rslt_ptr;
static VAR_ACC_DATA *vdata_ptr;
static VAR_ACC_TSPEC *tspec_ptr;
static SCATTERED_ACCESS *scat_acc_ptr;
static ALTERNATE_ACCESS *alt_acc_ptr;
static VARIABLE_SPEC *var_spec_ptr;
static VARIABLE_LIST *var_list_ptr;
static VAR_ACC_SPEC *va_spec_ptr;
static VARIABLE_LIST *va_spec_vlist_ptr;
static ST_INT *NUM_OF_VARS;
static ST_INT MAX_VARS;
static ST_RET ERROR_CODE;
static ST_INT save_dec_method;
/************************************************************************/
/************************************************************************/
/* _ms_get_va_address */
/* Function to get a variable access address from the received message. */
/************************************************************************/
ST_VOID _ms_get_va_address (ASN1_DEC_CTXT *aCtx, VAR_ACC_ADDR *data_ptr, ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
/* set decode error for request or response */
if (_mmsdec_rslt->type == MMSRESP)
ERROR_CODE = RESP_BAD_VALUE;
else
ERROR_CODE = REQ_BAD_VALUE;
addr_ptr = data_ptr;
get_va_address_done = done_fun;
ASN1R_TAG_ADD (aCtx, CTX, 0, address_get_num_addr);
ASN1R_TAG_ADD (aCtx, CTX, 1, address_get_sym_addr);
ASN1R_TAG_ADD (aCtx, CTX, 2, address_get_unc_addr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 2, address_unc_addr_cstr);
}
/************************************************************************/
/* address_get_num_addr */
/* numeric address was encountered. */
/************************************************************************/
static ST_VOID address_get_num_addr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("get_num_addr");
addr_ptr->addr_tag = 0; /* set tag to numeric address */
/* read numeric address */
if (asn1r_get_u32 (aCtx, &addr_ptr->addr.num_addr))
asn1r_set_dec_err (aCtx, ERROR_CODE);
(*get_va_address_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/* address_get_sym_addr */
/* symbolic address was encountered. */
/************************************************************************/
static ST_VOID address_get_sym_addr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("address_get_sym_addr");
addr_ptr->addr_tag = 1; /* set tag to symbolic address */
/* decode symbolic address onto itself, shifted by 1 ST_CHAR */
addr_ptr->addr.sym_addr = (ST_CHAR *) aCtx->asn1r_field_ptr - 1;
/* read symbolic address */
if (asn1r_get_vstr (aCtx, addr_ptr->addr.sym_addr))
asn1r_set_dec_err (aCtx, ERROR_CODE);
(*get_va_address_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/* address_get_unc_addr */
/* unconstrained address primitive was encountered. */
/************************************************************************/
static ST_VOID address_get_unc_addr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("address_get_unc_addr");
addr_ptr->addr_tag = 2; /* set tag to unconstrained */
/* decode unconstrained address onto itself, shifted by 1 ST_CHAR */
addr_ptr->addr.unc_addr.unc_ptr = aCtx->asn1r_field_ptr - 1;
/* read unconstrained address */
if (asn1r_get_octstr (aCtx, addr_ptr->addr.unc_addr.unc_ptr))
asn1r_set_dec_err (aCtx, ERROR_CODE);
/* save the address length */
addr_ptr->addr.unc_addr.unc_len = aCtx->asn1r_octetcount;
(*get_va_address_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/* address_unc_addr_cstr */
/* unconstrained address constructor was encountered. */
/************************************************************************/
static ST_VOID address_unc_addr_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("address_unc_addr_cstr");
addr_ptr->addr_tag = 2; /* set tag to unconstrained */
/* decode unconstrained address onto itself, shifted by 1 ST_CHAR */
addr_ptr->addr.unc_addr.unc_ptr = aCtx->asn1r_field_ptr - 1;
/* set up where to go when done decoding cstr */
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = address_unc_addr_cstr_done;
/* read unconstrained address from message */
asn1r_get_octstr_cstr (aCtx, _mmsdec_msglen, addr_ptr->addr.unc_addr.unc_ptr);
}
/************************************************************************/
/* address_unc_addr_cstr_done */
/* unconstrained address constructor done was encountered. */
/************************************************************************/
static ST_VOID address_unc_addr_cstr_done (ASN1_DEC_CTXT *aCtx)
{
/* save the address length */
addr_ptr->addr.unc_addr.unc_len = aCtx->asn1r_octetcount;
(*get_va_address_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_access_rslt */
/* Function to get a variable access access result from the received */
/* message. */
/************************************************************************/
ST_VOID _ms_get_va_access_rslt (ASN1_DEC_CTXT *aCtx, ACCESS_RESULT *data_ptr,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
/* set decode error for request or response */
if (_mmsdec_rslt->type == MMSRESP)
ERROR_CODE = RESP_BAD_VALUE;
else
ERROR_CODE = REQ_BAD_VALUE;
acc_rslt_ptr = data_ptr;
get_va_access_rslt_done = done_fun;
acc_rslt_ptr->va_data.data = aCtx->asn1r_field_ptr; /* set data pointer */
save_dec_method = aCtx->asn1r_decode_method;
aCtx->asn1r_decode_method = ASN1_CLASS_METHOD;
aCtx->asn1r_c_id_fun = access_rslt_get_result; /* decode access result */
aCtx->asn1r_u_id_fun = asn1r_class_err; /* no universals */
aCtx->asn1r_a_id_fun = asn1r_class_err; /* no applications */
aCtx->asn1r_p_id_fun = asn1r_class_err; /* no privates */
}
/************************************************************************/
/* access_rslt_get_result */
/* get access result. */
/************************************************************************/
static ST_VOID access_rslt_get_result (ASN1_DEC_CTXT *aCtx, ST_UINT16 id)
{
MLOG_CDEC0 ("access_rslt_get_result");
if (aCtx->asn1r_constr_elmnt)
{ /* constructor, success */
acc_rslt_ptr->acc_rslt_tag = ACC_RSLT_SUCCESS;
aCtx->asn1r_c_done_fun[aCtx->asn1r_msg_level] = access_rslt_get_data_done;
aCtx->asn1r_c_id_fun = access_rslt_cstr_parse; /* decode access result */
}
else
{ /* primitive */
if (id != 0)
{ /* success */
acc_rslt_ptr->acc_rslt_tag = ACC_RSLT_SUCCESS;
aCtx->asn1r_field_ptr += aCtx->asn1r_elmnt_len; /* move past data element */
access_rslt_get_data_done (aCtx);
}
else
{ /* failure */
acc_rslt_ptr->acc_rslt_tag = ACC_RSLT_FAILURE;
/* read data access error */
if (asn1r_get_i16 (aCtx, &acc_rslt_ptr->failure))
asn1r_set_dec_err (aCtx, ERROR_CODE);
/* NOTE: DataAccessError should be [0-11] but allow any val here. */
aCtx->asn1r_decode_method = save_dec_method; /* restore original dec method */
(*get_va_access_rslt_done) (aCtx); /* all done, call user set fun */
}
}
}
/************************************************************************/
/* access_rslt_cstr_parse */
/* in the middle of a result constructor, just accept the elements */
/************************************************************************/
static ST_VOID access_rslt_cstr_parse (ASN1_DEC_CTXT *aCtx, ST_UINT16 id)
{
MLOG_CDEC0 ("access_rslt_cstr_parse");
if (!aCtx->asn1r_constr_elmnt) /* if primitive, need to move */
aCtx->asn1r_field_ptr += aCtx->asn1r_elmnt_len; /* aCtx->asn1r_field_ptr */
else /* if cstr, need to set cstr */
aCtx->asn1r_c_done_fun[aCtx->asn1r_msg_level] = NULL; /* done function == safe */
}
/************************************************************************/
/* access_rslt_get_data_done */
/* variable data has been obtianed. */
/************************************************************************/
static ST_VOID access_rslt_get_data_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("access_rslt_get_data_done");
/* set the variable data length */
acc_rslt_ptr->va_data.len =
aCtx->asn1r_field_ptr - acc_rslt_ptr->va_data.data;
aCtx->asn1r_decode_method = save_dec_method; /* restore original dec method */
(*get_va_access_rslt_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_data */
/* Function to get a variable access data from the received message. */
/************************************************************************/
ST_VOID _ms_get_va_data (ASN1_DEC_CTXT *aCtx, VAR_ACC_DATA *data_ptr, ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
vdata_ptr = data_ptr;
get_va_data_done = done_fun;
vdata_ptr->data = aCtx->asn1r_field_ptr; /* set data pointer */
asn1r_parse_next (aCtx, vdata_get_data_done); /* parse entire element */
}
/************************************************************************/
/* vdata_get_data_done */
/* variable data has been parsed. */
/************************************************************************/
static ST_VOID vdata_get_data_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("vdata_get_data_done");
/* set the variable data length */
vdata_ptr->len = aCtx->asn1r_field_ptr - vdata_ptr->data;
(*get_va_data_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_type_spec */
/* Function to get a variable access type specification from the */
/* received message. */
/************************************************************************/
ST_VOID _ms_get_va_type_spec (ASN1_DEC_CTXT *aCtx, VAR_ACC_TSPEC *data_ptr,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
tspec_ptr = data_ptr;
get_va_type_spec_done = done_fun;
tspec_ptr->data = aCtx->asn1r_field_ptr; /* set data pointer */
asn1r_parse_next (aCtx, type_spec_get_tspec_done); /* parse entire element */
}
/************************************************************************/
/* type_spec_get_tspec_done */
/* valid type specification was encountered. */
/************************************************************************/
static ST_VOID type_spec_get_tspec_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("type_spec_get_tspec_done");
/* set type specification len */
tspec_ptr->len = aCtx->asn1r_field_ptr - tspec_ptr->data;
(*get_va_type_spec_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_scat_access */
/* Function to get a variable access scattered access from the received */
/* message. */
/************************************************************************/
ST_VOID _ms_get_va_scat_access (ASN1_DEC_CTXT *aCtx, SCATTERED_ACCESS *data_ptr,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
scat_acc_ptr = data_ptr;
get_va_scat_access_done = done_fun;
scat_acc_ptr->data = aCtx->asn1r_field_ptr; /* set data pointer */
asn1r_parse_next (aCtx, scat_access_get_sa_done); /* parse entire element */
}
/************************************************************************/
/* scat_access_get_sa_done */
/* scattered access universal sequence constructor was encountered. */
/************************************************************************/
static ST_VOID scat_access_get_sa_done (ASN1_DEC_CTXT *aCtx)
{
/* set scattered access len */
scat_acc_ptr->len = aCtx->asn1r_field_ptr - scat_acc_ptr->data;
(*get_va_scat_access_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_alt_access */
/* Function to get a variable access alternate access from the received */
/* message. */
/************************************************************************/
ST_VOID _ms_get_va_alt_access (ASN1_DEC_CTXT *aCtx, ALTERNATE_ACCESS *data_ptr,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
MLOG_CDEC0 ("_ms_get_va_alt_access");
alt_acc_ptr = data_ptr;
get_va_alt_access_done = done_fun;
alt_acc_ptr->data = aCtx->asn1r_field_ptr; /* set data pointer */
asn1r_parse_cstr_contents (aCtx, alt_access_get_aa_done); /* parse entire element */
}
/************************************************************************/
/* alt_access_get_aa_done */
/* scattered access was encountered. */
/************************************************************************/
static ST_VOID alt_access_get_aa_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("alt_access_get_aa_done");
/* set type specification len */
alt_acc_ptr->len = aCtx->asn1r_field_ptr - alt_acc_ptr->data;
(*get_va_alt_access_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_var_spec */
/* Function to get a variable access variable specification from the */
/* received message. */
/************************************************************************/
ST_VOID _ms_get_va_var_spec (ASN1_DEC_CTXT *aCtx, VARIABLE_SPEC *data_ptr,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
/* set decode error for request or response */
if (_mmsdec_rslt->type == MMSRESP)
ERROR_CODE = RESP_BAD_VALUE;
else
ERROR_CODE = REQ_BAD_VALUE;
var_spec_ptr = data_ptr;
get_va_var_spec_done = done_fun;
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 0, var_spec_objname_cstr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, var_spec_address_cstr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 2, var_spec_var_descr_cstr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 3, var_spec_scat_acc_cstr);
ASN1R_TAG_ADD (aCtx, CTX, 4, var_spec_get_null);
}
/************************************************************************/
/* var_spec_objname_cstr */
/* variable specification object name constructor was encountered. */
/************************************************************************/
static ST_VOID var_spec_objname_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_objname_cstr");
var_spec_ptr->var_spec_tag = 0; /* set tag to name */
_ms_get_mms_objname (aCtx, &var_spec_ptr->vs.name, var_spec_cstr_get_done);
}
/************************************************************************/
/* var_spec_address_cstr */
/* variable specification address was encountered. */
/************************************************************************/
static ST_VOID var_spec_address_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_address_cstr");
var_spec_ptr->var_spec_tag = 1; /* set tag to address */
_ms_get_va_address (aCtx, &var_spec_ptr->vs.address, var_spec_cstr_get_done);
}
/************************************************************************/
/* var_spec_var_descr_cstr */
/* variable specification variable description constructor was */
/* encountered. */
/************************************************************************/
static ST_VOID var_spec_var_descr_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_var_descr_cstr");
var_spec_ptr->var_spec_tag = 2; /* set tag to variable descr */
_ms_get_va_address (aCtx, &var_spec_ptr->vs.var_descr.address, var_spec_type_spec);
}
/************************************************************************/
/* var_spec_type_spec */
/* variable specification address is done, get the type specification. */
/************************************************************************/
static ST_VOID var_spec_type_spec (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_type_spec");
_ms_get_va_type_spec (aCtx, &var_spec_ptr->vs.var_descr.type, var_spec_cstr_get_done);
}
/************************************************************************/
/* var_spec_scat_acc_cstr */
/* variable specification scattered access constructor was encountered. */
/************************************************************************/
static ST_VOID var_spec_scat_acc_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_scat_acc_cstr");
var_spec_ptr->var_spec_tag = 3; /* set tag to scattered access */
_ms_get_va_scat_access (aCtx, &var_spec_ptr->vs.sa_descr, var_spec_cstr_get_done);
}
/************************************************************************/
/* var_spec_get_null */
/* variable specification null was encountered. */
/************************************************************************/
static ST_VOID var_spec_get_null (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("var_spec_get_null");
var_spec_ptr->var_spec_tag = 4; /* set tag to variable descr */
if (aCtx->asn1r_elmnt_len != 0)
{
asn1r_set_dec_err (aCtx, ERROR_CODE);
return;
}
(*get_va_var_spec_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/* var_spec_cstr_get_done */
/* variable specification object name constructor done was encountered. */
/************************************************************************/
static ST_VOID var_spec_cstr_get_done (ASN1_DEC_CTXT *aCtx)
{
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = va_var_spec_done;
}
/************************************************************************/
/* va_var_spec_done */
/* variable specification has been obtained, return to set-up function. */
/************************************************************************/
static ST_VOID va_var_spec_done (ASN1_DEC_CTXT *aCtx)
{
(*get_va_var_spec_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_var_list */
/* Function to get a variable access variable list from the received */
/* message. */
/************************************************************************/
ST_VOID _ms_get_va_var_list (ASN1_DEC_CTXT *aCtx, VARIABLE_LIST *data_ptr, ST_INT *num_of_vars,
ST_INT max_vars, ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
/* set decode error for request or response */
if (_mmsdec_rslt->type == MMSRESP)
ERROR_CODE = RESP_BAD_VALUE;
else
ERROR_CODE = REQ_BAD_VALUE;
var_list_ptr = data_ptr;
NUM_OF_VARS = num_of_vars;
MAX_VARS = max_vars;
*NUM_OF_VARS = 0; /* initialize # of variables */
ASN1R_TAG_ADD (aCtx, UNI | CONSTR, SEQ_CODE, va_vlist_useq_cstr);
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = done_fun; /* can be empty list */
}
/************************************************************************/
/* va_vlist_useq_cstr */
/* variable access variable list universal sequence was encountered. */
/************************************************************************/
static ST_VOID va_vlist_useq_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_vlist_useq_cstr");
(*NUM_OF_VARS)++; /* increment # of variables */
if (*NUM_OF_VARS > MAX_VARS)
asn1r_set_dec_err (aCtx, ERROR_CODE);
var_list_ptr->alt_access_pres = SD_FALSE;
_ms_get_va_var_spec (aCtx, &var_list_ptr->var_spec, va_vlist_var_spec_done);
}
/************************************************************************/
/* va_vlist_var_spec_done */
/* variable access variable specification done, get alternate access. */
/************************************************************************/
static ST_VOID va_vlist_var_spec_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_vlist_var_spec_done");
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 5, va_vlist_alt_acc_cstr);
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = va_vlist_useq_cstr_done;
}
/************************************************************************/
/* va_vlist_alt_acc_cstr */
/* variable access variable list alternate access constructor was */
/* encountered. */
/************************************************************************/
static ST_VOID va_vlist_alt_acc_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_vlist_alt_acc_cstr");
var_list_ptr->alt_access_pres = SD_TRUE; /* set alternate access present */
_ms_get_va_alt_access (aCtx, &var_list_ptr->alt_access, va_vlist_alt_acc_done);
}
/************************************************************************/
/* va_vlist_alt_acc_done */
/* variable specification alternate access has been obtained. */
/************************************************************************/
static ST_VOID va_vlist_alt_acc_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_vlist_alt_acc_done");
}
/************************************************************************/
/* va_vlist_useq_cstr_done */
/* variable access variable list universal sequence constructor done */
/* was encountered. */
/************************************************************************/
static ST_VOID va_vlist_useq_cstr_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_vlist_useq_cstr_done");
var_list_ptr++; /* point to where next will go */
ASN1R_TAG_ADD (aCtx, UNI | CONSTR, SEQ_CODE, va_vlist_useq_cstr);
}
/************************************************************************/
/************************************************************************/
/* _ms_get_va_spec */
/* Function to get a variable access specification from the received */
/* message. */
/************************************************************************/
ST_VOID _ms_get_va_spec (ASN1_DEC_CTXT *aCtx, VAR_ACC_SPEC *data_ptr, ST_INT max_vars,
ST_VOID (*done_fun) (ASN1_DEC_CTXT *aCtx))
{
/* set decode error for request or response */
if (_mmsdec_rslt->type == MMSRESP)
ERROR_CODE = RESP_BAD_VALUE;
else
ERROR_CODE = REQ_BAD_VALUE;
va_spec_ptr = data_ptr;
va_spec_vlist_ptr = (VARIABLE_LIST *) (va_spec_ptr + 1);
MAX_VARS = max_vars;
get_va_spec_done = done_fun;
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 0, va_spec_vlist_list_cstr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, va_spec_vlist_name_cstr);
}
/************************************************************************/
/* va_spec_vlist_list_cstr */
/* variable access specification list of variables constructor was */
/* encountered. */
/************************************************************************/
static ST_VOID va_spec_vlist_list_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_spec_vlist_list_cstr");
va_spec_ptr->var_acc_tag = 0; /* set tag to list of variables */
_ms_get_va_var_list (aCtx, va_spec_vlist_ptr, &va_spec_ptr->num_of_variables,
MAX_VARS, va_spec_done);
}
/************************************************************************/
/* va_spec_vlist_name_cstr */
/* variable access specification variable list name constructor was */
/* encountered. */
/************************************************************************/
static ST_VOID va_spec_vlist_name_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("va_spec_vlist_name_cstr");
va_spec_ptr->var_acc_tag = 1; /* set tag to var list name */
_ms_get_mms_objname (aCtx, &va_spec_ptr->vl_name, va_spec_objname_done);
}
/************************************************************************/
/* va_spec_objname_done */
/* variable access specification variable list object name is complete. */
/************************************************************************/
static ST_VOID va_spec_objname_done (ASN1_DEC_CTXT *aCtx)
{
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = va_spec_done;
}
/************************************************************************/
/* va_spec_done */
/* variable access specification has been obtained, return to set-up */
/* function. */
/************************************************************************/
static ST_VOID va_spec_done (ASN1_DEC_CTXT *aCtx)
{
(*get_va_spec_done) (aCtx); /* all done, call user set fun */
}
/************************************************************************/
/************************************************************************/
/* _ms_wr_va_address */
/* Function to write a variable access address to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_address (ASN1_ENC_CTXT *aCtx, VAR_ACC_ADDR *data_ptr)
{
switch (data_ptr->addr_tag)
{
case (0) : /* write the numeric address */
asn1r_wr_u32 (aCtx, data_ptr->addr.num_addr);
asn1r_fin_prim (aCtx, 0, CTX); /* context tag 0 */
break;
case (1) : /* write the symbolic address */
asn1r_wr_vstr (aCtx, data_ptr->addr.sym_addr);
asn1r_fin_prim (aCtx, 1,CTX); /* context tag 1 */
break;
case (2) : /* write the unconstrained addr */
asn1r_wr_octstr (aCtx, data_ptr->addr.unc_addr.unc_ptr,
data_ptr->addr.unc_addr.unc_len);
asn1r_fin_prim (aCtx, 2,CTX); /* context tag 2 */
break;
}
}
/************************************************************************/
/* _ms_wr_va_access_rslt */
/* Function to write a variable access access result to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_access_rslt (ASN1_ENC_CTXT *aCtx, ACCESS_RESULT *data_ptr)
{
if (data_ptr->acc_rslt_tag == ACC_RSLT_SUCCESS)
_ms_wr_va_data (aCtx, &data_ptr->va_data); /* success, write data */
else
{ /* failure, write failure value */
asn1r_wr_i16 (aCtx, data_ptr->failure);
asn1r_fin_prim (aCtx, 0, CTX); /* context tag 0 */
}
}
/************************************************************************/
/* _ms_wr_va_data */
/* Function to write a variable access data to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_data (ASN1_ENC_CTXT *aCtx, VAR_ACC_DATA *data_ptr)
{
asn1r_wr_delmnt (aCtx, data_ptr->data, data_ptr->len);
}
/************************************************************************/
/* _ms_wr_va_type_spec */
/* Function to write a variable access type specification to the */
/* message. */
/************************************************************************/
ST_VOID _ms_wr_va_type_spec (ASN1_ENC_CTXT *aCtx, VAR_ACC_TSPEC *data_ptr)
{
asn1r_wr_delmnt (aCtx, data_ptr->data, data_ptr->len);
}
/************************************************************************/
/* _ms_wr_va_scat_access */
/* Function to write a variable access scattered access to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_scat_access (ASN1_ENC_CTXT *aCtx, SCATTERED_ACCESS *data_ptr)
{
asn1r_wr_delmnt (aCtx, data_ptr->data, data_ptr->len);
}
/************************************************************************/
/* _ms_wr_va_alt_access */
/* Function to write a variable access alternate access to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_alt_access (ASN1_ENC_CTXT *aCtx, ALTERNATE_ACCESS *data_ptr)
{
asn1r_wr_delmnt (aCtx, data_ptr->data, data_ptr->len);
}
/************************************************************************/
/* _ms_wr_va_var_spec */
/* Function to write a variable access variable specification to the */
/* message. */
/************************************************************************/
ST_VOID _ms_wr_va_var_spec (ASN1_ENC_CTXT *aCtx, VARIABLE_SPEC *data_ptr)
{
switch (data_ptr->var_spec_tag)
{
case 0 :
asn1r_strt_constr (aCtx);
_ms_wr_mms_objname (aCtx, &data_ptr->vs.name);
asn1r_fin_constr (aCtx, 0, CTX, DEF);
break;
case 1 :
asn1r_strt_constr (aCtx);
_ms_wr_va_address (aCtx, &data_ptr->vs.address);
asn1r_fin_constr (aCtx, 1, CTX, DEF);
break;
case 2 :
asn1r_strt_constr (aCtx);
_ms_wr_va_type_spec (aCtx, &data_ptr->vs.var_descr.type);
_ms_wr_va_address (aCtx, &data_ptr->vs.var_descr.address);
asn1r_fin_constr (aCtx, 2, CTX, DEF);
break;
case 3 :
asn1r_strt_constr (aCtx);
_ms_wr_va_scat_access (aCtx, &data_ptr->vs.sa_descr);
asn1r_fin_constr (aCtx, 3, CTX, DEF);
break;
case 4 :
asn1r_fin_prim (aCtx, 4, CTX);
break;
}
}
/************************************************************************/
/* _ms_wr_va_var_list */
/* Function to write a variable access variable list to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_var_list (ASN1_ENC_CTXT *aCtx, VARIABLE_LIST *data_ptr, ST_INT num_of_vars)
{
VARIABLE_LIST *vl_ptr;
ST_INT i;
vl_ptr = data_ptr;
vl_ptr += num_of_vars - 1; /* point to last in the list */
for (i = 0; i < num_of_vars; i++)
{
asn1r_strt_constr (aCtx); /* start universal sequece cstr */
if (vl_ptr->alt_access_pres)
{
asn1r_strt_constr (aCtx); /* start context tag 5 cstr */
_ms_wr_va_alt_access (aCtx, &vl_ptr->alt_access);
asn1r_fin_constr (aCtx, 5, CTX, DEF);
}
_ms_wr_va_var_spec (aCtx, &vl_ptr->var_spec);
asn1r_fin_constr (aCtx, SEQ_CODE, UNI, DEF);
vl_ptr--; /* point to previous var name */
}
}
/************************************************************************/
/* _ms_wr_va_spec */
/* Function to write a variable access specification to the message. */
/************************************************************************/
ST_VOID _ms_wr_va_spec (ASN1_ENC_CTXT *aCtx, VAR_ACC_SPEC *data_ptr)
{
VARIABLE_LIST *vl_ptr;
if (data_ptr->var_acc_tag == 1)
{
asn1r_strt_constr (aCtx); /* start context tag 1 cstr */
_ms_wr_mms_objname (aCtx, &data_ptr->vl_name);
asn1r_fin_constr (aCtx, 1, CTX, DEF);
}
else
{
vl_ptr = (VARIABLE_LIST *) (data_ptr + 1);
asn1r_strt_constr (aCtx); /* start context tag 0 cstr */
_ms_wr_va_var_list (aCtx, vl_ptr, data_ptr->num_of_variables);
asn1r_fin_constr (aCtx, 0, CTX, DEF);
}
}