/////////////////////////////////////////////////////////////////////////////
//
//  Name        BtIfDefinitions.h
//  $Header:
//
//  Function    this file contains WIDCOMM BTW SDK type definitions
//
//  Date                 Modification
//  ----------------------------------
//  12/17/2000    JF   Create
//
//  Copyright (c) 2000-2004, Broadcom Corporation, All Rights Reserved.
//  Proprietary and confidential.
//
//////////////////////////////////////////////////////////////////////////////

#ifndef _BTIFDEFINITIONS_H 
#define _BTIFDEFINITIONS_H


// Ensure alignment across all builds
//
#ifdef _WIN32_WCE
#pragma pack (8)
#else
#include <pshpack1.h>
#endif


//
// Define return codes from the SDP service functions
//
typedef enum
{
    SDP_OK,
    SDP_COULD_NOT_ADD_RECORD,
    SDP_INVALID_RECORD,
    SDP_INVALID_PARAMETERS

} SDP_RETURN_CODE;

//
// Define SPP connection states
//
typedef enum
{
    SPP_CONNECTED,	        // port now connected
    SPP_DISCONNECTED,	    // port now disconnected
    SPP_RFCOMM_CONNECTION_FAILED,    //rfcomm connction failed

    //for SPP Client only
    SPP_PORT_IN_USE,        // Port in use, for SPPClient only
    SPP_PORT_NOT_CONFIGURED, // no port configured
    SPP_SERVICE_NOT_FOUND,  // service not found

    //for SPP Server Only
    SPP_ALLOC_SCN_FAILED,
    SPP_SDP_FULL
} SPP_STATE_CODE;


// Maximum number of UUIDs in a service class ID list
//
#define MAX_UUIDS_PER_SEQUENCE   3

// Maximum service name length
//
#define BT_MAX_SERVICE_NAME_LEN  100

// Maximum protocol list elements in a record
//
#define MAX_PROTOCOL_LIST_ELEM   3

#define SDP_MAX_LIST_ELEMS      3
#define MAX_ELEM_IN_SEQ 10


//
// Define a structure to hold attribute values when
// read from the discovery database. Note that the
// attribute may be a sequence, in which case the
// number of elements will be greater than 1.
//
#define MAX_SEQ_ENTRIES     20
#define MAX_ATTR_LEN        256

typedef struct
{
    int     num_elem;

    struct
    {
        #define ATTR_TYPE_INT      0       // Attribute value is an integer
        #define ATTR_TYPE_TWO_COMP 1       // Attribute value is an 2's complement integer
        #define ATTR_TYPE_UUID     2       // Attribute value is a UUID
        #define ATTR_TYPE_BOOL     3       // Attribute value is a boolean
        #define ATTR_TYPE_ARRAY    4       // Attribute value is an array of bytes

        int     type;
        int     len;                        // Length of the attribute
        BOOL    start_of_seq;               // TRUE for each start of sequence
        union
        {
            unsigned char  u8;                      // 8-bit integer
            unsigned short u16;                     // 16-bit integer
            unsigned long  u32;                     // 32-bit integer
            BOOL           b;                       // Boolean
            unsigned char  array[MAX_ATTR_LEN];     // Variable length array
        } val;

    } elem [MAX_SEQ_ENTRIES];

} SDP_DISC_ATTTR_VAL;

///////////////////////////////////////////////////////////////////////////////
///// definitions used in FTP client apps to present remote server directory listings
//
#define MAX_NAME_SIZE   255
#define MAX_ENTRY_SIZE  1000
#define DATE_TIME_SIZE  15

typedef struct
{
    WCHAR    name[MAX_NAME_SIZE + 1];
    BOOL    is_folder;
    WCHAR    date_created[DATE_TIME_SIZE + 1];
    WCHAR    date_modified[DATE_TIME_SIZE + 1];
    WCHAR    date_accessed[DATE_TIME_SIZE + 1];
    ULONG    file_size;

#define FTP_READ_PERM      (0x01)
#define FTP_WRITE_PERM     (0x02)
#define FTP_DELETE_PERM    (0x04)

    WCHAR    user_perm;
    WCHAR    group_perm;
    WCHAR    other_perm;
} tFTP_FILE_ENTRY;



#ifndef BT_CONN_STATS_DEFINED
#define BT_CONN_STATS_DEFINED
typedef struct
{
    UINT32   bIsConnected;
    INT32    Rssi;
    UINT32   BytesSent;
    UINT32   BytesRcvd;
    UINT32   Duration;
} tBT_CONN_STATS;
#endif  //BT_CONN_STATS_DEFINED

#define L2CAP_MIN_MTU                   (48)

/* Link types for connection complete event */
#define HCI_LINK_TYPE_SCO               0x00
#define HCI_LINK_TYPE_ACL               0x01
#define HCI_LINK_TYPE_ESCO              0x02


/////////////////////////////////////////////////////////////////////////////////////////
//	Definitions for applications only
//

#if !defined (WIDCOMMSDK_EXPORTS)

//
// Define some types used by the WIDCOMM BTW SDK
//
typedef unsigned char   UINT8;
typedef unsigned short  UINT16;
typedef unsigned int    UINT32;

//
// Common Bluetooth field definitions
//
#define BD_ADDR_LEN     6             		/* Device address length */
typedef UINT8 BD_ADDR[BD_ADDR_LEN];			/* Device address */
typedef UINT8 *BD_ADDR_PTR;					/* Pointer to Device Address */

#define LINK_KEY_LEN    16
typedef UINT8 LINK_KEY[LINK_KEY_LEN];       /* Link Key */

#define PIN_CODE_LEN    16
typedef UINT8 PIN_CODE[PIN_CODE_LEN];       /* Pin Code (upto 128 bits) MSB is 0 */
typedef UINT8 *PIN_CODE_PTR;				/* Pointer to Pin Code */

#define DEV_CLASS_LEN   3
typedef UINT8 DEV_CLASS[DEV_CLASS_LEN];     /* Device class */
typedef UINT8 *DEV_CLASS_PTR;				/* Pointer to Device class */

#define BTM_MAX_VENDOR_SPECIFIC_LEN 255     /*Vendor specific command len */
//
// Coding of the DEV_CLASS field. Refer to Bluetooth Assigned Numbers
// specification for further information on device class.
//
// First byte - Service class of the CoD, byte [0]
#define SERV_CLASS_NETWORKING               (1 << 1)
#define SERV_CLASS_RENDERING                (1 << 2)
#define SERV_CLASS_CAPTURING                (1 << 3)
#define SERV_CLASS_OBJECT_TRANSFER          (1 << 4)
#define SERV_CLASS_OBJECT_AUDIO             (1 << 5)
#define SERV_CLASS_OBJECT_TELEPHONY         (1 << 6)
#define SERV_CLASS_OBJECT_INFORMATION       (1 << 7)

// Second byte - high order 
#define SERV_CLASS_LIMITED_DISC_MODE        (0x20)

// Also 2nd byte - Major Device class - low 5 bits
#define MAJOR_DEV_CLASS_MASK                0x1F

#define MAJOR_DEV_CLASS_MISC                0x00
#define MAJOR_DEV_CLASS_COMPUTER            0x01
#define MAJOR_DEV_CLASS_PHONE               0x02
#define MAJOR_DEV_CLASS_LAN_ACCESS          0x03
#define MAJOR_DEV_CLASS_AUDIO               0x04
#define MAJOR_DEV_CLASS_PERIPHERAL          0x05
#define MAJOR_DEV_CLASS_IMAGING             0x06
#define MAJOR_DEV_CLASS_UNSPECIFIED         0x1F

// 3rd byte - Minor Device class, hi  6 bits
#define MINOR_DEV_CLASS_MASK                0xFC

