/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/*	(c) Copyright Systems Integration Specialists Company, Inc.,	*/
/*	1998 - 1998, All Rights Reserved				*/
/*									*/
/* MODULE NAME : s_defvl.c						*/
/* PRODUCT(S)  : MMSEASE-LITE						*/
/*									*/
/* MODULE DESCRIPTION :							*/
/*									*/
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE :				*/
/*	_mvl_process_defvlist_ind					*/
/*	mvlas_defvlist_resp						*/
/*	mplas_defvlist_resp						*/
/*									*/
/* MODIFICATION LOG :							*/
/*  Date     Who   Rev     Comments					*/
/* --------  ---  ------   -------------------------------------------	*/
/* 03/06/08  JRB     17    Send error resp if any variable not Named.	*/
/* 04/09/07  MDE     16    Enhanced filtered logging 			*/
/* 02/21/07  JRB     15    Fix comment.					*/
/* 10/30/06  JRB     14    Use new mvl_vmd_* object handling functions.	*/
/* 01/30/06  GLB     13    Integrated porting changes for VMS           */
/* 09/21/01  JRB     12    Alloc global bufs only once at startup.	*/
/* 01/21/00  MDE     11    Now use MEM_SMEM for dynamic memory		*/
/* 09/13/99  MDE     10    Added SD_CONST modifiers			*/
/* 01/20/99  JRB     09    Use new mvl_nvl_add (simpler, more efficient)*/
/* 01/14/99  JRB     08    BUG FIX: Increment variable_list in loop.	*/
/* 12/11/98  MDE     07    Removed scope references from VA		*/
/* 11/16/98  MDE     06    Allow use of manufactured variables		*/
/* 11/16/98  MDE     05    Renamed internal functions (prefix '_')	*/
/* 07/09/98  JRB     04    Set altAcc=NULL (no alternate access).	*/
/* 06/15/98  MDE     03    Changes to allow compile under C++		*/
/* 06/05/98  MDE     02    Moved 'mvl_insert_nvlist' elsewhere 		*/
/* 04/14/98  JRB     01    MMS-LITE V4.0 Release			*/
/************************************************************************/

#include "glbtypes.h"
#include "sysincs.h"
#include "mmsdefs.h"
#include "mms_pfil.h"
#include "mvl_defs.h"
#include "mvl_log.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

/************************************************************************/
/*			_mvl_process_defvlist_ind				*/
/* A "defvlist" indication has been received, process it and respond	*/
/************************************************************************/

ST_VOID _mvl_process_defvlist_ind (MVL_IND_PEND *indCtrl)
  {
  indCtrl->u.defvlist.req_info =
        (DEFVLIST_REQ_INFO *) indCtrl->event->u.mms.dec_rslt.data_ptr;

  u_mvl_defvlist_ind (indCtrl);
  }

/************************************************************************/
/*			mvlas_defvlist_resp				*/
/* Most of this code doesn't care whether the Named Variable List is	*/
/* VMD-specific, Dom-specific, etc.					*/
/************************************************************************/
ST_VOID mvlas_defvlist_resp (MVL_IND_PEND *indCtrl)
  {
MVL_NVLIST_CTRL *nvlist_ctrl;	/* alloc, fill in, & then copy to list	*/
ST_INT j;
VARIABLE_LIST *variable_list;
DEFVLIST_REQ_INFO *req_info = indCtrl->u.defvlist.req_info;
OBJECT_NAME *tmp_obj_array;

  if (req_info->num_of_variables <= 0)
    {
    _mplas_err_resp (indCtrl,4,0);	/* Service error , other	*/
    return;
    }

  variable_list = (VARIABLE_LIST *) (req_info + 1);
  
  /* Create temporary obj array from var list.	*/
  tmp_obj_array = (OBJECT_NAME *) M_MALLOC (MSMEM_GEN, req_info->num_of_variables * sizeof (OBJECT_NAME));
  for (j = 0;  j < req_info->num_of_variables;  j++, variable_list++)
    {
    if (variable_list->var_spec.var_spec_tag != VA_SPEC_NAMED)
      {	/* Only "Named" variables supported	*/
      _mplas_err_resp (indCtrl, MMS_ERRCLASS_DEFINITION, MMS_ERRCODE_TYPE_UNSUPPORTED);
      M_FREE (MSMEM_GEN, tmp_obj_array);	/* cleanup	*/
      return;					/* stop now	*/
      }
    memcpy (&tmp_obj_array [j], &variable_list->var_spec.vs.name, sizeof (OBJECT_NAME));
    }
    
  /* NOTE: Use "obj_name.vmd_spec" for an object of any scope,		*/
  /* because "obj_name" is a union of identical type objects.		*/
  nvlist_ctrl = mvl_vmd_nvl_add (&mvl_vmd, &req_info->vl_name, indCtrl->event->net_info,
                    req_info->num_of_variables, tmp_obj_array,
                    SD_TRUE);	/* copy name because it is volatile	*/

  M_FREE (MSMEM_GEN, tmp_obj_array);	/* free temporary object array.	*/

  if (nvlist_ctrl == NULL)
    {			   		/* Failed.			*/
    _mplas_err_resp (indCtrl,4,0);	/* Service error, other	*/
    return;
    }

  nvlist_ctrl->mms_deletable = SD_TRUE;	/* MMS spec requires this*/
  nvlist_ctrl->altAcc = NULL;		/* Don't support alternate access*/

  mplas_defvlist_resp (indCtrl);
  }


/************************************************************************/
/*			mplas_defvlist_resp				*/
/************************************************************************/
ST_VOID mplas_defvlist_resp (MVL_IND_PEND *indCtrl)
  {
ST_RET rc;

  /* Build a "defvlist" response (no response info).			*/
  rc = mpl_defvlist_resp (indCtrl->event->u.mms.dec_rslt.id);
  if (rc == SD_SUCCESS)
    mpl_resp_log (indCtrl, NULL);

  _mvl_send_resp_i (indCtrl, rc);
  }

