/*===========================================================================
  FILE:
  gobi_sdk_wrapper.cc,
  derived from
  QCWWANCMAPI2k.h
  which has the following copyright notice:

  DESCRIPTION:
  QUALCOMM Wireless WAN Connection Manager API for Gobi 2000

  Copyright (C) 2009 QUALCOMM Incorporated. All rights reserved.
  QUALCOMM Proprietary/GTDR

  All data and information contained in or disclosed by this document is
  confidential and proprietary information of QUALCOMM Incorporated and all
  rights therein are expressly reserved.  By accepting this material the
  recipient agrees that this material and the information contained therein
  is held in confidence and in trust and will not be used, copied, reproduced
  in whole or in part, nor its contents revealed in any manner to others
  without the express written permission of QUALCOMM Incorporated.
  ==========================================================================*/

#include "gobi_sdk_wrapper.h"

#include <base/logging.h>

#include "gobi/GobiConnectionMgmtAPI.h"
#include "gobi/GobiImageMgmtAPI.h"

namespace gobi {

static const char *kServiceMapping[] = {
  // Entries starting with "+" define a new service.  The rest are
  // function names that belong to that service.  These names are
  // taken from the tables at the beginning of service in the CMAPI
  // document.

  // Base is special--it must be the first group and it is
  // special-cased so that we cannot use any other function if we are
  // using a function in Base.  See also Sdk::GetServiceBound().
  "+Base",
  "QCWWANConnect",
  "QCWWANDisconnect",

  "+DeviceConnectivity",
  "GetDeviceType",
  "QCWWANEnumerateDevices",
  "QCWWANGetConnectedDeviceID",
  "QCWWANCancel",  // Not exported, see CancelStartDataSession

  "+WirelessData",
  "GetSessionState",
  "StartDataSession",
  "CancelDataSession",  // Not exported, see CancelStartDataSession
  "StopDataSession",
  "GetIPAddress",
  "GetConnectionRate",
  "GetPacketStatus",
  "SetMobileIP",
  "GetMobileIP",
  "SetActiveMobileIPProfile",
  "GetActiveMobileIPProfile",
  "SetMobileIPProfile",
  "GetMobileIPProfile",
  "SetMobileIPParameters",
  "GetMobileIPParameters",
  "GetLastMobileIPError",
  "GetAutoconnect",
  "SetAutoconnect",
  "SetDefaultProfile",
  "GetDefaultProfile",
  "GetDormancyState",
  "GetDataBearerTechnology",
  "GetByteTotals",
  "GetSessionDuration",

  "+NetworkAccess",
  "GetSignalStrengths",
  "GetRFInfo",
  "PerformNetworkScan",
  "PerformNetworkRATScan",
  "InitiateNetworkRegistration",
  "InitiateDomainAttach",
  "GetServingNetwork",
  "GetServingNetworkCapabilities",
  "GetHomeNetwork",
  "GetNetworkPreference",
  "SetNetworkPreference",
  "SetCDMANetworkParameters",
  "GetCDMANetworkParameters",
  "GetACCOLC",
  "SetACCOLC",
  "GetANAAAAuthenticationStatus",
  "GetPLMNName",

  "+DeviceManagement",
  "GetDeviceCapabilities",
  "GetManufacturer",
  "GetModelID",
  "GetFirmwareRevision",
  "GetFirmwareRevisions",
  "GetVoiceNumber",
  "GetIMSI",
  "GetSerialNumbers",
  "GetHardwareRevision",
  "GetPRLVersion",
  "GetERIFile",
  "ActivateAutomatic",
  "ActivateManual",
  "GetActivationState",
  "SetPower",
  "GetPower",
  "GetOfflineReason",
  "GetNetworkTime",
  "UIMSetPINProtection",
  "UIMVerifyPIN",
  "UIMUnblockPIN",
  "UIMChangePIN",
  "UIMGetPINStatus",
  "UIMGetICCID",
  "UIMGetControlKeyStatus",
  "UIMGetControlKeyBlockingStatus",
  "UIMSetControlKeyProtection",
  "UIMUnblockControlKey",
  "ResetToFactoryDefaults",
  "ValidateSPC",

  "+SMS",
  "DeleteSMS",
  "GetSMSList",
  "GetSMS",
  "ModifySMSStatus",
  "SaveSMS",
  "SendSMS",
  "GetSMSCAddress",
  "SetSMSCAddress",
  "GetSMSRoutes",
  "SetSMSRoutes",

  "+Firmware",
  "UpgradeFirmware",
  "GetImageStore",
  "GetImageInfo",
  "GetFirmwareInfo",

  "+PositionDetermination",
  "GetPDSState",
  "SetPDSState",
  "PDSInjectTimeReference",
  "GetPDSDefaults",
  "SetPDSDefaults",
  "GetXTRAAutomaticDownload",
  "SetXTRAAutomaticDownload",
  "GetXTRANetwork",
  "SetXTRANetwork",
  "GetXTRAValidity",
  "ForceXTRADownload",
  "GetAGPSConfig",
  "SetAGPSConfig",
  "GetServiceAutomaticTracking",
  "SetServiceAutomaticTracking",
  "GetPortAutomaticTracking",
  "SetPortAutomaticTracking",
  "ResetPDSData",

  "+CardApplication",
  "CATSendTerminalResponse",
  "CATSendEnvelopeCommand",

  "+RemoteManagement",
  "GetSMSWake",
  "SetSMSWake",

  "+OMADM",
  "OMADMStartSession",
  "OMADMCancelSession",
  "OMADMGetSessionInfo",
  "OMADMGetPendingNIA",
  "OMADMSendSelection",
  "OMADMGetFeatureSettings",
  "OMADMSetProvisioningFeature",
  "OMADMSetPRLUpdateFeature",

  "+Callback",
  "SetSessionStateCallback",
  "SetDataBearerCallback",
  "SetDormancyStatusCallback",
  "SetMobileIPStatusCallback",
  "SetActivationStatusCallback",
  "SetPowerCallback",
  "SetRoamingIndicatorCallback",
  "SetSignalStrengthCallback",
  "SetRFInfoCallback",
  "SetLURejectCallback",
  "SetNMEACallback",
  "SetPDSStateCallback",
  "SetNewSMSCallback",
  "SetDataCapabilitiesCallback",
  "SetByteTotalsCallback",
  "SetCATEventCallback",
  "SetOMADMAlertCallback",
  "SetOMADMStateCallback",

  NULL
};


Sdk::CallWrapper::CallWrapper(Sdk *sdk, const char *name)
    : sdk_(sdk),
      function_name_(name) {
  sdk_locked_ = sdk_->EnterSdk(function_name_) == kCrosGobiSubsystemInUse;
}

ULONG Sdk::CallWrapper::CheckReturn(ULONG rc) {
  if (sdk_->fault_inject_sdk_error_ != 0) {
    LOG(ERROR) << "Injecting error " << sdk_->fault_inject_sdk_error_;
    rc = sdk_->fault_inject_sdk_error_;
  }

  if (rc == kErrorSendingQmiRequest ||
      rc == kErrorReceivingQmiRequest ||
      rc == kErrorNeedsReset) {
    // SetOMADM...Callback returns error kErrorSendingQmiRequest when
    // run on an image without OMADM-capable firmware.  This error code
    // normally means "You have lost synch with the modem and must reset
    // it", but in this case we don't want to reset it.
    //    http://code.google.com/p/chromium-os/issues/detail?id=9372
    // tracks removing this workaround
    if (strstr(function_name_, "OMADM") == NULL)  {
      sdk_->sdk_error_sink_(sdk_->current_modem_path_,
                            function_name_,
                            rc);
    }
  }
  return rc;
}

Sdk::CallWrapper::~CallWrapper() {
  if (!sdk_locked_) {
    sdk_->LeaveSdk(function_name_);
  }
}

void Sdk::Init() {
  InitGetServiceFromName(kServiceMapping);
  service_to_function_.insert(
      service_to_function_.end(),
      service_index_upper_bound_,
      static_cast<const char *>(NULL));
  pthread_mutex_init(&service_to_function_mutex_, NULL);
  fault_inject_sdk_error_ = 0;
}

void Sdk::InjectFaultSdkError(int error) {
  fault_inject_sdk_error_ = error;
}

void Sdk::InitGetServiceFromName(const char *services[]) {
  int service_index = -1;
  for (int i = 0; services[i]; ++i) {
    const char *name = services[i];
    CHECK(*name != 0) << "Empty servicename: " << i;
    if (name[0] == '+') {
      service_index++;
      index_to_service_name_[service_index] = name + 1;
    } else {
      CHECK(service_index >= 0);
      name_to_service_[std::string(name)] = service_index;
    }
  }
  service_index_upper_bound_ = service_index + 1;
}

int Sdk::GetServiceFromName(const char *name) {
  std::map<std::string, int>::iterator i =
      name_to_service_.find(std::string(name));
  CHECK(i != name_to_service_.end()) << "Invalid function name: " << name;
  return i->second;
}

int Sdk::GetServiceBound(int service) {
  if (service == 0) {
    // Base service: we should prevent all other services from being
    // used
    return service_index_upper_bound_;
  } else {
    return service + 1;
  }
}

ULONG Sdk::EnterSdk(const char *function_name) {
  ULONG to_return = 0;
  int rc = pthread_mutex_lock(&service_to_function_mutex_);
  CHECK(rc == 0) << "lock failed: rc = " << rc;
  int service = GetServiceFromName(function_name);
  for (int i = service; i < GetServiceBound(service); ++i) {
    if (service_to_function_[i]) {
      LOG(WARNING) << "Reentrant SDK access detected:  Called "
                   << function_name << " while already in call to "
                   << service_to_function_[i];
      to_return = kCrosGobiSubsystemInUse;
    }
  }
  if (to_return == 0) {
    for (int i = service; i < GetServiceBound(service); ++i) {
      service_to_function_[i] = function_name;
    }
  }
  rc = pthread_mutex_unlock(&service_to_function_mutex_);
  CHECK(rc == 0) << "rc = " << rc;
  return to_return;
}

void Sdk::LeaveSdk(const char *function_name) {
  int rc = pthread_mutex_lock(&service_to_function_mutex_);
  CHECK(rc == 0) << "lock failed: rc = " << rc;

  int service = GetServiceFromName(function_name);
  for (int i = service; i < GetServiceBound(service); ++i) {
    const char *recorded_function = service_to_function_[i];
    if (!recorded_function || strcmp(recorded_function, function_name) != 0) {
      if (recorded_function == NULL) {
        recorded_function = "None";
      }
      LOG(WARNING) << "Found exited/wrong service when exiting sdk function: "
                   << function_name << ", " << recorded_function;
    }
    service_to_function_[i] = NULL;
  }
  rc = pthread_mutex_unlock(&service_to_function_mutex_);
  CHECK(rc == 0) << "rc = " << rc;
}

ULONG Sdk::CancelStartDataSession() {
  static const char *to_cancel = "StartDataSession";

  ULONG gobi_rc = ::QCWWANCancel();
  if (gobi_rc != 0) {
    LOG(ERROR) << "QCWWANCancel failed " << gobi_rc;
    return gobi_rc;
  }

  // Sanity checks
  int rc = pthread_mutex_lock(&service_to_function_mutex_);
  CHECK(rc == 0) << "lock failed: rc = " << rc;

  int wireless_data_service_index = name_to_service_[to_cancel];
  const char *current_wireless_data_fn =
      service_to_function_[wireless_data_service_index];

  if (current_wireless_data_fn &&
      strcmp(current_wireless_data_fn, to_cancel) != 0) {
    LOG(ERROR) << "Asked to cancel StartDataSession, but "
               << current_wireless_data_fn << "was running";
  }

  for (int i = 0; i < service_index_upper_bound_ ; ++i) {
    if (i != wireless_data_service_index &&
        service_to_function_[i] != NULL) {
      LOG(ERROR) << "Did not expect "
                 << service_to_function_[i] << " to be running";
    }
  }
  rc = pthread_mutex_unlock(&service_to_function_mutex_);
  CHECK(rc == 0) << "rc = " << rc;

  // Sanity checks complete
  return ::CancelDataSession();
}

// If the CallWrapper couldn't get a lock on the subsystem we need to
// use, return an error.
#define RETURN_IF_CALL_WRAPPER_LOCKED(CW)       \
do {                                            \
  if ((CW).sdk_locked_) {                       \
    return kCrosGobiSubsystemInUse;             \
  }                                             \
} while (0);

GobiType Sdk::GetDeviceType()
{
  return ::GetDeviceType();
}

ULONG Sdk::QCWWANEnumerateDevices(
    BYTE *                     pDevicesSize,
    BYTE *                     pDevices) {
  CallWrapper cw(this, "QCWWANEnumerateDevices");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::QCWWANEnumerateDevices(pDevicesSize,
                                                 pDevices));
}

