(******************************************************************************
 *
 * Copyright (c) 1997-2000 Palm, Inc. or its subsidiaries.
 * All rights reserved.
 *
 * File: SmsLib.h
 *
 * Release: Palm OS SDK 4.0 (63220)
 *
 * Description:
 *    Include file for PalmOS SMS Library
 *
 * History:
 *    1/26/00 Created by Hatem Oueslati
 *    3/01/00  Ludovic Ferrandis - Add API
 *    8/28/00  Ludovic Ferrandis - Update structure
 *
 *****************************************************************************)

{$IFNDEF FPC_DOTTEDUNITS}
unit smslib;
{$ENDIF FPC_DOTTEDUNITS}

interface

{$IFDEF FPC_DOTTEDUNITS}
uses  PalmApi.Palmos, PalmApi.Errorbase, PalmApi.Exgmgr, PalmApi.Telephonymgrui, PalmApi.Telephonymgrtypes, PalmApi.Telephonymgr;
{$ELSE FPC_DOTTEDUNITS}
uses  palmos, errorbase, exgmgr, telephonymgrui, telephonymgrtypes, telephonymgr;
{$ENDIF FPC_DOTTEDUNITS}

// The Sms library is used as an Exchange library. ExgLib.h defines all the
// primary entrypoints into the library. The rest of this include file defines the
// specials opCodes used in the ExgControl function and the structure used in the
// socketRef field of the Exchange Manager Socket structure.

(****************************************************************************
 *
 * ExgLibControl opcodes
 *
 ****************************************************************************)

// Those Op codes take SmsPrefType as parameter
const
  exgLibSmsPrefGetOp            = exgLibCtlSpecificOp or 1;
  exgLibSmsPrefGetDefaultOp     = exgLibCtlSpecificOp or 2;
  exgLibSmsPrefSetOp            = exgLibCtlSpecificOp or 3;

// This Op code takes a network type constant as parameter kSmsNetworkXxx
  exgLibSmsPrefDisplayOp        = exgLibCtlSpecificOp or 4;

// This Op code takes an UInt16 as parameter
  exgLibSmsIncompleteGetCountOp = exgLibCtlSpecificOp or 5;

// This OpCode takes a SmsID (UInt16) as parameter
  exgLibSmsIncompleteDeleteOp   = exgLibCtlSpecificOp or 6;

(****************************************************************************
 *
 * Types and Constants
 *
 ****************************************************************************)

const
  kSmsLibName = 'SMS Library'; // name of Sms library

// Feature Creators and numbers, for use with the FtrGet() call. This
// feature can be obtained to get the current version of the Sms Library
const
  kSmsFtrNumVersion       = UInt16(0);

// $MMmfsbbb, where MM is major version, m is minor version
// f is bug fix, s is stage: 3-release, 2-beta, 1-alpha, 0-development,
// bbb is build number for non-releases
// V1.12b3   would be: $01122003
// V2.00a2   would be: $02001002
// V1.01     would be: $01013000

const
  kSmsMessageRegExtensionType = 'sms';
  kSmsReportRegExtensionType  = 'rps';
  kSmsExtensionTypeLength     = 3;

  kSmsScheme                  = '_sms';

  kSmsMaxPhoneSize            = kTelMaxPhoneNumberLen + 1; // Max length for Phone number

  kSmsNBSConverter            = UInt8(0); // NBS header will be add to the data
  kSmsNoConverter             = UInt8(1); // No header will be add to the data.

  kSmsRowDataEncoding         = UInt8(0); // 8 bit encoding scheme
  kSmsTextEncoding            = UInt8(1); // 7 bit compressed encoding scheme.

  kSmsNetworkAuto             = UInt8(-1);
  kSmsNetworkCDMA             = UInt8(kTelNwkCDMA);
  kSmsNetworkGSM              = UInt8(kTelNwkGSM);
  kSmsNetworkTDMA             = UInt8(kTelNwkTDMA);
  kSmsNetworkPDC              = UInt8(kTelNwkPDC);

  kSmsMessageType             = UInt8(0);
  kSmsIncompleteType          = UInt8(1);
  kSmsReportType              = UInt8(2);

