/* CFaxApiFunctionParameterInfo class implementation file. */

#include "StdAfx.h"
#include "param.h"

extern "C" {
#include "winfax.h"
}
//#include "winfax.h"



/*
 *  CFaxApiFunctionParameterInfo
 *
 *  Purpose: 
 *          This function constructs a CFaxApiFunctionParameterInfo object.
 *
 *  Arguments:
 *          None
 *
 *  Returns:
 *          None
 *
 */

CFaxApiFunctionParameterInfo::CFaxApiFunctionParameterInfo()
{
   m_cpaParameterValue.RemoveAll();
   
   m_cpaParameterRange1.RemoveAll();
   
   m_cpaParameterRange2.RemoveAll();

   m_xNumberOfParameters = 0;
}



/*
 *  ~CFaxApiFunctionParameterInfo
 *
 *  Purpose: 
 *          This function destroys a CFaxApiFunctionParameterInfo object.
 *
 *  Arguments:
 *          None
 *
 *  Returns:
 *          None
 *
 */

CFaxApiFunctionParameterInfo::~CFaxApiFunctionParameterInfo()
{
   int   xNumberOfElements;
   int   xItemIndex;
   
   xNumberOfElements = m_cpaParameterValue.GetSize();
   
   if ( xNumberOfElements > 0 )
   {
      for ( xItemIndex = 0; xItemIndex < xNumberOfElements; xItemIndex++ )
      {
         if ( m_cpaParameterValue[xItemIndex] != (void *) NULL )
         {
            delete m_cpaParameterValue[xItemIndex];
         }
      }
   }
   
   xNumberOfElements = m_cpaParameterRange1.GetSize();
   
   if ( xNumberOfElements > 0 )
   {
      for ( xItemIndex = 0; xItemIndex < xNumberOfElements; xItemIndex++ )
      {
         if ( m_cpaParameterRange1[xItemIndex] != (void *) NULL )
         {
            delete m_cpaParameterRange1[xItemIndex];
         }
      }
   }
   
   xNumberOfElements = m_cpaParameterRange2.GetSize();
   
   if ( xNumberOfElements > 0 )
   {
      for ( xItemIndex = 0; xItemIndex < xNumberOfElements; xItemIndex++ )
      {
         if ( m_cpaParameterRange2[xItemIndex] != (void *) NULL )
         {
            delete m_cpaParameterRange2[xItemIndex];
         }
      }
   }
}



/*
 *  InitParameterInfoMember
 *
 *  Purpose: 
 *          This function constructs a CFaxApiFunctionParameterInfo object.
 *
 *  Arguments:
 *          rcsFunctionName - a reference to a CString tha contains the
 *                            name of a Fax API function.
 *
 *  Returns:
 *          None
 *
 */

void CFaxApiFunctionParameterInfo::InitParameterInfoMember( const CString & rcsFunctionName )
{
   m_cpaParameterValue.RemoveAll();
   
   m_cpaParameterRange1.RemoveAll();
   
   m_cpaParameterRange2.RemoveAll();

   /* Get the number of parameters from the initialization file. */

   int      xNumberOfParameters;

   xNumberOfParameters = (int) GetPrivateProfileInt(
                                            (LPCTSTR) rcsFunctionName,
                                            (LPCTSTR) TEXT("NumberOfParameters"),
                                            -1,       // default return value
                                            (LPCTSTR) TEXT(".\\faxapi.ini") );

   if ( xNumberOfParameters > 0 )
   {
      m_xNumberOfParameters = xNumberOfParameters;

      /* Initialize the sizes of the CStringArray data members. */

      m_csaParameterName.SetSize( m_xNumberOfParameters );
      m_csaParameterDescription.SetSize( m_xNumberOfParameters );

      /* Initialize the size of the CUIntArray data member. */

      m_cuiaParameterTypeEnum.SetSize( m_xNumberOfParameters );

      /* Initialize the sizes of the CPtrArray data members. */

      m_cpaParameterValue.SetSize( m_xNumberOfParameters );
      m_cpaParameterRange1.SetSize( m_xNumberOfParameters );
      m_cpaParameterRange2.SetSize( m_xNumberOfParameters );

      /************************************************************************/
      /* Read the parameter names, types, and descriptions from the ini file. */
      /************************************************************************/

      CString  csParameterName;
      CString  csParameterType;
      CString  csParameterDescription;

      eParamType  eParameterType;

      CString  csKeyName;

      int      xParameterIndex;

      DWORD    dwGPPSrv;                  // returned by GetPrivateProfileString

      TCHAR    tszProfileString[MAX_PARAM_VALUE_STRING_LENGTH];     // arbitrarily set size

      DWORD    dwErrorCode;

      for ( xParameterIndex = 0; xParameterIndex < xNumberOfParameters; xParameterIndex++ )
      {
         /* Make the key for the parameter name. */

         csKeyName.Format( TEXT("ParameterName%d"), xParameterIndex );

         /* Read the parameter name. */

         dwGPPSrv = GetPrivateProfileString( (LPCTSTR) rcsFunctionName,
                                             (LPCTSTR) csKeyName,
                                             (LPCTSTR) TEXT("NULL"),
                                             (LPTSTR) tszProfileString,
                                             (DWORD) sizeof( tszProfileString ),
                                             (LPCTSTR) TEXT(".\\faxapi.ini") );

         /* Did GetPrivateProfileString return the string "NULL" ? */

         if ( _wcsicmp( tszProfileString, TEXT("NULL") ) != 0 )
         {
            /* Did GetPrivateProfileString read an entry ? */

            if ( dwGPPSrv > (DWORD) 0L )
            {
               csParameterName = (CString) tszProfileString;

               try
               {
                  m_csaParameterName.SetAt( xParameterIndex, csParameterName );
               }

               catch ( ... )
               {
                  dwErrorCode = GetLastError();

                  if ( dwErrorCode == (DWORD) NO_ERROR )
                  {
                     dwErrorCode = (DWORD) ERROR_NOT_ENOUGH_MEMORY;
                  }
               }
            }
         }

         /* Make the key for the parameter type. */

         csKeyName.Format( TEXT("ParameterType%d"), xParameterIndex );

         /* Read the parameter name. */

         dwGPPSrv = GetPrivateProfileString( (LPCTSTR) rcsFunctionName,
                                             (LPCTSTR) csKeyName,
                                             (LPCTSTR) TEXT("NULL"),
                                             (LPTSTR) tszProfileString,
                                             (DWORD) sizeof( tszProfileString ),
                                             (LPCTSTR) TEXT(".\\faxapi.ini") );

         /* Did GetPrivateProfileString return the string "NULL" ? */

         if ( _wcsicmp( tszProfileString, TEXT("NULL") ) != 0 )
         {
            /* Did GetPrivateProfileString read an entry ? */

            if ( dwGPPSrv > (DWORD) 0L )
            {
               csParameterType = (CString) tszProfileString;

               eParameterType = GetParameterTypeEnum( (CString &) csParameterType );

               try
               {
                  m_cuiaParameterTypeEnum.SetAt( xParameterIndex, (UINT) eParameterType );
               }

               catch ( ... )
               {
                  dwErrorCode = GetLastError();

                  if ( dwErrorCode == (DWORD) NO_ERROR )
                  {
                     dwErrorCode = (DWORD) ERROR_NOT_ENOUGH_MEMORY;
                  }
               }

               // Terminate the for loop on error ?

               /* Allocate Storage for the parameter value. */

               m_cpaParameterValue[xParameterIndex] =
                     AllocateStorageForParameterEntity( eParameterType );
            }
         }

         /* Make the key for the parameter description. */

         csKeyName.Format( TEXT("ParameterDescr%d"), xParameterIndex );

         /* Read the parameter name. */

         dwGPPSrv = GetPrivateProfileString( (LPCTSTR) rcsFunctionName,
                                             (LPCTSTR) csKeyName,
                                             (LPCTSTR) TEXT("NULL"),
                                             (LPTSTR) tszProfileString,
                                             (DWORD) sizeof( tszProfileString ),
                                             (LPCTSTR) TEXT(".\\faxapi.ini") );

         /* Did GetPrivateProfileString return the string "NULL" ? */

         if ( _wcsicmp( tszProfileString, TEXT("NULL") ) != 0 )
         {
            /* Did GetPrivateProfileString read an entry ? */

            if ( dwGPPSrv > (DWORD) 0L )
            {
               csParameterDescription = (CString) tszProfileString;

               try
               {
                  m_csaParameterDescription.SetAt( xParameterIndex, csParameterDescription );
               }

               catch ( ... )
               {
                  dwErrorCode = GetLastError();

                  if ( dwErrorCode == (DWORD) NO_ERROR )
                  {
                     dwErrorCode = (DWORD) ERROR_NOT_ENOUGH_MEMORY;
                  }
               }
            }
         }

         // Will need to handle the parameter range(s) later !

      }     // end of for loop
   }
   else
   {
      m_xNumberOfParameters = 0;
   }
}