ULONG Sdk::QCWWANConnect(
    CHAR *                     pDeviceNode,
    CHAR *                     pDeviceKey) {
  CallWrapper cw(this, "QCWWANConnect");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::QCWWANConnect(pDeviceNode,
                                        pDeviceKey));
}

ULONG Sdk::QCWWANDisconnect() {
  CallWrapper cw(this, "QCWWANDisconnect");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::QCWWANDisconnect());
}

ULONG Sdk::QCWWANGetConnectedDeviceID(
    ULONG                      deviceNodeSize,
    CHAR *                     pDeviceNode,
    ULONG                      deviceKeySize,
    CHAR *                     pDeviceKey) {
  CallWrapper cw(this, "QCWWANGetConnectedDeviceID");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::QCWWANGetConnectedDeviceID(
      deviceNodeSize,
      pDeviceNode,
      deviceKeySize,
      pDeviceKey));
}

ULONG Sdk::GetSessionState(ULONG * pState) {
  CallWrapper cw(this, "GetSessionState");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSessionState(pState));
}

ULONG Sdk::GetSessionDuration(ULONGLONG * pDuration) {
  CallWrapper cw(this, "GetSessionDuration");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSessionDuration(pDuration));
}

ULONG Sdk::GetDormancyState(ULONG * pState) {
  CallWrapper cw(this, "GetDormancyState");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetDormancyState(pState));
}

