Procedure for Calling C Encode Functions

This section describes the step-by-step procedure for calling a C MDER encode function.

Before any encode function can be called; the user must first initialize an encoding context. This is a variable of type OSCTXT. This variable holds all of the working data used during the encoding of a message. The context variable is declared as a normal automatic variable within the top-level calling function. It must be initialized before use. This can be accomplished by using the rtInitContext function as follows:

   OSCTXT ctxt;

   if (rtInitContext (&ctxt) != 0) {
      /* initialization failed, could be a license problem */
      printf (“context initialization failed (check license)\n”);
      return -1;
   }

After initializing the context and populating a variable of the structure to be encoded, an encode function can be called to encode the message.

A program fragment that could be used to encode a simple release request PDU is as follows:

   #include "IEEE-11073-20601-ASN1.h"             /* include file generated by ASN1C */

   int main (void) {
      ApduType  *pdata;           /* typedef generated by ASN1C */
      OSCTXT    ctxt;
      OSOCTET*  msgptr;
      int       stat;

      /* Step 1: Initialize the context and set the buffer pointer */

      stat = rtInitContext (&ctxt);
      if (stat != 0) {
         /* initialization failed, could be a license problem */
         rtxErrPrint (&ctxt);
         return stat;
      }
      
      /* Step 2: Populate the structure to be encoded */

      pdata = rtxMemAllocType (&ctxt, ApduType);
      asn1Init_ApduType (pdata);  

      pdata->t = T_ApduType_rlrq;       
      pdata->u.rlrq = rtxMemAllocTypeZ (&ctxt, RlrqApdu);
      pdata->u.rlrq->reason = normal;   

      /* Step 3: Call the generated encode function */

      stat = MDEREnc_ApduType (&ctxt, pdata);

      /* Step 4: Check the return status. */

      if (stat < 0) {
         rtxErrPrint (&ctxt);
         return stat;
      }
      
      stat = rtFreeContext (&ctxt);
      if (stat != 0) {
         printf ("Error freeing context!\n");
         return stat;
      }
      
      return 0;
   }