// Minor device class if major is computer
#define MINOR_DEV_CLASS_COMP_UNCLASSIFIED   0x00
#define MINOR_DEV_CLASS_COMP_WORKSTATION    (0x01 << 2)
#define MINOR_DEV_CLASS_COMP_SERVER         (0x02 << 2)
#define MINOR_DEV_CLASS_COMP_LAPTOP         (0x03 << 2)
#define MINOR_DEV_CLASS_COMP_HANDHELD       (0x04 << 2)
#define MINOR_DEV_CLASS_COMP_PALM           (0x05 << 2)

// Minor device class if major is phone
#define MINOR_DEV_CLASS_PHONE_UNCLASSIFIED  0x00
#define MINOR_DEV_CLASS_PHONE_CELLULAR      (0x01 << 2)
#define MINOR_DEV_CLASS_PHONE_CORDLESS      (0x02 << 2)
#define MINOR_DEV_CLASS_PHONE_SMART         (0x03 << 2)
#define MINOR_DEV_CLASS_PHONE_MODEM         (0x04 << 2)

// Minor device class if major is imaging
#define MINOR_DEV_CLASS_IMAGING_UNCLASSIFIED  0x00
#define MINOR_DEV_CLASS_IMAGING_DISPLAY       (0x04 << 2)
#define MINOR_DEV_CLASS_IMAGING_CAMERA        (0x08 << 2)
#define MINOR_DEV_CLASS_IMAGING_SCANNER       (0x10 << 2)
#define MINOR_DEV_CLASS_IMAGING_PRINTER       (0x20 << 2)

#define MINOR_DEV_CLASS_AUDIO_UNCLASSIFIED  0x00

// Minor device class if major is audio
#define MINOR_DEV_CLASS_AUDIO_UNCLASSIFIED  0x00
#define MINOR_DEV_CLASS_AUDIO_HEADSET       (0x01 << 2)


#define BD_NAME_LEN     248
typedef UINT8 BD_NAME[BD_NAME_LEN];         /* Device name */
typedef UINT8 *BD_NAME_PTR;					/* Pointer to Device name */


// L2CAP Configuration QOS structure
//
#ifndef BT_TYPES_H
typedef struct
{
	UINT8				qos_flags;			/* TBD */

// Values for service_type
//
#define NO_TRAFFIC		0
#define BEST_EFFORT		1
#define GUARANTEED		2

    UINT8				service_type;		/* see below */
	UINT32				token_rate;			/* bytes/second */
	UINT32				token_bucket_size;	/* bytes */
	UINT32				peak_bandwidth;		/* bytes/second */
	UINT32				latency;			/* microseconds */
	UINT32				delay_variation;	/* microseconds */			

} FLOW_SPEC;
#endif



//Zong, need to talk to ask to see if we can make them the same
#ifdef _WIN32_WCE
    #define L2CAP_MAX_MTU               1400
    #define L2CAP_DEFAULT_MTU           672
#else
//    Note:  The following is not defined because: a) it is not
//           used in the SDK source code, and b) to avoid a redefinition
//           warning when used with the Windows Bluetooth SDK. (CR 14046)
//    #define L2CAP_MAX_MTU               1696      // 
    #define L2CAP_DEFAULT_MTU           (672)
    #define BNEP_MIN_MTU_SIZE           1691
#endif

#define L2CAP_DEFAULT_FLUSH_TO          0xFFFF


// This structure is used to add protocol lists and find protocol elements
//
#ifndef SDP_MAX_PROTOCOL_PARAMS
#define SDP_MAX_PROTOCOL_PARAMS     1
#endif

typedef struct 
{
    UINT16      protocol_uuid;
    UINT16      num_params;
    UINT16      params[SDP_MAX_PROTOCOL_PARAMS];
} tSDP_PROTOCOL_ELEM;

typedef struct 
{
    UINT16              num_elems;
    tSDP_PROTOCOL_ELEM  list_elem[SDP_MAX_LIST_ELEMS];
} tSDP_PROTO_LIST_ELEM;

// Maximum UUID size - 16 bytes, and structure to hold any type of UUID.
//
#define MAX_UUID_SIZE              16

#ifndef BT_TYPES_H
typedef struct
{
#define LEN_UUID_16     2
#define LEN_UUID_32     4
#define LEN_UUID_128    16

    UINT16          len;
    UINT8           pad[14];

    union
    {
        UINT16      uuid16;
        UINT32      uuid32;
        UINT8       uuid128[MAX_UUID_SIZE];
    } uu;

} tBT_UUID;
#endif


// Define the service record attribute IDs.
//
#define  ATTR_ID_SERVICE_RECORD_HDL             0x0000
#define  ATTR_ID_SERVICE_CLASS_ID_LIST          0x0001
#define  ATTR_ID_SERVICE_RECORD_STATE           0x0002
#define  ATTR_ID_SERVICE_ID                     0x0003
#define  ATTR_ID_PROTOCOL_DESC_LIST             0x0004
#define  ATTR_ID_BROWSE_GROUP_LIST              0x0005
#define  ATTR_ID_LANGUAGE_BASE_ATTR_ID_LIST     0x0006
#define  ATTR_ID_SERVICE_INFO_TIME_TO_LIVE      0x0007
#define  ATTR_ID_SERVICE_AVAILABILITY           0x0008
#define  ATTR_ID_BT_PROFILE_DESC_LIST           0x0009
#define  ATTR_ID_DOCUMENTATION_URL              0x000A
#define  ATTR_ID_CLIENT_EXE_URL                 0x000B
#define  ATTR_ID_ICON_URL                       0x000C
#define  ATTR_ID_ADDITION_PROTO_DESC_LISTS      0x000D

#define  LANGUAGE_BASE_ID                       0x0100
#define  ATTR_ID_SERVICE_NAME                   (LANGUAGE_BASE_ID + 0x0000)
#define  ATTR_ID_SERVICE_DESCRIPTION            (LANGUAGE_BASE_ID + 0x0001)
#define  ATTR_ID_PROVIDER_NAME                  (LANGUAGE_BASE_ID + 0x0002)

#define  ATTR_ID_VERSION_OR_GROUP				0x0200
#define  ATTR_ID_VERSION_NUMBER_LIST            ATTR_ID_VERSION_OR_GROUP
#define  ATTR_ID_GROUP_ID                       ATTR_ID_VERSION_OR_GROUP
#define  ATTR_ID_SERVICE_DATABASE_STATE         0x0201
#define  ATTR_ID_DATA_STORES_OR_NETWORK         0x0301
#define  ATTR_ID_SUPPORTED_DATA_STORES          ATTR_ID_DATA_STORES_OR_NETWORK
#define  ATTR_ID_EXTERNAL_NETWORK               ATTR_ID_DATA_STORES_OR_NETWORK
#define  ATTR_ID_FAX_CLASS_1_OR_AUDIO_VOLUME	0x0302
#define  ATTR_ID_FAX_CLASS_1_SUPPORT            ATTR_ID_FAX_1_OR_AUD_VOL_OR_DEV_NAME
#define  ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL    ATTR_ID_FAX_1_OR_AUD_VOL_OR_DEV_NAME
#define  ATTR_ID_DEVICE_NAME                    ATTR_ID_FAX_1_OR_AUD_VOL_OR_DEV_NAME
#define  ATTR_ID_FORMATS_OR_FAX_2_0				0x0303
#define  ATTR_ID_SUPPORTED_FORMATS_LIST			ATTR_ID_FORMATS_OR_FAX_2_0
#define  ATTR_ID_FAX_CLASS_2_0_SUPPORT			ATTR_ID_FORMATS_OR_FAX_2_0
#define  ATTR_ID_FAX_CLASS_2_OR_FRIENDLY_NAME   0x0304
#define  ATTR_ID_FAX_CLASS_2_SUPPORT            ATTR_ID_FAX_CLASS_2_OR_FRIENDLY_NAME
#define  ATTR_ID_FRIENDLY_NAME                  ATTR_ID_FAX_CLASS_2_OR_FRIENDLY_NAME
#define  ATTR_ID_AUDIO_FEEDBACK_SUPPORT			0x0305