ULONG Sdk::GetAutoconnect(ULONG * pSetting) {
  CallWrapper cw(this, "GetAutoconnect");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetAutoconnect(pSetting));
}

ULONG Sdk::SetAutoconnect(ULONG setting) {
  CallWrapper cw(this, "SetAutoconnect");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetAutoconnect(setting));
}

ULONG Sdk::SetDefaultProfile(
    ULONG                      profileType,
    ULONG *                    pPDPType,
    ULONG *                    pIPAddress,
    ULONG *                    pPrimaryDNS,
    ULONG *                    pSecondaryDNS,
    ULONG *                    pAuthentication,
    CHAR *                     pName,
    CHAR *                     pAPNName,
    CHAR *                     pUsername,
    CHAR *                     pPassword) {
  CallWrapper cw(this, "SetDefaultProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetDefaultProfile(
      profileType,
      pPDPType,
      pIPAddress,
      pPrimaryDNS,
      pSecondaryDNS,
      pAuthentication,
      pName,
      pAPNName,
      pUsername,
      pPassword));
}

ULONG Sdk::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) {
  CallWrapper cw(this, "GetDefaultProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetDefaultProfile(
      profileType,
      pPDPType,
      pIPAddress,
      pPrimaryDNS,
      pSecondaryDNS,
      pAuthentication,
      nameSize,
      pName,
      apnSize,
      pAPNName,
      userSize,
      pUsername));
}

ULONG Sdk::StartDataSession(
    ULONG *                    pTechnology,
    const CHAR *               pAPNName,
    ULONG *                    pAuthentication,
    const CHAR *               pUsername,
    const CHAR *               pPassword,
    ULONG *                    pSessionId,
    ULONG *                    pFailureReason
                            ) {
  CharStarCopier mutableAPNName(pAPNName);
  CharStarCopier mutableUsername(pUsername);
  CharStarCopier mutablePassword(pPassword);
  CallWrapper cw(this, "StartDataSession");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);

  // Do not call CheckReturn here; if this is a cancelled connect,
  // we'll get an error 13 and we don't want to restart.  Other calls
  // to the SDK will still discover the error if we're in a
  // persistently-failing state.
  return ::StartDataSession(
      pTechnology,
      NULL,
      NULL,
      NULL,
      NULL,
      mutableAPNName.get(),
      NULL,
      pAuthentication,
      mutableUsername.get(),
      mutablePassword.get(),
      pSessionId,
      pFailureReason);
}

ULONG Sdk::StopDataSession(ULONG sessionId) {
  CallWrapper cw(this, "StopDataSession");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::StopDataSession(sessionId));
}

ULONG Sdk::GetIPAddress(ULONG * pIPAddress) {
  CallWrapper cw(this, "GetIPAddress");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetIPAddress(pIPAddress));
}

ULONG Sdk::GetConnectionRate(
    ULONG *                    pCurrentChannelTXRate,
    ULONG *                    pCurrentChannelRXRate,
    ULONG *                    pMaxChannelTXRate,
    ULONG *                    pMaxChannelRXRate) {
  CallWrapper cw(this, "GetConnectionRate");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetConnectionRate(
      pCurrentChannelTXRate,
      pCurrentChannelRXRate,
      pMaxChannelTXRate,
      pMaxChannelRXRate));
}

ULONG Sdk::GetPacketStatus(
    ULONG *                    pTXPacketSuccesses,
    ULONG *                    pRXPacketSuccesses,
    ULONG *                    pTXPacketErrors,
    ULONG *                    pRXPacketErrors,
    ULONG *                    pTXPacketOverflows,
    ULONG *                    pRXPacketOverflows) {
  CallWrapper cw(this, "GetPacketStatus");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPacketStatus(
      pTXPacketSuccesses,
      pRXPacketSuccesses,
      pTXPacketErrors,
      pRXPacketErrors,
      pTXPacketOverflows,
      pRXPacketOverflows));
}

ULONG Sdk::GetByteTotals(
    ULONGLONG *                pTXTotalBytes,
    ULONGLONG *                pRXTotalBytes) {
  CallWrapper cw(this, "GetByteTotals");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetByteTotals(
      pTXTotalBytes,
      pRXTotalBytes));
}

ULONG Sdk::SetMobileIP(ULONG mode) {
  CallWrapper cw(this, "SetMobileIP");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetMobileIP(mode));
}

ULONG Sdk::GetMobileIP(ULONG * pMode) {
  CallWrapper cw(this, "GetMobileIP");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetMobileIP(pMode));
}

ULONG Sdk::SetActiveMobileIPProfile(
    CHAR *                     pSPC,
    BYTE                       index) {
  CallWrapper cw(this, "SetActiveMobileIPProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetActiveMobileIPProfile(
      pSPC,
      index));
}

ULONG Sdk::GetActiveMobileIPProfile(BYTE * pIndex) {
  CallWrapper cw(this, "GetActiveMobileIPProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetActiveMobileIPProfile(pIndex));
}

ULONG Sdk::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) {
  CallWrapper cw(this, "SetMobileIPProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetMobileIPProfile(
      pSPC,
      index,
      pEnabled,
      pAddress,
      pPrimaryHA,
      pSecondaryHA,
      pRevTunneling,
      pNAI,
      pHASPI,
      pAAASPI,
      pMNHA,
      pMNAAA));
}