/*
 *  AllocateStorageForParameterEntity
 *
 *  Purpose: 
 *          This function allocates (via the new operator) storage for either
 *          a parameter value or range entity.
 *
 *  Arguments:
 *          eParameterType - indicates the type of the parameter
 *
 *  Returns:
 *          a pointer to the storage that was allocated.
 *
 */

void * CFaxApiFunctionParameterInfo::AllocateStorageForParameterEntity( eParamType eParameterType )
{
   void *   pvParameterStorage;

   CString  csMessage;

   /* As of 6/11/97, there are 22 types of parameters. */

   switch ( eParameterType )
   {
      case eBOOL:

         /* The parameter type is BOOL. */
   
         pvParameterStorage = (void *) new BOOL;
   
         *((BOOL *) pvParameterStorage) = (BOOL) FALSE;

         break;

      case eDWORD:

         /* The parameter type is DWORD. */
   
         pvParameterStorage = (void *) new DWORD;
   
         *((DWORD *) pvParameterStorage) = (DWORD) 0L;

         break;

      case eHANDLE:

         /* The parameter type is HANDLE. */
   
         pvParameterStorage = (void *) new HANDLE;
   
         *((HANDLE *) pvParameterStorage) = (HANDLE) INVALID_HANDLE_VALUE;

         break;

      case eHDC:

         /* The parameter type is HDC. */
   
         pvParameterStorage = (void *) new HDC;
   
         *((HDC *) pvParameterStorage) = (HDC) INVALID_HANDLE_VALUE;

         break;

      case ePHDC:

         /* The parameter type is HDC *. */
   
         pvParameterStorage = (void *) new HDC *;
   
         *((HDC * *) pvParameterStorage) = (HDC *) NULL;

         break;

      case eLPBYTE:

         /* The parameter type is LPBYTE. */
   
         pvParameterStorage = (void *) new LPBYTE;
   
         *((LPBYTE *) pvParameterStorage) = (LPBYTE) NULL;

         break;

      case ePLPBYTE:

         /* The parameter type is LPBYTE *. */
   
         pvParameterStorage = (void *) new LPBYTE *;
   
         *((LPBYTE * *) pvParameterStorage) = (LPBYTE *) NULL;

         break;

      case eLPDWORD:

         /* The parameter type is LPDWORD. */
   
         pvParameterStorage = (void *) new LPDWORD;
   
         *((LPDWORD *) pvParameterStorage) = (LPDWORD) NULL;

         break;

      case eLPHANDLE:

         /* The parameter type is LPHANDLE. */

         pvParameterStorage = (void *) new LPHANDLE;

         *((LPHANDLE *) pvParameterStorage) = (LPHANDLE) NULL;

         break;

      case eLPSTR:

         /* The parameter type is LPSTR. */
   
         pvParameterStorage = (void *) new char[MAX_PARAM_VALUE_STRING_LENGTH];    // arbitrary size !
   
         /* Intialize it to an empty string. */
   
         *((char *) pvParameterStorage) = (char) '\0';

         break;

      case eLPVOID:

         /* The parameter type is LPVOID. */
   
         pvParameterStorage = (void *) new LPVOID;
   
         *((LPVOID *) pvParameterStorage) = (LPVOID) NULL;

         break;

      case eLPWSTR:

         /* The parameter type is LPWSTR. */
   
         pvParameterStorage = (void *) new wchar_t[MAX_PARAM_VALUE_STRING_LENGTH]; // arbitrary size
   
         /* Initialize it to an empty string. */
   
         *((wchar_t *) pvParameterStorage) = (wchar_t) L'\0';

         break;

      case ePFAX_CONFIGURATIONA:

         /* The parameter type is PFAX_CONFIGURATIONA. */
   
         pvParameterStorage = (void *) new PFAX_CONFIGURATIONA;
   
         *((PFAX_CONFIGURATIONA *) pvParameterStorage) = (PFAX_CONFIGURATIONA) NULL;

         break;

      case ePPFAX_CONFIGURATIONA:

         /* The parameter type is PFAX_CONFIGURATIONA *. */
   
         pvParameterStorage = (void *) new PFAX_CONFIGURATIONA *;
   
         *((PFAX_CONFIGURATIONA * *) pvParameterStorage) = (PFAX_CONFIGURATIONA *) NULL;

         break;

      case ePFAX_CONFIGURATIONW:

         /* The parameter type is PFAX_CONFIGURATIONW. */
   
         pvParameterStorage = (void *) new PFAX_CONFIGURATIONW;
   
         *((PFAX_CONFIGURATIONW *) pvParameterStorage) = (PFAX_CONFIGURATIONW) NULL;

         break;

      case ePPFAX_CONFIGURATIONW:

         /* The parameter type is PFAX_CONFIGURATIONW *. */
   
         pvParameterStorage = (void *) new PFAX_CONFIGURATIONW *;
   
         *((PFAX_CONFIGURATIONW * *) pvParameterStorage) = (PFAX_CONFIGURATIONW *) NULL;

         break;

      case ePFAX_COVERPAGE_INFOA:

         /* The parameter type is PFAX_COVERPAGE_INFOA. */
   
         pvParameterStorage = (void *) new PFAX_COVERPAGE_INFOA;
   
         *((PFAX_COVERPAGE_INFOA *) pvParameterStorage) = (PFAX_COVERPAGE_INFOA) NULL;

         break;

      case ePFAX_COVERPAGE_INFOW:

         /* The parameter type is PFAX_COVERPAGE_INFOW. */
   
         pvParameterStorage = (void *) new PFAX_COVERPAGE_INFOW;
   
         *((PFAX_COVERPAGE_INFOW *) pvParameterStorage) = (PFAX_COVERPAGE_INFOW) NULL;

         break;

      case ePPFAX_DEVICE_STATUSA:

         /* The parameter type is PFAX_DEVICE_STATUSA *. */

         pvParameterStorage = (void *) new PFAX_DEVICE_STATUSA *;

         *((PFAX_DEVICE_STATUSA * *) pvParameterStorage) = (PFAX_DEVICE_STATUSA *) NULL;

         break;

      case ePPFAX_DEVICE_STATUSW:

         /* The parameter type is PFAX_DEVICE_STATUSW *. */

         pvParameterStorage = (void *) new PFAX_DEVICE_STATUSW *;

         *((PFAX_DEVICE_STATUSW * *) pvParameterStorage) = (PFAX_DEVICE_STATUSW *) NULL;

         break;

      case ePFAX_JOB_ENTRYA:

         /* The parameter type is PFAX_JOB_ENTRYA. */

         pvParameterStorage = (void *) new PFAX_JOB_ENTRYA;

         *((PFAX_JOB_ENTRYA *) pvParameterStorage) = (PFAX_JOB_ENTRYA) NULL;

         break;

      case ePPFAX_JOB_ENTRYA:

         /* The parameter type is PFAX_JOB_ENTRYA *. */

         pvParameterStorage = (void *) new PFAX_JOB_ENTRYA *;

         *((PFAX_JOB_ENTRYA * *) pvParameterStorage) = (PFAX_JOB_ENTRYA *) NULL;

         break;

      case ePFAX_JOB_ENTRYW:

         /* The parameter type is PFAX_JOB_ENTRYW. */

         pvParameterStorage = (void *) new PFAX_JOB_ENTRYW;

         *((PFAX_JOB_ENTRYW *) pvParameterStorage) = (PFAX_JOB_ENTRYW) NULL;

         break;

      case ePPFAX_JOB_ENTRYW:

         /* The parameter type is PFAX_JOB_ENTRYW *. */

         pvParameterStorage = (void *) new PFAX_JOB_ENTRYW *;

         *((PFAX_JOB_ENTRYW * *) pvParameterStorage) = (PFAX_JOB_ENTRYW *) NULL;

         break;

      case ePFAX_JOB_PARAMA:

         /* The parameter type is PFAX_JOB_PARAMA. */
   
         pvParameterStorage = (void *) new PFAX_JOB_PARAMA;
   
         *((PFAX_JOB_PARAMA *) pvParameterStorage) = (PFAX_JOB_PARAMA) NULL;

         break;

      case ePFAX_JOB_PARAMW:

         /* The parameter type is PFAX_JOB_PARAMW. */
   
         pvParameterStorage = (void *) new PFAX_JOB_PARAMW;
   
         *((PFAX_JOB_PARAMW *) pvParameterStorage) = (PFAX_JOB_PARAMW) NULL;

         break;

      case ePFAX_LOG_CATEGORY:

         /* The parameter type is PFAX_LOG_CATEGORY. */

         pvParameterStorage = (void *) new PFAX_LOG_CATEGORY;

         *((PFAX_LOG_CATEGORY *) pvParameterStorage) = (PFAX_LOG_CATEGORY) NULL;

         break;

      case ePPFAX_LOG_CATEGORY:

         /* The parameter type is PFAX_LOG_CATEGORY *. */

         pvParameterStorage = (void *) new PFAX_LOG_CATEGORY *;

         *((PFAX_LOG_CATEGORY * *) pvParameterStorage) = (PFAX_LOG_CATEGORY *) NULL;

         break;

      case ePFAX_PORT_INFOA:

         /* The parameter type is PFAX_PORT_INFOA. */

         pvParameterStorage = (void *) new PFAX_PORT_INFOA;

         *((PFAX_PORT_INFOA *) pvParameterStorage) = (PFAX_PORT_INFOA) NULL;

         break;

      case ePPFAX_PORT_INFOA:

         /* The parameter type is PFAX_PORT_INFOA *. */

         pvParameterStorage = (void *) new PFAX_PORT_INFOA *;

         *((PFAX_PORT_INFOA * *) pvParameterStorage) = (PFAX_PORT_INFOA *) NULL;

         break;

      case ePFAX_PORT_INFOW:

         /* The parameter type is PFAX_PORT_INFOW. */

         pvParameterStorage = (void *) new PFAX_PORT_INFOW;

         *((PFAX_PORT_INFOW *) pvParameterStorage) = (PFAX_PORT_INFOW) NULL;

         break;

      case ePPFAX_PORT_INFOW:

         /* The parameter type is PFAX_PORT_INFOW *. */

         pvParameterStorage = (void *) new PFAX_PORT_INFOW *;

         *((PFAX_PORT_INFOW * *) pvParameterStorage) = (PFAX_PORT_INFOW *) NULL;

         break;

      case ePFAX_PRINT_INFOA:

         /* The parameter type is PFAX_PRINT_INFOA. */
   
         pvParameterStorage = (void *) new PFAX_PRINT_INFOA;
   
         *((PFAX_PRINT_INFOA *) pvParameterStorage) = (PFAX_PRINT_INFOA) NULL;

         break;

      case ePFAX_PRINT_INFOW:

         /* The parameter type is PFAX_PRINT_INFOW. */
   
         pvParameterStorage = (void *) new PFAX_PRINT_INFOW;
   
         *((PFAX_PRINT_INFOW *) pvParameterStorage) = (PFAX_PRINT_INFOW) NULL;

         break;

      case ePPFAX_ROUTING_METHODA:

         /* The parameter type is PFAX_ROUTING_METHODA *. */

         pvParameterStorage = (void *) new PFAX_ROUTING_METHODA *;

         *((PFAX_ROUTING_METHODA * *) pvParameterStorage) = (PFAX_ROUTING_METHODA *) NULL;

         break;

      case ePPFAX_ROUTING_METHODW:

         /* The parameter type is PFAX_ROUTING_METHODW *. */

         pvParameterStorage = (void *) new PFAX_ROUTING_METHODW *;

         *((PFAX_ROUTING_METHODW * *) pvParameterStorage) = (PFAX_ROUTING_METHODW *) NULL;

         break;

      default:

         /* The parameter type was not one of the cases above. */

         csMessage.Format( TEXT("Unrecognized type in AllocateStorageForParameterEntity") );

         AfxMessageBox( csMessage );

         pvParameterStorage = (void *) NULL;
   }

   return ( pvParameterStorage );
}