// Define for service attribute, all the 'Descriptor Type' values.
// These are also referred to as 'attribute type' values
#define  NULL_DESC_TYPE                     0
#define  UINT_DESC_TYPE                     1
#define  TWO_COMP_INT_DESC_TYPE             2
#define  UUID_DESC_TYPE                     3
#define  TEXT_STR_DESC_TYPE                 4
#define  BOOLEAN_DESC_TYPE                  5
#define  DATA_ELE_SEQ_DESC_TYPE             6
#define  DATA_ELE_ALT_DESC_TYPE             7
#define  URL_DESC_TYPE                      8


// Define common 16-bit protocol UUIDs
//
#define UUID_PROTOCOL_SDP                    0x0001
#define UUID_PROTOCOL_UDP                    0x0002
#define UUID_PROTOCOL_RFCOMM                 0x0003
#define UUID_PROTOCOL_TCP                    0x0004
#define UUID_PROTOCOL_TCS_BIN                0x0005
#define UUID_PROTOCOL_TCS_AT                 0x0006
#define UUID_PROTOCOL_OBEX                   0x0008
#define UUID_PROTOCOL_IP                     0x0009
#define UUID_PROTOCOL_FTP                    0x000A
#define UUID_PROTOCOL_HTTP                   0x000C
#define UUID_PROTOCOL_WSP                    0x000E
#define UUID_PROTOCOL_BNEP                   0x000F
#define UUID_PROTOCOL_UPNP                   0x0010
#define UUID_PROTOCOL_HIDP                   0x0011
#define UUID_PROTOCOL_HCRP_CTRL              0x0012
#define UUID_PROTOCOL_HCRP_DATA              0x0014
#define UUID_PROTOCOL_HCRP_NOTIF             0x0016
#define UUID_PROTOCOL_AVCTP                  0x0017
#define UUID_PROTOCOL_AVDTP                  0x0019
#define UUID_PROTOCOL_L2CAP                  0x0100

// Define common 16-bit service class UUIDs
//
#define UUID_SERVCLASS_SERVICE_DISCOVERY_SERVER 0X1000
#define UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR  0X1001
#define UUID_SERVCLASS_PUBLIC_BROWSE_GROUP      0X1002
#define UUID_SERVCLASS_SERIAL_PORT              0X1101
#define UUID_SERVCLASS_LAN_ACCESS_USING_PPP     0X1102
#define UUID_SERVCLASS_DIALUP_NETWORKING        0X1103
#define UUID_SERVCLASS_IRMC_SYNC                0X1104
#define UUID_SERVCLASS_OBEX_OBJECT_PUSH         0X1105
#define UUID_SERVCLASS_OBEX_FILE_TRANSFER       0X1106
#define UUID_SERVCLASS_IRMC_SYNC_COMMAND        0X1107
#define UUID_SERVCLASS_HEADSET                  0X1108
#define UUID_SERVCLASS_CORDLESS_TELEPHONY       0X1109
#define UUID_SERVCLASS_INTERCOM                 0X1110
#define UUID_SERVCLASS_FAX                      0X1111
#define UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY    0X1112
#define UUID_SERVCLASS_PNP_INFORMATION          0X1200
#define UUID_SERVCLASS_GENERIC_NETWORKING       0X1201
#define UUID_SERVCLASS_GENERIC_FILETRANSFER     0X1202
#define UUID_SERVCLASS_GENERIC_AUDIO            0X1203
#define UUID_SERVCLASS_GENERIC_TELEPHONY        0X1204


////////////////////////////////////////////////////////////////////////////////
// Definitions for RFCOMM and PORT functions
//

// 
// Define port settings structure send from the application in the 
// set settings request, or to the application in the set settings indication.
//
typedef struct 
{

#define PORT_BAUD_RATE_2400       0x00
#define PORT_BAUD_RATE_4800       0x01
#define PORT_BAUD_RATE_7200       0x02
#define PORT_BAUD_RATE_9600       0x03
#define PORT_BAUD_RATE_19200      0x04
#define PORT_BAUD_RATE_38400      0x05
#define PORT_BAUD_RATE_57600      0x06
#define PORT_BAUD_RATE_115200     0x07
#define PORT_BAUD_RATE_230400     0x08

    UINT8  baud_rate;

#define PORT_5_BITS               0x00
#define PORT_6_BITS               0x01
#define PORT_7_BITS               0x02
#define PORT_8_BITS               0x03

    UINT8  byte_size;

#define PORT_ONESTOPBIT           0x00
#define PORT_ONE5STOPBITS         0x01
    UINT8   stop_bits;

#define PORT_PARITY_NO            0x00
#define PORT_PARITY_YES           0x01
    UINT8   parity;

#define PORT_ODD_PARITY           0x00
#define PORT_EVEN_PARITY          0x01
#define PORT_MARK_PARITY          0x02
#define PORT_SPACE_PARITY         0x03

    UINT8   parity_type;

#define PORT_FC_OFF               0x00
#define PORT_FC_XONXOFF_ON_INPUT  0x01
#define PORT_FC_XONXOFF_ON_OUTPUT 0x02
#define PORT_FC_CTS_ON_INPUT      0x04
#define PORT_FC_CTS_ON_OUTPUT     0x08
#define PORT_FC_DSR_ON_INPUT      0x10
#define PORT_FC_DSR_ON_OUTPUT     0x20

    UINT8 fc_type;

    UINT8 rx_char1;

#define PORT_XON_DC1              0x11
    UINT8 xon_char;

#define PORT_XOFF_DC3             0x13
    UINT8 xoff_char;

} tPORT_STATE;

typedef struct
{

#define PORT_FLAG_CTS_HOLD  0x01    /* Tx is waiting for CTS signal */
#define PORT_FLAG_DSR_HOLD  0x02    /* Tx is waiting for DSR signal */
#define PORT_FLAG_RLSD_HOLD 0x04    /* Tx is waiting for RLSD signal */
    UINT16  flags;
    UINT16  in_queue_size;          /* Number of bytes in the input queue */
    UINT16  out_queue_size;         /* Number of bytes in the output queue */
} tPORT_STATUS;


//
// Define RFCOMM Port events that registered application can receive
// in the callback
//
#define PORT_EV_RXCHAR  0x00000001   /* Any Character received */
#define PORT_EV_RXFLAG  0x00000002   /* Received certain character */
#define PORT_EV_TXEMPTY 0x00000004   /* Transmitt Queue Empty */
#define PORT_EV_CTS     0x00000008   /* CTS changed state */
#define PORT_EV_DSR     0x00000010   /* DSR changed state */
#define PORT_EV_RLSD    0x00000020   /* RLSD changed state */
#define PORT_EV_BREAK   0x00000040   /* BREAK received */
#define PORT_EV_ERR     0x00000080   /* Line status error occurred */
#define PORT_EV_RING    0x00000100   /* Ring signal detected */
#define PORT_EV_CTSS    0x00000400   /* CTS state */
#define PORT_EV_DSRS    0x00000800   /* DSR state */
#define PORT_EV_RLSDS   0x00001000   /* RLSD state */
#define PORT_EV_OVERRUN 0x00002000   /* receiver buffer overrun */
#define PORT_EV_TXCHAR  0x00004000   /* Any character transmitted */

#define PORT_EV_CONNECTED    0x00000200  /* RFCOMM connection established */
#define PORT_EV_CONNECT_ERR  0x00008000  /* Was not able to establish connection */
                                     /* or disconnected */