ULONG Sdk::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) {
  CallWrapper cw(this, "GetMobileIPProfile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetMobileIPProfile(
      index,
      pEnabled,
      pAddress,
      pPrimaryHA,
      pSecondaryHA,
      pRevTunneling,
      naiSize,
      pNAI,
      pHASPI,
      pAAASPI,
      pHAState,
      pAAAState));
}

ULONG Sdk::SetMobileIPParameters(
    CHAR *                     pSPC,
    ULONG *                    pMode,
    BYTE *                     pRetryLimit,
    BYTE *                     pRetryInterval,
    BYTE *                     pReRegPeriod,
    BYTE *                     pReRegTraffic,
    BYTE *                     pHAAuthenticator,
    BYTE *                     pHA2002bis) {
  CallWrapper cw(this, "SetMobileIPParameters");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetMobileIPParameters(
      pSPC,
      pMode,
      pRetryLimit,
      pRetryInterval,
      pReRegPeriod,
      pReRegTraffic,
      pHAAuthenticator,
      pHA2002bis));
}

ULONG Sdk::GetMobileIPParameters(
    ULONG *                    pMode,
    BYTE *                     pRetryLimit,
    BYTE *                     pRetryInterval,
    BYTE *                     pReRegPeriod,
    BYTE *                     pReRegTraffic,
    BYTE *                     pHAAuthenticator,
    BYTE *                     pHA2002bis) {
  CallWrapper cw(this, "GetMobileIPParameters");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetMobileIPParameters(
      pMode,
      pRetryLimit,
      pRetryInterval,
      pReRegPeriod,
      pReRegTraffic,
      pHAAuthenticator,
      pHA2002bis));
}

ULONG Sdk::GetLastMobileIPError(ULONG * pError) {
  CallWrapper cw(this, "GetLastMobileIPError");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetLastMobileIPError(pError));
}

ULONG Sdk::GetANAAAAuthenticationStatus(ULONG * pStatus) {
  CallWrapper cw(this, "GetANAAAAuthenticationStatus");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetANAAAAuthenticationStatus(pStatus));
}

ULONG Sdk::GetSignalStrengths(
    ULONG *                    pArraySizes,
    INT8 *                     pSignalStrengths,
    ULONG *                    pRadioInterfaces) {
  CallWrapper cw(this, "GetSignalStrengths");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSignalStrengths(
      pArraySizes,
      pSignalStrengths,
      pRadioInterfaces));
}

ULONG Sdk::GetRFInfo(
    BYTE *                     pInstanceSize,
    BYTE *                     pInstances) {
  CallWrapper cw(this, "GetRFInfo");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetRFInfo(
      pInstanceSize,
      pInstances));
}

ULONG Sdk::PerformNetworkScan(
    BYTE *                     pInstanceSize,
    BYTE *                     pInstances) {
  CallWrapper cw(this, "PerformNetworkScan");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::PerformNetworkScan(
      pInstanceSize,
      pInstances));
}

ULONG Sdk::PerformNetworkRATScan(
    BYTE *                     pInstanceSize,
    BYTE *                     pInstances,
    BYTE *                     pRATSize,
    BYTE *                     pRATInstances) {
  CallWrapper cw(this, "PerformNetworkRATScan");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::PerformNetworkRATScan(
      pInstanceSize,
      pInstances,
      pRATSize,
      pRATInstances));
}

ULONG Sdk::InitiateNetworkRegistration(
    ULONG                      regType,
    WORD                       mcc,
    WORD                       mnc,
    ULONG                      rat) {
  CallWrapper cw(this, "InitiateNetworkRegistration");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::InitiateNetworkRegistration(
      regType,
      mcc,
      mnc,
      rat));
}

ULONG Sdk::InitiateDomainAttach(ULONG action) {
  CallWrapper cw(this, "InitiateDomainAttach");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::InitiateDomainAttach(action));
}

ULONG Sdk::GetServingNetwork(
    ULONG *                    pRegistrationState,
    ULONG *                    pRAN,
    BYTE *                     pRadioIfacesSize,
    BYTE *                     pRadioIfaces,
    ULONG *                    pRoaming,
    WORD *                     pMCC,
    WORD *                     pMNC,
    BYTE                       nameSize,
    CHAR *                     pName) {
  ULONG l1, l2;
  CallWrapper cw(this, "GetServingNetwork");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetServingNetwork(
      pRegistrationState,
      &l1,              // CS domain
      &l2,              // PS domain
      pRAN,
      pRadioIfacesSize,
      pRadioIfaces,
      pRoaming,
      pMCC,
      pMNC,
      nameSize,
      pName));
}

ULONG Sdk::GetServingNetworkCapabilities(
    BYTE *                     pDataCapsSize,
    BYTE *                     pDataCaps) {
  CallWrapper cw(this, "GetServingNetworkCapabilities");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetServingNetworkCapabilities(
      pDataCapsSize,
      pDataCaps));
}

ULONG Sdk::GetDataBearerTechnology(ULONG * pDataBearer) {
  CallWrapper cw(this, "GetDataBearerTechnology");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetDataBearerTechnology(pDataBearer));
}

ULONG Sdk::GetHomeNetwork(
    WORD *                     pMCC,
    WORD *                     pMNC,
    BYTE                       nameSize,
    CHAR *                     pName,
    WORD *                     pSID,
    WORD *                     pNID) {
  CallWrapper cw(this, "GetHomeNetwork");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetHomeNetwork(
      pMCC,
      pMNC,
      nameSize,
      pName,
      pSID,
      pNID));
}

ULONG Sdk::SetNetworkPreference(
    ULONG                      technologyPref,
    ULONG                      duration) {
  CallWrapper cw(this, "SetNetworkPreference");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetNetworkPreference(
      technologyPref,
      duration));
}

ULONG Sdk::GetNetworkPreference(
    ULONG *                    pTechnologyPref,
    ULONG *                    pDuration,
    ULONG *                    pPersistentTechnologyPref) {
  CallWrapper cw(this, "GetNetworkPreference");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetNetworkPreference(
      pTechnologyPref,
      pDuration,
      pPersistentTechnologyPref));
}

