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

449 lines
16 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1986 - 2001, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : mms_ced1.c */
/* PRODUCT(S) : MMSEASE, MMSEASE-LITE */
/* */
/* MODULE DESCRIPTION : */
/* This module contains common primitive encode/decode functions */
/* particular to get and write journal service. */
/* */
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 03/11/04 GLB 05 Remove "thisFileName" */
/* 12/20/01 JRB 04 Converted to use ASN1R (re-entrant ASN1) */
/* 04/28/00 JRB 03 Lint cleanup */
/* 09/13/99 MDE 02 Added SD_CONST modifiers */
/* 08/15/97 MDE 01 BTOD 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_pjou.h"
#include "asn1defs.h"
/************************************************************************/
/* global structures & functions */
/************************************************************************/
static ENTRY_CONTENT *ent_cont_ptr;
static ST_VOID (*get_jou_ent_cont_done) (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_get_data_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_get_annotation (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_list_of_var_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_vlist_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_vlist_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_vs_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_value_spec_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_get_var_tag (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_event_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_get_state (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_evcon_name_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_ecn_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_evcon_name_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_event_cstr (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_data_cstr_done (ASN1_DEC_CTXT *aCtx);
#ifdef CS_SUPPORT
static ST_VOID jec_addl_detail_cstr_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_addl_detail_done (ASN1_DEC_CTXT *aCtx);
static ST_VOID jec_get_addl_detail (ASN1_DEC_CTXT *aCtx);
#endif
static ST_VOID jec_get_occur_time (ASN1_DEC_CTXT *aCtx);
static VAR_INFO *var_info_ptr;
static ST_INT MAX_DATA_VARS;
static ST_RET ERROR_CODE;
/************************************************************************/
/************************************************************************/
/* _ms_get_jou_ent_cont */
/* Function to get a Journal Entry Content from the received message. */
/************************************************************************/
ST_VOID _ms_get_jou_ent_cont (ASN1_DEC_CTXT *aCtx, ENTRY_CONTENT *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;
ent_cont_ptr = data_ptr;
MAX_DATA_VARS = max_vars;
get_jou_ent_cont_done = done_fun;
ent_cont_ptr->addl_detail_pres = SD_FALSE; /* set default values */
ent_cont_ptr->entry_form_tag = 0;
ASN1R_TAG_ADD (aCtx, CTX, 0, jec_get_occur_time);
}
/************************************************************************/
/* jec_get_occur_time */
/* journal entry content is being decoded: occurrence time was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_get_occur_time (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_occur_time");
/* read time from message */
if (asn1r_get_btod (aCtx, &ent_cont_ptr->occur_time))
asn1r_set_dec_err (aCtx, ERROR_CODE);
#ifdef CS_SUPPORT
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, jec_get_addl_detail);
#endif
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 2, jec_get_data_cstr);
ASN1R_TAG_ADD (aCtx, CTX, 3, jec_get_annotation);
/* set cstr done function */
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = get_jou_ent_cont_done;
}
#ifdef CS_SUPPORT
/************************************************************************/
/* jec_get_addl_detail */
/* journal entry content is being decoded: additional detail was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_get_addl_detail (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_addl_detail");
ent_cont_ptr->addl_detail_pres = SD_TRUE; /* set addl detail pres */
/* leave additional detail in place; just parse it. */
ent_cont_ptr->addl_detail = aCtx->asn1r_field_ptr;
asn1r_parse_next (aCtx, jec_addl_detail_done);
}
/************************************************************************/
/* jec_addl_detail_done */
/* journal entry content is being decoded: additional detail has been */
/* parsed. */
/************************************************************************/
static ST_VOID jec_addl_detail_done (ASN1_DEC_CTXT *aCtx)
{
ent_cont_ptr->addl_detail_len = aCtx->asn1r_octetcount; /* save length */
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = jec_addl_detail_cstr_done;
}
/************************************************************************/
/* jec_addl_detail_cstr_done */
/* journal entry content is being decoded: additional detail cstr done */
/* has been encountered. */
/************************************************************************/
static ST_VOID jec_addl_detail_cstr_done (ASN1_DEC_CTXT *aCtx)
{
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 2, jec_get_data_cstr);
ASN1R_TAG_ADD (aCtx, CTX, 3, jec_get_annotation);
}
#endif
/************************************************************************/
/* jec_get_data_cstr */
/* journal entry content is being decoded: data constructor was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_get_data_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_data_cstr");
ent_cont_ptr->entry_form_tag = 2; /* set data form tag */
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 0, jec_event_cstr);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, jec_list_of_var_cstr);
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = jec_data_cstr_done;
}
/************************************************************************/
/* jec_event_cstr */
/* journal entry content is being decoded: event cstr was encountered. */
/************************************************************************/
static ST_VOID jec_event_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_event_cstr");
ent_cont_ptr->ef.data.event_pres = SD_TRUE; /* set event present */
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 0, jec_evcon_name_cstr);
}
/************************************************************************/
/* jec_evcon_name_cstr */
/* journal entry content is being decoded: event condition name cstr */
/* was encountered. */
/************************************************************************/
static ST_VOID jec_evcon_name_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_evcon_name_cstr");
_ms_get_mms_objname (aCtx, &ent_cont_ptr->ef.data.evcon_name, jec_ecn_done);
}
/************************************************************************/
/* jec_ecn_done */
/* journal entry content is being decoded: event condition name has */
/* been obtained. */
/************************************************************************/
static ST_VOID jec_ecn_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_ecn_done");
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = jec_evcon_name_cstr_done;
}
/************************************************************************/
/* jec_evcon_name_cstr_done */
/* journal entry content is being decoded: event condition name cstr */
/* done was encountered. */
/************************************************************************/
static ST_VOID jec_evcon_name_cstr_done (ASN1_DEC_CTXT *aCtx)
{
ASN1R_TAG_ADD (aCtx, CTX, 1, jec_get_state);
}
/************************************************************************/
/* jec_get_state */
/* journal entry content is being decoded: current state was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_get_state (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_state");
/* read time from message */
if (asn1r_get_i16 (aCtx, &ent_cont_ptr->ef.data.cur_state) ||
(ent_cont_ptr->ef.data.cur_state < 0) ||
(ent_cont_ptr->ef.data.cur_state > 2))
asn1r_set_dec_err (aCtx, UNCONF_BAD_VALUE);
/* set cstr done function */
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = jec_event_cstr_done;
}
/************************************************************************/
/* jec_event_cstr_done */
/* journal entry content is being decoded: event cstr done was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_event_cstr_done (ASN1_DEC_CTXT *aCtx)
{
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, jec_list_of_var_cstr);
}
/************************************************************************/
/* jec_list_of_var_cstr */
/* journal entry content is being decoded: list of variables cstr was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_list_of_var_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_list_of_var_cstr");
ent_cont_ptr->ef.data.list_of_var_pres = SD_TRUE;
ent_cont_ptr->ef.data.num_of_var = 0; /* initialize # of variables */
/* initialize var list pointer*/
var_info_ptr = (VAR_INFO *) (ent_cont_ptr + 1);
ASN1R_TAG_ADD (aCtx, UNI | CONSTR, SEQ_CODE, jec_vlist_cstr);
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = NULL;
}
/************************************************************************/
/* jec_vlist_cstr */
/* journal entry content is being decoded: variable list constructor */
/* was encountered. */
/************************************************************************/
static ST_VOID jec_vlist_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_vlist_cstr");
ent_cont_ptr->ef.data.num_of_var++; /* increment # of variables */
if (ent_cont_ptr->ef.data.num_of_var > MAX_DATA_VARS)
asn1r_set_dec_err (aCtx, ERROR_CODE);
ASN1R_TAG_ADD (aCtx, CTX, 0, jec_get_var_tag);
}
/************************************************************************/
/* jec_get_var_tag */
/* journal entry content is being decoded: variable tag was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_get_var_tag (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_var_tag");
/* copy variable tag back onto itself shifted by 1 char */
var_info_ptr->var_tag = (ST_CHAR *) aCtx->asn1r_field_ptr - 1;
/* read variable tag from message */
if (asn1r_get_vstr (aCtx, var_info_ptr->var_tag))
asn1r_set_dec_err (aCtx, ERROR_CODE);
ASN1R_TAG_ADD (aCtx, CTX | CONSTR, 1, jec_value_spec_cstr);
}
/************************************************************************/
/* jec_value_spec_cstr */
/* journal entry content is being decoded: value specification cstr */
/* was encountered. */
/************************************************************************/
static ST_VOID jec_value_spec_cstr (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_value_spec_cstr");
_ms_get_va_data (aCtx, &var_info_ptr->value_spec, jec_vs_done);
}
/************************************************************************/
/* jec_vs_done */
/* journal entry content is being decoded: value specification has been */
/* obtained. */
/************************************************************************/
static ST_VOID jec_vs_done (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_vs_done");
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level] = NULL;
aCtx->asn1r_c_done_fun [aCtx->asn1r_msg_level-1] = jec_vlist_cstr_done;
}
/************************************************************************/
/* jec_vlist_cstr_done */
/* journal entry content is being decoded: variable list constructor */
/* done was encountered. */
/************************************************************************/
static ST_VOID jec_vlist_cstr_done (ASN1_DEC_CTXT *aCtx)
{
var_info_ptr++; /* point to where next will go */
ASN1R_TAG_ADD (aCtx, UNI | CONSTR, SEQ_CODE, jec_vlist_cstr);
}
/************************************************************************/
/* jec_data_cstr_done */
/* journal entry content is being decoded: data constructor done was */
/* encountered. */
/************************************************************************/
static ST_VOID jec_data_cstr_done (ASN1_DEC_CTXT *aCtx)
{
}
/************************************************************************/
/* jec_get_annotation */
/* journal entry content is being decoded: annotation was encountered. */
/************************************************************************/
static ST_VOID jec_get_annotation (ASN1_DEC_CTXT *aCtx)
{
MLOG_CDEC0 ("jec_get_annotation");
/* copy annotation back onto itself shifted by 1 char */
ent_cont_ptr->entry_form_tag = 3;
ent_cont_ptr->ef.annotation = (ST_CHAR *) aCtx->asn1r_field_ptr - 1;
if (asn1r_get_vstr (aCtx, ent_cont_ptr->ef.annotation)) /* read annotation */
asn1r_set_dec_err (aCtx, ERROR_CODE);
}
/************************************************************************/
/************************************************************************/
/* _ms_wr_jou_ent_cont */
/* Function to write a Journal Entry Content to the message. */
/************************************************************************/
ST_VOID _ms_wr_jou_ent_cont (ASN1_ENC_CTXT *aCtx, ENTRY_CONTENT *data_ptr)
{
VAR_INFO *vi_ptr;
ST_INT i;
if (data_ptr->entry_form_tag == 3)
{ /* write annotation */
asn1r_wr_vstr (aCtx, data_ptr->ef.annotation);
asn1r_fin_prim (aCtx, 3, CTX); /* context tag 3 */
}
else
{
asn1r_strt_constr (aCtx); /* start context tag 2 cstr */
if (data_ptr->ef.data.list_of_var_pres)
{
asn1r_strt_constr (aCtx); /* start context tag 1 cstr */
vi_ptr = (VAR_INFO *) (data_ptr + 1);
vi_ptr += data_ptr->ef.data.num_of_var - 1;
for (i = 0; i < data_ptr->ef.data.num_of_var; i++)
{
asn1r_strt_constr (aCtx); /* start universal sequece cstr */
asn1r_strt_constr (aCtx); /* start context tag 1 cstr */
_ms_wr_va_data (aCtx, &vi_ptr->value_spec);
asn1r_fin_constr (aCtx, 1, CTX, DEF); /* finish context tag 1 cstr */
asn1r_wr_vstr (aCtx, vi_ptr->var_tag);
asn1r_fin_prim (aCtx, 0, CTX);
asn1r_fin_constr (aCtx, SEQ_CODE, UNI, DEF);
vi_ptr--; /* point to previous var name */
}
asn1r_fin_constr (aCtx, 1, CTX, DEF); /* finish context tag 1 cstr */
}
if (data_ptr->ef.data.event_pres)
{
asn1r_strt_constr (aCtx); /* start context tag 0 cstr */
asn1r_wr_i16 (aCtx, data_ptr->ef.data.cur_state);/* write the current state */
asn1r_fin_prim (aCtx, 1,CTX); /* context tag 1 */
asn1r_strt_constr (aCtx); /* start context tag 0 cstr */
_ms_wr_mms_objname (aCtx, &data_ptr->ef.data.evcon_name);
asn1r_fin_constr (aCtx, 0, CTX, DEF); /* finish context tag 0 cstr */
asn1r_fin_constr (aCtx, 0, CTX, DEF); /* finish context tag 0 cstr */
}
asn1r_fin_constr (aCtx, 2, CTX, DEF); /* finish context tag 2 cstr */
}
if (data_ptr->addl_detail_pres)
{
asn1r_strt_constr (aCtx); /* start context tag 1 cstr */
asn1r_wr_delmnt (aCtx, data_ptr->addl_detail,data_ptr->addl_detail_len);
asn1r_fin_constr (aCtx, 1, CTX, DEF); /* context tag 1 */
}
/* select short form if not present */
asn1r_wr_btod (aCtx, &data_ptr->occur_time);
asn1r_fin_prim (aCtx, 0, CTX); /* context tag 0 */
}