{
    This file is part of the Free Pascal run time library.
    Copyright (c) 2008 Free Pascal development team.

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 ********************************************************************** }
//
// Module: bthapi.h, bthapi.idl
//

//
//  Microsoft Windows Mobile 6.0 for PocketPC SDK.
//

unit bthapi;

{$MODE OBJFPC}

interface

uses Windows;

const
      LIBID_BTHAPILib:TIID = '{00BC26C8-0A87-41d0-82BA-61FF9E0B1BB5}';

const
     IID_ISdpWalk:TIID = '{57134AE6-5D3C-462D-BF2F-810361FBD7E7}';
     IID_ISdpNodeContainer:TIID = '{43F6ED49-6E22-4F81-A8EB-DCED40811A77}';
     IID_ISdpSearch:TIID = '{D93B6B2A-5EEF-4E1E-BECF-F5A4340C65F5}';
     IID_ISdpStream:TIID = '{A6ECD9FB-0C7A-41A3-9FF0-0B617E989357}';
     IID_ISdpRecord:TIID = '{10276714-1456-46D7-B526-8B1E83D5116E}';
     IID_IBluetoothDevice:TIID = '{5BD0418B-D705-4766-B215-183E4EADE341}';
     IID_IBluetoothAuthenticate:TIID = '{5F0FBA2B-8300-429D-99AD-96A2835D4901}';

const
      CLSID_SdpNodeContainer:CLSID = '{D5CA76C5-0DEE-4453-96A1-E603C2401766}';

      CLSID_SdpSearch:CLSID = '{3B898402-857E-4E41-9145-BC35431B7B4D}';

      CLSID_SdpWalk:CLSID = '{ED384010-59AE-44c7-8FCA-F3DF22CDCD28}';

      CLSID_SdpStream:CLSID = '{249797FA-19DB-4dda-94D4-E0BCD30EA65E}';

      CLSID_SdpRecord:CLSID = '{ACD02BA7-9667-4085-A100-CC6ACA9621D6}';


{$IFNDEF __BTHSDPDEF_H__}
type
     SDP_LARGE_INTEGER_16 = record
       LowPart:ULONGLONG;
       HighPart:LONGLONG;
     end;
     PSDP_LARGE_INTEGER_16 = ^SDP_LARGE_INTEGER_16;
     LPSDP_LARGE_INTEGER_16 = ^SDP_LARGE_INTEGER_16;

     SDP_ULARGE_INTEGER_16 = record
       LowPart:ULONGLONG;
       HighPart:ULONGLONG;
     end;
     PSDP_ULARGE_INTEGER_16 = ^SDP_ULARGE_INTEGER_16;
     LPSDP_ULARGE_INTEGER_16 = ^SDP_ULARGE_INTEGER_16;


type
     NodeContainerType = (NodeContainerTypeSequence	:= 0,
                          NodeContainerTypeAlternative);
     PNodeContainerType = ^NodeContainerType;


type
     SDP_ERROR = USHORT;
     PSDP_ERROR = ^SDP_ERROR;

type
     SDP_TYPE = (SDP_TYPE_NIL	:= 0,
	                SDP_TYPE_UINT	:= $1,
	                SDP_TYPE_INT	:= $2,
	                SDP_TYPE_UUID	:= $3,
	                SDP_TYPE_STRING	:= $4,
	                SDP_TYPE_BOOLEAN	:= $5,
	                SDP_TYPE_SEQUENCE	:= $6,
	                SDP_TYPE_ALTERNATIVE	:= $7,
	                SDP_TYPE_URL	:= $8,
	                SDP_TYPE_CONTAINER	:= $20);
     PSDP_TYPE = ^SDP_TYPE;

     SDP_SPECIFICTYPE = (SDP_ST_NONE	:= 0,
	                        SDP_ST_UINT8	:= $10,
                         SDP_ST_INT8	:= $20,
	                        SDP_ST_UINT16	:= $110,
                         SDP_ST_INT16	:= $120,
                         SDP_ST_UUID16	:= $130,
	                        SDP_ST_UINT32	:= $210,
                         SDP_ST_INT32	:= $220,
                         SDP_ST_UUID32	:= $230,
	                        SDP_ST_UINT64	:= $310,
                         SDP_ST_INT64	:= $320,
	                        SDP_ST_UINT128	:= $410,
	                        SDP_ST_INT128	:= $420,
	                        SDP_ST_UUID128	:= $430);
     PSDP_SPECIFICTYPE = ^SDP_SPECIFICTYPE;


type
     _SdpAttributeRange = record
       minAttribute:USHORT;
       maxAttribute:USHORT;
     end;
     SdpAttributeRange = _SdpAttributeRange;
     PSdpAttributeRange = ^_SdpAttributeRange;