(****************************************************************************
 *
 * Sms Error
 *
 ****************************************************************************)

const kSmsErrMaxSizeExceeded = smsErrorClass or $01; // Message exceeds maximum size supported by network

(****************************************************************************
 *
 * Data Structures
 *
 ****************************************************************************)

(****************************************************************************
 * Report parameters
 ****************************************************************************)

(* Report Parameters Type
   ---------------------- *)
type
  SmsReportParamsType = record
    timeStamp: UInt32;         // TimeStamp of the report (when delivered, or last attempt, ...)
    index: UInt16;             // SMS index on the phone storage
    reportType: UInt8;         // Delivery report type
    report: UInt8;             // Status report indicator
    originatingAddress: PAnsiChar; // Phone number to which belong the report (was sent)
  end;
  SmsReportParamsTag = SmsReportParamsType;
  SmsReportParamsPtr = ^SmsReportParamsType;

(****************************************************************************
 * Send parameters
 ****************************************************************************)

(* Advanced Parameters Type for TDMA & CDMA network
   ------------------------------------------------ *)
type
  SmsSendCDMAParamsType = record
   messageType: UInt8; // Message Type

   deferredDate: TelSmsDateTimeType;

   priority: UInt8;
   privacy: UInt8;

   bits: UInt8;
{
   alertOnDelivery: UInt8 ; //:1
   manualAckRequest: UInt8; //:1
   reserved: UInt8;         //:6
}
   callbackNumber: PAnsiChar; // Address to reply
  end;
  SmsSendCDMAParamsTag = SmsSendCDMAParamsType;
  SmsSendCDMAParamsPtr = ^SmsSendCDMAParamsType;

  SmsSendTDMAParamsType = SmsSendCDMAParamsType;
  SmsSendTDMAParamsPtr  = ^SmsSendCDMAParamsType;

(* Advanced Parameters Type for GSM network
   ---------------------------------------- *)

type
  SmsSendGSMParamsType = record
    protocolId: UInt16;         // Reserved - not supported (Fax, paging, . . .)
    serviceCenterNumber: PAnsiChar; // SMS Center number - Optionel

    rejectDuplicated: Boolean;  // Network must reject msg if the same exists
    replyPath: Boolean;         // Use reply specified path
  end;
  SmsSendGSMParamsTag = SmsSendGSMParamsType;
  SmsSendGSMParamsPtr = ^SmsSendGSMParamsType;


(* SMS Send Parameters Type
   ------------------------ *)

type
  SmsSendParamsType = record
    validityPeriod: TelSmsDateTimeType;  // SMS validity Period
    destinationAddress: PAnsiChar;           // recipient number -> to send the sms to

    bits: UInt8;
{
    networkDeliveryRequested: UInt8;     // (:1) Sms report wanted
    ignoreDefaultValue: UInt8;           // (:1) If false, the field validityPeriod, ackRequested, reportRequested, smsCenter are ignored.
    reserved: UInt8;                     // (:6)
}
    partCount: UInt16;                   // number of parts of the SMS (output)
    lastPart: UInt16;                    // if error, the last part sent (output)

    converter: UInt8;                    // How the data are going to be typed (0 = NBS, 1 = None)

    case Integer of                      // union 'protocol'
      1: (gsm: SmsSendGSMParamsType);
      2: (cdma: SmsSendCDMAParamsType);
      3: (tdma: SmsSendTDMAParamsType);
  end;
  SmsSendParamsTag = SmsSendParamsType;
  SmsSendParamsPtr = ^SmsSendParamsType;


(****************************************************************************
 * Receive parameters
 ****************************************************************************)

(* Advanced Parameters Type for TDMA & CDMA network
   ----------------------------------------------- *)
