227 lines
7.3 KiB
C
227 lines
7.3 KiB
C
|
|
/************************************************************************/
|
||
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
|
|
/* 1986 - 2001, All Rights Reserved. */
|
||
|
|
/* */
|
||
|
|
/* PROPRIETARY AND CONFIDENTIAL */
|
||
|
|
/* */
|
||
|
|
/* MODULE NAME : mms_tdef2.c */
|
||
|
|
/* PRODUCT(S) : MMSEASE */
|
||
|
|
/* */
|
||
|
|
/* MODULE DESCRIPTION : */
|
||
|
|
/* Functions to assist in using NESTED RUNTIME TYPES */
|
||
|
|
/* */
|
||
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||
|
|
/* */
|
||
|
|
/* MODIFICATION LOG : */
|
||
|
|
/* Date Who Rev Comments */
|
||
|
|
/* -------- --- ------ ------------------------------------------- */
|
||
|
|
/* 08/01/05 JRB 13 Avoid risky cast to remove const. */
|
||
|
|
/* 04/02/03 JRB 12 Add UTF8string support (see RT_UTF8_STRING). */
|
||
|
|
/* 12/20/01 JRB 11 Converted to use ASN1R (re-entrant ASN1) */
|
||
|
|
/* 11/14/01 EJV 10 Added support for new MMS type UtcTime: */
|
||
|
|
/* ms_runtime_to_asn1: add case for RT_UTC_TIME */
|
||
|
|
/* 10/18/01 JRB 09 Eliminate warning. */
|
||
|
|
/* 07/28/00 JRB 08 Use ms_comp_name_find for everyone. */
|
||
|
|
/* 07/13/00 JRB 07 Use new ms_comp_name_find to get comp names. */
|
||
|
|
/* 09/13/99 MDE 06 Added SD_CONST modifiers */
|
||
|
|
/* 04/14/99 MDE 05 Removed unnecessary include files */
|
||
|
|
/* 09/10/98 MDE 04 Removed 'mvlRtNames' declaration */
|
||
|
|
/* 08/13/98 MDE 03 Added asn1 encode overrun test to loop */
|
||
|
|
/* 03/11/98 MDE 02 Removed NEST_RT_TYPES */
|
||
|
|
/* 04/08/97 MDE 01 Fixed 'RT Table too small prob w/named types */
|
||
|
|
/* 04/02/97 DTL 7.00 MMSEASE 7.0 release. See MODL70.DOC for */
|
||
|
|
/* history. */
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
#include "glbtypes.h"
|
||
|
|
#include "sysincs.h"
|
||
|
|
#include "glbsem.h"
|
||
|
|
#include "mmsdefs.h"
|
||
|
|
#include "mms_pvar.h"
|
||
|
|
#include "mms_vvar.h"
|
||
|
|
#include "asn1defs.h"
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/* For debug version, use a static pointer to avoid duplication of */
|
||
|
|
/* __FILE__ strings. */
|
||
|
|
|
||
|
|
#ifdef DEBUG_SISCO
|
||
|
|
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* ms_runtime_to_tdl */
|
||
|
|
/************************************************************************/
|
||
|
|
/* Converts RUNTIME TYPE to ASN.1. ASN.1 build must be started */
|
||
|
|
|
||
|
|
ST_RET ms_runtime_to_asn1 (ASN1_ENC_CTXT *aCtx, SD_CONST RUNTIME_TYPE *rt, ST_INT rt_num)
|
||
|
|
{
|
||
|
|
ST_INT i;
|
||
|
|
ST_INT level;
|
||
|
|
SD_CONST RUNTIME_TYPE *rt_ptr;
|
||
|
|
ST_BOOLEAN structComp[ASN1_MAX_LEVEL];
|
||
|
|
ST_UCHAR v1;
|
||
|
|
ST_UCHAR v2;
|
||
|
|
const ST_CHAR *comp_name;
|
||
|
|
|
||
|
|
S_LOCK_COMMON_RESOURCES ();
|
||
|
|
|
||
|
|
level = 0;
|
||
|
|
rt_ptr = rt + (rt_num - 1);
|
||
|
|
for (i = 0; i < rt_num && aCtx->asn1r_encode_overrun == SD_FALSE; ++i, --rt_ptr)
|
||
|
|
{
|
||
|
|
switch (rt_ptr->el_tag)
|
||
|
|
{
|
||
|
|
case RT_ARR_START :
|
||
|
|
--level;
|
||
|
|
/* Finish typeSpecification */
|
||
|
|
asn1r_fin_constr (aCtx, 2, CTX, SD_FALSE);
|
||
|
|
|
||
|
|
/* Write numberOfElements */
|
||
|
|
asn1r_wr_i32 (aCtx, (ST_INT32) rt_ptr->u.arr.num_elmnts);
|
||
|
|
asn1r_fin_prim (aCtx, 1,CTX);
|
||
|
|
|
||
|
|
/* Finish array */
|
||
|
|
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_ARR_END :
|
||
|
|
++level;
|
||
|
|
structComp[level] = SD_FALSE;
|
||
|
|
asn1r_strt_constr (aCtx); /* Start array */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start typeSpecification */
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_STR_START :
|
||
|
|
--level;
|
||
|
|
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE); /* Finish components */
|
||
|
|
asn1r_fin_constr (aCtx, 2, CTX, SD_FALSE); /* Finish structure */
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_STR_END :
|
||
|
|
++level;
|
||
|
|
structComp[level] = SD_TRUE;
|
||
|
|
|
||
|
|
asn1r_strt_constr (aCtx); /* Start structure */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start components */
|
||
|
|
/* prepare for first component */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start component seq of seq */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start component type */
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_BOOL :
|
||
|
|
asn1r_fin_prim (aCtx, RT_BOOL, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_INTEGER :
|
||
|
|
asn1r_wr_u8 (aCtx, (ST_UCHAR) (rt_ptr->u.p.el_len * 8));
|
||
|
|
asn1r_fin_prim (aCtx, RT_INTEGER, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_UNSIGNED :
|
||
|
|
asn1r_wr_u8 (aCtx, (ST_UCHAR) (rt_ptr->u.p.el_len * 8));
|
||
|
|
asn1r_fin_prim (aCtx, RT_UNSIGNED, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_FLOATING_POINT :
|
||
|
|
asn1r_strt_constr (aCtx);
|
||
|
|
if (rt_ptr->u.p.el_len == 4) /* single precision */
|
||
|
|
{
|
||
|
|
v1 = SNGL_EXP;
|
||
|
|
if (!m_use_dis_float)
|
||
|
|
v2 = SNGL_WHOLE;
|
||
|
|
else
|
||
|
|
v2 = SNGL_FRACT;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
v1 = DOUBL_EXP;
|
||
|
|
if (!m_use_dis_float)
|
||
|
|
v2 = DOUBL_WHOLE;
|
||
|
|
else
|
||
|
|
v2 = DOUBL_FRACT;
|
||
|
|
}
|
||
|
|
asn1r_wr_u8 (aCtx, v1); /* write exp */
|
||
|
|
asn1r_fin_prim (aCtx, INT_CODE,UNI);
|
||
|
|
asn1r_wr_u8 (aCtx, v2);
|
||
|
|
asn1r_fin_prim (aCtx, INT_CODE,UNI);
|
||
|
|
asn1r_fin_constr (aCtx, RT_FLOATING_POINT, CTX, SD_FALSE);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_BIT_STRING :
|
||
|
|
case RT_OCTET_STRING :
|
||
|
|
case RT_VISIBLE_STRING :
|
||
|
|
case RT_UTF8_STRING : /* all same encoding w/ different tags*/
|
||
|
|
asn1r_wr_i32 (aCtx, (ST_INT32) rt_ptr->u.p.el_len);
|
||
|
|
asn1r_fin_prim (aCtx, rt_ptr->el_tag, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_GENERAL_TIME :
|
||
|
|
asn1r_fin_prim (aCtx, RT_GENERAL_TIME, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_BINARY_TIME :
|
||
|
|
if (rt_ptr->u.p.el_len == 4)
|
||
|
|
asn1r_wr_u8 (aCtx, 0);
|
||
|
|
else
|
||
|
|
asn1r_wr_u8 (aCtx, 1);
|
||
|
|
asn1r_fin_prim (aCtx, RT_BINARY_TIME, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_UTC_TIME :
|
||
|
|
asn1r_fin_prim (aCtx, RT_UTC_TIME, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_BCD :
|
||
|
|
asn1r_wr_u8 (aCtx, (ST_UCHAR) rt_ptr->u.p.el_len);
|
||
|
|
asn1r_fin_prim (aCtx, RT_BCD, CTX);
|
||
|
|
break;
|
||
|
|
|
||
|
|
case RT_BOOLEANARRAY :
|
||
|
|
break;
|
||
|
|
|
||
|
|
default :
|
||
|
|
MLOG_ERR1 ("MS_RUNTIME_TO_ASN1: Invalid element tag (%d)",
|
||
|
|
rt_ptr->el_tag);
|
||
|
|
S_UNLOCK_COMMON_RESOURCES ();
|
||
|
|
return (SD_FAILURE);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (level > 0 && structComp[level] == SD_TRUE &&
|
||
|
|
rt_ptr->el_tag != RT_STR_END)
|
||
|
|
{
|
||
|
|
asn1r_fin_constr (aCtx, 1, CTX, SD_FALSE); /* Finish typeSpec */
|
||
|
|
|
||
|
|
comp_name = ms_comp_name_find (rt_ptr);
|
||
|
|
if (strlen (comp_name))
|
||
|
|
{
|
||
|
|
asn1r_wr_vstr (aCtx, comp_name);
|
||
|
|
asn1r_fin_prim (aCtx, 0, CTX);
|
||
|
|
}
|
||
|
|
asn1r_fin_constr (aCtx, SEQ_CODE, UNI, SD_FALSE);
|
||
|
|
|
||
|
|
if ((rt_ptr-1)->el_tag != RT_STR_START)
|
||
|
|
{
|
||
|
|
/* prepare for the next component */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start component seq of seq */
|
||
|
|
asn1r_strt_constr (aCtx); /* Start component type */
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
S_UNLOCK_COMMON_RESOURCES ();
|
||
|
|
|
||
|
|
if (aCtx->asn1r_encode_overrun)
|
||
|
|
{
|
||
|
|
MLOG_NERR0 ("ms_runtime_to_asn1 : ASN.1 encode overrun");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
return (SD_SUCCESS);
|
||
|
|
}
|
||
|
|
|
||
|
|
|