type
     SdpQueryUuidUnion = record
       case integer of
         0: (uuid128:GUID);
         1: (uuid32:ULONG);
         2: (uuid16:USHORT);
     end;

type
     _SdpQueryUuid = record
       u:SdpQueryUuidUnion;
       uuidType:USHORT;
     end;
     SdpQueryUuid = _SdpQueryUuid;
     PSdpQueryUuid = ^_SdpQueryUuid;


const
      BTH_SDP_VERSION = 1;

type
     _BTHNS_SETBLOB = record
       pSdpVersion:PULONG;
       pRecordHandle:PULONG;
       Reserved:array[0..3] of ULONG;
       fSecurity:ULONG;
       fOptions:ULONG;
       ulRecordLength:ULONG;
       pRecord:array[0..0] of UCHAR;
     end;
     BTHNS_SETBLOB = _BTHNS_SETBLOB;
     PBTHNS_SETBLOB = ^_BTHNS_SETBLOB;

const
      MAX_UUIDS_IN_QUERY                   = 12;
      SDP_SERVICE_SEARCH_REQUEST           = 1;
      SDP_SERVICE_ATTRIBUTE_REQUEST        = 2;
      SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST = 3;

//
// The following may be passed as parameters to BthNsLookupServiceNext as extended
// dwFlags options for device inquiry.
//
const
// Causes traversal through list to be reset to first element.
      BTHNS_LUP_RESET_ITERATOR = $00010000;
// Does not increment list, causes next query to be performed on current item as well.
      BTHNS_LUP_NO_ADVANCE     = $00020000;
// Causes LookupServiceEnd to abort current inquiry.
      BTHNS_ABORT_CURRENT_INQUIRY = $fffffffd;


type
     _BTHNS_INQUIRYBLOB = record
       LAP:ULONG;
       _length:byte;
       num_responses:byte;
     end;
     BTHNS_INQUIRYBLOB = _BTHNS_INQUIRYBLOB;
     PBTHNS_INQUIRYBLOB = ^_BTHNS_INQUIRYBLOB;

type
     _BTHNS_RESTRICTIONBLOB = record
       _type:ULONG;
       serviceHandle:ULONG;
       uuids:array[0..11] of SdpQueryUuid;
       numRange:ULONG;
       pRange:array[0..0] of SdpAttributeRange;
     end;
     BTHNS_RESTRICTIONBLOB = _BTHNS_RESTRICTIONBLOB;
     PBTHNS_RESTRICTIONBLOB = ^_BTHNS_RESTRICTIONBLOB;

{$DEFINE __BTHSDPDEF_H__}
{$ENDIF __BTHSDPDEF_H__}


type
     SdpString = record
       val:^ShortInt;
       _length:ULONG;
     end;

//
// flags for fConnect in SdpSearch::Connect
//
const
      SDP_SEARCH_LOCAL    = $00000001;
      SDP_SEARCH_CACHED   = $00000002;

type
// Forward declarations.
     ISdpNodeContainer = interface;
     ISdpRecord = interface;

     PISdpRecord = ^ISdpRecord;
     PPISdpRecord = ^PISdpRecord;

     NodeDataUnion = record
       case integer of
         0: (int128:SDP_LARGE_INTEGER_16);
         1: (uint128:SDP_ULARGE_INTEGER_16);
         2: (uuid128:GUID);
         3: (uuid32:ULONG);
         4: (uuid16:USHORT);
         5: (int64:LONGLONG);
         6: (uint64:ULONGLONG);
         7: (int32:LONG);
         8: (uint32:ULONG);
         9: (int16:SHORT);
         10: (uint16:USHORT);
         11: (int8:ShortInt);
         12: (uint8:UCHAR);
         13: (booleanVal:UCHAR);
         14: (str:SdpString);
         15: (url:SdpString);
         16: (container:pointer{ISdpNodeContainer});
     end;

     NodeData = record
       _type:USHORT;
       specificType:USHORT;
       u:NodeDataUnion;
     end;
     PNODEDATA = ^NodeData;

     BthDeviceStringType = (BthDeviceStringTypeFriendlyName	:= 0,
	                          BthDeviceStringTypeDeviceName,
	                          BthDeviceStringTypeDisplay,
	                          BthDeviceStringTypeClass,
	                          BthDeviceStringTypeAddress);

// #pragma pack(push)
// #pragma pack(1)
{$PACKRECORDS 1}
     _BthDeviceInfo = record
       btAddress:ULONGLONG;
       cod:ULONG;
       lmpSupportedFeatures:ULONGLONG;
       name:array[0..247] of ShortInt;
     end;
     BthDeviceInfo = _BthDeviceInfo;
     PBthDeviceInfo = ^_BthDeviceInfo;
{$PACKRECORDS DEFAULT}
// #pragma pack(pop)