/*
 *  GetNumberOfParameters
 *
 *  Purpose: 
 *          This function retrieves the m_xNumberOfParameters member of the
 *          CFaxApiFunctionParameterInfo object.
 *
 *  Arguments:
 *          None
 *
 *  Returns:
 *          The number of parameters
 *
 */

int CFaxApiFunctionParameterInfo::GetNumberOfParameters()
{
   return ( m_xNumberOfParameters );
}



 /*
  *  GetParameterName
  *
  *  Purpose: 
  *          This function retrieves the Name of a parameter from the
  *          CFaxApiFunctionParameterInfo object.
  *
  *  Arguments:
  *          xParameterIndex - the index to the parameter
  *
  *  Returns:
  *          A CString that contains the parameter name.
  *
  */
 
CString CFaxApiFunctionParameterInfo::GetParameterName( int xParameterIndex )
{
   return ( (CString) m_csaParameterName.GetAt( xParameterIndex ) );
}



/*
 *  GetParameterValuePointer
 *
 *  Purpose: 
 *          This function retrieves the pointer to the storage for the
 *          parameter value.
 *
 *  Arguments:
 *          xParameterIndex = the index into the CPtrArray object to the
 *                            element that points to the parameter value.
 *
 *  Returns:
 *          a pointer to the storage for the parameter value.
 *
 */

void * CFaxApiFunctionParameterInfo::GetParameterValuePointer( int xParameterIndex )
{
   void *   pvParameterValue;

   pvParameterValue = m_cpaParameterValue[xParameterIndex];

   return ( pvParameterValue );
}



/*
 *  FormatParameterValueForOutput
 *
 *  Purpose: 
 *          This function prepares a CString representation of the parameter
 *          value whose index is xParameterIndex.
 *
 *  Arguments:
 *          xParameterIndex = the index to the parameter value to be output.
 *          rcsParameterValue - a reference to the CString to receive the string
 *                              representation of the parameter value.
 *
 *  Returns:
 *          None
 *
 */