#define PORT_EV_FC      0x00010000   /* flow control enabled flag changed by remote */
#define PORT_EV_FCS     0x00020000   /* flow control status true = enabled */

//
// To register for RFCOMM events application should provide bitmask with 
// corresponding bit set
//
#define PORT_MASK_ALL             (PORT_EV_RXCHAR | PORT_EV_TXEMPTY | PORT_EV_CTS | \
                                   PORT_EV_DSR | PORT_EV_RLSD | PORT_EV_BREAK | \
                                   PORT_EV_ERR | PORT_EV_RING | PORT_EV_CONNECT_ERR | \
                                   PORT_EV_DSRS | PORT_EV_CTSS | PORT_EV_RLSDS | \
                                   PORT_EV_RXFLAG | PORT_EV_TXCHAR | PORT_EV_OVERRUN | \
                                   PORT_EV_CONNECTED | PORT_EV_FC | PORT_EV_FCS)



//
// Definitions used by RFCOMM to set control leads
//
#define PORT_SET_DTRDSR         0x01
#define PORT_CLR_DTRDSR         0x02
#define PORT_SET_CTSRTS         0x03
#define PORT_CLR_CTSRTS         0x04
#define PORT_SET_RI             0x05        /* DCE only */
#define PORT_CLR_RI             0x06        /* DCE only */
#define PORT_SET_DCD            0x07        /* DCE only */
#define PORT_CLR_DCD            0x08        /* DCE only */
#define PORT_SET_BREAK          0x09
#define PORT_CLR_BREAK          0x0A

//
// RFCOMM Port modem control leads
//
#define PORT_DTRDSR_ON          0x01
#define PORT_CTSRTS_ON          0x02
#define PORT_RING_ON            0x04
#define PORT_DCD_ON             0x08


//
// RFCOMM Port errors
//
#define PORT_ERR_BREAK      0x01    /* Break condition occured on the peer device */
#define PORT_ERR_OVERRUN    0x02    /* Overrun is reported by peer device */
#define PORT_ERR_FRAME      0x04    /* Framing error reported by peer device */
#define PORT_ERR_RXOVER     0x08    /* Input queue overflow occured */
#define PORT_ERR_TXFULL     0x10    /* Output queue overflow occured */

//
// Flags used in the RFCOMM Port purge function
//
#define PORT_PURGE_TXCLEAR  0x01
#define PORT_PURGE_RXCLEAR  0x02

//
// RFCOMM default MTU size
//
#define RFCOMM_DEFAULT_MTU              127


//
// Valid Security Service Levels 
//
#define BTM_SEC_NONE               0x0000 /* Nothing required */
#define BTM_SEC_IN_AUTHORIZE       0x0001 /* Inbound call requires authorization */
#define BTM_SEC_IN_AUTHENTICATE    0x0002 /* Inbound call requires authentication */
#define BTM_SEC_IN_ENCRYPT         0x0004 /* Inbound call requires encryption */
#define BTM_SEC_OUT_AUTHORIZE      0x0008 /* Outbound call requires authorization */
#define BTM_SEC_OUT_AUTHENTICATE   0x0010 /* Outbound call requires authentication */
#define BTM_SEC_OUT_ENCRYPT        0x0020 /* Outbound call requires encryption */
#define BTM_SEC_BOND               0x0040 /* Bonding */

//
// definitions for security
//

// 
// Predefined security services 
//

#define BTM_SEC_SERVICE_SDP_SERVER  0
#define BTM_SEC_SERVICE_SERIAL_PORT 1
#define BTM_SEC_SERVICE_LAN_ACCESS  2
#define BTM_SEC_SERVICE_DUN         3
#define BTM_SEC_SERVICE_IRMCSYBC    4
#define BTM_SEC_SERVICE_OBEX_PUSH   5
#define BTM_SEC_SERVICE_OBEX_FTP    6
#define BTM_SEC_SERVICE_IRMCSYNCCMD 7
#define BTM_SEC_SERVICE_HEADSET     8
#define BTM_SEC_SERVICE_CORDLESS    9
#define BTM_SEC_SERVICE_INTERCOM    10
#define BTM_SEC_SERVICE_FAX         11
#define BTM_SEC_SERVICE_HEADSET_AG  12
#define BTM_SEC_SERVICE_PNP_INFO    13
#define BTM_SEC_SERVICE_PANU        14
#define BTM_SEC_SERVICE_NAP         15
#define BTM_SEC_SERVICE_GN          16
#define BTM_SEC_SERVICE_HCRP_CTRL   17
#define BTM_SEC_SERVICE_AVDTP       18
#define BTM_SEC_SERVICE_AVCTP        19
#define BTM_SEC_SERVICE_HF_HANDSFREE 20
#define BTM_SEC_SERVICE_AG_HANDSFREE 21
#define BTM_SEC_SERVICE_HID_CTRL    22
#define BTM_SEC_SERVICE_HID_INTR    23
#define BTM_SEC_SERVICE_SAP         24
#define BTM_SEC_SERVICE_BIP         25
#define BTM_SEC_SERVICE_HCRP_DATA   26
#define BTM_SEC_SERVICE_BIP_PRINT   27
#define BTM_SEC_SERVICE_BPP         28



#define BTM_SEC_SERVICE_FIRST_EMPTY 29

// Number of services that can be registered with security manager
#define BTM_SEC_MAX_SERVICE_RECORDS     32

// Following bits can be provided by host in the trusted_mask field
#define BTM_SEC_TRUST_SDP_SERVER    (1 << BTM_SEC_SERVICE_SDP_SERVER)
#define BTM_SEC_TRUST_SERIAL_PORT   (1 << BTM_SEC_SERVICE_SERIAL_PORT)
#define BTM_SEC_TRUST_LAN_ACCESS    (1 << BTM_SEC_SERVICE_LAN_ACCESS)
#define BTM_SEC_TRUST_DUN           (1 << BTM_SEC_SERVICE_DUN)
#define BTM_SEC_TRUST_IRMCSYBC      (1 << BTM_SEC_SERVICE_IRMCSYBC)
#define BTM_SEC_TRUST_OBEX_PUSH     (1 << BTM_SEC_SERVICE_OBEX_PUSH)
#define BTM_SEC_TRUST_OBEX_FTP      (1 << BTM_SEC_SERVICE_OBEX_FTP)
#define BTM_SEC_TRUST_IRMCSYNCCMD   (1 << BTM_SEC_SERVICE_IRMCSYNCCMD)
#define BTM_SEC_TRUST_HEADSET       (1 << BTM_SEC_SERVICE_HEADSET)
#define BTM_SEC_TRUST_CORDLESS      (1 << BTM_SEC_SERVICE_CORDLESS)
#define BTM_SEC_TRUST_IINTERCOM     (1 << BTM_SEC_SERVICE_IINTERCOM)
#define BTM_SEC_TRUST_FAX           (1 << BTM_SEC_SERVICE_FAX)
#define BTM_SEC_TRUST_HEADSET_AG    (1 << BTM_SEC_SERVICE_HEADSET_AG)
#define BTM_SEC_TRUST_PNP_INFO      (1 << BTM_SEC_SERVICE_PNP_INFO)
#define BTM_SEC_TRUST_GEN_NET       (1 << BTM_SEC_SERVICE_GEN_NET)
#define BTM_SEC_TRUST_GEN_FILE      (1 << BTM_SEC_SERVICE_GEN_FILE)
#define BTM_SEC_TRUST_GEN_AUDIO     (1 << BTM_SEC_SERVICE_GEN_AUDIO)
#define BTM_SEC_TRUST_GEN_TEL       (1 << BTM_SEC_SERVICE_GEN_TEL)

#define BTM_SEC_TRUST_ALL			0xFFFFFFFF



