/*===========================================================================
FILE: 
   GobiConnectionMgmtExports.cpp

DESCRIPTION:
   QUALCOMM Gobi 3000 Connection Management API exports

Copyright (c) 2011, Code Aurora Forum. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of Code Aurora Forum nor
      the names of its contributors may be used to endorse or promote
      products derived from this software without specific prior written
      permission.


THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
==========================================================================*/

//---------------------------------------------------------------------------
// Include Files
//---------------------------------------------------------------------------
#include "GobiConnectionMgmt.h"
#include "GobiConnectionMgmtAPI.h"

//---------------------------------------------------------------------------
// Definitions
//---------------------------------------------------------------------------

// Maximum length for adapter device path
const ULONG MAX_AI_DEVICE_PATH = 256;

// Maximum length for adapter key
const ULONG MAX_AI_KEY = 16;

//---------------------------------------------------------------------------
// Pragmas (pack structs)
//---------------------------------------------------------------------------
#pragma pack( push, 1 )

/*=========================================================================*/
// Struct sAdapterInfo
//    Struct to represent Gobi adapter info
/*=========================================================================*/  
struct sAdapterInfo
{
   public:
      CHAR mPath[MAX_AI_DEVICE_PATH];
      CHAR mKey[MAX_AI_KEY];
};

//---------------------------------------------------------------------------
// Pragmas
//---------------------------------------------------------------------------
#pragma pack( pop )

/*=========================================================================*/
// Exported Methods
/*=========================================================================*/

/* Returns the type of the connected device */
GobiType GetDeviceType()
{
   cGobiConnectionMgmt *pAPI = gConnectionDLL.GetAPI();
   if (!pAPI)
      return GOBITYPE_UNKNOWN;
   return pAPI->GetDeviceType();
}