ULONG Sdk::SetCDMANetworkParameters(
    CHAR *                     pSPC,
    BYTE *                     pForceRev0,
    BYTE *                     pCustomSCP,
    ULONG *                    pProtocol,
    ULONG *                    pBroadcast,
    ULONG *                    pApplication,
    ULONG *                    pRoaming) {
  CallWrapper cw(this, "SetCDMANetworkParameters");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetCDMANetworkParameters(
      pSPC,
      pForceRev0,
      pCustomSCP,
      pProtocol,
      pBroadcast,
      pApplication,
      pRoaming));
}

ULONG Sdk::GetCDMANetworkParameters(
    BYTE *                     pSCI,
    BYTE *                     pSCM,
    BYTE *                     pRegHomeSID,
    BYTE *                     pRegForeignSID,
    BYTE *                     pRegForeignNID,
    BYTE *                     pForceRev0,
    BYTE *                     pCustomSCP,
    ULONG *                    pProtocol,
    ULONG *                    pBroadcast,
    ULONG *                    pApplication,
    ULONG *                    pRoaming) {
  CallWrapper cw(this, "GetCDMANetworkParameters");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetCDMANetworkParameters(
      pSCI,
      pSCM,
      pRegHomeSID,
      pRegForeignSID,
      pRegForeignNID,
      pForceRev0,
      pCustomSCP,
      pProtocol,
      pBroadcast,
      pApplication,
      pRoaming));
}

ULONG Sdk::GetACCOLC(BYTE * pACCOLC) {
  CallWrapper cw(this, "GetACCOLC");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetACCOLC(pACCOLC));
}

ULONG Sdk::SetACCOLC(
    CHAR *                     pSPC,
    BYTE                       accolc) {
  CallWrapper cw(this, "SetACCOLC");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetACCOLC(
      pSPC,
      accolc));
}

ULONG Sdk::GetPLMNName(
    USHORT                     mcc,
    USHORT                     mnc,
    ULONG *                    pNamesSize,
    BYTE *                     pNames) {
  CallWrapper cw(this, "GetPLMNName");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPLMNName(
      mcc,
      mnc,
      pNamesSize,
      pNames));
}

ULONG Sdk::GetDeviceCapabilities(
    ULONG *                    pMaxTXChannelRate,
    ULONG *                    pMaxRXChannelRate,
    ULONG *                    pDataServiceCapability,
    ULONG *                    pSimCapability,
    ULONG *                    pRadioIfacesSize,
    BYTE *                     pRadioIfaces) {
  CallWrapper cw(this, "GetDeviceCapabilities");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetDeviceCapabilities(
      pMaxTXChannelRate,
      pMaxRXChannelRate,
      pDataServiceCapability,
      pSimCapability,
      pRadioIfacesSize,
      pRadioIfaces));
}

ULONG Sdk::GetManufacturer(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "GetManufacturer");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetManufacturer(
      stringSize,
      pString));
}

ULONG Sdk::GetModelID(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "GetModelID");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetModelID(
      stringSize,
      pString));
}

ULONG Sdk::GetFirmwareRevision(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "GetFirmwareRevision");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetFirmwareRevision(
      stringSize,
      pString));
}

ULONG Sdk::GetFirmwareRevisions(
    BYTE                       amssSize,
    CHAR *                     pAMSSString,
    BYTE                       bootSize,
    CHAR *                     pBootString,
    BYTE                       priSize,
    CHAR *                     pPRIString) {
  CallWrapper cw(this, "GetFirmwareRevisions");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetFirmwareRevisions(
      amssSize,
      pAMSSString,
      bootSize,
      pBootString,
      priSize,
      pPRIString));
}

ULONG Sdk::GetFirmwareInfo(
    ULONG *                    pFirmwareID,
    ULONG *                    pTechnology,
    ULONG *                    pCarrier,
    ULONG *                    pRegion,
    ULONG *                    pGPSCapability) {
  CallWrapper cw(this, "GetFirmwareInfo");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetFirmwareInfo(
      pFirmwareID,
      pTechnology,
      pCarrier,
      pRegion,
      pGPSCapability));
}

ULONG Sdk::GetVoiceNumber(
    BYTE                       voiceNumberSize,
    CHAR *                     pVoiceNumber,
    BYTE                       minSize,
    CHAR *                     pMIN) {
  CallWrapper cw(this, "GetVoiceNumber");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetVoiceNumber(
      voiceNumberSize,
      pVoiceNumber,
      minSize,
      pMIN));
}

ULONG Sdk::GetIMSI(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "GetIMSI");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetIMSI(
      stringSize,
      pString));
}

ULONG Sdk::GetSerialNumbers(
    BYTE                       esnSize,
    CHAR *                     pESNString,
    BYTE                       imeiSize,
    CHAR *                     pIMEIString,
    BYTE                       meidSize,
    CHAR *                     pMEIDString) {
  CallWrapper cw(this, "GetSerialNumbers");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSerialNumbers(
      esnSize,
      pESNString,
      imeiSize,
      pIMEIString,
      meidSize,
      pMEIDString));
}

ULONG Sdk::SetLock(
    ULONG                      state,
    CHAR *                     pCurrentPIN) {
  CallWrapper cw(this, "SetLock");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetLock(
      state,
      pCurrentPIN));
}

ULONG Sdk::QueryLock(ULONG * pState) {
  CallWrapper cw(this, "QueryLock");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::QueryLock(pState));
}

ULONG Sdk::ChangeLockPIN(
    CHAR *                     pCurrentPIN,
    CHAR *                     pDesiredPIN) {
  CallWrapper cw(this, "ChangeLockPIN");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ChangeLockPIN(
      pCurrentPIN,
      pDesiredPIN));
}

ULONG Sdk::GetHardwareRevision(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "GetHardwareRevision");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetHardwareRevision(
      stringSize,
      pString));
}

ULONG Sdk::GetPRLVersion(WORD * pPRLVersion) {
  CallWrapper cw(this, "GetPRLVersion");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPRLVersion(pPRLVersion));
}

ULONG Sdk::GetERIFile(
    ULONG *                    pFileSize,
    BYTE *                     pFile) {
  CallWrapper cw(this, "GetERIFile");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetERIFile(
      pFileSize,
      pFile));
}

ULONG Sdk::ActivateAutomatic(const CHAR * pActivationCode) {
  CharStarCopier mutableActivationCode(pActivationCode);
  CallWrapper cw(this, "ActivateAutomatic");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ActivateAutomatic(mutableActivationCode.get()));
}