// BtIfObexHeaders.cpp : Definitions for the OBEX headers objects.
//

#define OBEX_MINIMUM_MTU            (255)
#define OBEX_MAX_CLIENTS            4
#define OBEX_MAX_SERVERS            4


#ifdef _WIN32_WCE
    #define OBEX_MAX_CSESSIONS          1
    #define OBEX_MAX_SSESSIONS          1           /* Current version only allows 1 session per server */
#else
    #define OBEX_MAX_CSESSIONS          4
    #define OBEX_MAX_SSESSIONS          7
#endif

#define OBEX_MAX_TARGET             3
#define OBEX_MAX_AUTH_CHALLENGE     3
#define OBEX_MAX_AUTH_RESPONSE      3
#define OBEX_MAX_HTTP               3
#define OBEX_MAX_APP_PARAM          3
#define OBEX_MAX_USER_HDR           4
#define OBEX_TIMER_SEED             60
#define OBEX_IDLE_TIMER_SEED        180

#define OBEX_TIME_LOCAL		0x01
#define OBEX_TIME_UTC		0x02
#define OBEX_API 
#define OBEX_CLIENT_INCLUDED        (TRUE)
#define OBEX_SERVER_INCLUDED        (TRUE)

#ifndef BT_TYPES_H
#define GKI_BUF3_SIZE           700
#endif
#define OBEX_DATA_POOL_SIZE         (GKI_BUF3_SIZE)

#define OBEX_DATA_BUFFER_OVERHEAD   (41)
// for now, limit MTU to 640 - overhead 
#ifndef BT_TYPES_H
#define OBEX_DESIRED_MTU            (OBEX_DATA_POOL_SIZE - OBEX_DATA_BUFFER_OVERHEAD)
#endif
#if (OBEX_DESIRED_MTU + OBEX_DATA_BUFFER_OVERHEAD > OBEX_DATA_POOL_SIZE)
#define OBEX_DEFAULT_MTU            (OBEX_DATA_POOL_SIZE - OBEX_DATA_BUFFER_OVERHEAD)
#else
#define OBEX_DEFAULT_MTU            (OBEX_DESIRED_MTU)
#endif

/*
** Define OBEX Request Codes
*/
#define OBEX_REQ_CONNECT                0x00
#define OBEX_REQ_DISCONNECT             0x01
#define OBEX_REQ_PUT                    0x02
#define OBEX_REQ_GET                    0x03
#define OBEX_REQ_SETPATH                0x05
#define OBEX_REQ_ABORT                  0x7f
#define OBEX_FINAL                      0x80
#define OBEX_UNREGISTER                 0xff

/*
** Define well-known OBEX Client data types
*/
typedef UINT32  tOBEX_CLIENT_HANDLE;    /* Application Handle */
typedef UINT32  tOBEX_CSESSION_HANDLE;  /* Session Handle */

/*
** Define well-known OBEX Server data types
*/
typedef UINT32   tOBEX_SERVER_HANDLE;    /* Application Handle */
typedef UINT32   tOBEX_SSESSION_HANDLE;  /* Session Handle */


/*
** Define OBEX error codes returned by OBEX API Functions and Application
** Callback Functions
*/
typedef enum
{
    OBEX_SUCCESS = 0,       /* Operation was successful or accepted */
    OBEX_FAIL,              /* Operation failed or was rejected */
    OBEX_ERROR,             /* Internal OBEX error */
    OBEX_ERR_RESOURCES,     /* Insufficient resources */
    OBEX_ERR_NO_CB,         /* Calback for request is missing */
    OBEX_ERR_DUP_SERVER,    /* Server for 'Target' already register with OBEX */
    OBEX_ERR_RESPONSE,      /* Peer rejected request */
    OBEX_ERR_UNK_APP,       /* Unknown Application Handle (unregistered?) */
    OBEX_ERR_PARAM,         /* Invalid or missing parameter value */
    OBEX_ERR_CLOSED,        /* Session is closed */
    OBEX_ERR_ABORTED,       /* Operation was aborted */
    OBEX_ERR_STATE,         /* Request is invalid for current state */
    OBEX_ERR_NA,            /* API call not allowed at this time */
    OBEX_ERR_HEADER,        /* Invalid data in tOBEX_HEADERS */
    OBEX_ERR_TOO_BIG,       /* The data presented in the tOBEX_HEADERS */
                            /* structure is larger than the maximum */
                            /* size allowed for the request */
    OBEX_ERR_TIMEOUT        /* Timeout */
} tOBEX_ERRORS;
#define OBEX_MAX_ERROR OBEX_ERR_TIMEOUT

/*
** Define OBEX Response Code values used in OBEX Responses sent by
** the OBEX Server to the OBEX Client.  These codes are taken 
** from the 'IrDA Object Exchange Protocol (IROBEX)' specification
** with the high bit (final bit) removed.  The OBEX Core internally
** manages the 'final bit'.
*/
typedef enum
{
    OBEX_RSP_DEFAULT                        = 0x00,
    OBEX_RSP_CONTINUE                       = 0x10,
    OBEX_RSP_OK                             = 0x20,
    OBEX_RSP_CREATED                        = 0x21,
    OBEX_RSP_ACCEPTED                       = 0x22,
    OBEX_RSP_NON_AUTHORITATIVE_INFO         = 0x23,
    OBEX_RSP_NO_CONTENT                     = 0x24,
    OBEX_RSP_RESET_CONTENT                  = 0x25,
    OBEX_RSP_PARTIAL_CONTENT                = 0x26,
    OBEX_RSP_MULTIPLE_CHOICES               = 0x30,
    OBEX_RSP_MOVED_PERMANENTLY              = 0x31,
    OBEX_RSP_MOVED_TEMPORARILY              = 0x32,
    OBEX_RSP_SEE_OTHER                      = 0x33,
    OBEX_RSP_NOT_MODIFIED                   = 0x34,
    OBEX_RSP_USE_PROXY                      = 0x35,
    OBEX_RSP_BAD_REQUEST                    = 0x40,
    OBEX_RSP_UNAUTHORIZED                   = 0x41,
    OBEX_RSP_PAYMENT_REQUIRED               = 0x42,
    OBEX_RSP_FORBIDDEN                      = 0x43,
    OBEX_RSP_NOT_FOUND                      = 0x44,
    OBEX_RSP_METHOD_NOT_ALLOWED             = 0x45,
    OBEX_RSP_NOT_ACCEPTABLE                 = 0x46,
    OBEX_RSP_PROXY_AUTHENTICATION_REQUIRED  = 0x47,
    OBEX_RSP_REQUEST_TIME_OUT               = 0x48,
    OBEX_RSP_CONFLICT                       = 0x49,
    OBEX_RSP_GONE                           = 0x4A,
    OBEX_RSP_LENGTH_REQUIRED                = 0x4B,
    OBEX_RSP_PRECONDITION_FAILED            = 0x4C,
    OBEX_RSP_REQUESTED_ENTITY_TOO_LARGE     = 0x4D,
    OBEX_RSP_REQUEST_URL_TOO_LARGE          = 0x4E,
    OBEX_RSP_UNSUPPORTED_MEDIA_TYPE         = 0x4F,
    OBEX_RSP_INTERNAL_SERVER_ERROR          = 0x50,
    OBEX_RSP_NOT_IMPLEMENTED                = 0x51,
    OBEX_RSP_BAD_GATEWAY                    = 0x52,
    OBEX_RSP_SERVICE_UNAVAILABLE            = 0x53,
    OBEX_RSP_GATEWAY_TIMEOUT                = 0x54,
    OBEX_RSP_HTTP_VERSION_NOT_SUPPORTED     = 0x55,
    OBEX_RSP_DATABASE_FULL                  = 0x60,
    OBEX_RSP_DATABASE_LOCKED                = 0x61
} tOBEX_RESPONSE_CODE;