void CFaxApiFunctionParameterInfo::FormatParameterValueForOutput( int xParameterIndex, CString & rcsParameterValue )
{
   /* Get the parameter type. */

   eParamType  eParameterType;

   eParameterType = GetParameterTypeEnum( xParameterIndex );

   /* Get a pointer to the storage for the parameter. */

   void *   pvParameterValue;

   pvParameterValue = GetParameterValuePointer( xParameterIndex );

   /* As of 6/11/97, there are 22 types of parameters. */

   switch ( eParameterType )
   {
      case eBOOL:
         {
            /* The parameter type is BOOL. */

            if ( (BOOL) *((BOOL *) pvParameterValue) == (BOOL) FALSE )
            {
               rcsParameterValue = (CString) TEXT("FALSE");
            }
            else
            {
               rcsParameterValue = (CString) TEXT("TRUE");
            }
         }

         break;

      case eDWORD:
         {
            /* The parameter type is DWORD. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (DWORD) *((DWORD *) pvParameterValue) );
         }

         break;

      case eHANDLE:
         {
            /* The parameter type is HANDLE. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (HANDLE) *((HANDLE *) pvParameterValue) );
         }

         break;

      case eHDC:
         {
            /* The parameter type is HDC. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (HDC) *((HDC *) pvParameterValue) );
         }

         break;

      case ePHDC:
         {
            /* The parameter type is HDC *. */
      
            rcsParameterValue.Format( TEXT("0x%x"), (HDC *) *((HDC * *) pvParameterValue) );
         }

         break;

      case eLPBYTE:
         {
            /* The parameter type is LPBYTE. */
      
            rcsParameterValue.Format( TEXT("0x%x"), (LPBYTE) *((LPBYTE) pvParameterValue) );
         }

         break;

      case ePLPBYTE:
         {
            /* The parameter type is LPBYTE *. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (LPBYTE *)
                                      *((LPBYTE * *) pvParameterValue) );
         }

         break;

      case eLPDWORD:
         {
            /* The parameter type is LPDWORD. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (LPDWORD)
                                      *((LPDWORD *) pvParameterValue) );
         }

         break;

      case eLPHANDLE:
         {
            /* The parameter type is LPHANDLE. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (LPHANDLE)
                                      *((LPHANDLE *) pvParameterValue) );
         }

         break;

      case eLPSTR:
         {
            /* The parameter type is LPSTR. */
      
            LPSTR pszParameterValue;
      
            pszParameterValue = (LPSTR) pvParameterValue;
      
            /* Convert the ANSI string to UNICODE. */
      
            size_t   t_AnsiStringLength;
      
            t_AnsiStringLength = strlen( pszParameterValue );
      
            LPWSTR   pwszParameterValue;
      
            pwszParameterValue = new wchar_t[t_AnsiStringLength+1];  // reserve space for the terminator
      
            if ( pwszParameterValue != (LPWSTR) NULL )
            {
               int   xNumberOfCharsConverted;
      
               xNumberOfCharsConverted = mbstowcs( pwszParameterValue,
                                                   pszParameterValue,
                                                   t_AnsiStringLength );
         
               /* Terminate the wide character string. */
      
               pwszParameterValue[xNumberOfCharsConverted] = (wchar_t) L'\0';
      
               rcsParameterValue.Format( TEXT("%s"), (LPTSTR) pwszParameterValue );
      
               delete pwszParameterValue;
            }
         }

         break;

      case eLPVOID:
         {
            /* The parameter type is LPVOID. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (LPVOID) *((LPVOID *) pvParameterValue) );
         }

         break;

      case eLPWSTR:
         {
            /* The parameter type is LPWSTR. */
      
            rcsParameterValue.Format( TEXT("%s"),
                                      (LPTSTR) (LPWSTR) pvParameterValue );
         }

         break;

      case ePFAX_CONFIGURATIONA:
         {
            /* The parameter type is PFAX_CONFIGURATIONA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_CONFIGURATIONA)
                                      *((PFAX_CONFIGURATIONA *) pvParameterValue) );
         }

         break;

      case ePPFAX_CONFIGURATIONA:
         {
            /* The parameter type is PFAX_CONFIGURATIONA *. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_CONFIGURATIONA *)
                                      *((PFAX_CONFIGURATIONA * *) pvParameterValue) );
         }

         break;

      case ePFAX_CONFIGURATIONW:
         {
            /* The parameter type is PFAX_CONFIGURATIONW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_CONFIGURATIONW) 
                                      *((PFAX_CONFIGURATIONW *) pvParameterValue) );
         }

         break;

      case ePPFAX_CONFIGURATIONW:
         {
            /* The parameter type is PFAX_CONFIGURATIONW *. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_CONFIGURATIONW *)
                                      *((PFAX_CONFIGURATIONW * *) pvParameterValue) );
         }

         break;

      case ePFAX_COVERPAGE_INFOA:
         {
            /* The parameter type is PFAX_COVERPAGE_INFOA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_COVERPAGE_INFOA)
                                      *((PFAX_COVERPAGE_INFOA *) pvParameterValue) );
         }

         break;

      case ePFAX_COVERPAGE_INFOW:
         {
            /* The parameter type is PFAX_COVERPAGE_INFOW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_COVERPAGE_INFOW)
                                      *((PFAX_COVERPAGE_INFOW *) pvParameterValue) );
         }

         break;

      case ePPFAX_DEVICE_STATUSA:
         {
            /* The parameter type is PFAX_DEVICE_STATUSA *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_DEVICE_STATUSA *)
                                      *((PFAX_DEVICE_STATUSA * *) pvParameterValue) );
         }

         break;

      case ePPFAX_DEVICE_STATUSW:
         {
            /* The parameter type is PFAX_DEVICE_STATUSW *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_DEVICE_STATUSW *)
                                      *((PFAX_DEVICE_STATUSW * *) pvParameterValue) );
         }

         break;

      case ePFAX_JOB_ENTRYA:
         {
            /* The parameter type is PFAX_JOB_ENTRYA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_ENTRYA)
                                      *((PFAX_JOB_ENTRYA *) pvParameterValue) );
         }

         break;

      case ePPFAX_JOB_ENTRYA:
         {
            /* The parameter type is PFAX_JOB_ENTRYA *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_ENTRYA *)
                                      *((PFAX_JOB_ENTRYA * *) pvParameterValue) );
         }

         break;

      case ePFAX_JOB_ENTRYW:
         {
            /* The parameter type is PFAX_JOB_ENTRYW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_ENTRYW)
                                      *((PFAX_JOB_ENTRYW *) pvParameterValue) );
         }

         break;

      case ePPFAX_JOB_ENTRYW:
         {
            /* The parameter type is PFAX_JOB_ENTRYW *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_ENTRYW *)
                                      *((PFAX_JOB_ENTRYW * *) pvParameterValue) );
         }

         break;

      case ePFAX_JOB_PARAMA:
         {
            /* The parameter type is PFAX_JOB_PARAMA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_PARAMA)
                                      *((PFAX_JOB_PARAMA *) pvParameterValue) );
         }

         break;

      case ePFAX_JOB_PARAMW:
         {
            /* The parameter type is PFAX_JOB_PARAMW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_JOB_PARAMW)
                                      *((PFAX_JOB_PARAMW *) pvParameterValue) );
         }

         break;

      case ePFAX_LOG_CATEGORY:
         {
            /* The parameter type is PFAX_LOG_CATEGORY. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_LOG_CATEGORY)
                                      *((PFAX_LOG_CATEGORY *) pvParameterValue) );
         }

         break;

      case ePPFAX_LOG_CATEGORY:
         {
            /* The parameter type is PFAX_LOG_CATEGORY *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_LOG_CATEGORY *)
                                      *((PFAX_LOG_CATEGORY * *) pvParameterValue) );
         }

         break;

      case ePFAX_PORT_INFOA:
         {
            /* The parameter type is PFAX_PORT_INFOA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PORT_INFOA)
                                      *((PFAX_PORT_INFOA *) pvParameterValue) );
         }

         break;

      case ePPFAX_PORT_INFOA:
         {
            /* The parameter type is PFAX_PORT_INFOA *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PORT_INFOA *)
                                      *((PFAX_PORT_INFOA * *) pvParameterValue) );
         }

         break;

      case ePFAX_PORT_INFOW:
         {
            /* The parameter type is PFAX_PORT_INFOW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PORT_INFOW)
                                      *((PFAX_PORT_INFOW *) pvParameterValue) );
         }

         break;

      case ePPFAX_PORT_INFOW:
         {
            /* The parameter type is PFAX_PORT_INFOW *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PORT_INFOW *)
                                      *((PFAX_PORT_INFOW * *) pvParameterValue) );
         }

         break;

      case ePFAX_PRINT_INFOA:
         {
            /* The parameter type is PFAX_PRINT_INFOA. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PRINT_INFOA)
                                      *((PFAX_PRINT_INFOA *) pvParameterValue) );
         }

         break;

      case ePFAX_PRINT_INFOW:
         {
            /* The parameter type is PFAX_PRINT_INFOW. */
      
            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_PRINT_INFOW)
                                      *((PFAX_PRINT_INFOW *) pvParameterValue) );
         }

         break;

      case ePPFAX_ROUTING_METHODA:
         {
            /* The parameter type is PFAX_ROUTING_METHODA *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_ROUTING_METHODA *)
                                      *((PFAX_ROUTING_METHODA * *) pvParameterValue) );
         }

         break;

      case ePPFAX_ROUTING_METHODW:
         {
            /* The parameter type is PFAX_ROUTING_METHODW *. */

            rcsParameterValue.Format( TEXT("0x%x"),
                                      (PFAX_ROUTING_METHODW *)
                                      *((PFAX_ROUTING_METHODW * *) pvParameterValue) );
         }

         break;

      default:
         {
            /* The parameter type was not one of the cases above. */
         
            CString  csMessage;
         
            csMessage.Format( TEXT("Unrecognized type in FormatParameterValueForOutput") );
         
            AfxMessageBox( csMessage );
         
            rcsParameterValue.Empty();
         }
   }
}