type
  SmsReceiveCDMAParamsType = record
    messageType: UInt8; // Delivery Message Type

    validityPeriod: TelSmsDateTimeType;

    priority: UInt8;
    privacy: UInt8;

    alertOnDeliveryRequest: Boolean;
    manualAckRequest: Boolean;

    voiceMessageNumber: UInt8;
    languageIndicator: UInt8;

    callbackNumberAddress: PAnsiChar; // Store callback address
  end;
  SmsReceiveCDMAParamsTag = SmsReceiveCDMAParamsType;
  SmsReceiveCDMAParamsPtr = ^SmsReceiveCDMAParamsType;

  SmsReceiveTDMAParamsType = SmsReceiveCDMAParamsType;
  SmsReceiveTDMAParamsPtr  = ^SmsReceiveCDMAParamsType;

(* Advanced Parameters Type for GSM network
   ---------------------------------------- *)
type
  SmsReceiveGSMParamsType = record
    protocolId: UInt16; // reserved - not supported
    serviceCenterNumber: PAnsiChar;

    replyPath: Boolean; // Must use specified reply path
  end;
  SmsReceiveGSMParamsTag = SmsReceiveGSMParamsType;
  SmsReceiveGSMParamsPtr = ^SmsReceiveGSMParamsType;

(* SMS Receive Parameters Type
   --------------------------- *)

type
  SmsReceiveParamsType = record
   timeStamp: UInt32;          // Palm
   originatingAddress: PAnsiChar;  // originating number -> to send the sms to

   bits: UInt8;
{
   leaveOnPhone: UInt8         // (:1) Received messages won't be deleted on the phone (Input)
   forceSlotMode: UInt8        // (:1) Force parsing methode to Slot Mode (default is Block mode) (Input)
   reserved: UInt8             // (:6)
}
   index: UInt16;              // Index of the storage in the mobile where the message is stored

   otherToReceive: Boolean;
   reportDeliveryIndicator: Boolean;

   case Integer of             // union 'protocol'
     1: (gsm: SmsReceiveGSMParamsType);
     2: (cdma: SmsReceiveCDMAParamsType);
     3: (tdma: SmsReceiveTDMAParamsType);
  end;
  SmsReceiveParamsTag = SmsReceiveParamsType;
  SmsReceiveParamsPtr = ^SmsReceiveParamsType;

(****************************************************************************
 * Sms parameters
 ****************************************************************************)
(* SMS Parameters Type
   ------------------- *)

type
  SmsParamsType = record
    creator: UInt32;         // MUST ALWAYS BE SET TO sysFileCSmsLib
    smsID: UInt16;           // ID of the SMS (output)

    extension: PAnsiChar;        // Extension type of the data - Optionel     (Output)
    mimeTypes: PAnsiChar;        // Mime type of object - Optionel            (Output)
    appCreator: UInt32;      // Application Creator of the target - Optionel (Output)

    dataCodingScheme: UInt8; // How SMS are going to convert the data (0 = 8 bit, 1 = 7 bit)
    networkType: UInt8;      // Indicates the type of advanced parameters (input - output)
    dataType: UInt8;         // Indicates the kind of message: Sms, incomplete Sms, Report (Output)

    nbsDestPort: UInt16;     // NBS port to use to encode the data (input) - port used in received Sms (output)
    nbsSrcPort: UInt16;      // NBS port to use to encode the data (input) - port used in received Sms (output)

    case Integer of          // union 'data'
      1: (send: SmsSendParamsType);
      2: (receive: SmsReceiveParamsType);
      3: (report: SmsReportParamsType);
  end;
  SmsParamsTag = SmsParamsType;
  SmsParamsPtr = ^SmsParamsType;

(* Preferences Type
   ------------------- *)

type
  SmsPrefType = record
    validity: UInt32;        // Validity period of SMS (relatif) in seconds
    warnOver: UInt16;        // Display an alert if sending more Sms than this value.
    leave: Boolean;          // Leave SMS on Phone
    report: Boolean;         // Ask for a network delivery report
    autoSMSC: Boolean;       // If set, don't use the value stored in smscNumber field
    smscNumber: array [1..kSmsMaxPhoneSize] of AnsiChar; // SMS Service Center. Could be null
  end;
  SmsPrefTag = SmsPrefType;
  SmsPrefPtr = ^SmsPrefType;

implementation

end.