/*
** The tOBEX_CLIENT_HANDLE, tOBEX_SERVER_HANDLE, tOBEX_CSESSION_HANDLE 
** and tOBEX_SSESSION_HANDLE each consist of two 16 bit values.  The high 
** order 16 bits contain an arbitrary ordinal assigned when the client
** or server registers or when a session is opened.  The low order 16
** bits contain the tOBEX_GLOBAL_CLIENT.client_ctrl, 
** tOBEX_GLOBAL_SERVER.server_ctrl, tOBEX_CLIENT_CTRL.cses_ctrl or
** tOBEX_SERVER_CTRL.sses_ctrl index value for the client, server or 
** session.  The following macros encode an ordinal and index into a
** tOBEX_CLIENT_HANDLE, tOBEX_SERVER_HANDLE, tOBEX_CSESSION_HANDLE or
** tOBEX_SSESSION_HANDLE and decode an ordinal and index from a
** handle.
*/
#define OBEX_ENCODE_HANDLE(handle,ordinal,index) (handle = ((ordinal << 16) | (index & 0xFFFF)))
#define OBEX_DECODE_HANDLE(handle,ordinal,index) (ordinal = (handle >> 16), index = (handle & 0xFFFF))

/*
* The following defines and describes the tOBEX_HEADERS structure
* and the other structures that are embedded in the tOBEX_HEADERS
* structure.
*
* The tOBEX_HEADERS structure is used by many calls to OBEX API 
* and Application Callback Functions.  It contains the information 
* found in the OBEX Headers supported by this implementation of 
* OBEX as defined in the 'IrDA Object Exchange Protocol (IrOBEX)' 
* specification.  
*
* When an application wants to send information to the peer 
* application it creates an instance of the tOBEX_HEADERS structure
* and passes a pointer to the structure to the appropriate OBEX API
* Function.  OBEX will process the information found in the 
* structure and return to the application.  If the application has
* registered with OBEX as being 'well behaved' (see OBEX_ClientRegister
* and OBEX_ServerRegister functions), OBEX will assume that the 
* tOBEX_HEADERS pointer points to a GKI buffer (without the BT_HDR
* prefix) and will assume ownership of the buffer.  If the application
* has not registered as 'well behaved', OBEX will assume that the 
* tOBEX_HEADERS pointer points to static memory and will not alter
* the memory pointed to by the pointer.  For best performance, it
* is recommended that applications be well behaved.
*
* When OBEX receives information from the peer OBEX that it needs to
* deliver to the application, it creates an instance of the 
* tOBEX_HEADERS structure and passes a pointer to it to the appropriate
* Application Callback Function.  The tOBEX_HEADERS structure resides
* in a GKI buffer (without the BT_HDR prefix).  If the application has
* registered as 'well behaved', OBEX assumes that the application will
* assume ownership of the buffer and release it as appropriate.  If the
* application has not registered as 'well behaved', OBEX assumes that 
* the application treats the buffer as static memory and once the
* Application Callback Function returns to OBEX, OBEX will dispose of
* the buffer appropriately.
*/


/*
* The tOBEX_UNI_HDR structure is embedded in the tOBEX_HEADERS 
* structure.  It is used to hold the contents of an OBEX 
* 'UNICODE' type header.  These headers contain null-terminated
* UNICODE text strings.  The struct contains a 'p_string' member
* that points to the null-terminated UNICODE string and a 'str_len'
* member that indicates the number of characters in the UNICODE string.
* NOTE: The 'str_len' member includes the terminating NULL
* character.  Therefore, by example, if a Name header contains
* the UNICODE text string "JUMAR.TXT", the 'p_string' member of the
* struct will point to a data area containing
* the hex values (displayed in Big-endian format):
* "00 4A 00 55 00 4D 00 41 00 52 00 2E 00 54 00 58 00 54 00 00"
* and the 'str_len' member will contain the value 10.
*
* If a 'UNICODE' type header present in an OBEX request or
* response, the contents of that header will be stored in a 
* tOBEX_UNI_HDR struct and the 'flag' member of the tOBEX_HEADERS
* struct will indicate that the header is present.  Some headers may
* be present but contain no data.  In such a case, the 'flag' member
* of the tOBEX_HEADERS struct will indicate that the header is 
* present but the 'str_len' member and 'p_string' member of the 
* associated header struct will be zero.
*
* If the application has registered with OBEX as being 'well behaved',
* it is assumed that each 'p_string' member in use points to a GKI
* buffer and ownership of each buffer will follow the rules specified
* above for the tOBEX_HEADERS structure.  If the application has not
* registered with OBEX as being 'well behaved', the OBEX API functions
* assume that each 'p_string' member points to static memory it does
* not alter that memory.  OBEX also assumes that the Application
* Callback Functions will treat the memory pointed to by each 'p_string'
* member as static and will not alter that memory.
*/

/* OBEX UNICODE Type Header - null terminated UNICODE string */
typedef struct
{ 
    UINT32 str_len; 
    WCHAR  *p_string; 
} tOBEX_UNI_HDR; 


/*
* The tOBEX_OCTET_HDR structure is embedded in the tOBEX_HEADERS 
* structure.  It is used to hold the contents of an OBEX 
* 'octet-array' type header.  These headers contain unstructured octet 
* arrays.  The struct contains a 'p_array' member that points to an 
* array of octets and a 'length' member that indicates the length of 
* the array.
*
* If a header of the 'octet-array' type is present in an OBEX request or
* response, the contents of that header will be stored in its 
* corresponding struct and the 'flag' member of the tOBEX_HEADERS
* struct will indicate that the header is present.  Some headers may
* be present but contain no data.  In such a case, the 'flag' member
* of the tOBEX_HEADERS struct will indicate that the header is 
* present but the 'length' member and 'p_array' member of the 
* associated header struct will be zero.
*
* Some header types may occur multiple times in a request or response.
* For these types of headers, the tOBEX_HEADERS structure contains
* an array of embedded structures for that header type and a counter
* indicating the number of those headers that are present.  The 
* 'flag' member of the tOBEX_HEADERS struct will indicate that at 
* least one instance of the header is present in the request/response
* and the corresponding 'num_...' member of the tOBEX_HEADERS struct
* will indicate the actual number of instances included in the array
* of structures.
*
* If the application has registered with OBEX as being 'well behaved',
* it is assumed that each 'p_array' member in use points to a GKI
* buffer and ownership of each buffer will follow the rules specified
* above for the tOBEX_HEADERS structure.  If the application has not
* registered with OBEX as being 'well behaved', the OBEX API functions
* assume that each 'p_array' member points to static memory it does
* not alter that memory.  OBEX also assumes that the Application
* Callback Functions will treat the memory pointed to by each 'p_array'
* member as static and will not alter that memory.
*/

/* OBEX Octet-Array Type Header - unstructured octet array */
typedef struct
{ 
    UINT32 length; 
    UINT8 *p_array; 
} tOBEX_OCTET_HDR; 



/*
* The tOBEX_HEADERS structure contains three arrays of the 
* following tOBEX_HDR_TRIPLET structure to hold information 
* found in the OBEX Application Request-Response Parameters 
* Header, the Authenticate Challenge Header and the 
* Authenticate Response Header.  Each of these headers contain
* one or more 'Triplets' and each triplet is stored in an
* entry in its associated tOBEX_HDR_TRIPLET array.  The 
* tOBEX_HEADERS structure contains a 'num_app_params' member
* that indicates the number of triplets contained in the 
* Application Request-Response Parameters Header, a 
* 'num_auth_challenge' member that indicates the number of
* triplets contained in the Authenticate Challenge Header and
* a 'num_auth_response' member that indicates the number of
* triplets contains in the Authenticate Response Header.
*
* If the application has registered with OBEX as being 'well behaved',
* it is assumed that each 'p_array' member in use points to a GKI
* buffer and ownership of each buffer will follow the rules specified
* above for the tOBEX_HEADERS structure.  If the application has not
* registered with OBEX as being 'well behaved', the OBEX API functions
* assume that each 'p_array' member points to static memory it does
* not alter that memory.  OBEX also assumes that the Application
* Callback Functions will treat the memory pointed to by each 'p_array'
* member as static and will not alter that memory.
*/
typedef struct obex_hdr_triplet_s 
{ 
    UINT8   tag;
    UINT8   length;
    UINT8   *p_array;
} tOBEX_HDR_TRIPLET;