/*
 *  GetParameterTypeString
 *
 *  Purpose: 
 *          This function retrieves the parameter type for the parameter whose
 *          index is xParameterIndex.
 *
 *  Arguments:
 *          xParameterIndex = the index into the CPtrArray to the pointer
 *                            to the CFaxApiFunctionParameterInfo object.
 *
 *  Returns:
 *          A CString that contains the parameter type.
 *
 */

CString CFaxApiFunctionParameterInfo::GetParameterTypeString( int xParameterIndex )
{
   CString  csParameterType;

   eParamType  eParameterType;

   eParameterType = (eParamType) m_cuiaParameterTypeEnum.GetAt( xParameterIndex );

   switch ( eParameterType )
   {
      case eBOOL:

         /* The parameter type is BOOL. */
   
         csParameterType = (CString) TEXT("BOOL");
   
         break;

      case eDWORD:

         /* The parameter type is DWORD. */
   
         csParameterType = (CString) TEXT("DWORD");
   
         break;

      case eHANDLE:

         /* The parameter type is HANDLE. */
   
         csParameterType = (CString) TEXT("HANDLE");
   
         break;

      case eHDC:

         /* The parameter type is HDC. */
   
         csParameterType = (CString) TEXT("HDC");
   
         break;

      case ePHDC:

         /* The parameter type is HDC *. */
   
         csParameterType = (CString) TEXT("HDC *");
   
         break;

      case eLPBYTE:

         /* The parameter type is LPBYTE. */
   
         csParameterType = (CString) TEXT("LPBYTE");
   
         break;

      case ePLPBYTE:

         /* The parameter type is LPBYTE *. */
   
         csParameterType = (CString) TEXT("LPBYTE *");
   
         break;

      case eLPDWORD:

         /* The parameter type is LPDWORD. */
   
         csParameterType = (CString) TEXT("LPDWORD");
   
         break;

      case eLPHANDLE:

         /* The parameter type is LPHANDLE. */

         csParameterType = (CString) TEXT("LPHANDLE");

         break;

      case eLPSTR:

         /* The parameter type is LPSTR. */
   
         csParameterType = (CString) TEXT("LPSTR");
   
         break;

      case eLPVOID:

         /* The parameter type is LPVOID. */
   
         csParameterType = (CString) TEXT("LPVOID");
   
         break;

      case eLPWSTR:

         /* The parameter type is LPWSTR. */
   
         csParameterType = (CString) TEXT("LPWSTR");
   
         break;

      case ePFAX_CONFIGURATIONA:

         /* The parameter type is PFAX_CONFIGURATIONA. */
   
         csParameterType = (CString) TEXT("PFAX_CONFIGURATIONA");
   
         break;

      case ePPFAX_CONFIGURATIONA:

         /* The parameter type is PFAX_CONFIGURATIONA *. */
   
         csParameterType = (CString) TEXT("PFAX_CONFIGURATIONA *");
   
         break;

      case ePFAX_CONFIGURATIONW:

         /* The parameter type is PFAX_CONFIGURATIONW. */
   
         csParameterType = (CString) TEXT("PFAX_CONFIGURATIONW");
   
         break;

      case ePPFAX_CONFIGURATIONW:

         /* The parameter type is PFAX_CONFIGURATIONW *. */
   
         csParameterType = (CString) TEXT("PFAX_CONFIGURATIONW *");
   
         break;

      case ePFAX_COVERPAGE_INFOA:

         /* The parameter type is PFAX_COVERPAGE_INFOA. */
   
         csParameterType = (CString) TEXT("PFAX_COVERPAGE_INFOA");
   
         break;

      case ePFAX_COVERPAGE_INFOW:

         /* The parameter type is PFAX_COVERPAGE_INFOW. */
   
         csParameterType = (CString) TEXT("PFAX_COVERPAGE_INFOW");
   
         break;

      case ePPFAX_DEVICE_STATUSA:

         /* The parameter type is PFAX_DEVICE_STATUSA *. */
   
         csParameterType = (CString) TEXT("PFAX_DEVICE_STATUSA *");
   
         break;

      case ePPFAX_DEVICE_STATUSW:

         /* The parameter type is PFAX_DEVICE_STATUSW *. */
   
         csParameterType = (CString) TEXT("PFAX_DEVICE_STATUSW *");
   
         break;

      case ePFAX_JOB_ENTRYA:

         /* The parameter type is PFAX_JOB_ENTRYA. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_ENTRYA");
   
         break;

      case ePPFAX_JOB_ENTRYA:

         /* The parameter type is PFAX_JOB_ENTRYA *. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_ENTRYA *");
   
         break;

      case ePFAX_JOB_ENTRYW:

         /* The parameter type is PFAX_JOB_ENTRYW. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_ENTRYW");
   
         break;

      case ePPFAX_JOB_ENTRYW:

         /* The parameter type is PFAX_JOB_ENTRYW *. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_ENTRYW *");
   
         break;

      case ePFAX_JOB_PARAMA:

         /* The parameter type is PFAX_JOB_PARAMA. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_PARAMA");
   
         break;

      case ePFAX_JOB_PARAMW:

         /* The parameter type is PFAX_JOB_PARAMW. */
   
         csParameterType = (CString) TEXT("PFAX_JOB_PARAMW");
   
         break;

      case ePFAX_PORT_INFOA:

         /* The parameter type is PFAX_PORT_INFOA. */
   
         csParameterType = (CString) TEXT("PFAX_PORT_INFOA");
   
         break;

      case ePPFAX_PORT_INFOA:

         /* The parameter type is PFAX_PORT_INFOA *. */
   
         csParameterType = (CString) TEXT("PFAX_PORT_INFOA *");
   
         break;

      case ePFAX_PORT_INFOW:

         /* The parameter type is PFAX_PORT_INFOW. */
   
         csParameterType = (CString) TEXT("PFAX_PORT_INFOW");
   
         break;

      case ePPFAX_PORT_INFOW:

         /* The parameter type is PFAX_PORT_INFOW *. */
   
         csParameterType = (CString) TEXT("PFAX_PORT_INFOW *");
   
         break;

      case ePFAX_PRINT_INFOA:

         /* The parameter type is PFAX_PRINT_INFOA. */
   
         csParameterType = (CString) TEXT("PFAX_PRINT_INFOA");
   
         break;

      case ePFAX_PRINT_INFOW:

         /* The parameter type is PFAX_PRINT_INFOW. */
   
         csParameterType = (CString) TEXT("PFAX_PRINT_INFOW");
   
         break;

      case ePPFAX_ROUTING_METHODA:

         /* The parameter type is PFAX_ROUTING_METHODA *. */
   
         csParameterType = (CString) TEXT("PFAX_ROUTING_METHODA *");
   
         break;

      case ePPFAX_ROUTING_METHODW:

         /* The parameter type is PFAX_ROUTING_METHODW *. */
   
         csParameterType = (CString) TEXT("PFAX_ROUTING_METHODW *");
   
         break;

      default:

         csParameterType.Empty();

         break;
   }

   return ( csParameterType );
}