ULONG Sdk::ActivateManual(
    const CHAR *                pSPC,
    WORD                        sid,
    const CHAR *                pMDN,
    const CHAR *                pMIN,
    ULONG                       prlSize,
    BYTE *                      pPRL,
    const CHAR *                pMNHA,
    const CHAR *                pMNAAA) {
  CharStarCopier mutableSPC(pSPC);
  CharStarCopier mutableMDN(pMDN);
  CharStarCopier mutableMIN(pMIN);
  CharStarCopier mutableMNHA(pMNHA);
  CharStarCopier mutableMNAAA(pMNAAA);

  CallWrapper cw(this, "ActivateManual");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ActivateManual(
      mutableSPC.get(),
      sid,
      mutableMDN.get(),
      mutableMIN.get(),
      prlSize,
      pPRL,
      mutableMNHA.get(),
      mutableMNAAA.get()));
}

ULONG Sdk::ResetToFactoryDefaults(CHAR * pSPC) {
  CallWrapper cw(this, "ResetToFactoryDefaults");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ResetToFactoryDefaults(pSPC));
}

ULONG Sdk::GetActivationState(ULONG * pActivationState) {
  CallWrapper cw(this, "GetActivationState");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetActivationState(pActivationState));
}

ULONG Sdk::SetPower(ULONG powerMode) {
  CallWrapper cw(this, "SetPower");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPower(powerMode));
}

ULONG Sdk::GetPower(ULONG * pPowerMode) {
  CallWrapper cw(this, "GetPower");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPower(pPowerMode));
}

ULONG Sdk::GetOfflineReason(
    ULONG *                    pReasonMask,
    ULONG *                    pbPlatform) {
  CallWrapper cw(this, "GetOfflineReason");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetOfflineReason(
      pReasonMask,
      pbPlatform));
}

ULONG Sdk::GetNetworkTime(
    ULONGLONG *                pTimeCount,
    ULONG *                    pTimeSource) {
  CallWrapper cw(this, "GetNetworkTime");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetNetworkTime(
      pTimeCount,
      pTimeSource));
}

ULONG Sdk::ValidateSPC(CHAR * pSPC) {
  CallWrapper cw(this, "ValidateSPC");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ValidateSPC(pSPC));
}

ULONG Sdk::DeleteSMS(
    ULONG                      storageType,
    ULONG *                    pMessageIndex,
    ULONG *                    pMessageTag) {
  CallWrapper cw(this, "DeleteSMS");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::DeleteSMS(
      storageType,
      pMessageIndex,
      pMessageTag));
}

ULONG Sdk::GetSMSList(
    ULONG                      storageType,
    ULONG *                    pRequestedTag,
    ULONG *                    pMessageListSize,
    BYTE *                     pMessageList) {
  CallWrapper cw(this, "GetSMSList");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSMSList(
      storageType,
      pRequestedTag,
      pMessageListSize,
      pMessageList));
}

ULONG Sdk::GetSMS(
    ULONG                      storageType,
    ULONG                      messageIndex,
    ULONG *                    pMessageTag,
    ULONG *                    pMessageFormat,
    ULONG *                    pMessageSize,
    BYTE *                     pMessage) {
  CallWrapper cw(this, "GetSMS");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSMS(
      storageType,
      messageIndex,
      pMessageTag,
      pMessageFormat,
      pMessageSize,
      pMessage));
}

ULONG Sdk::ModifySMSStatus(
    ULONG                      storageType,
    ULONG                      messageIndex,
    ULONG                      messageTag) {
  CallWrapper cw(this, "ModifySMSStatus");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ModifySMSStatus(
      storageType,
      messageIndex,
      messageTag));
}

ULONG Sdk::SaveSMS(
    ULONG                      storageType,
    ULONG                      messageFormat,
    ULONG                      messageSize,
    BYTE *                     pMessage,
    ULONG *                    pMessageIndex) {
  CallWrapper cw(this, "SaveSMS");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SaveSMS(
      storageType,
      messageFormat,
      messageSize,
      pMessage,
      pMessageIndex));
}

ULONG Sdk::SendSMS(
    ULONG                      messageFormat,
    ULONG                      messageSize,
    BYTE *                     pMessage,
    ULONG *                    pMessageFailureCode) {
  CallWrapper cw(this, "SendSMS");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SendSMS(
      messageFormat,
      messageSize,
      pMessage,
      pMessageFailureCode));
}

ULONG Sdk::GetSMSCAddress(
    BYTE                       addressSize,
    CHAR *                     pSMSCAddress,
    BYTE                       typeSize,
    CHAR *                     pSMSCType) {
  CallWrapper cw(this, "GetSMSCAddress");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSMSCAddress(
      addressSize,
      pSMSCAddress,
      typeSize,
      pSMSCType));
}

ULONG Sdk::SetSMSCAddress(
    CHAR *                     pSMSCAddress,
    CHAR *                     pSMSCType) {
  CallWrapper cw(this, "SetSMSCAddress");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetSMSCAddress(
      pSMSCAddress,
      pSMSCType));
}

ULONG Sdk::UIMSetPINProtection(
    ULONG                      id,
    ULONG                      bEnable,
    CHAR *                     pValue,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMSetPINProtection");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMSetPINProtection(
      id,
      bEnable,
      pValue,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMVerifyPIN(
    ULONG                      id,
    CHAR *                     pValue,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMVerifyPIN");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMVerifyPIN(
      id,
      pValue,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMUnblockPIN(
    ULONG                      id,
    CHAR *                     pPUKValue,
    CHAR *                     pNewValue,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMUnblockPIN");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMUnblockPIN(
      id,
      pPUKValue,
      pNewValue,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMChangePIN(
    ULONG                      id,
    CHAR *                     pOldValue,
    CHAR *                     pNewValue,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMChangePIN");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMChangePIN(
      id,
      pOldValue,
      pNewValue,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMGetPINStatus(
    ULONG                      id,
    ULONG *                    pStatus,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMGetPINStatus");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMGetPINStatus(
      id,
      pStatus,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMGetICCID(
    BYTE                       stringSize,
    CHAR *                     pString) {
  CallWrapper cw(this, "UIMGetICCID");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMGetICCID(
      stringSize,
      pString));
}
ULONG Sdk::UIMGetControlKeyStatus(
    ULONG                      id,
    ULONG *                    pStatus,
    ULONG *                    pVerifyRetriesLeft,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMGetControlKeyStatus");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMGetControlKeyStatus(
      id,
      pStatus,
      pVerifyRetriesLeft,
      pUnblockRetriesLeft));
}

ULONG Sdk::UIMSetControlKeyProtection(
    ULONG                      id,
    ULONG                      status,
    CHAR *                     pValue,
    ULONG *                    pVerifyRetriesLeft) {
  CallWrapper cw(this, "UIMSetControlKeyProtection");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMSetControlKeyProtection(
      id,
      status,
      pValue,
      pVerifyRetriesLeft));
}

ULONG Sdk::UIMUnblockControlKey(
    ULONG                      id,
    CHAR *                     pValue,
    ULONG *                    pUnblockRetriesLeft) {
  CallWrapper cw(this, "UIMUnblockControlKey");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UIMUnblockControlKey(
      id,
      pValue,
      pUnblockRetriesLeft));
}