/*
* The tOBEX_HEADERS structure contains an array of the 
* following tOBEX_USER_HDR structure to hold information 
* found in the OBEX User Defined Headers.  The OBEX User
* Defined Header is formatted according to the 'IrDA Object 
* Exchange Protocol (IrOBEX)' specification.  The specification
* requires that the two high-order bits of the first octet of 
* the header indicate the format and, by implication, the size 
* of the data contained in the header and the remaining bits of 
* the first octet be within the range of 0x30 to 0x3F.
*
* By performing a logical AND on the 'id' member of the 
* tOBEX_USER_HDR structure and the OBEX_USER_TYPE_MASK constant
* and comparing the results with each of the other 
* 'OBEX_USER_TYPE_....' constants, the User Defined Header 
* format can be determined.  The appropriate member of the 
* 'value' union can then be accessed and the 'length' member
* can be interpreted as follows:
*
*   ---------------------- ----------- -------------------
*  |  If the high-order   |           |                   |
*  |  2 bits of id are    |  Then     |  Contains         |
*  |----------------------|-----------|-------------------|
*  | OBEX_USER_TYPE_UNI   | p_string  | Pointer to null   |
*  |                      |           | terminated        |
*  |                      |           | UNICODE text      |
*  |                      |           | string            |
*  |                      |-----------|-------------------|
*  |                      | length    | Number of         |
*  |                      |           | characters in     |
*  |                      |           | the UNICODE text  |
*  |                      |           | string (including |
*  |                      |           | the terminating   |
*  |                      |           | NULL character)   |
*  |----------------------|-----------|-------------------|
*  | OBEX_USER_TYPE_ARRAY | p_array   | Pointer to        |
*  |                      |           | unstructured      |
*  |                      |           | octet array       |
*  |                      |-----------|-------------------|
*  |                      | length    | Number octets of  |
*  |                      |           | data in the array |
*  |----------------------|-----------|-------------------|
*  | OBEX_USER_TYPE_BYTE  | user_byte | One byte of       |
*  |                      |           | user data         |
*  |                      |-----------|-------------------|
*  |                      | length    | N/A               |
*  |----------------------|-----------|-------------------|
*  | OBEX_USER_TYPE_INT   | user_int  | One 32-bit        |
*  |                      |           | integer of user   |
*  |                      |           | data              |
*  |                      |-----------|-------------------|
*  |                      | length    | N/A               |
*   ---------------------- ----------- -------------------
*
* If the application has registered with OBEX as being 'well behaved',
* it is assumed that each 'p_array' and 'p_string' member in use 
* points to a GKI buffer and ownership of each buffer will follow the 
* rules specified above for the tOBEX_HEADERS structure.  If the 
* application has not registered with OBEX as being 'well behaved', 
* the OBEX API functions assume that each 'p_array' member points to 
* static memory it does not alter that memory.  OBEX also assumes 
* that the Application Callback Functions will treat the memory 
* pointed to by each 'p_array' member as static and will not alter 
* that memory.
*/
typedef struct 
{ 
    UINT8   id;
#define OBEX_USER_TYPE_MASK  0xC0
#define OBEX_USER_TYPE_UNI   0x00 /* Null terminated ASCII text */
#define OBEX_USER_TYPE_ARRAY 0x40 /* Unstructured octet array */
#define OBEX_USER_TYPE_BYTE  0x80 /* Single byte */
#define OBEX_USER_TYPE_INT   0xC0 /* 32 bit integer */
    UINT16  length;
    union
    {
        WCHAR   *p_string;
        UINT8   *p_array;
        UINT8   user_byte;
        UINT32  user_int;
    } value;
} tOBEX_USER_HDR;



/*
* The following is the tOBEX_HEADERS structure.
*
* The 'rsp_code' member contains the OBEX Response Code used in the
* OBEX Response Packet.  It is stored without the high-order (final) 
* bit set.  The OBEX Core manages the 'final bit' in Response 
* Packets internally.  When the Server Application calls an OBEX 
* Server API Function it indicates the success or failure of the request
* by passing a tOBEX_ERRORS enumerator to the appropriate API.  If the
* Server Application wants to be more specific in the type of error 
* returned to the Client Application, it can set the specific OBEX 
* Response Code desired in the 'rsp_code' member of the tOBEX_HEADERS
* structure.  If the Server Application does not set the 'rsp_code'
* member to a valid tOBEX_ERRORS enumerator, the OBEX Core will
* generate an appropriate OBEX Response Code based on the tOBEX_ERRORS
* enumerator passed as a parameter to the Confirmation API Function and
* the current operation being performed.
*
* The 'flag' member indicates which headers are present.
*
* If the 'flag' member indicates that the Count Header is 
* present, the 'count' member of the tOBEX_HEADERS structure
* will contain the value found in the Count Header.
*
* If the 'flag' member indicates that the Name Header, Type Header,
* Description Header, Target Header, HTTP Header, Body (or 
* End-of-Body) Header, Who Header, Application Request-Response Header, 
* Authentication Challenge Header, Authentication Response Header, 
* Object Class Header or User Defined Header is present, the 
* corresponding data will be present in the tOBEX_HEADERS structure 
* as specified above.
*
* If the 'flag' member indicates that the Length Header is
* present, the 'hint_of_length' member of the tOBEX_HEADERS 
* structure will contain the value found in the Length Header.
*
* THE FOLLOWING DESCRIPTION APPLIES ONLY TO THE OBEX NON_LEGACY API:    
* If the 'flag' member indicates that the Time Header is present, 
* the 'time' member contains the contents of the Time Header
* as seconds since midnight, January 1, 1970, UTC ('Universal
* Coordinated Time' also known as GMT or 'Greenwich Mean Time') or
* Local Time.  The 'time_qualifier' member of the tOBEX_HEADERS 
* structure indicates whether the time in the header is UTC or Local 
* Time.  The 'IrDA Object Exchange Protocol (IrOBEX)' specification 
* recommends that the Time Header be formatted according to ISO 8601.
* The OBEX core performs the conversion between the ISO 8601 format
* and the tOBEX_HEADERS structure format as appropriate.
* END OF OBEX NON-LEGACY API DESCRIPTION
*
* NOTE!!!!!
*   The bit positions for each header represented in the 'flag' member
*   must not be altered because the OBEX Core relies on them being
*   assigned as defined here.
* 
*/
typedef struct
{
    UINT32              flag;
#define OBEX_FLAG_INTERNAL1         0x00000001  /* Used internally by OBEX Core */
#define OBEX_FLAG_COUNT             0x00000002 
#define OBEX_FLAG_NAME              0x00000004 
#define OBEX_FLAG_TYPE              0x00000008 
#define OBEX_FLAG_LENGTH            0x00000010 
#define OBEX_FLAG_OBJECT_CLASS      0x00000020 
#define OBEX_FLAG_TARGET            0x00000040 
#define OBEX_FLAG_WHO               0x00000080 
#define OBEX_FLAG_TIME              0x00000100 
#define OBEX_FLAG_INTERNAL2         0x00000200  /* Used internally by OBEX Core */
#define OBEX_FLAG_DESCRIPTION       0x00000400 
#define OBEX_FLAG_AUTH_CHALLENGE    0x00000800 
#define OBEX_FLAG_AUTH_RESPONSE     0x00001000 
#define OBEX_FLAG_HTTP              0x00002000 
#define OBEX_FLAG_APPL_REQ_RSP      0x00004000 
#define OBEX_FLAG_USER_DEFINED      0x00008000
#define OBEX_FLAG_BODY              0x00010000
#define OBEX_FLAG_BODY_END          0x00020000
/* flag bits legal for applications to set */
#define OBEX_FLAG_LEGAL_BITS \
       (OBEX_FLAG_COUNT + \
        OBEX_FLAG_NAME + \
        OBEX_FLAG_TYPE + \
        OBEX_FLAG_LENGTH + \
        OBEX_FLAG_OBJECT_CLASS + \
        OBEX_FLAG_TARGET + \
        OBEX_FLAG_WHO + \
        OBEX_FLAG_TIME + \
        OBEX_FLAG_DESCRIPTION + \
        OBEX_FLAG_AUTH_CHALLENGE + \
        OBEX_FLAG_AUTH_RESPONSE + \
        OBEX_FLAG_HTTP + \
        OBEX_FLAG_APPL_REQ_RSP + \
        OBEX_FLAG_USER_DEFINED + \
        OBEX_FLAG_BODY + \
        OBEX_FLAG_BODY_END)
    UINT32              internal1;  /* Used internally by OBEX Core */
    UINT32              count;
    tOBEX_UNI_HDR       uni_name;
    tOBEX_OCTET_HDR     type;
    UINT32              hint_of_length;
    tOBEX_OCTET_HDR     object_class;
    UINT32              num_target;
    tOBEX_OCTET_HDR     target[OBEX_MAX_TARGET];
    tOBEX_OCTET_HDR     who;
    UINT32              time_value;
    UINT8               time_qualifier;
#define OBEX_TIME_LOCAL     0x01
#define OBEX_TIME_UTC       0x02
    tOBEX_UNI_HDR       uni_description;
    UINT32              num_auth_challenge;
    tOBEX_HDR_TRIPLET   auth_challenge[OBEX_MAX_AUTH_CHALLENGE];
    UINT32              num_auth_response;
    tOBEX_HDR_TRIPLET   auth_response[OBEX_MAX_AUTH_RESPONSE];
    UINT32              num_http;
    tOBEX_OCTET_HDR     http[OBEX_MAX_HTTP];
    UINT32              num_app_param;
    tOBEX_HDR_TRIPLET   app_param[OBEX_MAX_APP_PARAM];
    UINT32              num_user;
    tOBEX_USER_HDR      user[OBEX_MAX_USER_HDR];
    tOBEX_OCTET_HDR     body;
} tOBEX_HEADERS;


