#ifndef GOBI_CROMO_PLUGIN_GOBI_SDK_WRAPPER_H_
#define GOBI_CROMO_PLUGIN_GOBI_SDK_WRAPPER_H_

/*===========================================================================
  FILE:
  gobi_sdk_wrapper.h,
  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 <pthread.h>
#include <stdlib.h>

#include <map>
#include <string>
#include <vector>

#include <base/macros.h>  // for DISALLOW_COPY_AND_ASSIGN
#include <base/memory/scoped_ptr.h>
#include <dbus/dbus.h>  // for DBus::Path &
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "gobi/GobiConnectionMgmtAPI.h"

// Session state callback function
typedef void (* tFNSessionState)(
   ULONG                      state,
   ULONG                      sessionEndReason );

// RX/TX byte counts callback function
typedef void (* tFNByteTotals)(
   ULONGLONG                  totalBytesTX,
   ULONGLONG                  totalBytesRX );

// Dormancy status callback function
typedef void (* tFNDormancyStatus)( ULONG dormancyStatus );

// Mobile IP status callback function
typedef void (* tFNMobileIPStatus)( ULONG mipStatus );

// Activation status callback function
typedef void (* tFNActivationStatus)( ULONG activationStatus );

// Power operating mode callback function
typedef void (* tFNPower)( ULONG operatingMode );

// Serving system data capabilities callback function
typedef void (* tFNDataCapabilities)(
   BYTE                       dataCapsSize,
   BYTE *                     pDataCaps );

// Data bearer technology callback function
typedef void (* tFNDataBearer)( ULONG dataBearer );

// Roaming indicator callback function
typedef void (* tFNRoamingIndicator)( ULONG roaming );

// Signal strength callback function
typedef void (* tFNSignalStrength)(
   INT8                       signalStrength,
   ULONG                      radioInterface );

// RF information callback function
typedef void (* tFNRFInfo)(
   ULONG                      radioInterface,
   ULONG                      activeBandClass,
   ULONG                      activeChannel );

// LU reject callback function
typedef void (* tFNLUReject)(
   ULONG                      serviceDomain,
   ULONG                      rejectCause );

// New SMS message callback function
typedef void (* tFNNewSMS)(
   ULONG                      storageType,
   ULONG                      messageIndex );

// New NMEA sentence callback function
typedef void (* tFNNewNMEA)( LPCSTR pNMEA );

// New NMEA sentence plus mode callback function
typedef void (* tFNNewNMEAPlus)(
   LPCSTR                     pNMEA,
   ULONG                      mode );

// PDS session state callback function
typedef void (* tFNPDSState)(
   ULONG                      enabledStatus,
   ULONG                      trackingStatus );

// CAT event callback function
typedef void (* tFNCATEvent)(
   ULONG                      eventID,
   ULONG                      eventLen,
   BYTE *                     pEventData );

// OMA-DM network initiated alert callback function
typedef void (* tFNOMADMAlert)(
   ULONG                      sessionType,
   USHORT                     sessionID );

// OMA-DM state callback function
typedef void (* tFNOMADMState)(
   ULONG                      sessionState,
   ULONG                      failureReason );


namespace gobi {

enum PowerMode {
  kOnline = 0,
  kLowPower = 1,
  kFactoryTest = 2,
  kOffline = 3,
  kReset = 4,
  kPowerOff = 5,
  kPersistentLowPower = 6,  // airplane mode
};

enum RegistrationState {
  kUnregistered = 0,
  kRegistered = 1,
  kSearching = 2,
  kRegistrationDenied = 3,
  kRegistrationStateUnknown = 4
};

enum OmadmSessionType {
  kConfigure = 0,
  kPrlUpdate = 1,
  kHandsFreeActivation = 2,
};

enum OmadmSessionState {
  // Table 2-11 of QC WWAN CM API
  kOmadmComplete = 0,
  kOmadmUpdateInformationUnavailable = 1,
  kOmadmFailed = 2,

  // Artificial state: The last state that signifies that the OMADM
  // session is over.
  kOmadmMaxFinal = 2,
  kOmadmRetrying = 3,
  kOmadmConnecting = 4,
  kOmadmConnected = 5,
  kOmadmAuthenticated = 6,
  kOmadmMdnDownloaded = 7,
  kOmadmMsidDownloaded = 8,
  kOmadmPrlDownloaded = 9,
  kOmadmMipProfiledDownloaded = 10,
};

enum ActivationState {
  kNotActivated = 0,
  kActivated = 1,
  kActivationConnecting = 2,
  kActivationConnected = 3,
  kOtaspAuthenticated = 4,
  kOtaspNamDownloaded = 5,
  kOtaspMdnDownloaded = 6,
  kOtaspImsiDownloaded = 7,
  kOtaspPrlDownloaded = 8,
  kOtaspSpcDownloaded = 9,
  kOtaspSettingsCommitted = 10,
};

enum GsmRegistrationType {
  kRegistrationTypeAutomatic = 1,
  kRegistrationTypeManual = 2
};

enum SessionState {
  kDisconnected = 1,
  kConnected = 2,
  kSuspended = 3,
  kAuthenticating = 4
};

enum RadioInterfaceTechnology {
  kRfiNoService = 0,
  kRfiCdma1xRtt = 1,
  kRfiCdmaEvdo = 2,
  kRfiAmps = 3,
  kRfiGsm = 4,
  kRfiUmts = 5
};

enum DataBearerTechnology {
  kDataBearerCdma1xRtt = 1,
  kDataBearerCdmaEvdo = 2,
  kDataBearerGprs = 3,
  kDataBearerWcdma = 4,
  kDataBearerCdmaEvdoRevA = 5,
  kDataBearerEdge = 6,
  kDataBearerHsdpaDlWcdmaUl = 7,
  kDataBearerWcdmaDlUsupaUl = 8,
  kDataBearerHsdpaDlHsupaUl = 9
};

enum DataCapability {
  kDataCapGprs = 1,
  kDataCapEdge = 2,
  kDataCapHsdpa = 3,
  kDataCapHsupa = 4,
  kDataCapWcdma = 5,
  kDataCapCdma1xRtt = 6,
  kDataCapCdmaEvdoRev0 = 7,
  kDataCapCdmaEvdoRevA = 8,
  kDataCapGsm = 9
};

enum ConfiguredTechnology {
  kConfigurationCdma = 0,
  kConfigurationUmts = 1,
  kConfigurationUnknownTechnology = 0xffffffff
};

enum RoamingState {
  kRoaming = 0,
  kHome = 1,
  kRoamingPartner = 2
};

// Selected return codes from table 2-3 of QC WWAN CM API
enum ReturnCode {
  kGeneralError = 1,
  kErrorSendingQmiRequest = 12,
  kErrorReceivingQmiRequest = 13,
  kTimeoutReceivingQmiRequest = 15,
  kNoAvailableSignal = 29,
  kErrorNeedsReset = 34,
  kInvalidPinId = 1011,
  kIncorrectPinId = 1012,
  kCallFailed = 1014,
  kNotProvisioned = 1016,
  kNotSupportedByNetwork = 1024,
  kNotSupportedByDevice = 1025,
  kOperationHasNoEffect = 1026,
  kPinBlocked = 1035,
  kPinPermanentlyBlocked = 1036,
  kNoTrackingSessionHasBeenStarted = 1065,
  kInformationElementUnavailable = 1074,
  kAccessToRequiredEntityNotAvailable = 1082,
  kQMIHardwareRestricted = 1083,

  // CrOS made-up code (31 random bits.  Number does not appear in
  // Gobi SDK sources in hex or decimal).  Returned when a call is
  // made to a Gobi subsystem that already has a call pending.
  kCrosGobiSubsystemInUse = 0x74b97cc5,
};

enum DormancyStatus {
  kDormant = 1,
  kNotDormant = 2
};

enum SmsMessageStorageType {
  kSmsUim = 0,
  kSmsNonVolatileMemory = 1
};

enum SmsMessageTag {
  kSmsRead = 0,
  kSmsNotRead = 1,
  kSmsMobileOrigAndSent = 2,
  kSmsMobileOrigNotSent = 3
};

// Selected call failure reasons from table 2-4 "Call end reason codes"
enum CallEndReason {
  kReasonClientEndedCall = 2,
  kReasonNoService = 3,
  kReasonBadApn = 1013,
  kReasonNotSubscribed = 1018
};

enum PinId {
  kPinId1 = 1,
  kPinId2 = 2,
};

static const unsigned int kPinRetriesLeftUnknown = 0xffffffff;

enum PinStatus {
  kPinStatusNotInitialized = 0,
  kPinStatusEnabled = 1,
  kPinStatusVerified = 2,
  kPinStatusDisabled = 3,
  kPinStatusBlocked = 4,
  kPinStatusPermanentlyBlocked = 5
};

enum RegistrationTechnologyPreference {
  kRegistrationTechnologyAutomatic = 0,
  kRegistrationTechnologyCdma = 1,
  kRegistrationTechnologyUmts = 2
};

enum RegistrationTechnologyPreferenceCdma {
  kRegistrationTechnologyPreferenceCdma1xRtt = 2,
  kRegistrationTechnologyPreferenceCdmaEvdo = 4
};

enum RegistrationTechnologyPreferenceUmts {
  kRegistrationTechnologyPreferenceUmtsGsm = 1,
  kRegistrationTechnologyPreferenceUmtsWcdma = 2
};

enum RegistrationPreferencePersistence {
  kRegistrationPreferencePersistent = 0,
  kRegistrationPreferencePowerCycleOnly = 1
};

typedef struct {
  ULONG radioInterface;
  ULONG activeBandClass;
  ULONG activeChannel;
} RfInfoInstance;

static const unsigned int kGsmNetInfoUnknown = 0;
static const unsigned int kGsmNetInfoYes = 1;
static const unsigned int kGsmNetInfoNo = 2;

typedef struct __attribute__ ((__packed__)) {
  WORD mcc;
  WORD mnc;
  ULONG inUse;
  ULONG roaming;
  ULONG forbidden;
  ULONG preferred;
  CHAR description[255];
} GsmNetworkInfoInstance;

typedef struct {
  WORD mcc;
  WORD mnc;
  WORD radioAccessTech;
} GsmNetworkRATInfoInstance;

struct DeviceElement {
  char deviceNode[256];
  char deviceKey[16];
};

struct ReentrancyGroup;

struct CharStarCopier {
  // Make a temporary, writable, copy of a char *, preserving the
  // NULL-ness of the input.
 public:
  explicit CharStarCopier(const char *in) {
    if (!in) {
      // str_ is constructed as nullptr
    } else {
      str_.reset(strdup(in));
    }
  }
  ~CharStarCopier() {
    // We sometimes pass sensitive information
    if (str_.get()) {
      memset(str_.get(), '\0', strlen(str_.get()));
    }
  }
  char *get() {
    return str_.get();
  }

 private:
  scoped_ptr<char, base::FreeDeleter> str_;
  DISALLOW_COPY_AND_ASSIGN(CharStarCopier);
};


class Sdk {
 public:
  typedef void (*SdkErrorSink)(const std::string &modem_path,
                               const std::string &sdk_function,
                               ULONG error);

  // SdkErrorSink is called if an SDK function returns an error.
  // The GobiModem class uses this to decide if an error warrants
  // resetting the modem
  explicit Sdk(SdkErrorSink sink) : sdk_error_sink_(sink) {}
  virtual ~Sdk() {}

  virtual void set_current_modem_path(const std::string &path) {
    current_modem_path_ = path;
  }

  virtual void Init();

  // Future calls to the sdk will return this error
  virtual void InjectFaultSdkError(int error);

  virtual ULONG QCWWANEnumerateDevices(
      BYTE *                     pDevicesSize,
      BYTE *                     pDevices);

  virtual ULONG QCWWANConnect(
      CHAR *                     pDeviceNode,
      CHAR *                     pDeviceKey);

  virtual ULONG QCWWANDisconnect();

  virtual ULONG QCWWANGetConnectedDeviceID(
      ULONG                      deviceNodeSize,
      CHAR *                     pDeviceNode,
      ULONG                      deviceKeySize,
      CHAR *                     pDeviceKey);

  virtual ULONG GetSessionState(ULONG * pState);

  virtual ULONG GetSessionDuration(ULONGLONG * pDuration);

  virtual ULONG GetDormancyState(ULONG * pState);

  virtual ULONG GetAutoconnect(ULONG * pSetting);

  virtual ULONG SetAutoconnect(ULONG setting);

  virtual ULONG SetDefaultProfile(
      ULONG                      profileType,
      ULONG *                    pPDPType,
      ULONG *                    pIPAddress,
      ULONG *                    pPrimaryDNS,
      ULONG *                    pSecondaryDNS,
      ULONG *                    pAuthentication,
      CHAR *                     pName,
      CHAR *                     pAPNName,
      CHAR *                     pUsername,
      CHAR *                     pPassword);

  virtual 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);

  virtual ULONG StartDataSession(
      ULONG *                    pTechnology,
      const CHAR *               pAPNName,
      ULONG *                    pAuthentication,
      const CHAR *               pUsername,
      const CHAR *               pPassword,
      ULONG *                    pSessionId,
      ULONG *                    pFailureReason);

  // Calls QCWWANCancel and CancelDataSession.
  virtual ULONG CancelStartDataSession();

  virtual ULONG StopDataSession(ULONG sessionId);

  virtual ULONG GetIPAddress(ULONG * pIPAddress);

  virtual ULONG GetConnectionRate(
      ULONG *                    pCurrentChannelTXRate,
      ULONG *                    pCurrentChannelRXRate,
      ULONG *                    pMaxChannelTXRate,
      ULONG *                    pMaxChannelRXRate);

  virtual ULONG GetPacketStatus(
      ULONG *                    pTXPacketSuccesses,
      ULONG *                    pRXPacketSuccesses,
      ULONG *                    pTXPacketErrors,
      ULONG *                    pRXPacketErrors,
      ULONG *                    pTXPacketOverflows,
      ULONG *                    pRXPacketOverflows);

  virtual ULONG GetByteTotals(
      ULONGLONG *                pTXTotalBytes,
      ULONGLONG *                pRXTotalBytes);

  virtual ULONG SetMobileIP(ULONG mode);

  virtual ULONG GetMobileIP(ULONG * pMode);

  virtual ULONG SetActiveMobileIPProfile(
      CHAR *                     pSPC,
      BYTE                       index);

  virtual ULONG GetActiveMobileIPProfile(BYTE * pIndex);

  virtual 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);

  virtual 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);

  virtual ULONG SetMobileIPParameters(
      CHAR *                     pSPC,
      ULONG *                    pMode,
      BYTE *                     pRetryLimit,
      BYTE *                     pRetryInterval,
      BYTE *                     pReRegPeriod,
      BYTE *                     pReRegTraffic,
      BYTE *                     pHAAuthenticator,
      BYTE *                     pHA2002bis);

  virtual ULONG GetMobileIPParameters(
      ULONG *                    pMode,
      BYTE *                     pRetryLimit,
      BYTE *                     pRetryInterval,
      BYTE *                     pReRegPeriod,
      BYTE *                     pReRegTraffic,
      BYTE *                     pHAAuthenticator,
      BYTE *                     pHA2002bis);

  virtual ULONG GetLastMobileIPError(ULONG * pError);

  virtual ULONG GetANAAAAuthenticationStatus(ULONG * pStatus);

  virtual ULONG GetSignalStrengths(
      ULONG *                    pArraySizes,
      INT8 *                     pSignalStrengths,
      ULONG *                    pRadioInterfaces);

  virtual ULONG GetRFInfo(
      BYTE *                     pInstanceSize,
      BYTE *                     pInstances);

  virtual ULONG PerformNetworkScan(
      BYTE *                     pInstanceSize,
      BYTE *                     pInstances);

  virtual ULONG PerformNetworkRATScan(
      BYTE *                     pInstanceSize,
      BYTE *                     pInstances,
      BYTE *                     pRATSize,
      BYTE *                     pRATInstances);

  virtual ULONG InitiateNetworkRegistration(
      ULONG                      regType,
      WORD                       mcc,
      WORD                       mnc,
      ULONG                      rat);

  virtual ULONG InitiateDomainAttach(ULONG action);

  virtual ULONG GetServingNetwork(
      ULONG *                    pRegistrationState,
      ULONG *                    pRAN,
      BYTE *                     pRadioIfacesSize,
      BYTE *                     pRadioIfaces,
      ULONG *                    pRoaming,
      WORD *                     pMCC,
      WORD *                     pMNC,
      BYTE                       nameSize,
      CHAR *                     pName);

  virtual ULONG GetServingNetworkCapabilities(
      BYTE *                     pDataCapsSize,
      BYTE *                     pDataCaps);

  virtual ULONG GetDataBearerTechnology(ULONG * pDataBearer);

  virtual ULONG GetHomeNetwork(
      WORD *                     pMCC,
      WORD *                     pMNC,
      BYTE                       nameSize,
      CHAR *                     pName,
      WORD *                     pSID,
      WORD *                     pNID);

  virtual ULONG SetNetworkPreference(
      ULONG                      technologyPref,
      ULONG                      duration);

  virtual ULONG GetNetworkPreference(
      ULONG *                    pTechnologyPref,
      ULONG *                    pDuration,
      ULONG *                    pPersistentTechnologyPref);

  virtual ULONG SetCDMANetworkParameters(
      CHAR *                     pSPC,
      BYTE *                     pForceRev0,
      BYTE *                     pCustomSCP,
      ULONG *                    pProtocol,
      ULONG *                    pBroadcast,
      ULONG *                    pApplication,
      ULONG *                    pRoaming);

  virtual ULONG GetCDMANetworkParameters(
      BYTE *                     pSCI,
      BYTE *                     pSCM,
      BYTE *                     pRegHomeSID,
      BYTE *                     pRegForeignSID,
      BYTE *                     pRegForeignNID,
      BYTE *                     pForceRev0,
      BYTE *                     pCustomSCP,
      ULONG *                    pProtocol,
      ULONG *                    pBroadcast,
      ULONG *                    pApplication,
      ULONG *                    pRoaming);

  virtual ULONG GetACCOLC(BYTE * pACCOLC);

  virtual ULONG SetACCOLC(
      CHAR *                     pSPC,
      BYTE                       accolc);

  virtual ULONG GetPLMNName(
      USHORT                     mcc,
      USHORT                     mnc,
      ULONG *                    pNamesSize,
      BYTE *                     pNames);

  virtual ULONG GetDeviceCapabilities(
      ULONG *                    pMaxTXChannelRate,
      ULONG *                    pMaxRXChannelRate,
      ULONG *                    pDataServiceCapability,
      ULONG *                    pSimCapability,
      ULONG *                    pRadioIfacesSize,
      BYTE *                     pRadioIfaces);

  virtual ULONG GetManufacturer(
      BYTE                       stringSize,
      CHAR *                     pString);

  virtual ULONG GetModelID(
      BYTE                       stringSize,
      CHAR *                     pString);

  virtual ULONG GetFirmwareRevision(
      BYTE                       stringSize,
      CHAR *                     pString);

  virtual ULONG GetFirmwareRevisions(
      BYTE                       amssSize,
      CHAR *                     pAMSSString,
      BYTE                       bootSize,
      CHAR *                     pBootString,
      BYTE                       priSize,
      CHAR *                     pPRIString);

  virtual ULONG GetFirmwareInfo(
      ULONG *                    pFirmwareID,
      ULONG *                    pTechnology,
      ULONG *                    pCarrier,
      ULONG *                    pRegion,
      ULONG *                    pGPSCapability);

  virtual ULONG GetVoiceNumber(
      BYTE                       voiceNumberSize,
      CHAR *                     pVoiceNumber,
      BYTE                       minSize,
      CHAR *                     pMIN);

  virtual ULONG GetIMSI(
      BYTE                       stringSize,
      CHAR *                     pString);

  virtual ULONG GetSerialNumbers(
      BYTE                       esnSize,
      CHAR *                     pESNString,
      BYTE                       imeiSize,
      CHAR *                     pIMEIString,
      BYTE                       meidSize,
      CHAR *                     pMEIDString);

  virtual ULONG SetLock(
      ULONG                      state,
      CHAR *                     pCurrentPIN);

  virtual ULONG QueryLock(ULONG * pState);

  virtual ULONG ChangeLockPIN(
      CHAR *                     pCurrentPIN,
      CHAR *                     pDesiredPIN);

  virtual ULONG GetHardwareRevision(
      BYTE                       stringSize,
      CHAR *                     pString);

  virtual ULONG GetPRLVersion(WORD * pPRLVersion);

  virtual ULONG GetERIFile(
      ULONG *                    pFileSize,
      BYTE *                     pFile);

  virtual ULONG ActivateAutomatic(const CHAR * pActivationCode);

  virtual ULONG ActivateManual(
      const CHAR *               pSPC,
      WORD                       sid,
      const CHAR *               pMDN,
      const CHAR *               pMIN,
      ULONG                      prlSize,
      BYTE *                     pPRL,
      const CHAR *               pMNHA,
      const CHAR *               pMNAAA);

  virtual ULONG ResetToFactoryDefaults(CHAR * pSPC);

  virtual ULONG GetActivationState(ULONG * pActivationState);

  virtual ULONG SetPower(ULONG powerMode);

  virtual ULONG GetPower(ULONG * pPowerMode);

  virtual ULONG GetOfflineReason(
      ULONG *                    pReasonMask,
      ULONG *                    pbPlatform);

  virtual ULONG GetNetworkTime(
      ULONGLONG *                pTimeCount,
      ULONG *                    pTimeSource);

  virtual ULONG ValidateSPC(CHAR * pSPC);

  virtual ULONG DeleteSMS(
      ULONG                      storageType,
      ULONG *                    pMessageIndex,
      ULONG *                    pMessageTag);

  virtual ULONG GetSMSList(
      ULONG                      storageType,
      ULONG *                    pRequestedTag,
      ULONG *                    pMessageListSize,
      BYTE *                     pMessageList);

  virtual ULONG GetSMS(
      ULONG                      storageType,
      ULONG                      messageIndex,
      ULONG *                    pMessageTag,
      ULONG *                    pMessageFormat,
      ULONG *                    pMessageSize,
      BYTE *                     pMessage);

  virtual ULONG ModifySMSStatus(
      ULONG                      storageType,
      ULONG                      messageIndex,
      ULONG                      messageTag);

  virtual ULONG SaveSMS(
      ULONG                      storageType,
      ULONG                      messageFormat,
      ULONG                      messageSize,
      BYTE *                     pMessage,
      ULONG *                    pMessageIndex);

  virtual ULONG SendSMS(
      ULONG                      messageFormat,
      ULONG                      messageSize,
      BYTE *                     pMessage,
      ULONG *                    pMessageFailureCode);

  virtual ULONG GetSMSCAddress(
      BYTE                       addressSize,
      CHAR *                     pSMSCAddress,
      BYTE                       typeSize,
      CHAR *                     pSMSCType);

  virtual ULONG SetSMSCAddress(
      CHAR *                     pSMSCAddress,
      CHAR *                     pSMSCType);

  virtual ULONG UIMSetPINProtection(
      ULONG                      id,
      ULONG                      bEnable,
      CHAR *                     pValue,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMVerifyPIN(
      ULONG                      id,
      CHAR *                     pValue,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMUnblockPIN(
      ULONG                      id,
      CHAR *                     pPUKValue,
      CHAR *                     pNewValue,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMChangePIN(
      ULONG                      id,
      CHAR *                     pOldValue,
      CHAR *                     pNewValue,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMGetPINStatus(
      ULONG                      id,
      ULONG *                    pStatus,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMGetICCID(
      BYTE                       stringSize,
      CHAR *                     pString);
  virtual ULONG UIMGetControlKeyStatus(
      ULONG                      id,
      ULONG *                    pStatus,
      ULONG *                    pVerifyRetriesLeft,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG UIMSetControlKeyProtection(
      ULONG                      id,
      ULONG                      status,
      CHAR *                     pValue,
      ULONG *                    pVerifyRetriesLeft);

  virtual ULONG UIMUnblockControlKey(
      ULONG                      id,
      CHAR *                     pValue,
      ULONG *                    pUnblockRetriesLeft);

  virtual ULONG GetPDSState(
      ULONG *                    pEnabled,
      ULONG *                    pTracking);

  virtual ULONG SetPDSState(ULONG enable);

  virtual ULONG PDSInjectTimeReference(
      ULONGLONG                  systemTime,
      USHORT                     systemDiscontinuities);

  virtual ULONG GetPDSDefaults(
      ULONG *                    pOperation,
      BYTE *                     pTimeout,
      ULONG *                    pInterval,
      ULONG *                    pAccuracy);

  virtual ULONG SetPDSDefaults(
      ULONG                      operation,
      BYTE                       timeout,
      ULONG                      interval,
      ULONG                      accuracy);

  virtual ULONG GetXTRAAutomaticDownload(
      ULONG *                    pbEnabled,
      USHORT *                   pInterval);

  virtual ULONG SetXTRAAutomaticDownload(
      ULONG                      bEnabled,
      USHORT                     interval);

  virtual ULONG GetXTRANetwork(ULONG * pPreference);

  virtual ULONG SetXTRANetwork(ULONG preference);

  virtual ULONG GetXTRAValidity(
      USHORT *                   pGPSWeek,
      USHORT *                   pGPSWeekOffset,
      USHORT *                   pDuration);

  virtual ULONG ForceXTRADownload();

  virtual ULONG GetAGPSConfig(
      ULONG *                    pServerAddress,
      ULONG *                    pServerPort);

  virtual ULONG SetAGPSConfig(
      ULONG                      serverAddress,
      ULONG                      serverPort);

  virtual ULONG GetServiceAutomaticTracking(ULONG * pbAuto);

  virtual ULONG SetServiceAutomaticTracking(ULONG bAuto);

  virtual ULONG GetPortAutomaticTracking(ULONG * pbAuto);

  virtual ULONG SetPortAutomaticTracking(ULONG bAuto);

  virtual ULONG ResetPDSData(
      ULONG *                    pGPSDataMask,
      ULONG *                    pCellDataMask);

  virtual ULONG CATSendTerminalResponse(
      ULONG                      refID,
      ULONG                      dataLen,
      BYTE *                     pData);

  virtual ULONG CATSendEnvelopeCommand(
      ULONG                      cmdID,
      ULONG                      dataLen,
      BYTE *                     pData);

  virtual ULONG GetSMSWake(
      ULONG *                    pbEnabled,
      ULONG *                    pWakeMask);

  virtual ULONG SetSMSWake(
      ULONG                      bEnable,
      ULONG                      wakeMask);

  virtual ULONG OMADMStartSession(ULONG sessionType);

  virtual ULONG OMADMCancelSession();

  virtual ULONG OMADMGetSessionInfo(
      ULONG *                    pSessionState,
      ULONG *                    pSessionType,
      ULONG *                    pFailureReason,
      BYTE *                     pRetryCount,
      WORD *                     pSessionPause,
      WORD *                     pTimeRemaining);

  virtual ULONG OMADMGetPendingNIA(
      ULONG *                    pSessionType,
      USHORT *                   pSessionID);

  virtual ULONG OMADMSendSelection(
      ULONG                      selection,
      USHORT                     sessionID);

  virtual ULONG OMADMGetFeatureSettings(
      ULONG *                    pbProvisioning,
      ULONG *                    pbPRLUpdate);

  virtual ULONG OMADMSetProvisioningFeature(
      ULONG                      bProvisioning);

  virtual ULONG OMADMSetPRLUpdateFeature(
      ULONG                      bPRLUpdate);

  virtual ULONG UpgradeFirmware(CHAR * pDestinationPath);

  virtual ULONG GetImageInfo(
      CHAR *                     pPath,
      ULONG *                    pFirmwareID,
      ULONG *                    pTechnology,
      ULONG *                    pCarrier,
      ULONG *                    pRegion,
      ULONG *                    pGPSCapability);

  virtual ULONG GetImageStore(
      WORD                       pathSize,
      CHAR *                     pImageStorePath);

  virtual ULONG SetSessionStateCallback(tFNSessionState pCallback);

  virtual ULONG SetByteTotalsCallback(
      tFNByteTotals              pCallback,
      BYTE                       interval);

  virtual ULONG SetDataCapabilitiesCallback(
      tFNDataCapabilities        pCallback);

  virtual ULONG SetDataBearerCallback(tFNDataBearer pCallback);

  virtual ULONG SetDormancyStatusCallback(
      tFNDormancyStatus          pCallback);

  virtual ULONG SetMobileIPStatusCallback(
      tFNMobileIPStatus          pCallback);

  virtual ULONG SetActivationStatusCallback(
      tFNActivationStatus        pCallback);

  virtual ULONG SetPowerCallback(tFNPower pCallback);

  virtual ULONG SetRoamingIndicatorCallback(
      tFNRoamingIndicator        pCallback);

  virtual ULONG SetSignalStrengthCallback(
      tFNSignalStrength          pCallback,
      BYTE                       thresholdsSize,
      INT8 *                     pThresholds);

  virtual ULONG SetRFInfoCallback(tFNRFInfo pCallback);

  virtual ULONG SetLURejectCallback(tFNLUReject pCallback);

  virtual ULONG SetNewSMSCallback(tFNNewSMS pCallback);

  virtual ULONG SetNMEACallback(tFNNewNMEA pCallback);

  virtual ULONG SetPDSStateCallback(tFNPDSState pCallback);

  virtual ULONG SetCATEventCallback(
      tFNCATEvent                pCallback,
      ULONG                      eventMask,
      ULONG *                    pErrorMask);

  virtual ULONG SetOMADMAlertCallback(tFNOMADMAlert pCallback);

  virtual ULONG SetOMADMStateCallback(tFNOMADMState pCallback);

  virtual GobiType GetDeviceType();

 protected:
  class CallWrapper {
   public:
    CallWrapper(Sdk *sdk, const char *name);
    ULONG CheckReturn(ULONG rc);
    ~CallWrapper();
    Sdk *sdk_;
    const char *function_name_;
    bool sdk_locked_;
   private:
    DISALLOW_COPY_AND_ASSIGN(CallWrapper);
  };

  // The CMAPI is split into groups.  Functions in multiple groups can
  // be called simultaneously, but each group is nonreentrant against
  // itself.  This machinery takes care of this

  // Returns kCrosGobiSubsystemInUse if it cannot get the lock for a subsystem
  ULONG EnterSdk(const char *function_name);
  void LeaveSdk(const char *function_name);

  void InitGetServiceFromName(const char *service_map[]);
  int GetServiceFromName(const char *name);

  // Given a starting service of begin, what services should we cover?
  // Returns max service if supplied with kServiceBase, else begin + 1
  int GetServiceBound(int begin);

  std::map<int, const char*> index_to_service_name_;
  std::map<std::string, int> name_to_service_;
  int service_index_upper_bound_;

  // mutex-protected mapping from a service index to the
  // currently-executing function in that service.
  pthread_mutex_t service_to_function_mutex_;
  std::vector<const char*> service_to_function_;

  SdkErrorSink sdk_error_sink_;
  std::string current_modem_path_;

  // Always return this error if != 0
  int fault_inject_sdk_error_;

  friend class CallWrapper;
  FRIEND_TEST(GobiSdkTest, BaseClosesAllDeathTest);
  FRIEND_TEST(GobiSdkTest, EnterLeaveDeathTest);
  FRIEND_TEST(GobiSdkTest, InitGetServiceFromNameDeathTest);
  FRIEND_TEST(GobiSdkTest, InitGetServiceFromName);
  FRIEND_TEST(GobiSdkTest, InterleavedSdkCalls);
  FRIEND_TEST(GobiSdkTest, CharStarCopier);

 private:
  DISALLOW_COPY_AND_ASSIGN(Sdk);
};  // Class Sdk

}   // namespace gobi

#endif  // GOBI_CROMO_PLUGIN_GOBI_SDK_WRAPPER_H_