ULONG Sdk::GetPDSState(
    ULONG *                    pEnabled,
    ULONG *                    pTracking) {
  CallWrapper cw(this, "GetPDSState");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPDSState(
      pEnabled,
      pTracking));
}

ULONG Sdk::SetPDSState(ULONG enable) {
  CallWrapper cw(this, "SetPDSState");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPDSState(enable));
}

ULONG Sdk::PDSInjectTimeReference(
    ULONGLONG                  systemTime,
    USHORT                     systemDiscontinuities) {
  CallWrapper cw(this, "PDSInjectTimeReference");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::PDSInjectTimeReference(
      systemTime,
      systemDiscontinuities));
}

ULONG Sdk::GetPDSDefaults(
    ULONG *                    pOperation,
    BYTE *                     pTimeout,
    ULONG *                    pInterval,
    ULONG *                    pAccuracy) {
  CallWrapper cw(this, "GetPDSDefaults");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPDSDefaults(
      pOperation,
      pTimeout,
      pInterval,
      pAccuracy));
}

ULONG Sdk::SetPDSDefaults(
    ULONG                      operation,
    BYTE                       timeout,
    ULONG                      interval,
    ULONG                      accuracy) {
  CallWrapper cw(this, "SetPDSDefaults");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPDSDefaults(
      operation,
      timeout,
      interval,
      accuracy));
}

ULONG Sdk::GetXTRAAutomaticDownload(
    ULONG *                    pbEnabled,
    USHORT *                   pInterval) {
  CallWrapper cw(this, "GetXTRAAutomaticDownload");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetXTRAAutomaticDownload(
      pbEnabled,
      pInterval));
}

ULONG Sdk::SetXTRAAutomaticDownload(
    ULONG                      bEnabled,
    USHORT                     interval) {
  CallWrapper cw(this, "SetXTRAAutomaticDownload");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetXTRAAutomaticDownload(
      bEnabled,
      interval));
}

ULONG Sdk::GetXTRANetwork(ULONG * pPreference) {
  CallWrapper cw(this, "GetXTRANetwork");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetXTRANetwork(pPreference));
}

ULONG Sdk::SetXTRANetwork(ULONG preference) {
  CallWrapper cw(this, "SetXTRANetwork");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetXTRANetwork(preference));
}

ULONG Sdk::GetXTRAValidity(
    USHORT *                   pGPSWeek,
    USHORT *                   pGPSWeekOffset,
    USHORT *                   pDuration) {
  CallWrapper cw(this, "GetXTRAValidity");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetXTRAValidity(
      pGPSWeek,
      pGPSWeekOffset,
      pDuration));
}

ULONG Sdk::ForceXTRADownload() {
  CallWrapper cw(this, "ForceXTRADownload");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ForceXTRADownload());
}

ULONG Sdk::GetAGPSConfig(
    ULONG *                    pServerAddress,
    ULONG *                    pServerPort) {
  CallWrapper cw(this, "GetAGPSConfig");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetAGPSConfig(
      pServerAddress,
      pServerPort));
}

ULONG Sdk::SetAGPSConfig(
    ULONG                      serverAddress,
    ULONG                      serverPort) {
  CallWrapper cw(this, "SetAGPSConfig");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetAGPSConfig(
      serverAddress,
      serverPort));
}

ULONG Sdk::GetServiceAutomaticTracking(ULONG * pbAuto) {
  CallWrapper cw(this, "GetServiceAutomaticTracking");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetServiceAutomaticTracking(pbAuto));
}

ULONG Sdk::SetServiceAutomaticTracking(ULONG bAuto) {
  CallWrapper cw(this, "SetServiceAutomaticTracking");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetServiceAutomaticTracking(bAuto));
}

ULONG Sdk::GetPortAutomaticTracking(ULONG * pbAuto) {
  CallWrapper cw(this, "GetPortAutomaticTracking");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetPortAutomaticTracking(pbAuto));
}

ULONG Sdk::SetPortAutomaticTracking(ULONG bAuto) {
  CallWrapper cw(this, "SetPortAutomaticTracking");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPortAutomaticTracking(bAuto));
}

ULONG Sdk::ResetPDSData(
    ULONG *                    pGPSDataMask,
    ULONG *                    pCellDataMask) {
  CallWrapper cw(this, "ResetPDSData");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::ResetPDSData(
      pGPSDataMask,
      pCellDataMask));
}

ULONG Sdk::CATSendTerminalResponse(
    ULONG                      refID,
    ULONG                      dataLen,
    BYTE *                     pData) {
  CallWrapper cw(this, "CATSendTerminalResponse");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::CATSendTerminalResponse(
      refID,
      dataLen,
      pData));
}

ULONG Sdk::CATSendEnvelopeCommand(
    ULONG                      cmdID,
    ULONG                      dataLen,
    BYTE *                     pData) {
  CallWrapper cw(this, "CATSendEnvelopeCommand");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::CATSendEnvelopeCommand(
      cmdID,
      dataLen,
      pData));
}

ULONG Sdk::GetSMSWake(
    ULONG *                    pbEnabled,
    ULONG *                    pWakeMask) {
  CallWrapper cw(this, "GetSMSWake");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetSMSWake(
      pbEnabled,
      pWakeMask));
}

ULONG Sdk::SetSMSWake(
    ULONG                      bEnable,
    ULONG                      wakeMask) {
  CallWrapper cw(this, "SetSMSWake");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetSMSWake(
      bEnable,
      wakeMask));
}

ULONG Sdk::OMADMStartSession(ULONG sessionType) {
  CallWrapper cw(this, "OMADMStartSession");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMStartSession(sessionType));
}

ULONG Sdk::OMADMCancelSession() {
  CallWrapper cw(this, "OMADMCancelSession");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMCancelSession());
}