/*
 *  GetParameterTypeEnum
 *
 *  Purpose: 
 *          This function returns the eParamType value thet represents the
 *          data type of the parameter whose index is xParameterIndex.
 *
 *  Arguments:
 *          xParameterIndex = the index into the CPtrArray to the pointer
 *                            to the CFaxApiFunctionParameterInfo object.
 *
 *  Returns:
 *          The eParamType value that represents the data type of the parameter.
 *
 *  Note:
 *          GetParameterTypeEnum is overloaded to accept either a integer or
 *          a reference to a CString as a parameter.
 *
 */

eParamType CFaxApiFunctionParameterInfo::GetParameterTypeEnum( int xParameterIndex )
{
   return ( (eParamType) m_cuiaParameterTypeEnum.GetAt( xParameterIndex ) );
}



/*
 *  GetParameterTypeEnum
 *
 *  Purpose: 
 *          This function returns the eParamType value that represents the
 *          data type specified in rcsParameterType.
 *
 *  Arguments:
 *          rcsParameterType - a reference to a CString that contains the data
 *                             type of the parameter.
 *
 *  Returns:
 *          The eParamType value that represents the data type of the parameter.
 *
 *  Note:
 *          GetParameterTypeEnum is overloaded to accept either a integer or
 *          a reference to a CString as a parameter.
 *
 *          As much as I hate to use a "goto" statement in a structured language
 *          in this case I feel it is justified in order to avoid executing the
 *          comparisons that will fail.
 *
 */