// Needful types.
     PPUCHAR = ^PUCHAR;
     PPUSHORT = ^PUSHORT;
     PPWCHAR = ^PWCHAR;

     ISdpWalk = interface(IUnknown)
      ['{57134AE6-5D3C-462D-BF2F-810361FBD7E7}']
       function WalkNode(pData:PNODEDATA; state:ULONG):HRESULT; stdcall;
       function WalkStream(elementType:UCHAR; elementSize:ULONG; pStream:PUCHAR):HRESULT; stdcall;
     end;

		   ISdpNodeContainer = interface(IUnknown)
      ['{43F6ED49-6E22-4F81-A8EB-DCED40811A77}']
       function CreateStream(out pStream:PUCHAR;{ppStream:PPUCHAR;} pSize:PULONG):HRESULT; stdcall;
       function WriteStream(pStream:PUCHAR; pNumBytesWritten:PULONG):HRESULT; stdcall;
       function AppendNode(pData:PNODEDATA):HRESULT; stdcall;
       function GetType(pType:PNodeContainerType):HRESULT; stdcall;
       function SetType(_type:NodeContainerType):HRESULT; stdcall;
       function Walk(Walk:ISdpWalk):HRESULT; stdcall;
       function SetNode(nodeIndex:ULONG; pData:PNODEDATA):HRESULT; stdcall;
       function GetNode(nodeIndex:ULONG; pData:PNODEDATA):HRESULT; stdcall;
       function LockContainer(lock:UCHAR):HRESULT; stdcall;
       function GetNodeCount(pNodeCount:PULONG):HRESULT; stdcall;
       function CreateFromStream(pStream:PUCHAR; _size:ULONG):HRESULT; stdcall;
       function GetNodeStringData(nodeIndex:ULONG; pData:PNODEDATA):HRESULT; stdcall;
       function GetStreamSize(pSize:PULONG):HRESULT; stdcall;
     end;

   		ISdpSearch = interface(IUnknown)
      ['{D93B6B2A-5EEF-4E1E-BECF-F5A4340C65F5}']
		     function _Begin(pAddrss:PULONGLONG; fConnect:ULONG):HRESULT; stdcall;
		     function _End:HRESULT; stdcall;
		     function ServiceSearch(pUuidList:PSdpQueryUuid;
                              listSize:ULONG;
                              pHandles:PULONG;
                              pNumHandles:PUSHORT):HRESULT; stdcall;
       function AttributeSearch(_handle:ULONG;
                                pRangeListP:SdpAttributeRange;
                                numRanges:ULONG;
                                out ppSdpRecord:ISdpRecord{ppSdpRecord:PISdpRecord}):HRESULT; stdcall;
       function ServiceAndAttributeSearch(pUuidList:PSdpQueryUuid;
                                          listSize:ULONG;
                                          pRangeList:PSdpAttributeRange;
                                          numRanges:ULONG;
                                          out pppSdpRecord:PISdpRecord{pppSdpRecord:PPISdpRecord};
                                          pNumRecords:PULONG):HRESULT; stdcall;
     end;


     ISdpStream = interface(IUnknown)
      ['{A6ECD9FB-0C7A-41A3-9FF0-0B617E989357}']
{$IF DEFINED(WINCE_EMULATION)}
       function Validate(pStream:PUCHAR; _size:ULONG; pErrorByte:PULONG):HRESULT; stdcall;
{$ELSE}
       function Validate(pStream:PUCHAR; _size:ULONG; pErrorByte:PULONG_PTR):HRESULT; stdcall;
{$ENDIF}
       function Walk(Walk:ISdpWalk):HRESULT; stdcall;

       function RetrieveRecords(pStream:PUCHAR; _size:ULONG; var SdpRecords:ISdpRecord;{ppSdpRecords:PISdpRecord;} pNumRecords:PULONG):HRESULT; stdcall;

       function RetrieveUuid128(pStream:PUCHAR; pUuid128:PGUID):HRESULT; stdcall;

       function RetrieveUint16(pStream:PUCHAR; pUint16:PUSHORT):HRESULT; stdcall;
       function RetrieveUint32(pStream:PUCHAR; pUint32:PULONG):HRESULT; stdcall;
       function RetrieveUint64(pStream:PUCHAR; pUint64:PULONGLONG):HRESULT; stdcall;
       function RetrieveUint128(pStream:PUCHAR; pUint128:PSDP_ULARGE_INTEGER_16):HRESULT; stdcall;
       function RetrieveInt16(pStream:PUCHAR; pInt16:PSHORT):HRESULT; stdcall;
       function RetrieveInt32(pStream:PUCHAR; pInt32:PLONG):HRESULT; stdcall;
       function RetrieveInt64(pStream:PUCHAR; pInt64:PLONGLONG):HRESULT; stdcall;
       function RetrieveInt128(pStream:PUCHAR; pInt128:PSDP_LARGE_INTEGER_16):HRESULT; stdcall;

       function ByteSwapUuid128(pInUuid128:PGUID; pOutUuid128:PGUID):HRESULT; stdcall;
       function ByteSwapUint128(pInUint128:PSDP_ULARGE_INTEGER_16; pOutUint128:PSDP_ULARGE_INTEGER_16):HRESULT; stdcall;
       function ByteSwapUint64(inUint64:ULONGLONG; pOutUint64:PULONGLONG):HRESULT; stdcall;
       function ByteSwapUint32(uint32:ULONG; pUint32:PULONG):HRESULT; stdcall;
       function ByteSwapUint16(uint16:USHORT; pUint16:PUSHORT):HRESULT; stdcall;
       function ByteSwapInt128(pInInt128:PSDP_LARGE_INTEGER_16; pOutInt128:PSDP_LARGE_INTEGER_16):HRESULT; stdcall;
       function ByteSwapInt64(inInt64:LONGLONG; pOutInt64:PLONGLONG):HRESULT; stdcall;
       function ByteSwapInt32(int32:LONG; pInt32:PLONG):HRESULT; stdcall;
       function ByteSwapInt16(int16:SHORT; pInt16:PSHORT):HRESULT; stdcall;

       function NormalizeUuid(pDataUuid:PNODEDATA; pNormalizeUuid:PGUID):HRESULT; stdcall;
       function RetrieveElementInfo(pStream:PUCHAR;
                                    pElementType:PSDP_TYPE;
                                    pElementSpecificType:PSDP_SPECIFICTYPE;
                                    pElementSize:PULONG;
                                    pStorageSize:PULONG;
                                    out pData:PUCHAR{ppData:PPUCHAR}):HRESULT; stdcall;
       function VerifySequenceOf(pStream:PUCHAR; _size:ULONG; ofType:SDP_TYPE; pSpecificSizes:PUCHAR; pNumFound:PULONG):HRESULT; stdcall;
     end;

     ISdpRecord = interface(IUnknown)
      ['{10276714-1456-46D7-B526-8B1E83D5116E}']
       function CreateFromStream(pStream:PUCHAR; _size:ULONG):HRESULT; stdcall;
       function WriteToStream(out pStream:PUCHAR;{ppStream:PPUCHAR;} pStreamSize:PULONG; preSize:ULONG; postSize:ULONG):HRESULT; stdcall;
       function SetAttribute(attribute:USHORT; pNode:PNODEDATA):HRESULT; stdcall;
       function SetAttributeFromStream(attribute:USHORT; pStream:PUCHAR; _size:ULONG):HRESULT; stdcall;
       function GetAttribute(attribute:USHORT; pNode:PNODEDATA):HRESULT; stdcall;
       function GetAttributeAsStream(attribute:USHORT; out pStream:PUCHAR;{ppStream:PPUCHAR;} pSize:PULONG):HRESULT; stdcall;
       function Walk(Walk:ISdpWalk):HRESULT; stdcall;
       function GetAttributeList(out pList:PUSHORT;{ppList:PPUSHORT;} pListSize:PULONG):HRESULT; stdcall;
       function GetString(_offset:USHORT; pLangId:PUSHORT; var ppString:PWCHAR{ppString:PPWCHAR}):HRESULT; stdcall;
       function GetIcon(cxRes:longint; cyRes:longint; phIcon:LPHICON):HRESULT; stdcall;
       function GetServiceClass(pServiceClass:LPGUID):HRESULT; stdcall;
     end;


     IBluetoothDevice = interface(IUnknown)
      ['{5BD0418B-D705-4766-B215-183E4EADE341}']
       function Initialize(pInfo:PBthDeviceInfo):HRESULT; stdcall;
       function GetInfo(pInfo:PBthDeviceInfo):HRESULT; stdcall;
       function GetString(_type:BthDeviceStringType; var ppString:PWCHAR{ppString:PPWCHAR}):HRESULT; stdcall;
       function SetString(_type:BthDeviceStringType; pString:PWCHAR):HRESULT; stdcall;
       function GetIcon(cxRes:longint; cyRes:longint; phIcon:LPHICON):HRESULT; stdcall;
       function GetApprovedServices(pServices:PGUID; pServiceCount:PULONG):HRESULT; stdcall;
       function GetPassKey(hwndParent:HWND; pPassKey:PUCHAR; pPassKeyLength:PUCHAR):HRESULT; stdcall;
     end;

     IBluetoothAuthenticate = interface(IUnknown)
      ['{5F0FBA2B-8300-429D-99AD-96A2835D4901}']

     end;

implementation

end.