#endif // !defined (WIDCOMMSDK_EXPORTS)

/* Define the L2CAP connection result codes
*/
#define L2CAP_CONN_OK                0
#define L2CAP_CONN_PENDING           1
#define L2CAP_CONN_NO_PSM            2
#define L2CAP_CONN_SECURITY_BLOCK    3
#define L2CAP_CONN_NO_RESOURCES      4
#define L2CAP_CONN_TIMEOUT           0xEEEE

#define L2CAP_CONN_NO_LINK           255        /* Add a couple of our own for internal use */


// Define a structure to hold the configuration parameters. Since the
// parameters are optional, for each parameter there is a boolean to
// use to signify its presence or absemce.
//
// NOTE:  This structure is used externally from (or above) the SDK
//        and is mapped to the tL2CAP_CFG_INFO structure when used
//        in the CL2CapConn::Reconfigure method.  This is done so we
//        only expose BOOL types externally.
//
typedef struct
{
    UINT16      result;                 // Only used in confirm messages
    BOOL        mtu_present;
    UINT16      mtu;
    BOOL        qos_present;
    FLOW_SPEC   qos;
    BOOL        flush_to_present;
    UINT16      flush_to;

    UINT16      flags;                  // Internally used by L2CAP

} tL2CAP_CONFIG_INFO;

typedef struct
{
    BD_ADDR     bda;
    GUID        guid;
    char        szServiceName[BT_MAX_SERVICE_NAME_LEN];
    short       com_port;
} tBT_REM_ASSOC_REC;

#ifndef BTM_API_H
/////////////////////////////////////////////////////////////////////////////////////////
//  Definitions for SCO APIs
//

/***************
**  SCO Types
****************/
#define BTM_LINK_TYPE_SCO           HCI_LINK_TYPE_SCO
#define BTM_LINK_TYPE_ESCO          HCI_LINK_TYPE_ESCO
typedef UINT8 tBTM_SCO_TYPE;


#define HCI_SUCCESS                     0x00

/******************
**  eSCO Constants
*******************/
#define BTM_64KBITS_RATE            0x00001f40  /* 64 kbits/sec data rate */

/* Retransmission effort */
#define BTM_ESCO_RETRANS_OFF        0
#define BTM_ESCO_RETRANS_POWER      1
#define BTM_ESCO_RETRANS_QUALITY    2
#define BTM_ESCO_RETRANS_DONTCARE   0xff

/* Max Latency Don't Care */
#define BTM_ESCO_MAX_LAT_DONTCARE   0xffff

/* tBTM_ESCO_CBACK event types */
#define BTM_ESCO_CHG_EVT        1
#define BTM_ESCO_CONN_REQ_EVT   2
typedef UINT8 tBTM_ESCO_EVT;

/* Passed into BTM_SetEScoMode() */
typedef struct
{
    UINT32 tx_bw;
    UINT32 rx_bw;
    UINT16 max_latency;
    UINT16 voice_contfmt;  /* Voice Settings or Content Format */
    UINT16 packet_types;
    UINT8  retrans_effort;
} tBTM_ESCO_PARAMS;

typedef struct
{
    UINT16 max_latency;
    UINT16 packet_types;
    UINT8  retrans_effort;
} tBTM_CHG_ESCO_PARAMS;

/* Returned by BTM_ReadEScoLinkParms() */
typedef struct
{
    UINT16  rx_pkt_len;
    UINT16  tx_pkt_len;
    BD_ADDR bd_addr;
    UINT8   link_type;  /* BTM_LINK_TYPE_SCO or BTM_LINK_TYPE_ESCO */
    UINT8   tx_interval;
    UINT8   retrans_window;
    UINT8   air_mode;
} tBTM_ESCO_DATA;

typedef struct
{
    UINT16  sco_inx;
    UINT16  rx_pkt_len;
    UINT16  tx_pkt_len;
    BD_ADDR bd_addr;
    UINT8   hci_status;
    UINT8   tx_interval;
    UINT8   retrans_window;
} tBTM_CHG_ESCO_EVT_DATA;

typedef struct
{
    UINT16        sco_inx;
    BD_ADDR       bd_addr;
    DEV_CLASS     dev_class;
    tBTM_SCO_TYPE link_type;
} tBTM_ESCO_CONN_REQ_EVT_DATA;

typedef union
{
    tBTM_CHG_ESCO_EVT_DATA      chg_evt;
    tBTM_ESCO_CONN_REQ_EVT_DATA conn_evt;
} tBTM_ESCO_EVT_DATA;

/***************************
**  eSCO Callback Functions
****************************/
typedef void (tBTM_ESCO_CBACK) (tBTM_ESCO_EVT event, tBTM_ESCO_EVT_DATA *p_data);
#endif //BTM_API_H

#ifdef _WIN32_WCE
#pragma pack ()
#else
#include <poppack.h>
#endif

#endif // !defined(AFX_WIDCOMMTYPES_H__1F5ED990_6FC6_4B0D_882C_8D7C98C16A06__INCLUDED_)
