自主协议库编译通过
This commit is contained in:
448
mmslib/mmsle/mms_ced1.c
Normal file
448
mmslib/mmsle/mms_ced1.c
Normal file
@@ -0,0 +1,448 @@
|
||||
/************************************************************************/
|
||||
/* 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 */
|
||||
}
|
||||
Reference in New Issue
Block a user