/*===========================================================================
METHOD:
   QCWWANEnumerateDevices

DESCRIPTION:
   This function enumerates the Gobi devices currently attached to the
   system

PARAMETERS:
   pDevicesSize   [I/O] - Upon input the maximum number of elements that the 
                          device array can contain.  Upon successful output 
                          the actual number of elements in the device array
   pDevices       [ O ] - The device array 

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QCWWANEnumerateDevices( 
   BYTE *                     pDevicesSize, 
   BYTE *                     pDevices )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   // Validate arguments
   if (pDevicesSize == 0 || pDevices == 0) 
   {
      return (ULONG)eGOBI_ERR_INVALID_ARG;
   }

   // Assume failure
   BYTE maxInstances = *pDevicesSize;
   *pDevicesSize = 0;

   // Obtain adapter info
   std::vector <cGobiConnectionMgmt::tDeviceID> adapters;
   adapters = pAPI->GetAvailableDevices();

   ULONG sz = (ULONG)adapters.size();
   if (sz > (ULONG)maxInstances)
   {
      sz = (ULONG)maxInstances;
   }

   sAdapterInfo * pOutput = (sAdapterInfo *)pDevices;
   for (ULONG a = 0; a < sz; a++)
   {
      const cGobiConnectionMgmt::tDeviceID & id = adapters[a];

      memset( &pOutput->mPath[0], 0, (SIZE_T)MAX_AI_DEVICE_PATH );
      memset( &pOutput->mKey[0], 0, (SIZE_T)MAX_AI_KEY );

      ULONG len = id.first.size();
      if (len > 0)
      {
         if (len >= MAX_AI_DEVICE_PATH)
         {
            len = MAX_AI_DEVICE_PATH - 1;
         }

         memcpy( (LPVOID)&pOutput->mPath[0], 
                 (LPVOID)id.first.c_str(), 
                 (SIZE_T)len );
      }

      len = id.second.size();
      if (len > 0)
      {
         if (len >= MAX_AI_KEY)
         {
            len = MAX_AI_KEY - 1;
         }

         memcpy( (LPVOID)&pOutput->mKey[0], 
                 (LPCVOID)id.second.c_str(), 
                 (SIZE_T)len );
      }

      pOutput++;
   }

   *pDevicesSize = (BYTE)sz;
   return eGOBI_ERR_NONE;
}

/*===========================================================================
METHOD:
   QCWWANConnect

DESCRIPTION:
   This function connects the CM API library to the specified Gobi 
   device

   Both device node and key are case sensitive

PARAMETERS:
   pDeviceNode   [ I ] - The device node
   pDeviceKey    [ I ] - The device key (unique, stored on-device)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QCWWANConnect(
   CHAR *                     pDeviceNode,
   CHAR *                     pDeviceKey )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   // Validate arguments
   if (pDeviceNode == 0 && pDeviceKey != 0)
   {
      // If you specify a device key then you have to specify a device ID
      return (ULONG)eGOBI_ERR_INVALID_ARG;
   }

   bool bConnect = pAPI->Connect( (LPCSTR)pDeviceNode, 
                                  (LPCSTR)pDeviceKey );
   if (bConnect == false)
   {
      return (ULONG)pAPI->GetCorrectedLastError();
   }

   return (ULONG)eGOBI_ERR_NONE;
}

/*===========================================================================
METHOD:
   QCWWANCancel

DESCRIPTION:
   This function cancels the most recent outstanding request
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QCWWANCancel()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->CancelSend();
}

/*===========================================================================
METHOD:
   QCWWANDisconnect

DESCRIPTION:
   This function disconnects the CM API library from the currently 
   connected Gobi device

PARAMETERS:
   pState      [ O ] - State of the current packet session
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QCWWANDisconnect()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   bool bDisco = pAPI->Disconnect();
   if (bDisco == false)
   {
      return (ULONG)pAPI->GetCorrectedLastError();
   }

   return (ULONG)eGOBI_ERR_NONE;
}

/*===========================================================================
METHOD:
   QCWWANGetConnectedDeviceID

DESCRIPTION:
   This function returns the Node/key of the device the Gobi CM API library 
   is currently connected to

PARAMETERS:
   deviceNodeSize [ I ] - The maximum number of characters (including NULL 
                          terminator) that the device Node array can contain
   pDeviceNode    [ O ] - Device Node (NULL terminated string)
   deviceKeySize  [ I ] - The maximum number of characters (including NULL 
                          terminator) that the device key array can contain
   pDeviceKey     [ O ] - Device key (NULL terminated string)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QCWWANGetConnectedDeviceID( 
   ULONG                      deviceNodeSize, 
   CHAR *                     pDeviceNode,
   ULONG                      deviceKeySize, 
   CHAR *                     pDeviceKey )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   // Validate arguments
   if ( (deviceNodeSize == 0) 
   ||   (pDeviceNode == 0) 
   ||   (deviceKeySize == 0)
   ||   (pDeviceKey == 0) )
   {
      return (ULONG)eGOBI_ERR_INVALID_ARG;
   }

   *pDeviceNode = 0;
   *pDeviceKey = 0;

   std::string devNode = "";
   std::string devKey = "";   
   bool bOK = pAPI->GetConnectedDeviceID( devNode, devKey );
   if (bOK == false)
   {
      return (ULONG)pAPI->GetCorrectedLastError();
   }

   ULONG lenNode = (ULONG)devNode.size();

   // Space to perform the copy?
   if (deviceNodeSize < lenNode + 1)
   {
      return eGOBI_ERR_BUFFER_SZ;
   }

   memcpy( (LPVOID)pDeviceNode, (LPVOID)devNode.c_str(), lenNode );
   
   // Enforce null termination
   pDeviceNode[lenNode] = 0;

   ULONG lenKey = (ULONG)devKey.size();

   // Space to perform the copy?
   if (deviceKeySize < lenKey + 1)
   {
      return eGOBI_ERR_BUFFER_SZ;
   }

   memcpy( (LPVOID)pDeviceKey, (LPVOID)devKey.c_str(), lenKey );
   
   // Enforce null termination
   devKey[lenKey] = 0;

   return eGOBI_ERR_NONE;
}

/*===========================================================================
METHOD:
   GetSessionState

DESCRIPTION:
   This function returns the state of the current packet data session

PARAMETERS:
   pState      [ O ] - State of the current packet session
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSessionState( ULONG * pState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSessionState( pState );
}

/*===========================================================================
METHOD:
   GetSessionDuration

DESCRIPTION:
   This function returns the duration of the current packet data session

PARAMETERS:
   pDuration   [ O ] - Duration of the current packet session
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSessionDuration( ULONGLONG * pDuration )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }
   
   return (ULONG)pAPI->GetSessionDuration( pDuration );
}

/*===========================================================================
METHOD:
   GetDormancyState

DESCRIPTION:
   This function returns the dormancy state of the current packet 
   data session (when connected)

PARAMETERS:
   pState      [ O ] - Dormancy state of the current packet session
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetDormancyState( ULONG * pState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetDormancyState( pState );
}

/*===========================================================================
METHOD:
   GetAutoconnect (Deprecated)

DESCRIPTION:
   This function returns the current autoconnect data session setting

PARAMETERS:
   pSetting    [ O ] - NDIS autoconnect setting
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetAutoconnect( ULONG * pSetting )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   ULONG dummy;
   return (ULONG)pAPI->GetEnhancedAutoconnect( pSetting, &dummy );
}

/*===========================================================================
METHOD:
   SetAutoconnect (Deprecated)

DESCRIPTION:
   This function sets the autoconnect data session setting

PARAMETERS:
   setting    [ I ] - NDIS autoconnect disabled (0) or enabled (non-zero)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetAutoconnect( ULONG setting )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetEnhancedAutoconnect( setting, 0 );
}

/*===========================================================================
METHOD:
   GetEnhancedAutoconnect

DESCRIPTION:
   This function returns the current autoconnect data session setting

PARAMETERS:
   pSetting       [ O ] - NDIS autoconnect setting
   pRoamSetting   [ O ] - NDIS autoconnect roam setting 
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetEnhancedAutoconnect( 
   ULONG *                    pSetting,
   ULONG *                    pRoamSetting )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetEnhancedAutoconnect( pSetting, pRoamSetting );
}

/*===========================================================================
METHOD:
   SetEnhancedAutoconnect

DESCRIPTION:
   This function sets the autoconnect data session setting

PARAMETERS:
   setting        [ I ] - NDIS autoconnect setting
   pRoamSetting   [ I ] - (Optional) NDIS autoconnect roam setting 

 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetEnhancedAutoconnect( 
   ULONG                      setting,
   ULONG *                    pRoamSetting )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetEnhancedAutoconnect( setting, pRoamSetting );
}


/*===========================================================================
METHOD:
   SetDefaultProfile

DESCRIPTION:
   This function writes the default profile settings to the device, the 
   default profile is used during autoconnect

PARAMETERS:
   profileType       [ I ] - Profile type being written
   pPDPType          [ I ] - (Optional) PDP type
   pIPAddress        [ I ] - (Optional) Preferred assigned IPv4 address
   pPrimaryDNS       [ I ] - (Optional) Primary DNS IPv4 address 
   pSecondaryDNS     [ I ] - (Optional) Secondary DNS IPv4 address 
   pAuthentication   [ I ] - (Optional) Authentication algorithm bitmap
   pName             [ I ] - (Optional) The profile name or description 
   pAPNName          [ I ] - (Optional) Access point name 
   pUsername         [ I ] - (Optional) Username used during authentication
   pPassword         [ I ] - (Optional) Password used during authentication

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetDefaultProfile( 
   ULONG                      profileType,
   ULONG *                    pPDPType, 
   ULONG *                    pIPAddress, 
   ULONG *                    pPrimaryDNS, 
   ULONG *                    pSecondaryDNS, 
   ULONG *                    pAuthentication, 
   CHAR *                     pName, 
   CHAR *                     pAPNName, 
   CHAR *                     pUsername,
   CHAR *                     pPassword )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetDefaultProfile( profileType, 
                                             pPDPType, 
                                             pIPAddress,
                                             pPrimaryDNS,
                                             pSecondaryDNS, 
                                             pAuthentication, 
                                             pName,
                                             pAPNName,
                                             pUsername,
                                             pPassword );
}

/*===========================================================================
METHOD:
   GetDefaultProfile

DESCRIPTION:
   This function reads the default profile settings from the device, the 
   default profile is used during autoconnect

PARAMETERS:
   profileType       [ I ] - Profile type being read
   pPDPType          [ O ] - PDP type
   pIPAddress        [ O ] - Preferred assigned IPv4 address
   pPrimaryDNS       [ O ] - Primary DNS IPv4 address 
   pSecondaryDNS     [ O ] - Secondary DNS IPv4 address 
   pAuthentication   [ O ] - Authentication algorithm bitmap
   nameSize          [ I ] - The maximum number of characters (including 
                             NULL terminator) that the profile name array 
                             can contain
   pName             [ O ] - The profile name or description 
   apnSize           [ I ] - The maximum number of characters (including 
                             NULL terminator) that the APN name array 
                             can contain
   pAPNName          [ O ] - Access point name represented as a NULL 
                             terminated string (empty string returned when 
                             unknown)
   userSize          [ I ] - The maximum number of characters (including 
                             NULL terminator) that the username array 
                             can contain
   pUsername         [ O ] - Username used during authentication

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetDefaultProfile( 
   ULONG                      profileType,
   ULONG *                    pPDPType, 
   ULONG *                    pIPAddress, 
   ULONG *                    pPrimaryDNS, 
   ULONG *                    pSecondaryDNS, 
   ULONG *                    pAuthentication, 
   BYTE                       nameSize,
   CHAR *                     pName, 
   BYTE                       apnSize,
   CHAR *                     pAPNName, 
   BYTE                       userSize,
   CHAR *                     pUsername )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetDefaultProfile( profileType, 
                                             pPDPType, 
                                             pIPAddress,
                                             pPrimaryDNS,
                                             pSecondaryDNS, 
                                             pAuthentication, 
                                             nameSize,
                                             pName,
                                             apnSize,
                                             pAPNName,
                                             userSize,
                                             pUsername );
}

/*===========================================================================
METHOD:
   StartDataSession

DESCRIPTION:
   This function activates a packet data session

PARAMETERS:
   pTechnology       [ I ] - (Optional) Technology bitmap
   pPrimaryDNS       [ I ] - (Optional) Primary DNS IPv4 address 
   pSecondaryDNS     [ I ] - (Optional) Secondary DNS IPv4 address 
   pPrimaryNBNS      [ I ] - (Optional) Primary NetBIOS NS IPv4 address
   pSecondaryNBNS    [ I ] - (Optional) Secondary NetBIOS NS IPv4 address
   pAPNName          [ I ] - (Optional) Access point name 
   pIPAddress        [ I ] - (Optional) Preferred assigned IPv4 address
   pAuthentication   [ I ] - (Optional) Authentication algorithm bitmap
   pUsername         [ I ] - (Optional) Username used during authentication
   pPassword         [ I ] - (Optional) Password used during authentication
   pSessionId        [ O ] - The assigned session ID
   pFailureReason    [ O ] - Upon call failure the failure reason provided

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG StartDataSession( 
   ULONG *                    pTechnology, 
   ULONG *                    pPrimaryDNS, 
   ULONG *                    pSecondaryDNS, 
   ULONG *                    pPrimaryNBNS, 
   ULONG *                    pSecondaryNBNS, 
   CHAR *                     pAPNName, 
   ULONG *                    pIPAddress, 
   ULONG *                    pAuthentication, 
   CHAR *                     pUsername, 
   CHAR *                     pPassword,
   ULONG *                    pSessionId,
   ULONG *                    pFailureReason )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->StartDataSession( pTechnology, 
                                            pPrimaryDNS, 
                                            pSecondaryDNS, 
                                            pPrimaryNBNS, 
                                            pSecondaryNBNS, 
                                            pAPNName, 
                                            pIPAddress, 
                                            pAuthentication, 
                                            pUsername, 
                                            pPassword,
                                            pSessionId,
                                            pFailureReason );
}

/*===========================================================================
METHOD:
   CancelDataSession

DESCRIPTION:
   This function cancels an in-progress packet data session activation

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG CancelDataSession()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->CancelDataSession();
}

/*===========================================================================
METHOD:
   StopDataSession

DESCRIPTION:
   This function stops the current data session

PARAMETERS:
   sessionId   [ I ] - The ID of the session to terminate
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG StopDataSession( ULONG sessionId )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->StopDataSession( sessionId );
}

/*===========================================================================
METHOD:
   GetIPAddress

DESCRIPTION:
   This function returns the current packet data session IP address

PARAMETERS:
   pIPAddress        [ O ] - Assigned IPv4 address
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetIPAddress( ULONG * pIPAddress )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->GetIPAddress( pIPAddress );
}

/*===========================================================================
METHOD:
   GetConnectionRate

DESCRIPTION:
   This function returns connection rate information for the packet data 
   connection

PARAMETERS:
   pCurrentChannelTXRate   [ O ] - Current channel TX rate (bps)
   pCurrentChannelRXRate   [ O ] - Current channel RX rate (bps)
   pMaxChannelTXRate       [ O ] - Maximum channel TX rate (bps)
   pMaxChannelRXRate       [ O ] - Maximum channel RX rate (bps)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetConnectionRate(
   ULONG *                    pCurrentChannelTXRate,
   ULONG *                    pCurrentChannelRXRate,
   ULONG *                    pMaxChannelTXRate,
   ULONG *                    pMaxChannelRXRate )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetConnectionRate( pCurrentChannelTXRate,
                                             pCurrentChannelRXRate,
                                             pMaxChannelTXRate,
                                             pMaxChannelRXRate );
}

/*===========================================================================
METHOD:
   GetPacketStatus

DESCRIPTION:
   This function returns the packet data transfer statistics since the start 
   of the current packet data session

PARAMETERS:
   pTXPacketSuccesses   [ O ] - Packets transmitted without error
   pRXPacketSuccesses   [ O ] - Packets received without error
   pTXPacketErrors      [ O ] - Outgoing packets with framing errors
   pRXPacketErrors      [ O ] - Incoming packets with framing errors
   pTXPacketOverflows   [ O ] - Packets dropped because TX buffer overflowed 
   pRXPacketOverflows   [ O ] - Packets dropped because RX buffer overflowed
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPacketStatus(  
   ULONG *                    pTXPacketSuccesses, 
   ULONG *                    pRXPacketSuccesses, 
   ULONG *                    pTXPacketErrors, 
   ULONG *                    pRXPacketErrors, 
   ULONG *                    pTXPacketOverflows, 
   ULONG *                    pRXPacketOverflows )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPacketStatus( pTXPacketSuccesses,
                                           pRXPacketSuccesses,
                                           pTXPacketErrors,
                                           pRXPacketErrors,
                                           pTXPacketOverflows,
                                           pRXPacketOverflows );
}

/*===========================================================================
METHOD:
   GetByteTotals

DESCRIPTION:
   This function returns the RX/TX byte counts since the start of the 
   current packet data session

PARAMETERS:
   pTXTotalBytes  [ O ] - Bytes transmitted without error
   pRXTotalBytes  [ O ] - Bytes received without error
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetByteTotals(   
   ULONGLONG *                pTXTotalBytes, 
   ULONGLONG *                pRXTotalBytes )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetByteTotals( pTXTotalBytes, pRXTotalBytes );
}

/*===========================================================================
METHOD:
   SetMobileIP

DESCRIPTION:
   This function sets the current mobile IP setting

PARAMETERS:
   mode        [ I ] - Desired mobile IP setting
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetMobileIP( ULONG mode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetMobileIP( mode );
}

/*===========================================================================
METHOD:
   GetMobileIP

DESCRIPTION:
   This function gets the current mobile IP setting

PARAMETERS:
   pMode       [ O ] - Current mobile IP setting
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetMobileIP( ULONG * pMode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetMobileIP( pMode );
}

/*===========================================================================
METHOD:
   SetActiveMobileIPProfile

DESCRIPTION:
   This function sets the active mobile IP profile index

PARAMETERS:
   pSPC        [ I ] - Six digit service programming code
   index       [ I ] - Desired mobile IP profile index
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetActiveMobileIPProfile( 
   CHAR *                     pSPC,
   BYTE                       index )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetActiveMobileIPProfile( pSPC, index );
}

/*===========================================================================
METHOD:
   GetActiveMobileIPProfile

DESCRIPTION:
   This function gets the the active mobile IP profile index

PARAMETERS:
   pIndex      [ O ] - Active mobile IP profile index
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetActiveMobileIPProfile( BYTE * pIndex )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetActiveMobileIPProfile( pIndex );
}

/*===========================================================================
METHOD:
   SetMobileIPProfile

DESCRIPTION:
   This function sets the specified mobile IP profile settings

PARAMETERS:
   pSPC           [ I ] - Six digit service programming code
   index          [ I ] - Mobile IP profile ID
   pEnabled       [ I ] - (Optional) Enable MIP profile?
   pAddress       [ I ] - (Optional) Home IPv4 address
   pPrimaryHA     [ I ] - (Optional) Primary home agent IPv4 address
   pSecondaryHA   [ I ] - (Optional) Secondary home agent IPv4 address
   bRevTunneling  [ I ] - (Optional) Enable reverse tunneling?
   pNAI           [ I ] - (Optional) Network access identifier string
   pHASPI         [ I ] - (Optional) HA security parameter index
   pAAASPI        [ I ] - (Optional) AAA security parameter index
   pMNHA          [ I ] - (Optional) MN-HA string
   pMNAAA         [ I ] - (Optional) MN-AAA string

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetMobileIPProfile( 
   CHAR *                     pSPC,
   BYTE                       index,
   BYTE *                     pEnabled,
   ULONG *                    pAddress,
   ULONG *                    pPrimaryHA,
   ULONG *                    pSecondaryHA,
   BYTE *                     pRevTunneling,
   CHAR *                     pNAI,
   ULONG *                    pHASPI,
   ULONG *                    pAAASPI,
   CHAR *                     pMNHA,
   CHAR *                     pMNAAA )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetMobileIPProfile( pSPC,
                                              index,
                                              pEnabled,
                                              pAddress,
                                              pPrimaryHA,
                                              pSecondaryHA,
                                              pRevTunneling,
                                              pNAI,
                                              pHASPI,
                                              pAAASPI,
                                              pMNHA,
                                              pMNAAA );
}

/*===========================================================================
METHOD:
   GetMobileIPProfile

DESCRIPTION:
   This function gets the specified mobile IP profile settings

PARAMETERS:
   index          [ I ] - Mobile IP profile ID
   pEnabled       [ O ] - Mobile IP profile enabled?
   pAddress       [ O ] - Home IPv4 address
   pPrimaryHA     [ O ] - Primary home agent IPv4 address
   pSecondaryHA   [ O ] - Secondary home agent IPv4 address
   pRevTunneling  [ O ] - Reverse tunneling enabled?
   naiSize        [ I ] - The maximum number of characters (including NULL 
                          terminator) that the NAI array can contain
   pNAI           [ O ] - Network access identifier string
   pHASPI         [ O ] - HA security parameter index
   pAAASPI        [ O ] - AAA security parameter index
   pHAState       [ O ] - HA key state
   pAAAState      [ O ] - AAA key state

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetMobileIPProfile( 
   BYTE                       index,
   BYTE *                     pEnabled,
   ULONG *                    pAddress,
   ULONG *                    pPrimaryHA,
   ULONG *                    pSecondaryHA,
   BYTE *                     pRevTunneling,
   BYTE                       naiSize,
   CHAR *                     pNAI,
   ULONG *                    pHASPI,
   ULONG *                    pAAASPI,
   ULONG *                    pHAState,
   ULONG *                    pAAAState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetMobileIPProfile( index,
                                              pEnabled,
                                              pAddress,
                                              pPrimaryHA,
                                              pSecondaryHA,
                                              pRevTunneling,
                                              naiSize,
                                              pNAI,
                                              pHASPI,
                                              pAAASPI,
                                              pHAState,
                                              pAAAState );
}

/*===========================================================================
METHOD:
   SetMobileIPParameters

DESCRIPTION:
   This function sets the specified mobile IP parameters

PARAMETERS:
   pSPC              [ I ] - Six digit service programming code
   pMode             [ I ] - (Optional) Desired mobile IP setting
   pRetryLimit       [ I ] - (Optional) Retry attempt limit
   pRetryInterval    [ I ] - (Optional) Retry attempt interval
   pReRegPeriod      [ I ] - (Optional) Re-registration period
   pReRegTraffic     [ I ] - (Optional) Re-registration only with traffic?
   pHAAuthenticator  [ I ] - (Optional) MH-HA authenticator calculator?
   pHA2002bis        [ I ] - (Optional) MH-HA RFC 2002bis authentication?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetMobileIPParameters( 
   CHAR *                     pSPC,
   ULONG *                    pMode,
   BYTE *                     pRetryLimit,
   BYTE *                     pRetryInterval,
   BYTE *                     pReRegPeriod,
   BYTE *                     pReRegTraffic,
   BYTE *                     pHAAuthenticator,
   BYTE *                     pHA2002bis )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetMobileIPParameters( pSPC,
                                                 pMode,
                                                 pRetryLimit,
                                                 pRetryInterval,
                                                 pReRegPeriod,
                                                 pReRegTraffic,
                                                 pHAAuthenticator,
                                                 pHA2002bis );
}

/*===========================================================================
METHOD:
   GetMobileIPParameters

DESCRIPTION:
   This function gets the mobile IP parameters

PARAMETERS:
   pMode             [ O ] - Current mobile IP setting
   pRetryLimit       [ O ] - Retry attempt limit
   pRetryInterval    [ O ] - Retry attempt interval
   pReRegPeriod      [ O ] - Re-registration period
   pReRegTraffic     [ O ] - Re-registration only with traffic?
   pHAAuthenticator  [ O ] - MH-HA authenticator calculator?
   pHA2002bis        [ O ] - MH-HA RFC 2002bis authentication?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetMobileIPParameters( 
   ULONG *                    pMode,
   BYTE *                     pRetryLimit,
   BYTE *                     pRetryInterval,
   BYTE *                     pReRegPeriod,
   BYTE *                     pReRegTraffic,
   BYTE *                     pHAAuthenticator,
   BYTE *                     pHA2002bis )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetMobileIPParameters( pMode,
                                                 pRetryLimit,
                                                 pRetryInterval,
                                                 pReRegPeriod,
                                                 pReRegTraffic,
                                                 pHAAuthenticator,
                                                 pHA2002bis );
}

/*===========================================================================
METHOD:
   GetLastMobileIPError

DESCRIPTION:
   This function gets the last mobile IP error

PARAMETERS:
   pError      [ O ] - Last mobile IP error

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetLastMobileIPError( ULONG * pError )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetLastMobileIPError( pError );
}

/*===========================================================================
METHOD:
   SetDNSSettings

DESCRIPTION:
   This function sets the DNS settings for the device

PARAMETERS:
   pPrimaryDNS       [ I ] - (Optional) Primary DNS IPv4 address 
   pSecondaryDNS     [ I ] - (Optional) Secondary DNS IPv4 address 

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetDNSSettings( 
   ULONG *                    pPrimaryDNS, 
   ULONG *                    pSecondaryDNS )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetDNSSettings( pPrimaryDNS, pSecondaryDNS );
}

/*===========================================================================
METHOD:
   GetDNSSettings

DESCRIPTION:
   This function gets the DNS settings for the device

PARAMETERS:
   pPrimaryDNS       [ O ] - Primary DNS IPv4 address 
   pSecondaryDNS     [ O ] - Secondary DNS IPv4 address 

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetDNSSettings( 
   ULONG *                    pPrimaryDNS, 
   ULONG *                    pSecondaryDNS )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetDNSSettings( pPrimaryDNS, pSecondaryDNS );
}

/*===========================================================================
METHOD:
   GetANAAAAuthenticationStatus

DESCRIPTION:
   This function gets the AN-AAA authentication status

PARAMETERS:
   pStatus     [ O ] - AN-AAA authentication status

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetANAAAAuthenticationStatus( ULONG * pStatus )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetANAAAAuthenticationStatus( pStatus );
}

/*===========================================================================
METHOD:
   GetSignalStrengths

DESCRIPTION:
   This function gets the current available signal strengths (in dBm) 
   as measured by the device

PARAMETERS:
   pArraySizes       [I/O] - Upon input the maximum number of elements 
                             that each array can contain can contain.  
                             Upon successful output the actual number 
                             of elements in each array
   pSignalStrengths  [ O ] - Received signal strength array (dBm)
   pRadioInterfaces  [ O ] - Radio interface technology array 

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSignalStrengths( 
   ULONG *                    pArraySizes, 
   INT8 *                     pSignalStrengths, 
   ULONG *                    pRadioInterfaces )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSignalStrengths( pArraySizes, 
                                              pSignalStrengths, 
                                              pRadioInterfaces );
}

/*===========================================================================
METHOD:
   GetRFInfo

DESCRIPTION:
   This function gets the current RF information

PARAMETERS:
   pInstanceSize  [I/O] - Upon input the maximum number of elements that the 
                          RF info instance array can contain.  Upon success
                          the actual number of elements in the RF info 
                          instance array
   pInstances     [ O ] - The RF info instance array 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetRFInfo( 
   BYTE *                     pInstanceSize, 
   BYTE *                     pInstances )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetRFInfo( pInstanceSize, pInstances ); 
}



/*===========================================================================
METHOD:
   PerformNetworkScan

DESCRIPTION:
   This function performs a scan for available networks

PARAMETERS:
   pInstanceSize  [I/O] - Upon input the maximum number of elements that the 
                          network info instance array can contain.  Upon 
                          success the actual number of elements in the
                          network info instance array
   pInstances     [ O ] - The network info instance array 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG PerformNetworkScan( 
   BYTE *                     pInstanceSize, 
   BYTE *                     pInstances )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->PerformNetworkScan( pInstanceSize, pInstances ); 
}

/*===========================================================================
METHOD:
   PerformNetworkRATScan

DESCRIPTION:
   This function performs a scan for available networks (includes RAT)

PARAMETERS:
   pInstanceSize  [I/O] - Upon input the maximum number of elements that the 
                          network info instance array can contain.  Upon 
                          success the actual number of elements in the
                          network info instance array
   pInstances     [ O ] - The network info instance array 
   pRATSize       [I/O] - Upon input the maximum number of elements that the 
                          RAT info instance array can contain.  Upon success 
                          the actual number of elements in the RAT info 
                          instance array
   pRATInstances  [ O ] - The RAT info instance array
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG PerformNetworkRATScan( 
   BYTE *                     pInstanceSize, 
   BYTE *                     pInstances,
   BYTE *                     pRATSize, 
   BYTE *                     pRATInstances )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->PerformNetworkRATScan( pInstanceSize, 
                                              pInstances,
                                              pRATSize,
                                              pRATInstances ); 
}

/*===========================================================================
METHOD:
   InitiateNetworkRegistration

DESCRIPTION:
   This function initiates a network registration

PARAMETERS:
   regType     [ I ] - Registration type 
   mcc         [ I ] - Mobile country code (ignored for auto registration)
   mnc         [ I ] - Mobile network code (ignored for auto registration)
   rat         [ I ] - Radio access type (ignored for auto registration)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG InitiateNetworkRegistration( 
   ULONG                      regType,
   WORD                       mcc, 
   WORD                       mnc, 
   ULONG                      rat )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->InitiateNetworkRegistration( regType, 
                                                       mcc, 
                                                       mnc, 
                                                       rat ); 
}

/*===========================================================================
METHOD:
   InitiateDomainAttach

DESCRIPTION:
   This function initiates a domain attach (or detach)

PARAMETERS:
   action      [ I ] - PS attach action (attach or detach)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG InitiateDomainAttach( ULONG action )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->InitiateDomainAttach( action ); 
}

/*===========================================================================
METHOD:
   GetServingNetwork

DESCRIPTION:
   Gets information regarding the system that currently provides service 
   to the device

PARAMETERS:
   pRegistrationState   [ O ] - Registration state
   pCSDomain            [ O ] - Circuit switch domain status
   pPSDomain            [ O ] - Packet switch domain status 
   pRAN                 [ O ] - Radio access network 
   pRadioIfacesSize     [I/O] - Upon input the maximum number of elements 
                                that the radio interfaces can contain.  Upon 
                                successful output the actual number of elements 
                                in the radio interface array
   pRadioIfaces         [ O ] - The radio interface array 
   pRoaming             [ O ] - Roaming indicator (0xFFFFFFFF - Unknown)
   pMCC                 [ O ] - Mobile country code (0xFFFF - Unknown)
   pMNC                 [ O ] - Mobile network code (0xFFFF - Unknown)
   nameSize             [ I ] - The maximum number of characters (including 
                                NULL terminator) that the network name array 
                                can contain
   pName                [ O ] - The network name or description represented 
                                as a NULL terminated string (empty string 
                                returned when unknown)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetServingNetwork( 
   ULONG *                    pRegistrationState, 
   ULONG *                    pCSDomain, 
   ULONG *                    pPSDomain, 
   ULONG *                    pRAN, 
   BYTE *                     pRadioIfacesSize, 
   BYTE *                     pRadioIfaces, 
   ULONG *                    pRoaming, 
   WORD *                     pMCC, 
   WORD *                     pMNC, 
   BYTE                       nameSize, 
   CHAR *                     pName )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetServingNetwork( pRegistrationState,
                                             pCSDomain, 
                                             pPSDomain, 
                                             pRAN, 
                                             pRadioIfacesSize, 
                                             pRadioIfaces, 
                                             pRoaming, 
                                             pMCC, 
                                             pMNC, 
                                             nameSize, 
                                             pName );
}

/*===========================================================================
METHOD:
   GetServingNetworkCapabilities

DESCRIPTION:
   Gets information regarding the data capabilities of the system that 
   currently provides service to the device

PARAMETERS:
   pDataCapsSize  [I/O] - Upon input the maximum number of elements that the 
                          data capabilities array can contain.  Upon success
                          the actual number of elements in the data 
                          capabilities array
   pDataCaps      [ O ] - The data capabilities array 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetServingNetworkCapabilities( 
   BYTE *                     pDataCapsSize, 
   BYTE *                     pDataCaps )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetServingNetworkCapabilities( pDataCapsSize,
                                                         pDataCaps ); 
}

/*===========================================================================
METHOD:
   GetDataBearerTechnology

DESCRIPTION:
   This function retrieves the current data bearer technology (only
   valid when connected)

PARAMETERS:
   pDataCaps      [ O ] - The data bearer technology
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetDataBearerTechnology( ULONG * pDataBearer )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetDataBearerTechnology( pDataBearer );
}

/*===========================================================================
METHOD:
   GetHomeNetwork

DESCRIPTION:
   This function retrieves information about the home network of the device

PARAMETERS:
   pMCC        [ O ] - Mobile country code
   pMNC        [ O ] - Mobile network code
   nameSize    [ I ] - The maximum number of characters (including NULL 
                       terminator) that the network name array can contain
   pName       [ O ] - The network name or description represented as a NULL 
                       terminated string (empty string returned when unknown)
   pSID        [ O ] - Home network system ID (0xFFFF - Unknown)
   pNID        [ O ] - Home network ID (0xFFFF - Unknown)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetHomeNetwork( 
   WORD *                     pMCC, 
   WORD *                     pMNC, 
   BYTE                       nameSize, 
   CHAR *                     pName, 
   WORD *                     pSID, 
   WORD *                     pNID )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetHomeNetwork( pMCC,
                                          pMNC,
                                          nameSize,
                                          pName,
                                          pSID,
                                          pNID );
}

/*===========================================================================
METHOD:
   SetNetworkPreference

DESCRIPTION:
   This function sets the network registration preference

PARAMETERS:
   technologyPref [ I ] - Technology preference bitmap
   duration       [ I ] - Duration of active preference
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetNetworkPreference( 
   ULONG                      technologyPref, 
   ULONG                      duration )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetNetworkPreference( technologyPref, duration );
}

/*===========================================================================
METHOD:
   GetNetworkPreference

DESCRIPTION:
   This function returns the network registration preference

PARAMETERS:
   pTechnologyPref            [ O ] - Technology preference bitmap
   pDuration                  [ O ] - Duration of active preference
   pPersistentTechnologyPref  [ O ] - Persistent technology preference bitmap 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetNetworkPreference( 
   ULONG *                    pTechnologyPref, 
   ULONG *                    pDuration, 
   ULONG *                    pPersistentTechnologyPref )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetNetworkPreference( pTechnologyPref,
                                                pDuration,
                                                pPersistentTechnologyPref );
}

/*===========================================================================
METHOD:
   SetCDMANetworkParameters

DESCRIPTION:
   This function sets the desired CDMA network parameters

PARAMETERS:
   pSPC           [ I ] - Six digit service programming code
   pForceRev0     [ I ] - (Optional) Force CDMA 1x-EV-DO Rev. 0 mode?
   pCustomSCP     [ I ] - (Optional) Use a custom config for CDMA 1x-EV-DO SCP?
   pProtocol      [ I ] - (Optional) Protocol mask for custom SCP config
   pBroadcast     [ I ] - (Optional) Broadcast mask for custom SCP config
   pApplication   [ I ] - (Optional) Application mask for custom SCP config
   pRoaming       [ I ] - (Optional) Roaming preference

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetCDMANetworkParameters( 
   CHAR *                     pSPC,
   BYTE *                     pForceRev0,
   BYTE *                     pCustomSCP,
   ULONG *                    pProtocol,
   ULONG *                    pBroadcast,
   ULONG *                    pApplication,
   ULONG *                    pRoaming )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetCDMANetworkParameters( pSPC,
                                             pForceRev0,
                                             pCustomSCP,
                                             pProtocol,
                                             pBroadcast,
                                             pApplication,
                                             pRoaming );
}

/*===========================================================================
METHOD:
   GetEVDONetworkParameters

DESCRIPTION:
   This function gets the current CDMA network parameters

PARAMETERS:
   pSCI           [ O ] - Slot cycle index
   pSCM           [ O ] - Station class mark
   pRegHomeSID    [ O ] - Register on home SID?
   pRegForeignSID [ O ] - Register on foreign SID?
   pRegForeignNID [ O ] - Register on foreign NID?
   pForceRev0     [ O ] - Force CDMA 1x-EV-DO Rev. 0 mode?
   pCustomSCP     [ O ] - Use a custom config for CDMA 1x-EV-DO SCP?
   pProtocol      [ O ] - Protocol mask for custom SCP config
   pBroadcast     [ O ] - Broadcast mask for custom SCP config
   pApplication   [ O ] - Application mask for custom SCP config
   pRoaming       [ O ] - Roaming preference
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetCDMANetworkParameters( 
   BYTE *                     pSCI,
   BYTE *                     pSCM,
   BYTE *                     pRegHomeSID,
   BYTE *                     pRegForeignSID,
   BYTE *                     pRegForeignNID,
   BYTE *                     pForceRev0,
   BYTE *                     pCustomSCP,
   ULONG *                    pProtocol,
   ULONG *                    pBroadcast,
   ULONG *                    pApplication,
   ULONG *                    pRoaming )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->GetCDMANetworkParameters( pSCI,
                                             pSCM,
                                             pRegHomeSID,
                                             pRegForeignSID,
                                             pRegForeignNID,
                                             pForceRev0,
                                             pCustomSCP,
                                             pProtocol,
                                             pBroadcast,
                                             pApplication,
                                             pRoaming );
}

/*===========================================================================
METHOD:
   GetACCOLC

DESCRIPTION:
   This function returns the Access Overload Class (ACCOLC) of the device

PARAMETERS:
   pACCOLC     [ O ] - The ACCOLC
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetACCOLC( BYTE * pACCOLC )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetACCOLC( pACCOLC );
}

/*===========================================================================
METHOD:
   SetACCOLC

DESCRIPTION:
   This function sets the Access Overload Class (ACCOLC) of the device

PARAMETERS:
   pSPC        [ I ] - NULL terminated string representing the six digit 
                       service programming code
   accolc      [ I ] - The ACCOLC
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetACCOLC( 
   CHAR *                     pSPC,
   BYTE                       accolc )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetACCOLC( pSPC, accolc );
}

/*===========================================================================
METHOD:
   GetPLMNMode

DESCRIPTION:
   This function returns the PLMN mode from the CSP

PARAMETERS:
   pMode       [ O ] - PLMN mode
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPLMNMode( ULONG * pMode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->GetPLMNMode( pMode );
}

/*===========================================================================
METHOD:
   GetPLMNName

DESCRIPTION:
   This function returns PLMN name information for the given MCC/MNC

PARAMETERS:
   mcc         [ I ] - Mobile country code
   mnc         [ I ] - Mobile network code
   pNamesSize  [I/O] - Upon input the size in BYTEs of the name structure 
                       array.  Upon success the actual number of BYTEs 
                       copied to the name structure array
   pNames      [ O ] - The name structure array

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPLMNName(
   USHORT                     mcc,
   USHORT                     mnc,
   ULONG *                    pNamesSize, 
   BYTE *                     pNames )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->GetPLMNName( mcc, mnc, pNamesSize, pNames );
}

/*===========================================================================
METHOD:
   GetDeviceCapabilities

DESCRIPTION:
   This function gets device capabilities

PARAMETERS:
   pMaxTXChannelRate       [ O ] - Maximum transmission rate (bps) 
   pMaxRXChannelRate       [ O ] - Maximum reception rate (bps)
   pDataServiceCapability  [ O ] - CS/PS data service capability
   pSimCapability          [ O ] - Device SIM support
   pRadioIfacesSize        [I/O] - Upon input the maximum number of elements 
                                   that the radio interfaces can contain.  
                                   Upon successful output the actual number 
                                   of elements in the radio interface array
   pRadioIfaces            [ O ] - The radio interface array
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetDeviceCapabilities( 
   ULONG *                    pMaxTXChannelRate, 
   ULONG *                    pMaxRXChannelRate, 
   ULONG *                    pDataServiceCapability, 
   ULONG *                    pSimCapability, 
   ULONG *                    pRadioIfacesSize, 
   BYTE *                     pRadioIfaces )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetDeviceCapabilities( pMaxTXChannelRate,
                                                 pMaxRXChannelRate,
                                                 pDataServiceCapability,
                                                 pSimCapability,
                                                 pRadioIfacesSize,
                                                 pRadioIfaces );
}

/*===========================================================================
METHOD:
   GetManufacturer

DESCRIPTION:
   This function returns the device manufacturer name

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetManufacturer( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetManufacturer( stringSize, pString );
}

/*===========================================================================
METHOD:
   GetModelID

DESCRIPTION:
   This function returns the device model ID

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetModelID( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetModelID( stringSize, pString );
}

/*===========================================================================
METHOD:
   GetFirmwareRevision

DESCRIPTION:
   This function returns the device firmware revision

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetFirmwareRevision( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetFirmwareRevision( stringSize, pString );
}

/*===========================================================================
METHOD:
   GetFirmwareRevisions

DESCRIPTION:
   This function returns the device firmware (AMSS, boot, and PRI)
   revisions

PARAMETERS:
   amssSize    [ I ] - The maximum number of characters (including NULL 
                       terminator) that the AMSS string array can contain
   pAMSSString [ O ] - NULL terminated AMSS revision string
   bootSize    [ I ] - The maximum number of characters (including NULL 
                       terminator) that the boot string array can contain
   pBootString [ O ] - NULL terminated boot code revision string  
   priSize     [ I ] - The maximum number of characters (including NULL 
                       terminator) that the PRI string array can contain
   pPRIString  [ O ] - NULL terminated PRI revision string  

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetFirmwareRevisions( 
   BYTE                       amssSize, 
   CHAR *                     pAMSSString,
   BYTE                       bootSize, 
   CHAR *                     pBootString,
   BYTE                       priSize, 
   CHAR *                     pPRIString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetFirmwareRevisions( amssSize, 
                                                pAMSSString,
                                                bootSize,
                                                pBootString,
                                                priSize,
                                                pPRIString );
}

/*===========================================================================
METHOD:
   GetFirmwareInfo

DESCRIPTION:
   Returns image information obtained from the current device firmware

PARAMETERS:
   pFirmwareID    [ O ] - Firmware ID obtained from the firmware image
   pTechnology    [ O ] - Technology (0xFFFFFFFF if unknown)
   pCarrier       [ O ] - Carrier (0xFFFFFFFF if unknown)
   pRegion        [ O ] - Region (0xFFFFFFFF if unknown)
   pGPSCapability [ O ] - GPS capability (0xFFFFFFFF if unknown)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetFirmwareInfo( 
   ULONG *                    pFirmwareID,
   ULONG *                    pTechnology,
   ULONG *                    pCarrier,
   ULONG *                    pRegion,
   ULONG *                    pGPSCapability )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetFirmwareInfo( pFirmwareID,
                                           pTechnology,
                                           pCarrier,
                                           pRegion,
                                           pGPSCapability ); 
}

/*===========================================================================
METHOD:
   GetVoiceNumber

DESCRIPTION:
   This function returns the voice number in use by the device

PARAMETERS:
   voiceNumberSize   [ I ] - The maximum number of characters (including NULL 
                             terminator) that the voice number array can 
                             contain
   pVoiceNumber      [ O ] - Voice number (MDN or ISDN) string
   minSize           [ I ] - The maximum number of characters (including NULL 
                             terminator) that the MIN array can contain
   pMIN              [ O ] - MIN string (empty string returned when MIN is
                             not supported/programmed)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetVoiceNumber( 
   BYTE                       voiceNumberSize, 
   CHAR *                     pVoiceNumber,
   BYTE                       minSize, 
   CHAR *                     pMIN )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetVoiceNumber( voiceNumberSize,
                                          pVoiceNumber,
                                          minSize,
                                          pMIN );
}

/*===========================================================================
METHOD:
   GetIMSI

DESCRIPTION:
   This function returns the device IMSI

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetIMSI( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetIMSI( stringSize, pString );
}

/*===========================================================================
METHOD:
   GetSerialNumbers

DESCRIPTION:
   This command returns all serial numbers assigned to the device

PARAMETERS:
   esnSize     [ I ] - The maximum number of characters (including NULL 
                       terminator) that the ESN array can contain
   pESNString  [ O ] - ESN string (empty string returned when ESN is
                       not supported/programmed)
   imeiSize    [ I ] - The maximum number of characters (including NULL 
                       terminator) that the IMEI array can contain
   pIMEIString [ O ] - IMEI string (empty string returned when IMEI is
                       not supported/programmed)
   meidSize    [ I ] - The maximum number of characters (including NULL 
                       terminator) that the MEID array can contain
   pMEIDString [ O ] - MEID string (empty string returned when MEID is
                       not supported/programmed)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSerialNumbers( 
   BYTE                       esnSize, 
   CHAR *                     pESNString, 
   BYTE                       imeiSize, 
   CHAR *                     pIMEIString, 
   BYTE                       meidSize, 
   CHAR *                     pMEIDString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSerialNumbers( esnSize,
                                            pESNString,
                                            imeiSize,
                                            pIMEIString,
                                            meidSize,
                                            pMEIDString );
}

/*===========================================================================
METHOD:
   SetLock

DESCRIPTION:
   This function sets the user lock state maintained by the device

PARAMETERS:
   state       [ I ] - Desired lock state
   pCurrentPIN [ I ] - Current four digit PIN string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetLock( 
   ULONG                      state, 
   CHAR *                     pCurrentPIN )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetLock( state, pCurrentPIN );
}

/*===========================================================================
METHOD:
   QueryLock

DESCRIPTION:
   This function sets the user lock state maintained by the device

PARAMETERS:
   pState      [ O ] - Current lock state
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG QueryLock( ULONG * pState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->QueryLock( pState );
}

/*===========================================================================
METHOD:
   ChangeLockPIN

DESCRIPTION:
   This command sets the user lock code maintained by the device

PARAMETERS:
   pCurrentPIN [ O ] - Current four digit PIN string
   pDesiredPIN [ O ] - New four digit PIN string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ChangeLockPIN( 
   CHAR *                     pCurrentPIN, 
   CHAR *                     pDesiredPIN )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->ChangeLockPIN( pCurrentPIN, pDesiredPIN );
}

/*===========================================================================
METHOD:
   GetHardwareRevision

DESCRIPTION:
   This function returns the device hardware revision

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetHardwareRevision( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetHardwareRevision( stringSize, pString );
}

/*===========================================================================
METHOD:
   GetPRLVersion

DESCRIPTION:
   This function returns the version of the active Preferred Roaming List 
   (PRL) in use by the device

PARAMETERS:
   pPRLVersion [ O ] - The PRL version number
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPRLVersion( WORD * pPRLVersion )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPRLVersion( pPRLVersion );
}

/*===========================================================================
METHOD:
   GetERIFile

DESCRIPTION:
   This command returns the ERI file that is stored in EFS on the device

PARAMETERS:
   pFileSize   [I/O] - Upon input the maximum number of bytes that the file 
                       contents array can contain.  Upon successful output 
                       the actual number of bytes written to the file contents 
                       array
   pFile       [ O ] - The file contents
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetERIFile( 
   ULONG *                    pFileSize, 
   BYTE *                     pFile )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetERIFile( pFileSize, pFile );
}

/*===========================================================================
METHOD:
   ActivateAutomatic

DESCRIPTION:
   This function requests the device to perform automatic service activation

PARAMETERS:
   pActivationCode   [ I ] - Activation code (maximum string length of 12) 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ActivateAutomatic( CHAR * pActivationCode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->ActivateAutomatic( pActivationCode );
}

/*===========================================================================
METHOD:
   ActivateManual

DESCRIPTION:
   This function requests the device perform manual service activation

PARAMETERS:
   pSPC        [ I ] - NULL terminated string representing the six digit 
                       service programming code
   sid         [ I ] - System identification number
   pMDN        [ I ] - Mobile Directory Number string
   pMIN        [ I ] - Mobile Identification Number string
   prlSize     [ I ] - (Optional) Size of PRL file array
   pPRL        [ I ] - (Optional) The PRL file contents
   pMNHA       [ I ] - (Optional) MN-HA string
   pMNAAA      [ I ] - (Optional) MN-AAA string

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ActivateManual( 
   CHAR *                     pSPC,
   WORD                       sid, 
   CHAR *                     pMDN,
   CHAR *                     pMIN, 
   ULONG                      prlSize, 
   BYTE *                     pPRL, 
   CHAR *                     pMNHA,
   CHAR *                     pMNAAA )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->ActivateManual( pSPC,
                                   sid,
                                   pMDN,
                                   pMIN,
                                   prlSize,
                                   pPRL,
                                   pMNHA,
                                   pMNAAA );
}

/*===========================================================================
METHOD:
   ResetToFactoryDefaults

DESCRIPTION:
   This function requests the device reset configuration to factory defaults

PARAMETERS:
   pSPC        [ I ] - NULL terminated string representing the six digit 
                       service programming code

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ResetToFactoryDefaults( CHAR * pSPC )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->ResetToFactoryDefaults( pSPC );
}

/*===========================================================================
METHOD:
   GetActivationState

DESCRIPTION:
   This function returns the device activation state

PARAMETERS:
   pActivationState  [ O ] - Service activation state
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetActivationState( ULONG * pActivationState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetActivationState( pActivationState );
}

/*===========================================================================
METHOD:
   SetPower

DESCRIPTION:
   This function sets the operating mode of the device

PARAMETERS:
   powerMode   [ I ] - Selected operating mode
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPower( ULONG powerMode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->SetPower( powerMode );
}

/*===========================================================================
METHOD:
   GetPower

DESCRIPTION:
   This function returns the operating mode of the device

PARAMETERS:
   pPowerMode  [ O ] - Current operating mode
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPower( ULONG * pPowerMode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPower( pPowerMode );
}

/*===========================================================================
METHOD:
   GetOfflineReason

DESCRIPTION:
   This function returns the reason why the operating mode of the device
   is currently offline

PARAMETERS:
   pReasonMask [ O ] - Bitmask of offline reasons
   pbPlatform  [ O ] - Offline due to being platform retricted?
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetOfflineReason( 
   ULONG *                    pReasonMask,
   ULONG *                    pbPlatform )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetOfflineReason( pReasonMask, pbPlatform );
}

/*===========================================================================
METHOD:
   GetNetworkTime

DESCRIPTION:
   This function returns the current time of the device

PARAMETERS:
   pTimeStamp  [ O ] - Count of 1.25ms that have elapsed from the start 
                       of GPS time (Jan 6, 1980)
   pTimeSource [ O ] - Source of the timestamp

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetNetworkTime( 
   ULONGLONG *                pTimeCount,  
   ULONG *                    pTimeSource )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetNetworkTime( pTimeCount, pTimeSource );
}

/*===========================================================================
METHOD:
   ValidateSPC

DESCRIPTION:
   This function validates the service programming code

PARAMETERS:
   pSPC        [ I ] - Six digit service programming code

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ValidateSPC( CHAR * pSPC )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->ValidateSPC( pSPC );
}

/*===========================================================================
METHOD:
   DeleteSMS

DESCRIPTION:
   This function deletes one or more SMS messages from device memory

PARAMETERS:
   storageType    [ I ] - SMS message storage type
   pMessageIndex  [ I ] - (Optional) message index
   pMessageTag    [ I ] - (Optional) message tag
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG DeleteSMS( 
   ULONG                      storageType, 
   ULONG *                    pMessageIndex, 
   ULONG *                    pMessageTag )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->DeleteSMS( storageType, pMessageIndex, pMessageTag );
}

/*===========================================================================
METHOD:
   GetSMSList

DESCRIPTION:
   This function returns the list of SMS messages stored on the device

PARAMETERS:
   storageType       [ I ] - SMS message storage type
   pRequestedTag     [ I ] - Message index
   pMessageListSize  [I/O] - Upon input the maximum number of elements that the 
                             message list array can contain.  Upon successful 
                             output the actual number of elements in the message 
                             list array
   pMessageList      [ O ] - The message list array
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSMSList( 
   ULONG                      storageType, 
   ULONG *                    pRequestedTag,
   ULONG *                    pMessageListSize, 
   BYTE *                     pMessageList )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSMSList( storageType,
                                      pRequestedTag,
                                      pMessageListSize,
                                      pMessageList );
}

/*===========================================================================
METHOD:
   GetSMS

DESCRIPTION:
   This function returns an SMS message from device memory

PARAMETERS:
   storageType    [ I ] - SMS message storage type
   messageIndex   [ I ] - Message index
   pMessageTag    [ O ] - Message tag
   pMessageFormat [ O ] - Message format
   pMessageSize   [I/O] - Upon input the maximum number of bytes that can be 
                          written to the message array.  Upon successful 
                          output the actual number of bytes written to the 
                          message array
   pMessage       [ I ] - The message contents array
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSMS( 
   ULONG                      storageType, 
   ULONG                      messageIndex, 
   ULONG *                    pMessageTag,
   ULONG *                    pMessageFormat,
   ULONG *                    pMessageSize, 
   BYTE *                     pMessage )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSMS( storageType,
                                  messageIndex,
                                  pMessageTag,
                                  pMessageFormat,
                                  pMessageSize,
                                  pMessage );
}

/*===========================================================================
METHOD:
   ModifySMSStatus

DESCRIPTION:
   This function modifies the status of an SMS message saved in storage on 
   the device

PARAMETERS:
   storageType    [ I ] - SMS message storage type
   messageIndex   [ I ] - Message index
   messageTag     [ I ] - Message tag
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ModifySMSStatus( 
   ULONG                      storageType, 
   ULONG                      messageIndex, 
   ULONG                      messageTag )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return pAPI->ModifySMSStatus( storageType, messageIndex, messageTag );
}

/*===========================================================================
METHOD:
   SaveSMS

DESCRIPTION:
   This function saves an SMS message to device memory

PARAMETERS:
   storageType    [ I ] - SMS message storage type
   messageFormat  [ I ] - Message format   
   messageSize    [ I ] - The length of the message contents in bytes
   pMessage       [ I ] - The message contents
   pMessageIndex  [ O ] - The message index assigned by the device
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SaveSMS(    
   ULONG                      storageType, 
   ULONG                      messageFormat, 
   ULONG                      messageSize, 
   BYTE *                     pMessage, 
   ULONG *                    pMessageIndex )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SaveSMS( storageType,
                                   messageFormat,
                                   messageSize,
                                   pMessage,
                                   pMessageIndex );
}

/*===========================================================================
METHOD:
   SendSMS

DESCRIPTION:
   This function sends an SMS message for immediate over the air transmission

PARAMETERS:
   messageFormat        [ I ] - Message format   
   messageSize          [ I ] - The length of the message contents in bytes
   pMessage             [ I ] - The message contents
   pMessageFailureCode  [ O ] - When the function fails due to an error sending
                                the message this parameter may contain the 
                                message failure cause code (see 3GPP2 N.S0005 
                                Section 6.5.2.125).  If the cause code is not
                                provided then the value will be 0xFFFFFFFF
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SendSMS(    
   ULONG                      messageFormat, 
   ULONG                      messageSize, 
   BYTE *                     pMessage, 
   ULONG *                    pMessageFailureCode )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SendSMS( messageFormat,
                                   messageSize,
                                   pMessage,
                                   pMessageFailureCode );
}

/*===========================================================================
METHOD:
   GetSMSCAddress

DESCRIPTION:
   This function returns the SMS center address

PARAMETERS:
   addressSize    [ I ] - The maximum number of characters (including NULL 
                          terminator) that the SMS center address array 
                          can contain
   pSMSCAddress   [ 0 ] - The SMS center address represented as a NULL 
                          terminated string
   typeSize       [ I ] - The maximum number of characters (including NULL 
                          terminator) that the SMS center address type array
                          can contain
   pSMSCType      [ 0 ] - The SMS center address type represented as a NULL 
                          terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSMSCAddress( 
   BYTE                       addressSize,
   CHAR *                     pSMSCAddress,
   BYTE                       typeSize,
   CHAR *                     pSMSCType )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSMSCAddress( addressSize,
                                          pSMSCAddress,
                                          typeSize,
                                          pSMSCType );
}

/*===========================================================================
METHOD:
   SetSMSCAddress

DESCRIPTION:
   This function sets the SMS center address

PARAMETERS:
   pSMSCAddress   [ 0 ] - The SMS center address represented as a NULL 
                          terminated string
   pSMSCType      [ 0 ] - The SMS center address type represented as a NULL 
                          terminated string (optional)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetSMSCAddress( 
   CHAR *                     pSMSCAddress, 
   CHAR *                     pSMSCType )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetSMSCAddress( pSMSCAddress, pSMSCType );
}

/*===========================================================================
METHOD:
   GetSMSRoutes

DESCRIPTION:
   This function gets the current incoming SMS routing information

PARAMETERS:
   pRouteSize  [I/O] - Upon input the maximum number of elements that the 
                       SMS route array can contain.  Upon succes the actual 
                       number of elements in the SMS route array
   pRoutes     [ O ] - The SMS route array 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSMSRoutes( 
   BYTE *                     pRouteSize, 
   BYTE *                     pRoutes )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSMSRoutes( pRouteSize, pRoutes );
}

/*===========================================================================
METHOD:
   SetSMSRoutes

DESCRIPTION:
   This function sets the desired incoming SMS routing information

PARAMETERS:
   pRouteSize  [ I ] - The number of elements in the SMS route array
   pRoutes     [ I ] - The SMS route array 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetSMSRoutes( 
   BYTE *                     pRouteSize, 
   BYTE *                     pRoutes )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetSMSRoutes( pRouteSize, pRoutes );
}

/*===========================================================================
METHOD:
   UIMSetPINProtection

DESCRIPTION:
   This function enables or disables protection of UIM contents by a 
   given PIN

PARAMETERS:
   id                   [ I ] - PIN ID (1/2)
   bEnable              [ I ] - Enable/disable PIN protection (0 = disable)?
   pValue               [ I ] - PIN value of the PIN to be enabled/disabled
   pVerifyRetriesLeft   [ O ] - Upon operational failure this will indicate 
                                the number of retries left, after which the 
                                PIN will be blocked (0xFFFFFFFF = unknown)
   pUnblockRetriesLeft  [ O ] - Upon operational failure this will indicate 
                                the number of unblock retries left, after 
                                which the PIN will be permanently blocked, 
                                i.e. UIM is unusable (0xFFFFFFFF = unknown)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMSetPINProtection( 
   ULONG                      id, 
   ULONG                      bEnable,
   CHAR *                     pValue,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMSetPINProtection( id,
                                               bEnable,
                                               pValue,
                                               pVerifyRetriesLeft,
                                               pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMVerifyPIN

DESCRIPTION:
   This function verifies the PIN before accessing the UIM contents

PARAMETERS:
   id                   [ I ] - PIN ID (1/2)
   pValue               [ I ] - PIN value of the PIN to verify
   pVerifyRetriesLeft   [ O ] - Upon operational failure this will indicate 
                                the number of retries left, after which the 
                                PIN will be blocked (0xFFFFFFFF = unknown)
   pUnblockRetriesLeft  [ O ] - Upon operational failure this will indicate 
                                the number of unblock retries left, after 
                                which the PIN will be permanently blocked, 
                                i.e. UIM is unusable (0xFFFFFFFF = unknown)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMVerifyPIN( 
   ULONG                      id, 
   CHAR *                     pValue,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMVerifyPIN( id,
                                        pValue,
                                        pVerifyRetriesLeft,
                                        pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMUnblockPIN

DESCRIPTION:
   This function unblocks a blocked PIN

PARAMETERS:
   id                   [ I ] - PIN ID (1/2)
   pPUKValue            [ I ] - PUK value of the PIN to unblock
   pNewValue            [ I ] - New PIN value of the PIN to unblock
   pVerifyRetriesLeft   [ O ] - Upon operational failure this will indicate 
                                the number of retries left, after which the 
                                PIN will be blocked (0xFFFFFFFF = unknown)
   pUnblockRetriesLeft  [ O ] - Upon operational failure this will indicate 
                                the number of unblock retries left, after 
                                which the PIN will be permanently blocked, 
                                i.e. UIM is unusable (0xFFFFFFFF = unknown)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMUnblockPIN( 
   ULONG                      id, 
   CHAR *                     pPUKValue,
   CHAR *                     pNewValue,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMUnblockPIN( id,
                                         pPUKValue,
                                         pNewValue,
                                         pVerifyRetriesLeft,
                                         pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMChangePIN

DESCRIPTION:
   This function change the PIN value

PARAMETERS:
   id                   [ I ] - PIN ID (1/2)
   pOldValue            [ I ] - Old PIN value of the PIN to change
   pNewValue            [ I ] - New PIN value of the PIN to change
   pVerifyRetriesLeft   [ O ] - Upon operational failure this will indicate 
                                the number of retries left, after which the 
                                PIN will be blocked (0xFFFFFFFF = unknown)
   pUnblockRetriesLeft  [ O ] - Upon operational failure this will indicate 
                                the number of unblock retries left, after 
                                which the PIN will be permanently blocked, 
                                i.e. UIM is unusable (0xFFFFFFFF = unknown)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMChangePIN( 
   ULONG                      id, 
   CHAR *                     pOldValue,
   CHAR *                     pNewValue,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMChangePIN( id,
                                        pOldValue,
                                        pNewValue,
                                        pVerifyRetriesLeft,
                                        pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMGetPINStatus

DESCRIPTION:
   This function returns the status of the pin

PARAMETERS:
   id                   [ I ] - PIN ID (1/2)
   pStatus              [ O ] - PIN status (0xFFFFFFFF = unknown)
   pVerifyRetriesLeft   [ O ] - The number of retries left, after which the 
                                PIN will be blocked (0xFFFFFFFF = unknown)
   pUnblockRetriesLeft  [ O ] - The number of unblock retries left, after 
                                which the PIN will be permanently blocked, 
                                i.e. UIM is unusable (0xFFFFFFFF = unknown)
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMGetPINStatus( 
   ULONG                      id, 
   ULONG *                    pStatus,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMGetPINStatus( id,
                                           pStatus,
                                           pVerifyRetriesLeft,
                                           pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMGetICCID

DESCRIPTION:
   This function returns the UIM ICCID

PARAMETERS:
   stringSize  [ I ] - The maximum number of characters (including NULL 
                       terminator) that the string array can contain
   pString     [ O ] - NULL terminated string
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMGetICCID( 
   BYTE                       stringSize, 
   CHAR *                     pString )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMGetICCID( stringSize, pString );
}

/*===========================================================================
METHOD:
   UIMGetControlKeyStatus

DESCRIPTION:
   This function returns the status of the specified facility control key

PARAMETERS:
   id                   [ I ] - Facility ID
   pStatus              [ O ] - Control key status
   pVerifyRetriesLeft   [ O ] - The number of retries left, after which the 
                                control key will be blocked 
   pUnblockRetriesLeft  [ O ] - The number of unblock retries left, after 
                                which the control key  will be permanently 
                                blocked 
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMGetControlKeyStatus( 
   ULONG                      id, 
   ULONG *                    pStatus,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMGetControlKeyBlockingStatus( id, 
                                                          pStatus, 
                                                          pVerifyRetriesLeft, 
                                                          pUnblockRetriesLeft,
                                                          0 );
}

/*===========================================================================
METHOD:
   UIMGetControlKeyBlockingStatus

DESCRIPTION:
   This function returns the blocking status of the specified facility 
   control key

PARAMETERS:
   id                   [ I ] - Facility ID
   pStatus              [ O ] - Control key status
   pVerifyRetriesLeft   [ O ] - The number of retries left, after which the 
                                control key will be blocked 
   pUnblockRetriesLeft  [ O ] - The number of unblock retries left, after 
                                which the control key  will be permanently 
                                blocked 
   pbBlocking           [ O ] - (Optional) Is the facility blocking? 
 
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMGetControlKeyBlockingStatus( 
   ULONG                      id, 
   ULONG *                    pStatus,
   ULONG *                    pVerifyRetriesLeft,
   ULONG *                    pUnblockRetriesLeft,
   ULONG *                    pbBlocking )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMGetControlKeyBlockingStatus( id, 
                                                          pStatus, 
                                                          pVerifyRetriesLeft, 
                                                          pUnblockRetriesLeft,
                                                          pbBlocking);
}

/*===========================================================================
METHOD:
   UIMSetControlKeyProtection

DESCRIPTION:
   This function changes the specified facility control key

PARAMETERS:
   id                   [ I ] - Facility ID
   status               [ I ] - Control key status
   pValue               [ I ] - Control key de-personalization string
   pVerifyRetriesLeft   [ O ] - Upon operational failure this will indicate 
                                the number of retries left, after which the 
                                control key will be blocked 
                                (0xFFFFFFFF = unknown)
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMSetControlKeyProtection( 
   ULONG                      id, 
   ULONG                      status,
   CHAR *                     pValue,
   ULONG *                    pVerifyRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMSetControlKeyProtection( id, 
                                                      status, 
                                                      pValue,
                                                      pVerifyRetriesLeft );
}

/*===========================================================================
METHOD:
   UIMUnblockControlKey

DESCRIPTION:
   This function unblocks the specified facility control key

PARAMETERS:
   id                   [ I ] - Facility ID
   pValue               [ I ] - Control key de-personalization string
   pUnblockRetriesLeft  [ O ] - The number of unblock retries left, after 
                                which the control key  will be permanently 
                                blocked 
                                (0xFFFFFFFF = unknown)
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UIMUnblockControlKey( 
   ULONG                      id, 
   CHAR *                     pValue,
   ULONG *                    pUnblockRetriesLeft )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UIMUnblockControlKey( id, 
                                                pValue,
                                                pUnblockRetriesLeft );
}

/*===========================================================================
METHOD:
   GetPDSState

DESCRIPTION:
   This function returns the current PDS state

PARAMETERS:
   pEnabled    [ O ] - Current PDS state (0 = disabled)
   pTracking   [ O ] - Current PDS tracking session state


RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPDSState( 
   ULONG *                    pEnabled,
   ULONG *                    pTracking )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPDSState( pEnabled, pTracking );
}

/*===========================================================================
METHOD:
   SetPDSState

DESCRIPTION:
   This function sets the PDS state

PARAMETERS:
   enable      [ I ] - Desired PDS state (0 = disable)
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPDSState( ULONG enable )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPDSState( enable );
}

/*===========================================================================
METHOD:
   PDSInjectTimeReference

DESCRIPTION:
   This function injects a system time into the PDS engine

PARAMETERS:
   sysTime              [ I ] - System time
   sysDiscontinuities   [ I ] - Number of system time discontinuities
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG PDSInjectTimeReference( 
   ULONGLONG                  systemTime,
   USHORT                     systemDiscontinuities )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->PDSInjectTimeReference( systemTime, 
                                                  systemDiscontinuities );
}

/*===========================================================================
METHOD:
   GetPDSDefaults

DESCRIPTION:
   This function returns the default tracking session configuration

PARAMETERS:
   pOperation  [ O ] - Current session operating mode 
   pTimeout    [ O ] - Maximum amount of time (seconds) to work on each fix
   pInterval   [ O ] - Interval (milliseconds) between fix requests
   pAccuracy   [ O ] - Current accuracy threshold (meters)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPDSDefaults( 
   ULONG *                    pOperation,
   BYTE *                     pTimeout,
   ULONG *                    pInterval,
   ULONG *                    pAccuracy )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPDSDefaults( pOperation, 
                                          pTimeout, 
                                          pInterval, 
                                          pAccuracy );
}

/*===========================================================================
METHOD:
   SetPDSDefaults

DESCRIPTION:
   This function sets the default tracking session configuration

PARAMETERS:
   operation   [ I ] - Desired session operating mode 
   timeout     [ I ] - Maximum amount of time (seconds) to work on each fix
   interval    [ I ] - Interval (milliseconds) between fix requests
   accuracy    [ I ] - Desired accuracy threshold (meters)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPDSDefaults( 
   ULONG                      operation,
   BYTE                       timeout,
   ULONG                      interval,
   ULONG                      accuracy )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPDSDefaults( operation, 
                                          timeout, 
                                          interval, 
                                          accuracy );
}

/*===========================================================================
METHOD:
   GetXTRAAutomaticDownload

DESCRIPTION:
   This function returns the XTRA automatic download configuration

PARAMETERS:
   pbEnabled   [ O ] - Automatic download enabled?
   pInterval   [ O ] - Interval (hours) between XTRA downloads

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetXTRAAutomaticDownload( 
   ULONG *                    pbEnabled,
   USHORT *                   pInterval )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetXTRAAutomaticDownload( pbEnabled, pInterval );
}

/*===========================================================================
METHOD:
   SetXTRAAutomaticDownload

DESCRIPTION:
   This function sets the XTRA automatic download configuration

PARAMETERS:
   bEnabled    [ I ] - Automatic download enabled?
   interval    [ I ] - Interval (hours) between XTRA downloads

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetXTRAAutomaticDownload( 
   ULONG                      bEnabled,
   USHORT                     interval )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetXTRAAutomaticDownload( bEnabled, interval );
}

/*===========================================================================
METHOD:
   GetXTRANetwork

DESCRIPTION:
   This function returns the XTRA WWAN network preference

PARAMETERS:
   pPreference [ O ] - XTRA WWAN network preference

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetXTRANetwork( ULONG * pPreference )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetXTRANetwork( pPreference );
}

/*===========================================================================
METHOD:
   SetXTRANetwork

DESCRIPTION:
   This function sets the XTRA WWAN network preference

PARAMETERS:
   preference  [ I ] - XTRA WWAN network preference

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetXTRANetwork( ULONG preference )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetXTRANetwork( preference );
}

/*===========================================================================
METHOD:
   GetXTRAValidity

DESCRIPTION:
   This function returns the XTRA database validity period

PARAMETERS:
   pGPSWeek       [ O ] - Starting GPS week of validity period
   pGPSWeekOffset [ O ] - Starting GPS week offset (minutes) of validity period
   pDuration      [ O ] - Length of validity period (hours)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetXTRAValidity(
   USHORT *                   pGPSWeek,
   USHORT *                   pGPSWeekOffset, 
   USHORT *                   pDuration )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetXTRAValidity( pGPSWeek, 
                                           pGPSWeekOffset, 
                                           pDuration );
}

/*===========================================================================
METHOD:
   ForceXTRADownload

DESCRIPTION:
   This function forces the XTRA database to be downloaded to the device

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ForceXTRADownload()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->ForceXTRADownload();
}

/*===========================================================================
METHOD:
   GetXTRADataState

DESCRIPTION:
   This function returns the XTRA data positioning state

PARAMETERS:
   pState      [ O ] - XTRA data positioning state

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetXTRADataState( ULONG * pState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetXTRADataState( pState );
}

/*===========================================================================
METHOD:
   SetXTRADataState

DESCRIPTION:
   This function sets the XTRA data positioning state

PARAMETERS:
   state       [ I ] - XTRA data positioning state

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetXTRADataState( ULONG state )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetXTRADataState( state );
}

/*===========================================================================
METHOD:
   GetXTRATimeState

DESCRIPTION:
   This function returns the XTRA time positioning state

PARAMETERS:
   pState      [ O ] - XTRA time positioning state

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetXTRATimeState( ULONG * pState )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetXTRATimeState( pState );
}

/*===========================================================================
METHOD:
   SetXTRATimeState

DESCRIPTION:
   This function sets the XTRA time positioning state

PARAMETERS:
   state       [ I ] - XTRA time positioning state

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetXTRATimeState( ULONG state )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetXTRATimeState( state );
}

/*===========================================================================
METHOD:
   GetAGPSConfig

DESCRIPTION:
   This function returns the PDS AGPS configuration

PARAMETERS:
   pServerAddress [ O ] - IPv4 address of AGPS server
   pServerPort    [ O ] - Port number of AGPS server

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetAGPSConfig( 
   ULONG *                    pServerAddress,
   ULONG *                    pServerPort )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetAGPSConfig( pServerAddress, pServerPort );
}

/*===========================================================================
METHOD:
   SetAGPSConfig

DESCRIPTION:
   This function sets the PDS AGPS configuration

PARAMETERS:
   serverAddress [ I ] - IPv4 address of AGPS server
   serverPort    [ I ] - Port number of AGPS server

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetAGPSConfig( 
   ULONG                      serverAddress,
   ULONG                      serverPort )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetAGPSConfig( serverAddress, serverPort );
}

/*===========================================================================
METHOD:
   GetServiceAutomaticTracking

DESCRIPTION:
   This function returns the automatic tracking state for the service

PARAMETERS:
   pbAuto      [ O ] - Automatic tracking session started for service?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetServiceAutomaticTracking( ULONG * pbAuto )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetServiceAutomaticTracking( pbAuto );
}

/*===========================================================================
METHOD:
   SetServiceAutomaticTracking

DESCRIPTION:
   This function sets the automatic tracking state for the service

PARAMETERS:
   pbAuto      [ I ] - Start automatic tracking session for service?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetServiceAutomaticTracking( ULONG bAuto )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetServiceAutomaticTracking( bAuto );
}

/*===========================================================================
METHOD:
   GetPortAutomaticTracking

DESCRIPTION:
   This function returns the automatic tracking configuration for the NMEA
   COM port

PARAMETERS:
   pbAuto      [ O ] - Automatic tracking enabled for NMEA COM port?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetPortAutomaticTracking( ULONG * pbAuto )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetPortAutomaticTracking( pbAuto );
}

/*===========================================================================
METHOD:
   SetPortAutomaticTracking

DESCRIPTION:
   This function sets the automatic tracking configuration for the NMEA
   COM port

PARAMETERS:
   pbAuto      [ I ] - Enable automatic tracking for NMEA COM port?

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPortAutomaticTracking( ULONG bAuto )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPortAutomaticTracking( bAuto );
}

/*===========================================================================
METHOD:
   ResetPDSData

DESCRIPTION:
   This function resets the specified PDS data

PARAMETERS:
   pGPSDataMask   [ I ] - Bitmask of GPS data to clear (optional)
   pCellDataMask  [ I ] - Bitmask of cell data to clear (optional)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG ResetPDSData( 
   ULONG *                    pGPSDataMask,
   ULONG *                    pCellDataMask )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->ResetPDSData( pGPSDataMask, pCellDataMask );
}

/*===========================================================================
METHOD:
   CATSendTerminalResponse

DESCRIPTION:
   This function sends the terminal response to the device

PARAMETERS:
   refID       [ I ] - UIM reference ID (from CAT event)
   dataLen     [ I ] - Terminal response data length
   pData       [ I ] - Terminal response data

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG CATSendTerminalResponse( 
   ULONG                      refID,
   ULONG                      dataLen,
   BYTE *                     pData )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->CATSendTerminalResponse( refID, dataLen, pData );
}

/*===========================================================================
METHOD:
   CATSendEnvelopeCommand

DESCRIPTION:
   This function sends the envelope command to the device

PARAMETERS:
   cmdID       [ I ] - Envelope command ID
   dataLen     [ I ] - Envelope command data length
   pData       [ I ] - Envelope command data

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG CATSendEnvelopeCommand( 
   ULONG                      cmdID,
   ULONG                      dataLen,
   BYTE *                     pData )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->CATSendEnvelopeCommand( cmdID, dataLen, pData );
}

/*===========================================================================
METHOD:
   GetSMSWake

DESCRIPTION:
   This function queries the state of the SMS wake functionality

PARAMETERS:
   pbEnabled   [ O ] - SMS wake functionality enabled?
   pWakeMask   [ O ] - SMS wake mask (only relevant when enabled)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetSMSWake( 
   ULONG *                    pbEnabled,
   ULONG *                    pWakeMask )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetSMSWake( pbEnabled, pWakeMask );
}

/*===========================================================================
METHOD:
   SetSMSWake

DESCRIPTION:
   This function enables/disables the SMS wake functionality

PARAMETERS:
   bEnable     [ I ] - Enable SMS wake functionality?
   wakeMask    [ I ] - SMS wake mask (only relevant when enabling)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetSMSWake( 
   ULONG                      bEnable,
   ULONG                      wakeMask )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetSMSWake( bEnable, wakeMask );
}

/*===========================================================================
METHOD:
   OMADMStartSession

DESCRIPTION:
   This function starts an OMA-DM session

PARAMETERS:
   sessionType [ I ] - Type of session to initiate

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMStartSession( ULONG sessionType )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMStartSession( sessionType );
}

/*===========================================================================
METHOD:
   OMADMCancelSession

DESCRIPTION:
   This function cancels an ongoing OMA-DM session

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMCancelSession()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMCancelSession();
}

/*===========================================================================
METHOD:
   OMADMGetSessionInfo

DESCRIPTION:
   This function returns information related to the current (or previous
   if no session is active) OMA-DM session

PARAMETERS:
   pSessionState  [ O ] - State of session
   pSessionType   [ O ] - Type of session
   pFailureReason [ O ] - Session failure reason (when state indicates failure)
   pRetryCount    [ O ] - Session retry count (when state indicates retrying)
   pSessionPause  [ O ] - Session pause timer (when state indicates retrying)
   pTimeRemaining [ O ] - Pause time remaining (when state indicates retrying)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMGetSessionInfo( 
   ULONG *                    pSessionState,
   ULONG *                    pSessionType,
   ULONG *                    pFailureReason,
   BYTE *                     pRetryCount,
   WORD *                     pSessionPause,
   WORD *                     pTimeRemaining )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMGetSessionInfo( pSessionState,
                                               pSessionType,
                                               pFailureReason,
                                               pRetryCount,
                                               pSessionPause,
                                               pTimeRemaining );
}

/*===========================================================================
METHOD:
   OMADMGetPendingNIA

DESCRIPTION:
   This function returns information about the pending network initiated
   alert

PARAMETERS:
   pSessionType   [ O ] - Type of session
   pSessionID     [ O ] - Unique session ID

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMGetPendingNIA( 
   ULONG *                    pSessionType,
   USHORT *                   pSessionID )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMGetPendingNIA( pSessionType, pSessionID );
}

/*===========================================================================
METHOD:
   OMADMSendSelection

DESCRIPTION:
   This function sends the specified OMA-DM selection for the current 
   network initiated session

PARAMETERS:
   selection   [ I ] - Selection
   sessionID   [ I ] - Unique session ID

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMSendSelection( 
   ULONG                      selection,
   USHORT                     sessionID )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMSendSelection( selection, sessionID );
}

/*===========================================================================
METHOD:
   OMADMGetFeatureSettings

DESCRIPTION:
   This function returns the OMA-DM feature settings

PARAMETERS:
   pbProvisioning [ O ] - Device provisioning service update enabled
   pbPRLUpdate    [ O ] - PRL service update enabled

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMGetFeatureSettings( 
   ULONG *                    pbProvisioning,
   ULONG *                    pbPRLUpdate )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMGetFeatureSettings( pbProvisioning,
                                                   pbPRLUpdate );
}

/*===========================================================================
METHOD:
   OMADMSetProvisioningFeature

DESCRIPTION:
   This function sets the OMA-DM device provisioning service 
   update feature setting

PARAMETERS:
   bProvisioning  [ I ] - Device provisioning service update enabled

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMSetProvisioningFeature( 
   ULONG                      bProvisioning )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMSetProvisioningFeature( bProvisioning );
}

/*===========================================================================
METHOD:
   OMADMSetPRLUpdateFeature

DESCRIPTION:
   This function sets the OMA-DM PRL service update feature setting

PARAMETERS:
   bPRLUpdate     [ I ] - PRL service update enabled

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OMADMSetPRLUpdateFeature( 
   ULONG                      bPRLUpdate )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OMADMSetPRLUpdateFeature( bPRLUpdate );
}

/*===========================================================================
METHOD:
   OriginateUSSD

DESCRIPTION:
   This function initiates a USSD operation

PARAMETERS:
   pInfo          [ I ] - USSD information

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG OriginateUSSD( BYTE * pInfo )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->OriginateUSSD( pInfo );
}

/*===========================================================================
METHOD:
   AnswerUSSD

DESCRIPTION:
   This function responds to a USSD request from the network

PARAMETERS:
   pInfo          [ I ] - USSD information

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG AnswerUSSD( BYTE * pInfo )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->AnswerUSSD( pInfo );
}

/*===========================================================================
METHOD:
   CancelUSSD

DESCRIPTION:
   This function cancels an in-progress USSD operation

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG CancelUSSD()
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->CancelUSSD();
}

/*===========================================================================
METHOD:
   UpgradeFirmware

DESCRIPTION:
   This function performs the following set of steps:
      a)   Verifies arguments
      b)   Updates firmware ID on device
      c)   Resets the device

   NOTE: Upon successful completion the above steps will have been completed, 
         however the actual upgrade of the firmware will necessarily then 
         follow.

PARAMETERS:
   pDestinationPath  [ I ] - The fully qualified path to the destination folder 
                             that the firmware download service will use 
  
RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG UpgradeFirmware( CHAR * pDestinationPath )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->UpgradeFirmware( pDestinationPath );
}

/*===========================================================================
METHOD:
   GetImageInfo

DESCRIPTION:
   Returns image information obtained from the firmware image located at the
   provided path

PARAMETERS:
   pPath          [ I ] - Location of the firmware image
   pFirmwareID    [ O ] - Firmware ID obtained from the firmware image
   pTechnology    [ O ] - Technology (0xFFFFFFFF if unknown)
   pCarrier       [ O ] - Carrier (0xFFFFFFFF if unknown)
   pRegion        [ O ] - Region (0xFFFFFFFF if unknown)
   pGPSCapability [ O ] - GPS capability (0xFFFFFFFF if unknown)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetImageInfo( 
   CHAR *                     pPath, 
   ULONG *                    pFirmwareID,
   ULONG *                    pTechnology,
   ULONG *                    pCarrier,
   ULONG *                    pRegion,
   ULONG *                    pGPSCapability )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetImageInfo( pPath, 
                                     pFirmwareID,
                                     pTechnology,
                                     pCarrier,
                                     pRegion,
                                     pGPSCapability );
}

/*===========================================================================
METHOD:
   GetImageStore

DESCRIPTION:
   Returns the image store folder, i.e. the folder co-located with the
   QDL Service executable which (by default) contains one or more carrier 
   specific image subfolders

PARAMETERS:
   pathSize          [ I ] - Maximum number of characters (including NULL
                             terminator) that can be copied to the image
                             store path array
   pImageStorePath   [ O ] - The path to the image store


RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG GetImageStore( 
   WORD                       pathSize,
   CHAR *                     pImageStorePath )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->GetImageStore( pathSize, pImageStorePath ); 
}

/*===========================================================================
METHOD:
   SetSessionStateCallback

DESCRIPTION:
   This function enables/disables the session state callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetSessionStateCallback( tFNSessionState pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetSessionStateCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetByteTotalsCallback

DESCRIPTION:
   This function enables/disables the RX/TX byte counts callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)
   interval    [ I ] - Interval in seconds (ignored when disabling)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetByteTotalsCallback( 
   tFNByteTotals              pCallback,
   BYTE                       interval )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetByteTotalsCallback( pCallback, interval );
}

/*===========================================================================
METHOD:
   SetDataCapabilitiesCallback

DESCRIPTION:
   This function enables/disables the serving system data capabilities 
   callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetDataCapabilitiesCallback( 
   tFNDataCapabilities        pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetDataCapabilitiesCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetDataBearerCallback

DESCRIPTION:
   This function enables/disables the data bearer status callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetDataBearerCallback( tFNDataBearer pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetDataBearerCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetDormancyStatusCallback

DESCRIPTION:
   This function enables/disables the dormancy status callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetDormancyStatusCallback( 
   tFNDormancyStatus          pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetDormancyStatusCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetMobileIPStatusCallback

DESCRIPTION:
   This function enables/disables the mobile IP status callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetMobileIPStatusCallback( 
   tFNMobileIPStatus          pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetMobileIPStatusCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetActivationStatusCallback

DESCRIPTION:
   This function enables/disables the activation status callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetActivationStatusCallback( 
   tFNActivationStatus        pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetActivationStatusCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetPowerCallback

DESCRIPTION:
   Enable/disable power operating mode callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPowerCallback( tFNPower pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPowerCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetWirelessDisableCallback

DESCRIPTION:
   Enable/disable wireless disable state callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetWirelessDisableCallback( 
   tFNWirelessDisable         pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetWirelessDisableCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetRoamingIndicatorCallback

DESCRIPTION:
   This function enables/disables the roaming indicator callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetRoamingIndicatorCallback( 
   tFNRoamingIndicator        pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetRoamingIndicatorCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetSignalStrengthCallback

DESCRIPTION:
   This function enables/disables the signal strength callback function

PARAMETERS:
   pCallback      [ I ] - Callback function (0 = disable)
   thresholdsSize [ I ] - Number of elements the threshold array contain
                          (a maximum of 5 thresholds is supported), must
                          be 0 when disabling the callback
   pThresholds    [ I ] - Signal threshold array (each entry in dBm),
                          must be 0 when disabling the callback

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetSignalStrengthCallback( 
   tFNSignalStrength          pCallback,
   BYTE                       thresholdsSize,
   INT8 *                     pThresholds )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   if (thresholdsSize > 0 && pThresholds == 0)
   {
      return (ULONG)eGOBI_ERR_INVALID_ARG;
   }

   std::list <INT8> thresholdsList;
   for (BYTE t = 0; t < thresholdsSize; t++)
   {
      thresholdsList.push_back( pThresholds[t] );
   }

   return (ULONG)pAPI->SetSignalStrengthCallback( pCallback, thresholdsList );
}

/*===========================================================================
METHOD:
   SetRFInfoCallback

DESCRIPTION:
   This function enables/disables the RF information callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetRFInfoCallback( tFNRFInfo pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetRFInfoCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetLURejectCallback

DESCRIPTION:
   This function enables/disables the LU reject callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetLURejectCallback( tFNLUReject pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetLURejectCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetPLMNModeCallback

DESCRIPTION:
   Enable/disable PLMN mode callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPLMNModeCallback( tFNPLMNMode pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPLMNModeCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetNewSMSCallback

DESCRIPTION:
   This function enables/disables the new SMS callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetNewSMSCallback( tFNNewSMS pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetNewSMSCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetNMEACallback

DESCRIPTION:
   This function enables/disables the NMEA sentence callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetNMEACallback( tFNNewNMEA pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetNMEACallback( pCallback );
}

/*===========================================================================
METHOD:
   SetPDSStateCallback

DESCRIPTION:
   This function enables/disables the PDS service state callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetPDSStateCallback( tFNPDSState pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetPDSStateCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetCATEventCallback

DESCRIPTION:
   This function enables/disables the CAT event callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)
   eventMask   [ I ] - Bitmask of CAT events to register for
   pErrorMask  [ O ] - Error bitmask

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetCATEventCallback( 
   tFNCATEvent                pCallback,
   ULONG                      eventMask,
   ULONG *                    pErrorMask )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetCATEventCallback( pCallback, eventMask, pErrorMask );
}

/*===========================================================================
METHOD:
   SetOMADMAlertCallback

DESCRIPTION:
   This function enables/disables the OMA-DM network initiated alert
   callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetOMADMAlertCallback( tFNOMADMAlert pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetOMADMAlertCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetOMADMStateCallback

DESCRIPTION:
   This function enables/disables the OMA-DM state callback function

PARAMETERS:
   pCallback   [ I ] - Callback function (0 = disable)

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetOMADMStateCallback( tFNOMADMState pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetOMADMStateCallback( pCallback );
}

#ifdef VOICE_SUPPORT
/*===========================================================================
METHOD:
   SetUSSDReleaseCallback

DESCRIPTION:
   Enable/disable USSD release callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetUSSDReleaseCallback( 
   tFNUSSDRelease             pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetUSSDReleaseCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetUSSDNotificationCallback

DESCRIPTION:
   Enable/disable USSD notification callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetUSSDNotificationCallback( 
   tFNUSSDNotification        pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetUSSDNotificationCallback( pCallback );
}

/*===========================================================================
METHOD:
   SetUSSDOriginationCallback

DESCRIPTION:
   Enable/disable USSD origination callback function
  
PARAMETERS:
   pCallback   [ I ] - Callback function

RETURN VALUE:
   ULONG - Return code
===========================================================================*/
ULONG SetUSSDOriginationCallback( 
   tFNUSSDOrigination         pCallback )
{
   cGobiConnectionMgmt * pAPI = gConnectionDLL.GetAPI();
   if (pAPI == 0)
   {
      return (ULONG)eGOBI_ERR_INTERNAL;
   }

   return (ULONG)pAPI->SetUSSDOriginationCallback( pCallback );
}
#endif