eParamType CFaxApiFunctionParameterInfo::GetParameterTypeEnum( const CString & rcsParameterType )
{
   eParamType  eReturnValue;

   /* As of 6/11/97, there are 22 types of parameters. */

   /* Note: a "switch" statement cannot be used here because rcsParameterType */
   /*       is not an integral type and is an illegal switch expression.      */

   if ( rcsParameterType.Compare( TEXT("BOOL") ) == 0 )
   {
      /* Note: "BOOL" is typedefed, in windef.h, as type int. It is not the */
      /*       the same as the native data type "bool".                     */

      eReturnValue = eBOOL;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("DWORD") ) == 0 )
   {
      eReturnValue = eDWORD;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("HANDLE") ) == 0 )
   {
      eReturnValue = eHANDLE;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("HDC") ) == 0 )
   {
      eReturnValue = eHDC;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("HDC *") ) == 0 )
   {
      eReturnValue = ePHDC;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPBYTE") ) == 0 )
   {
      eReturnValue = eLPBYTE;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPBYTE *") ) == 0 )
   {
      eReturnValue = ePLPBYTE;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPDWORD") ) == 0 )
   {
      eReturnValue = eLPDWORD;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPHANDLE") ) == 0 )
   {
      eReturnValue = eLPHANDLE;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPSTR") ) == 0 )
   {
      eReturnValue = eLPSTR;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPVOID") ) == 0 )
   {
      eReturnValue = eLPVOID;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("LPWSTR") ) == 0 )
   {
      eReturnValue = eLPWSTR;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_CONFIGURATIONA") ) == 0 )
   {
      eReturnValue = ePFAX_CONFIGURATIONA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_CONFIGURATIONA *") ) == 0 )
   {
      eReturnValue = ePPFAX_CONFIGURATIONA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_CONFIGURATIONW") ) == 0 )
   {
      eReturnValue = ePFAX_CONFIGURATIONW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_CONFIGURATIONW *") ) == 0 )
   {
      eReturnValue = ePPFAX_CONFIGURATIONW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_COVERPAGE_INFOA") ) == 0 )
   {
      eReturnValue = ePFAX_COVERPAGE_INFOA;

      goto ExitGetParameterTypeEnum;
   }
   
   if ( rcsParameterType.Compare( TEXT("PFAX_COVERPAGE_INFOW") ) == 0 )
   {
      eReturnValue = ePFAX_COVERPAGE_INFOW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_DEVICE_STATUSA *") ) == 0 )
   {
      eReturnValue = ePPFAX_DEVICE_STATUSA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_DEVICE_STATUSW *") ) == 0 )
   {
      eReturnValue = ePPFAX_DEVICE_STATUSW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_ENTRYA") ) == 0 )
   {
      eReturnValue = ePFAX_JOB_ENTRYA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_ENTRYA *") ) == 0 )
   {
      eReturnValue = ePPFAX_JOB_ENTRYA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_ENTRYW") ) == 0 )
   {
      eReturnValue = ePFAX_JOB_ENTRYW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_ENTRYW *") ) == 0 )
   {
      eReturnValue = ePPFAX_JOB_ENTRYW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_PARAMA") ) == 0 )
   {
      eReturnValue = ePFAX_JOB_PARAMA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_JOB_PARAMW") ) == 0 )
   {
      eReturnValue = ePFAX_JOB_PARAMW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_LOG_CATEGORY") ) == 0 )
   {
      eReturnValue = ePFAX_LOG_CATEGORY;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_LOG_CATEGORY *") ) == 0 )
   {
      eReturnValue = ePPFAX_LOG_CATEGORY;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PORT_INFOA") ) == 0 )
   {
      eReturnValue = ePFAX_PORT_INFOA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PORT_INFOA *") ) == 0 )
   {
      eReturnValue = ePPFAX_PORT_INFOA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PORT_INFOW") ) == 0 )
   {
      eReturnValue = ePFAX_PORT_INFOW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PORT_INFOW *") ) == 0 )
   {
      eReturnValue = ePPFAX_PORT_INFOW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PRINT_INFOA") ) == 0 )
   {
      eReturnValue = ePFAX_PRINT_INFOA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_PRINT_INFOW") ) == 0 )
   {
      eReturnValue = ePFAX_PRINT_INFOW;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_ROUTING_METHODA *") ) == 0 )
   {
      eReturnValue = ePPFAX_ROUTING_METHODA;

      goto ExitGetParameterTypeEnum;
   }

   if ( rcsParameterType.Compare( TEXT("PFAX_ROUTING_METHODW *") ) == 0 )
   {
      eReturnValue = ePPFAX_ROUTING_METHODW;

      goto ExitGetParameterTypeEnum;
   }
   else
   {
      eReturnValue = eUnknownParamType;    // the parameter type wasn't
                                          // in the list above !
   }

ExitGetParameterTypeEnum:

   return ( eReturnValue );
}



/*
 *  GetParameterDescription
 *
 *  Purpose: 
 *          This function retrieves the description for a parameter to a
 *          Fax API function.
 *
 *  Arguments:
 *          xParameterIndex = the index into the CPtrArray to the pointer
 *                            to the CFaxApiFunctionParameterInfo object.
 *
 *  Returns:
 *          A CString that contains the description of the parameter.
 *
 */

CString CFaxApiFunctionParameterInfo::GetParameterDescription( int xParameterIndex )
{
   return ( m_csaParameterDescription.GetAt( xParameterIndex ) );
}



/*
 *  StoreParameterValue
 *
 *  Purpose: 
 *          This function stores the value contained in a CSting in the storage
 *          location for the parameter value indexed by xParameterIndex.
 *
 *  Arguments:
 *          xParameterIndex - the index to the pointer to the storage for a
 *                            parameer value.
 *          rcsParameterValue - a reference to a CString that contains a
 *                              representation of the value to be stored.
 *
 *  Returns:
 *          TRUE - indicates success
 *          FALSE - indicates failure
 *
 */

BOOL CFaxApiFunctionParameterInfo::StoreParameterValue( int xParameterIndex, CString & rcsParameterValue )
{
   BOOL  fReturnValue = (BOOL) TRUE;

   CString  csParameterValue;

   /* Get the parameter type. */

   eParamType  eParameterType;

   eParameterType = GetParameterTypeEnum( xParameterIndex );

   if ( (eParameterType != eLPSTR) && (eParameterType != eLPWSTR) )
   {
      /* rcsParameterValue may begin with "0x", "0X", "x" or "X". */
      /* The first two will be scanned properly, but the second   */
      /* two will not. The following code segment eliminates the  */
      /* second two prefixes if they exist.                       */

      csParameterValue = PreProcessParameterValueString( (const CString &) rcsParameterValue );
   }
   else
   {
      csParameterValue = rcsParameterValue;
   }

   /* Get a pointer to the string representation of the parameter value. */

   LPTSTR   ptszParameterValue;

   ptszParameterValue = (LPTSTR) csParameterValue.GetBuffer( MAX_PARAM_VALUE_STRING_LENGTH );      // arbitrary size

   /* Get a pointer to the storage for the parameter. */

   void *   pvParameterValue;

   pvParameterValue = GetParameterValuePointer( xParameterIndex );

   /* As of 6/11/97, there are 22 types of parameters. */

   switch ( eParameterType )
   {
      case eBOOL:
         {
            /* The parameter type is BOOL. */

            BOOL     fParameterValue = (BOOL) FALSE;  // set default value

            if ( csParameterValue.CompareNoCase( TEXT("FALSE") ) == 0 )
            {
               *((BOOL *) pvParameterValue) = (BOOL) FALSE;
            }
            else
            {
               if ( csParameterValue.CompareNoCase( TEXT("TRUE") ) == 0 )
               {
                  *((BOOL *) pvParameterValue) = (BOOL) TRUE;
               }
               else
               {
                  swscanf( (const wchar_t *) ptszParameterValue,
                           (const wchar_t *) TEXT("%x"),
                           &fParameterValue );

                  *((BOOL *) pvParameterValue) = fParameterValue;
               }
            }
         }

         break;

      case eDWORD:
         {
            /* The parameter type is DWORD. */

            DWORD    dwParameterValue = (DWORD) 0L;   // set default value

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &dwParameterValue );

            *((DWORD *) pvParameterValue) = (DWORD) dwParameterValue;
         }

         break;

      case eHANDLE:
         {
            /* The parameter type is HANDLE. */

            HANDLE      hParameterValue = (HANDLE) INVALID_HANDLE_VALUE;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &hParameterValue );

            *((HANDLE *) pvParameterValue) = hParameterValue;
         }

         break;

      case eHDC:
         {
            /* The parameter type is HDC. */

            HDC      hdcParameterValue = (HDC) INVALID_HANDLE_VALUE;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &hdcParameterValue );

            *((HDC *) pvParameterValue) = hdcParameterValue;
         }

         break;

      case ePHDC:
         {
            /* The parameter type is HDC *. */

            HDC *    phdcParameterValue = (HDC *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &phdcParameterValue );

            *((HDC * *) pvParameterValue) = phdcParameterValue;
         }

         break;

      case eLPBYTE:
         {
            /* The parameter type is LPBYTE. */

            LPBYTE      pbParameterValue = (LPBYTE) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pbParameterValue );

            *((LPBYTE *) pvParameterValue) = pbParameterValue;
         }

         break;

      case ePLPBYTE:
         {
            /* The parameter type is LPBYTE *. */

            LPBYTE *    ppbParameterValue = (LPBYTE *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppbParameterValue );

            *((LPBYTE * *) pvParameterValue) = ppbParameterValue;
         }

         break;

      case eLPDWORD:
         {
            /* The parameter type is LPDWORD. */

            LPDWORD     pdwParameterValue = (LPDWORD) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pdwParameterValue );

            *((LPDWORD *) pvParameterValue) = pdwParameterValue;
         }

         break;

      case eLPHANDLE:
         {
            /* The parameter type is LPHANDLE. */

            LPHANDLE    phParameterValue = (LPHANDLE) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &phParameterValue );

            *((LPHANDLE *) pvParameterValue) = phParameterValue;
         }

         break;

      case eLPSTR:
         {
            /* The parameter type is LPSTR. */

            /* Convert ptszParameterValue to ANSI !! */

            size_t   t_WideStringLength;

            t_WideStringLength = wcslen( ptszParameterValue );

            LPSTR pszAnsiString;

            pszAnsiString = new char[t_WideStringLength+1];    // reserve a character for the NULL

            LPSTR *  ppszParameterValue;

            ppszParameterValue = (LPSTR *) pvParameterValue;

            if ( pszAnsiString != (LPSTR) NULL )
            {
               int   xNumberOfCharsConverted;

               xNumberOfCharsConverted = wcstombs( pszAnsiString, ptszParameterValue, t_WideStringLength );

               /* Terminate the Ansi string. */

               pszAnsiString[xNumberOfCharsConverted] = (char) '\0';

               strcpy( (char *) ppszParameterValue, (const char *) pszAnsiString );

               delete [] pszAnsiString;
            }
            else
            {
               **ppszParameterValue = (char) '\0';
            }
         }

         break;

      case eLPVOID:
         {
            /* The parameter type is LPVOID. */

            LPVOID      pvDataValue = (LPVOID) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pvDataValue );

            *((LPVOID *) pvParameterValue) = pvDataValue;
         }

         break;

      case eLPWSTR:
         {
            /* The parameter type is LPWSTR. */

            LPWSTR *    ppwszParameterValue;

            ppwszParameterValue = (LPWSTR *) pvParameterValue;

            wcscpy( (wchar_t *) ppwszParameterValue, (const wchar_t *) ptszParameterValue );
         }

         break;

      case ePFAX_CONFIGURATIONA:
         {
            /* The parameter type is PFAX_CONFIGURATIONA. */

            PFAX_CONFIGURATIONA     pfcaParameterValue = (PFAX_CONFIGURATIONA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcaParameterValue );

            *((PFAX_CONFIGURATIONA *) pvParameterValue) = pfcaParameterValue;
         }

         break;

      case ePPFAX_CONFIGURATIONA:
         {
            /* The parameter type is PFAX_CONFIGURATIONA *. */

            PFAX_CONFIGURATIONA *   ppfcaParameterValue = (PFAX_CONFIGURATIONA *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcaParameterValue );

            *((PFAX_CONFIGURATIONA * *) pvParameterValue) = ppfcaParameterValue;
         }

         break;

      case ePFAX_CONFIGURATIONW:
         {
            /* The parameter type is PFAX_CONFIGURATIONW. */

            PFAX_CONFIGURATIONW     pfcwParameterValue = (PFAX_CONFIGURATIONW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_CONFIGURATIONW *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_CONFIGURATIONW:
         {
            /* The parameter type is PFAX_CONFIGURATIONW *. */

            PFAX_CONFIGURATIONW *   ppfcwParameterValue = (PFAX_CONFIGURATIONW *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_CONFIGURATIONW * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_COVERPAGE_INFOA:
         {
            /* The parameter type is PFAX_COVERPAGE_INFOA. */

            PFAX_COVERPAGE_INFOA    pfciaParameterValue = (PFAX_COVERPAGE_INFOA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfciaParameterValue );

            *((PFAX_COVERPAGE_INFOA *) pvParameterValue) = pfciaParameterValue;
         }

         break;

      case ePFAX_COVERPAGE_INFOW:
         {
            /* The parameter type is PFAX_COVERPAGE_INFOW. */

            PFAX_COVERPAGE_INFOW    pfciwParameterValue = (PFAX_COVERPAGE_INFOW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfciwParameterValue );

            *((PFAX_COVERPAGE_INFOW *) pvParameterValue) = pfciwParameterValue;
         }

         break;

      case ePPFAX_DEVICE_STATUSA:
         {
            /* The parameter type is PFAX_DEVICE_STATUSA *. */

            PFAX_DEVICE_STATUSA *   ppfcwParameterValue = (PFAX_DEVICE_STATUSA *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_DEVICE_STATUSA * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePPFAX_DEVICE_STATUSW:
         {
            /* The parameter type is PFAX_DEVICE_STATUSW *. */

            PFAX_DEVICE_STATUSW *   ppfcwParameterValue = (PFAX_DEVICE_STATUSW *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_DEVICE_STATUSW * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_JOB_ENTRYA:
         {
            /* The parameter type is PFAX_JOB_ENTRYA. */

            PFAX_JOB_ENTRYA     pfcwParameterValue = (PFAX_JOB_ENTRYA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_JOB_ENTRYA *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_JOB_ENTRYA:
         {
            /* The parameter type is PFAX_JOB_ENTRYA *. */

            PFAX_JOB_ENTRYA *   ppfcwParameterValue = (PFAX_JOB_ENTRYA *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_JOB_ENTRYA * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_JOB_ENTRYW:
         {
            /* The parameter type is PFAX_JOB_ENTRYW. */

            PFAX_JOB_ENTRYW     pfcwParameterValue = (PFAX_JOB_ENTRYW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_JOB_ENTRYW *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_JOB_ENTRYW:
         {
            /* The parameter type is PFAX_JOB_ENTRYW *. */

            PFAX_JOB_ENTRYW *   ppfcwParameterValue = (PFAX_JOB_ENTRYW *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_JOB_ENTRYW * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_JOB_PARAMA:
         {
            /* The parameter type is PFAX_JOB_PARAMA. */

            PFAX_JOB_PARAMA   pfjpaParameterValue = (PFAX_JOB_PARAMA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfjpaParameterValue );

            *((PFAX_JOB_PARAMA *) pvParameterValue) = pfjpaParameterValue;
         }

         break;

      case ePFAX_JOB_PARAMW:
         {
            /* The parameter type is PFAX_JOB_PARAMW. */

            PFAX_JOB_PARAMW   pfjpwParameterValue = (PFAX_JOB_PARAMW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfjpwParameterValue );

            *((PFAX_JOB_PARAMW *) pvParameterValue) = pfjpwParameterValue;
         }

         break;

      case ePFAX_LOG_CATEGORY:
         {
            /* The parameter type is PFAX_LOG_CATEGORY. */

            PFAX_LOG_CATEGORY     pfcwParameterValue = (PFAX_LOG_CATEGORY) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_LOG_CATEGORY *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_LOG_CATEGORY:
         {
            /* The parameter type is PFAX_LOG_CATEGORY *. */

            PFAX_LOG_CATEGORY *   ppfcwParameterValue = (PFAX_LOG_CATEGORY *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_LOG_CATEGORY * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_PORT_INFOA:
         {
            /* The parameter type is PFAX_PORT_INFOA. */

            PFAX_PORT_INFOA     pfcwParameterValue = (PFAX_PORT_INFOA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_PORT_INFOA *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_PORT_INFOA:
         {
            /* The parameter type is PFAX_PORT_INFOA *. */

            PFAX_PORT_INFOA *   ppfcwParameterValue = (PFAX_PORT_INFOA *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_PORT_INFOA * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_PORT_INFOW:
         {
            /* The parameter type is PFAX_PORT_INFOW. */

            PFAX_PORT_INFOW     pfcwParameterValue = (PFAX_PORT_INFOW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfcwParameterValue );

            *((PFAX_PORT_INFOW *) pvParameterValue) = pfcwParameterValue;
         }

         break;

      case ePPFAX_PORT_INFOW:
         {
            /* The parameter type is PFAX_PORT_INFOW *. */

            PFAX_PORT_INFOW *   ppfcwParameterValue = (PFAX_PORT_INFOW *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_PORT_INFOW * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePFAX_PRINT_INFOA:
         {
            /* The parameter type is PFAX_PRINT_INFOA. */

            PFAX_PRINT_INFOA     pfpiaParameterValue = (PFAX_PRINT_INFOA) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfpiaParameterValue );

            *((PFAX_PRINT_INFOA *) pvParameterValue) = pfpiaParameterValue;
         }

         break;

      case ePFAX_PRINT_INFOW:
         {
            /* The parameter type is PFAX_PRINT_INFOW. */

            PFAX_PRINT_INFOW     pfpiwParameterValue = (PFAX_PRINT_INFOW) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &pfpiwParameterValue );

            *((PFAX_PRINT_INFOW *) pvParameterValue) = pfpiwParameterValue;
         }

         break;

      case ePPFAX_ROUTING_METHODA:
         {
            /* The parameter type is PFAX_ROUTING_METHODA *. */

            PFAX_ROUTING_METHODA *   ppfcwParameterValue = (PFAX_ROUTING_METHODA *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_ROUTING_METHODA * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      case ePPFAX_ROUTING_METHODW:
         {
            /* The parameter type is PFAX_ROUTING_METHODW *. */

            PFAX_ROUTING_METHODW *   ppfcwParameterValue = (PFAX_ROUTING_METHODW *) NULL;

            swscanf( (const wchar_t *) ptszParameterValue, (const wchar_t *) TEXT("%x"), &ppfcwParameterValue );

            *((PFAX_ROUTING_METHODW * *) pvParameterValue) = ppfcwParameterValue;
         }

         break;

      default:
         {
            /* The parameter type was not recognized by the "if" statements above. */

            CString  csMessage;

            csMessage.Format( TEXT("Unrecognized type in StoreParameterValue.") );

            AfxMessageBox( csMessage );

            fReturnValue = (BOOL) FALSE;
         }

         break;
   }

   csParameterValue.ReleaseBuffer();

   return ( fReturnValue );
}



/*
 *  PreProcessParameterValueString
 *
 *  Purpose: 
 *          This function prepares a CString object to be scanned as a
 *          hexadecimal number by removing the characters "x" ot "X" if
 *          they appear as a prefix.
 *
 *  Arguments:
 *          rcsParameterValue - a reference to a CString that contains the
 *                              parameter value.
 *
 *  Returns:
 *          a CString that has been formatted to be properly scanned as a
 *          hexadecimal value.
 *
 */

CString CFaxApiFunctionParameterInfo::PreProcessParameterValueString( const CString & rcsParameterValue )
{
   CString  csParameterValue;

   if ( rcsParameterValue.FindOneOf( TEXT("xX") ) == 0 )
   {
      int   xStringLength;

      xStringLength = rcsParameterValue.GetLength();

      /* Remove the "x" ot "X" prefix. */

      csParameterValue = rcsParameterValue.Right( xStringLength - 1 );
   }
   else
   {
      csParameterValue = rcsParameterValue;
   }

   return ( csParameterValue );
}