ULONG Sdk::OMADMGetSessionInfo(
    ULONG *                    pSessionState,
    ULONG *                    pSessionType,
    ULONG *                    pFailureReason,
    BYTE *                     pRetryCount,
    WORD *                     pSessionPause,
    WORD *                     pTimeRemaining) {
  CallWrapper cw(this, "OMADMGetSessionInfo");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMGetSessionInfo(
      pSessionState,
      pSessionType,
      pFailureReason,
      pRetryCount,
      pSessionPause,
      pTimeRemaining));
}

ULONG Sdk::OMADMGetPendingNIA(
    ULONG *                    pSessionType,
    USHORT *                   pSessionID) {
  CallWrapper cw(this, "OMADMGetPendingNIA");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMGetPendingNIA(
      pSessionType,
      pSessionID));
}

ULONG Sdk::OMADMSendSelection(
    ULONG                      selection,
    USHORT                     sessionID) {
  CallWrapper cw(this, "OMADMSendSelection");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMSendSelection(
      selection,
      sessionID));
}

ULONG Sdk::OMADMGetFeatureSettings(
    ULONG *                    pbProvisioning,
    ULONG *                    pbPRLUpdate) {
  CallWrapper cw(this, "OMADMGetFeatureSettings");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMGetFeatureSettings(
      pbProvisioning,
      pbPRLUpdate));
}

ULONG Sdk::OMADMSetProvisioningFeature(
    ULONG                      bProvisioning) {
  CallWrapper cw(this, "OMADMSetProvisioningFeature");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMSetProvisioningFeature(
      bProvisioning));
}

ULONG Sdk::OMADMSetPRLUpdateFeature(
    ULONG                      bPRLUpdate) {
  CallWrapper cw(this, "OMADMSetPRLUpdateFeature");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::OMADMSetPRLUpdateFeature(
      bPRLUpdate));
}

ULONG Sdk::UpgradeFirmware(CHAR * pDestinationPath) {
  CallWrapper cw(this, "UpgradeFirmware");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::UpgradeFirmware(pDestinationPath));
}

ULONG Sdk::GetImageInfo(
    CHAR *                     pPath,
    ULONG *                    pFirmwareID,
    ULONG *                    pTechnology,
    ULONG *                    pCarrier,
    ULONG *                    pRegion,
    ULONG *                    pGPSCapability) {
  CallWrapper cw(this, "GetImageInfo");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetImageInfo(
      pPath,
      pFirmwareID,
      pTechnology,
      pCarrier,
      pRegion,
      pGPSCapability));
}

ULONG Sdk::GetImageStore(
    WORD                       pathSize,
    CHAR *                     pImageStorePath) {
  CallWrapper cw(this, "GetImageStore");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::GetImageStore(
      pathSize,
      pImageStorePath));
}

ULONG Sdk::SetSessionStateCallback(tFNSessionState pCallback) {
  CallWrapper cw(this, "SetSessionStateCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetSessionStateCallback(pCallback));
}

ULONG Sdk::SetByteTotalsCallback(
    tFNByteTotals              pCallback,
    BYTE                       interval) {
  CallWrapper cw(this, "SetByteTotalsCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetByteTotalsCallback(
      pCallback,
      interval));
}

ULONG Sdk::SetDataCapabilitiesCallback(
    tFNDataCapabilities        pCallback) {
  CallWrapper cw(this, "SetDataCapabilitiesCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetDataCapabilitiesCallback(
      pCallback));
}

ULONG Sdk::SetDataBearerCallback(tFNDataBearer pCallback) {
  CallWrapper cw(this, "SetDataBearerCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetDataBearerCallback(pCallback));
}

ULONG Sdk::SetDormancyStatusCallback(
    tFNDormancyStatus          pCallback) {
  CallWrapper cw(this, "SetDormancyStatusCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetDormancyStatusCallback(
      pCallback));
}

ULONG Sdk::SetMobileIPStatusCallback(
    tFNMobileIPStatus          pCallback) {
  CallWrapper cw(this, "SetMobileIPStatusCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetMobileIPStatusCallback(
      pCallback));
}

ULONG Sdk::SetActivationStatusCallback(
    tFNActivationStatus        pCallback) {
  CallWrapper cw(this, "SetActivationStatusCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetActivationStatusCallback(
      pCallback));
}

ULONG Sdk::SetPowerCallback(tFNPower pCallback) {
  CallWrapper cw(this, "SetPowerCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPowerCallback(pCallback));
}
ULONG Sdk::SetRoamingIndicatorCallback(
    tFNRoamingIndicator        pCallback) {
  CallWrapper cw(this, "SetRoamingIndicatorCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetRoamingIndicatorCallback(
      pCallback));
}

ULONG Sdk::SetSignalStrengthCallback(
    tFNSignalStrength          pCallback,
    BYTE                       thresholdsSize,
    INT8 *                     pThresholds) {
  CallWrapper cw(this, "SetSignalStrengthCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetSignalStrengthCallback(
      pCallback,
      thresholdsSize,
      pThresholds));
}

ULONG Sdk::SetRFInfoCallback(tFNRFInfo pCallback) {
  CallWrapper cw(this, "SetRFInfoCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetRFInfoCallback(pCallback));
}

ULONG Sdk::SetLURejectCallback(tFNLUReject pCallback) {
  CallWrapper cw(this, "SetLURejectCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetLURejectCallback(pCallback));
}

ULONG Sdk::SetNewSMSCallback(tFNNewSMS pCallback) {
  CallWrapper cw(this, "SetNewSMSCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetNewSMSCallback(pCallback));
}

ULONG Sdk::SetNMEACallback(tFNNewNMEA pCallback) {
  CallWrapper cw(this, "SetNMEACallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetNMEACallback(pCallback));
}

ULONG Sdk::SetPDSStateCallback(tFNPDSState pCallback) {
  CallWrapper cw(this, "SetPDSStateCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetPDSStateCallback(pCallback));
}

ULONG Sdk::SetCATEventCallback(
    tFNCATEvent                pCallback,
    ULONG                      eventMask,
    ULONG *                    pErrorMask) {
  CallWrapper cw(this, "SetCATEventCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetCATEventCallback(
      pCallback,
      eventMask,
      pErrorMask));
}

ULONG Sdk::SetOMADMAlertCallback(tFNOMADMAlert pCallback) {
  CallWrapper cw(this, "SetOMADMAlertCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetOMADMAlertCallback(pCallback));
}

ULONG Sdk::SetOMADMStateCallback(tFNOMADMState pCallback) {
  CallWrapper cw(this, "SetOMADMStateCallback");
  RETURN_IF_CALL_WRAPPER_LOCKED(cw);
  return cw.CheckReturn(::SetOMADMStateCallback(pCallback));
}

}   // Namespace Gobi
