Содержание материала

  

Code:

package BTClasses;

 

{$R *.res}

{$ALIGN 8}

{$ASSERTIONS ON}

{$BOOLEVAL OFF}

{$DEBUGINFO ON}

{$EXTENDEDSYNTAX ON}

{$IMPORTEDDATA ON}

{$IOCHECKS ON}

{$LOCALSYMBOLS ON}

{$LONGSTRINGS ON}

{$OPENSTRINGS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

{$RANGECHECKS OFF}

{$REFERENCEINFO ON}

{$SAFEDIVIDE OFF}

{$STACKFRAMES OFF}

{$TYPEDADDRESS OFF}

{$VARSTRINGCHECKS ON}

{$WRITEABLECONST OFF}

{$MINENUMSIZE 1}

{$IMAGEBASE $400000}

{$IMPLICITBUILD OFF}

 

requires

rtl;

 

contains

BTRadio in 'BTRadio.pas',

BluetoothAPI in 'BluetoothAPI.pas',

BthSdpDef in 'BthSdpDef.pas',

BTExceptions in 'BTExceptions.pas',

BTStrings in 'BTStrings.pas',

BTDevice in 'BTDevice.pas';

 

end.

 

 

Code:

unit BluetoothAPI;

 

interface

 

uses

Windows, BthSdpDef;

 

const

BLUETOOTH_MAX_NAME_SIZE            = 248;

{$EXTERNALSYM BLUETOOTH_MAX_NAME_SIZE}

BLUETOOTH_MAX_PASSKEY_SIZE         = 16;

{$EXTERNALSYM BLUETOOTH_MAX_PASSKEY_SIZE}

BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE  = BLUETOOTH_MAX_PASSKEY_SIZE + 1;

{$EXTERNALSYM BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE}

 

// ***************************************************************************

//

//  Bluetooth Address

//

// ***************************************************************************

 

type

BTH_ADDR = Int64;

{$EXTERNALSYM BTH_ADDR}

 

_BLUETOOTH_ADDRESS = record

   case Integer of

     0: (ullLong: BTH_ADDR);       //  easier to compare again BLUETOOTH_NULL_ADDRESS

     1: (rgBytes: array [0..5] of Byte);   //  easier to format when broken out

end;

{$EXTERNALSYM _BLUETOOTH_ADDRESS}

BLUETOOTH_ADDRESS = _BLUETOOTH_ADDRESS;

{$EXTERNALSYM BLUETOOTH_ADDRESS}

TBlueToothAddress = BLUETOOTH_ADDRESS;

PBlueToothAddress = ^BLUETOOTH_ADDRESS;

 

const

BLUETOOTH_NULL_ADDRESS: TBlueToothAddress = (ullLong: 0;);

{$EXTERNALSYM BLUETOOTH_NULL_ADDRESS}

 

// ***************************************************************************

//

//  Radio Enumeration

//

//  Description:

//      This group of APIs enumerates the installed Bluetooth radios.

//

//  Sample Usage:

//      HANDLE hRadio;

//      BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };

//

//      HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio );

//      if ( NULL != hFind )

//      {

//          do

//          {

//              //

//              //  TODO: Do something with the radio handle.

//              //

//

//              CloseHandle( hRadio );

//

//          } while( BluetoothFindNextRadio( hFind, &hRadio ) );

//

//          BluetoothFindRadioClose( hFind );

//      }

//

// ***************************************************************************

 

type

_BLUETOOTH_FIND_RADIO_PARAMS = record

   dwSize: DWORD;             //  IN  sizeof this structure

end;

{$EXTERNALSYM _BLUETOOTH_FIND_RADIO_PARAMS}

BLUETOOTH_FIND_RADIO_PARAMS = _BLUETOOTH_FIND_RADIO_PARAMS;

{$EXTERNALSYM BLUETOOTH_FIND_RADIO_PARAMS}

TBlueToothFindRadioParams = BLUETOOTH_FIND_RADIO_PARAMS;

PBlueToothFindRadioParams = ^BLUETOOTH_FIND_RADIO_PARAMS;

 

HBLUETOOTH_RADIO_FIND = THandle;

{$EXTERNALSYM HBLUETOOTH_RADIO_FIND}

 

//

//  Description:

//      Begins the enumeration of local Bluetooth radios.

//

//  Parameters:

//      pbtfrp

//          A pointer to a BLUETOOTH_FIND_RADIO_PARAMS structure. The dwSize

//          member of this structure must match the sizeof the of the structure.

//

//      phRadio

//          A pointer where the first radio HANDLE enumerated will be returned.

//

//  Return Values:

//      NULL

//          Error opening radios or no devices found. Use GetLastError() for

//          more info.

//

//          ERROR_INVALID_PARAMETER

//              pbtfrp parameter is NULL.

//

//          ERROR_REVISION_MISMATCH

//              The pbtfrp structure is not the right length.

//

//          ERROR_OUTOFMEMORY

//              Out of memory.

//

//          other Win32 errors.

//

//      any other

//          Success. The return handle is valid and phRadio points to a valid handle.

//

 

function BluetoothFindFirstRadio(const pbtfrp: PBlueToothFindRadioParams; var phRadio: THandle): HBLUETOOTH_RADIO_FIND; stdcall;

{$EXTERNALSYM BluetoothFindFirstRadio}

 

//

//  Description:

//      Finds the next installed Bluetooth radio.

//

//  Parameters:

//      hFind

//          The handle returned by BluetoothFindFirstRadio().

//

//      phRadio

//          A pointer where the next radio HANDLE enumerated will be returned.

//

//  Return Values:

//      TRUE

//          Next device succesfully found. pHandleOut points to valid handle.

//

//      FALSE

//          No device found. pHandleOut points to an invalid handle. Call

//          GetLastError() for more details.

//

//          ERROR_INVALID_HANDLE

//              The handle is NULL.

//

//          ERROR_NO_MORE_ITEMS

//              No more radios found.

//

//          ERROR_OUTOFMEMORY

//              Out of memory.

//

//          other Win32 errors

//

 

function BluetoothFindNextRadio(hFind: HBLUETOOTH_RADIO_FIND; var phRadio: THandle): BOOL; stdcall;

{$EXTERNALSYM BluetoothFindNextRadio}

 

//

//  Description:

//      Closes the enumeration handle.

//

//  Parameters

//      hFind

//          The handle returned by BluetoothFindFirstRadio().

//

//  Return Values:

//      TRUE

//          Handle succesfully closed.

//

//      FALSE

//          Failure. Check GetLastError() for details.

//

//          ERROR_INVALID_HANDLE

//              The handle is NULL.

//

 

function BluetoothFindRadioClose(hFind: HBLUETOOTH_RADIO_FIND): BOOL; stdcall;

{$EXTERNALSYM BluetoothFindRadioClose}

 

// ***************************************************************************

//

//  Radio Information

//

// ***************************************************************************

 

type

_BLUETOOTH_RADIO_INFO = record

   dwSize: DWORD;                               // Size, in bytes, of this entire data structure

   address: BLUETOOTH_ADDRESS;                  // Address of the local radio

   szName: array [0..BLUETOOTH_MAX_NAME_SIZE - 1] of WideChar;    // Name of the local radio

   ulClassofDevice: ULONG;                      // Class of device for the local radio

   lmpSubversion: Word;                       // lmpSubversion, manufacturer specifc.

   manufacturer: Word;                        // Manufacturer of the radio, BTH_MFG_Xxx value.  For the most up to date

                                               // list, goto the Bluetooth specification website and get the Bluetooth

                                               // assigned numbers document.

end;

{$EXTERNALSYM _BLUETOOTH_RADIO_INFO}

BLUETOOTH_RADIO_INFO = _BLUETOOTH_RADIO_INFO;

{$EXTERNALSYM BLUETOOTH_RADIO_INFO}

PBLUETOOTH_RADIO_INFO = ^BLUETOOTH_RADIO_INFO;

{$EXTERNALSYM PBLUETOOTH_RADIO_INFO}

TBlueToothRadioFind = BLUETOOTH_RADIO_INFO;

PBlueToothRadioFind = PBLUETOOTH_RADIO_INFO;

 

//

//  Description:

//      Retrieves the information about the radio represented by the handle.

//

//  Parameters:

//      hRadio

//          Handle to a local radio retrieved through BluetoothFindFirstRadio()

//          et al or SetupDiEnumerateDeviceInterfaces()

//

//      pRadioInfo

//          Radio information to be filled in. The dwSize member must match the

//          size of the structure.

//

//  Return Values:

//      ERROR_SUCCESS

//          The information was retrieved successfully.

//

//      ERROR_INVALID_PARAMETER

//          pRadioInfo or hRadio is NULL.

//

//      ERROR_REVISION_MISMATCH

//          pRadioInfo->dwSize is invalid.

//

//      other Win32 error codes.

//

 

function BluetoothGetRadioInfo(hRadio: THandle; var pRadioInfo: BLUETOOTH_RADIO_INFO): DWORD; stdcall;

{$EXTERNALSYM BluetoothGetRadioInfo}

 

// ***************************************************************************

//

//  Device Information Stuctures

//

// ***************************************************************************

 

type

_BLUETOOTH_DEVICE_INFO = record

   dwSize: DWORD;                             //  size, in bytes, of this structure - must be the sizeof(BLUETOOTH_DEVICE_INFO)

   Address: BLUETOOTH_ADDRESS;                  //  Bluetooth address

   ulClassofDevice: ULONG;                    //  Bluetooth "Class of Device"

   fConnected: BOOL;                         //  Device connected/in use

   fRemembered: BOOL;                        //  Device remembered

   fAuthenticated: BOOL;                     //  Device authenticated/paired/bonded

   stLastSeen: SYSTEMTIME;                     //  Last time the device was seen

   stLastUsed: SYSTEMTIME;                     //  Last time the device was used for other than RNR, inquiry, or SDP

   szName: array [0..BLUETOOTH_MAX_NAME_SIZE - 1] of WideChar;  //  Name of the device

end;

{$EXTERNALSYM _BLUETOOTH_DEVICE_INFO}

BLUETOOTH_DEVICE_INFO = _BLUETOOTH_DEVICE_INFO;

{$EXTERNALSYM BLUETOOTH_DEVICE_INFO}

PBLUETOOTH_DEVICE_INFO = BLUETOOTH_DEVICE_INFO;

{$EXTERNALSYM PBLUETOOTH_DEVICE_INFO}

TBlueToothDeviceInfo = BLUETOOTH_DEVICE_INFO;

PBlueToothDeviceInfo = PBLUETOOTH_DEVICE_INFO;

 

// ***************************************************************************

//

//  Device Enumeration

//

//  Description:

//      Enumerates the Bluetooth devices. The types of returned device depends

//      on the flags set in the BLUETOOTH_DEVICE_SEARCH_PARAMS (see structure

//      definition for details).

//

//  Sample Usage:

//      HBLUETOOTH_DEVICE_FIND hFind;

//      BLUETOOTH_DEVICE_SEARCH_PARAMS btsp = { sizeof(btsp) };

//      BLUETOOTH_DEVICE_INFO btdi = { sizeof(btdi) };

//

//      btsp.fReturnAuthenticated = TRUE;

//      btsp.fReturnRemembered    = TRUE;

//

//      hFind = BluetoothFindFirstDevice( &btsp, &btdi );

//      if ( NULL != hFind )

//      {

//          do

//          {

//              //

//              //  TODO:   Do something useful with the device info.

//              //

//

//          } while( BluetoothFindNextDevice( hFind, &btdi ) );

//

//          BluetoothFindDeviceClose( hFind );

//      }

//

// ***************************************************************************

 

type

_BLUETOOTH_DEVICE_SEARCH_PARAMS = record

   dwSize: DWORD;                 //  IN  sizeof this structure

 

   fReturnAuthenticated: BOOL;   //  IN  return authenticated devices

   fReturnRemembered: BOOL;      //  IN  return remembered devices

   fReturnUnknown: BOOL;         //  IN  return unknown devices

   fReturnConnected: BOOL;       //  IN  return connected devices

 

   fIssueInquiry: BOOL;          //  IN  issue a new inquiry

   cTimeoutMultiplier: UCHAR;     //  IN  timeout for the inquiry

 

   hRadio: THandle;                 //  IN  handle to radio to enumerate - NULL == all radios will be searched

end;

{$EXTERNALSYM _BLUETOOTH_DEVICE_SEARCH_PARAMS}

BLUETOOTH_DEVICE_SEARCH_PARAMS = _BLUETOOTH_DEVICE_SEARCH_PARAMS;

{$EXTERNALSYM BLUETOOTH_DEVICE_SEARCH_PARAMS}

TBlueToothDeviceSearchParams = BLUETOOTH_DEVICE_SEARCH_PARAMS;

 

HBLUETOOTH_DEVICE_FIND = THandle;

{$EXTERNALSYM HBLUETOOTH_DEVICE_FIND}

 

//

//  Description:

//      Begins the enumeration of Bluetooth devices.

//

//  Parameters:

//      pbtsp

//          A pointer to a BLUETOOTH_DEVICE_SEARCH_PARAMS structure. This

//          structure contains the flags and inputs used to conduct the search.

//          See BLUETOOTH_DEVICE_SEARCH_PARAMS for details.

//

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure to return information

//          about the first Bluetooth device found. Note that the dwSize member

//          of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before

//          calling because the APIs hast to know the size of the buffer being

//          past in. The dwSize member must also match the exact

//          sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail.

//

//  Return Values:

//      NULL

//          Error opening radios or not devices found. Use GetLastError for more info.

//

//          ERROR_INVALID_PARAMETER

//              pbtsp parameter or pbtdi parameter is NULL.

//

//          ERROR_REVISION_MISMATCH

//              The pbtfrp structure is not the right length.

//

//          other Win32 errors

//

//      any other value

//          Success. The return handle is valid and pbtdi points to valid data.

//

 

function BluetoothFindFirstDevice(const pbtsp: BLUETOOTH_DEVICE_SEARCH_PARAMS; var pbtdi: BLUETOOTH_DEVICE_INFO): HBLUETOOTH_DEVICE_FIND; stdcall;

{$EXTERNALSYM BluetoothFindFirstDevice}

 

//

//  Description:

//      Finds the next Bluetooth device in the enumeration.

//

//  Parameters:

//      hFind

//          The handle returned from BluetoothFindFirstDevice().

//

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure to return information

//          about the first Bluetooth device found. Note that the dwSize member

//          of the structure must be the sizeof(BLUETOOTH_DEVICE_INFO) before

//          calling because the APIs hast to know the size of the buffer being

//          past in. The dwSize member must also match the exact

//          sizeof(BLUETOOTH_DEVICE_INFO) or the call will fail.

//

//  Return Values:

//      TRUE

//          Next device succesfully found. pHandleOut points to valid handle.

//

//      FALSE

//          No device found. pHandleOut points to an invalid handle. Call

//          GetLastError() for more details.

//

//          ERROR_INVALID_HANDLE

//              The handle is NULL.

//

//          ERROR_NO_MORE_ITEMS

//              No more radios found.

//

//          ERROR_OUTOFMEMORY

//              Out of memory.

//

//          other Win32 errors

//

 

function BluetoothFindNextDevice(hFind: HBLUETOOTH_DEVICE_FIND; var pbtdi: BLUETOOTH_DEVICE_INFO): BOOL; stdcall;

{$EXTERNALSYM BluetoothFindNextDevice}

 

//

//  Description:

//      Closes the enumeration handle.

//

//  Parameters:

//      hFind

//          The handle returned from BluetoothFindFirstDevice().

//

//  Return Values:

//      TRUE

//          Handle succesfully closed.

//

//      FALSE

//          Failure. Check GetLastError() for details.

//

//          ERROR_INVALID_HANDLE

//              The handle is NULL.

//

 

function BluetoothFindDeviceClose(hFind: HBLUETOOTH_DEVICE_FIND): BOOL; stdcall;

{$EXTERNALSYM BluetoothFindDeviceClose}

 

//

//  Description:

//      Retrieves information about a remote device.

//

//      Fill in the dwSize and the Address members of the pbtdi structure

//      being passed in. On success, the rest of the members will be filled

//      out with the information that the system knows.

//

//  Parameters:

//      hRadio

//          Handle to a local radio retrieved through BluetoothFindFirstRadio()

//          et al or SetupDiEnumerateDeviceInterfaces()

//

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure to return information

//          about the first Bluetooth device found. The dwSize member of the

//          structure must be the sizeof the structure in bytes. The Address

//          member must be filled out with the Bluetooth address of the remote

//          device.

//

//  Return Values:

//      ERROR_SUCCESS

//          Success. Information returned.

//

//      ERROR_REVISION_MISMATCH

//          The size of the BLUETOOTH_DEVICE_INFO isn't compatible. Check

//          the dwSize member of the BLUETOOTH_DEVICE_INFO structure you

//          passed in.

//

//      ERROR_NOT_FOUND

//          The radio is not known by the system or the Address field of

//          the BLUETOOTH_DEVICE_INFO structure is all zeros.

//

//      ERROR_INVALID_PARAMETER

//          pbtdi is NULL.

//

//      other error codes

//

 

function BluetoothGetDeviceInfo(hRadio: THandle; var pbtdi: BLUETOOTH_DEVICE_INFO): DWORD; stdcall;

{$EXTERNALSYM BluetoothGetDeviceInfo}

 

//

//  Description:

//      Updates the computer local cache about the device.

//

//  Parameters:

//      pbtdi

//          A pointer to the BLUETOOTH_DEVICE_INFO structure to be updated.

//          The following members must be valid:

//              dwSize

//                  Must match the size of the structure.

//              Address

//                  Must be a previously found radio address.

//              szName

//                  New name to be stored.

//

//  Return Values:

//      ERROR_SUCCESS

//          The device information was updated successfully.

//

//      ERROR_INVALID_PARAMETER

//          pbtdi is NULL.

//

//      ERROR_REVISION_MISMATCH

//          pbtdi->dwSize is invalid.

//

//      other Win32 error codes.

//

 

function BluetoothUpdateDeviceRecord(var pbtdi: BLUETOOTH_DEVICE_INFO): DWORD; stdcall;

{$EXTERNALSYM BluetoothUpdateDeviceRecord}

 

//

//  Description:

//      Delete the authentication (aka "bond") between the computer and the

//      device. Also purges any cached information about the device.

//

//  Return Values:

//      ERROR_SUCCESS

//          The device was removed successfully.

//

//      ERROR_NOT_FOUND

//          The device was not found. If no Bluetooth radio is installed,

//          the devices could not be enumerated or removed.

//

 

function BluetoothRemoveDevice(var pAddress: BLUETOOTH_ADDRESS): DWORD; stdcall;

{$EXTERNALSYM BluetoothRemoveDevice}

 

// ***************************************************************************

//

//  Device Picker Dialog

//

//  Description:

//      Invokes a common dialog for selecting Bluetooth devices. The list

//      of devices displayed to the user is determined by the flags and

//      settings the caller specifies in the BLUETOOTH_SELECT_DEVICE_PARAMS

//      (see structure definition for more details).

//

//      If BluetoothSelectDevices() returns TRUE, the caller must call

//      BluetoothSelectDevicesFree() or memory will be leaked within the

//      process.

//

//  Sample Usage:

//

//      BLUETOOTH_SELECT_DEVICE_PARAMS btsdp = { sizeof(btsdp) };

//

//      btsdp.hwndParent = hDlg;

//      btsdp.fShowUnknown = TRUE;

//      btsdp.fAddNewDeviceWizard = TRUE;

//

//      BOOL b = BluetoothSelectDevices( &btsdp );

//      if ( b )

//      {

//          BLUETOOTH_DEVICE_INFO * pbtdi = btsdp.pDevices;

//          for ( ULONG cDevice = 0; cDevice < btsdp.cNumDevices; cDevice ++ )

//          {

//              if ( pbtdi->fAuthenticated || pbtdi->fRemembered )

//              {

//                  //

//                  //  TODO:   Do something usefull with the device info

//                  //

//              }

//

//              pbtdi = (BLUETOOTH_DEVICE_INFO *) ((LPBYTE)pbtdi + pbtdi->dwSize);

//          }

//

//          BluetoothSelectDevicesFree( &btsdp );

//      }

//

// ***************************************************************************

 

type

_BLUETOOTH_COD_PAIRS = record

   ulCODMask: ULONG;                          //  ClassOfDevice mask to compare

   pcszDescription: LPWSTR;                    //  Descriptive string of mask

end;

{$EXTERNALSYM _BLUETOOTH_COD_PAIRS}

BLUETOOTH_COD_PAIRS = _BLUETOOTH_COD_PAIRS;

{$EXTERNALSYM BLUETOOTH_COD_PAIRS}

TBlueToothCodPairs = BLUETOOTH_COD_PAIRS;

PBlueToothCodPairs = ^BLUETOOTH_COD_PAIRS;

 

PFN_DEVICE_CALLBACK = function(pvParam: Pointer; pDevice: PBLUETOOTH_DEVICE_INFO): BOOL; stdcall;

{$EXTERNALSYM PFN_DEVICE_CALLBACK}

 

_BLUETOOTH_SELECT_DEVICE_PARAMS = record

   dwSize: DWORD;                             //  IN  sizeof this structure

 

   cNumOfClasses: ULONG;                      //  IN  Number in prgClassOfDevice - if ZERO search for all devices

   prgClassOfDevices: PBlueToothCodPairs;    //  IN  Array of CODs to find.

 

   pszInfo: LPWSTR;                            //  IN  If not NULL, sets the "information" text

 

   hwndParent: HWND;                         //  IN  parent window - NULL == no parent

 

   fForceAuthentication: BOOL;               //  IN  If TRUE, authenication will be forced before returning

   fShowAuthenticated: BOOL;                 //  IN  If TRUE, authenticated devices will be shown in the picker

   fShowRemembered: BOOL;                    //  IN  If TRUE, remembered devices will be shown in the picker

   fShowUnknown: BOOL;                       //  IN  If TRUE, unknown devices that are not authenticated or "remember" will be shown.

 

   fAddNewDeviceWizard: BOOL;                //  IN  If TRUE, invokes the add new device wizard.

   fSkipServicesPage: BOOL;                  //  IN  If TRUE, skips the "Services" page in the wizard.

 

   pfnDeviceCallback: PFN_DEVICE_CALLBACK;      //  IN  If non-NULL, a callback that will be called for each device. If the

                                               //      the callback returns TRUE, the item will be added. If the callback is

                                               //      is FALSE, the item will not be shown.

   pvParam: Pointer;                            //  IN  Parameter to be passed to pfnDeviceCallback as the pvParam.

 

   cNumDevices: DWORD;                        //  IN  number calles wants - ZERO == no limit.

                                               //  OUT the number of devices returned.

 

   pDevices: PBLUETOOTH_DEVICE_INFO;           //  OUT pointer to an array for BLUETOOTH_DEVICE_INFOs.

                                               //      call BluetoothSelectDevicesFree() to free

end;

{$EXTERNALSYM _BLUETOOTH_SELECT_DEVICE_PARAMS}

BLUETOOTH_SELECT_DEVICE_PARAMS = _BLUETOOTH_SELECT_DEVICE_PARAMS;

{$EXTERNALSYM BLUETOOTH_SELECT_DEVICE_PARAMS}

TBlueToothSelectDeviceParams = BLUETOOTH_SELECT_DEVICE_PARAMS;

PBlueToothSelectDeviceParams = ^BLUETOOTH_SELECT_DEVICE_PARAMS;

 

//

//  Description:

//      (See header above)

//

//  Return Values:

//      TRUE

//          User selected a device. pbtsdp->pDevices points to valid data.

//          Caller should check the fAuthenticated && fRemembered flags to

//          determine which devices we successfuly authenticated or valid

//          selections by the user.

//

//          Use BluetoothSelectDevicesFree() to free the nessecary data

//          such as pDevices only if this function returns TRUE.

//

//      FALSE

//          No valid data returned. Call GetLastError() for possible details

//          of the failure. If GLE() is:

//

//          ERROR_CANCELLED

//              The user cancelled  the request.

//

//          ERROR_INVALID_PARAMETER

//              The pbtsdp is NULL.

//

//          ERROR_REVISION_MISMATCH

//              The structure passed in as pbtsdp is of an unknown size.

//

//          other WIN32 errors

//

 

function BluetoothSelectDevices(pbtsdp: PBlueToothSelectDeviceParams): BOOL; stdcall;

{$EXTERNALSYM BluetoothSelectDevices}

 

//

//  Description:

//      This function should only be called if BluetoothSelectDevices() returns

//      TRUE. This function will free any memory and resource returned by the

//      BluetoothSelectDevices() in the BLUETOOTH_SELECT_DEVICE_PARAMS

//      structure.

//

//  Return Values:

//      TRUE

//          Success.

//

//      FALSE

//          Nothing to free.

//

 

function BluetoothSelectDevicesFree(pbtsdp: PBlueToothSelectDeviceParams): BOOL; stdcall;

{$EXTERNALSYM BluetoothSelectDevicesFree}

 

// ***************************************************************************

//

//  Device Property Sheet

//

// ***************************************************************************

 

//

//  Description:

//      Invokes the CPLs device info property sheet.

//

//  Parameters:

//      hwndParent

//          HWND to parent the property sheet.

//

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure of the device

//          to be displayed.

//

//  Return Values:

//      TRUE

//          The property page was successfully displayed.

//

//      FALSE

//          Failure. The property page was not displayed. Check GetLastError

//          for more details.

//

 

function BluetoothDisplayDeviceProperties(hwndParent: HWND; pbtdi: PBLUETOOTH_DEVICE_INFO): BOOL; stdcall;

{$EXTERNALSYM BluetoothDisplayDeviceProperties}

 

// ***************************************************************************

//

//  Radio Authentication

//

// ***************************************************************************

 

//

//  Description:

//      Sends an authentication request to a remote device.

//                                          

//      There are two modes of operation. "Wizard mode" and "Blind mode."

//

//      "Wizard mode" is invoked when the pszPasskey is NULL. This will cause

//      the "Bluetooth Connection Wizard" to be invoked. The user will be

//      prompted to enter a passkey during the wizard after which the

//      authentication request will be sent. The user will see the success

//      or failure of the authentication attempt. The user will also be

//      given the oppurtunity to try to fix a failed authentication.

//

//      "Blind mode" is invoked when the pszPasskey is non-NULL. This will

//      cause the computer to send a authentication request to the remote

//      device. No UI is ever displayed. The Bluetooth status code will be

//      mapped to a Win32 Error code.

//

//  Parameters:

//

//      hwndParent

//          The window to parent the authentication wizard. If NULL, the

//          wizard will be parented off the desktop.

//

//      hRadio

//          A valid local radio handle or NULL. If NULL, then all radios will

//          be tired. If any of the radios succeed, then the call will

//          succeed.

//

//      pbtdi

//          BLUETOOTH_DEVICE_INFO record of the device to be authenticated.

//

//      pszPasskey

//          PIN to be used to authenticate the device.  If NULL, then UI is

//          displayed and the user steps through the authentication process.

//          If not NULL, no UI is shown.  The passkey is NOT NULL terminated.

//

//      ulPasskeyLength

//          Length of szPassKey in bytes. The length must be less than or

//          equal to BLUETOOTH_MAX_PASSKEY_SIZE * sizeof(WCHAR).

//

//  Return Values:

//

//      ERROR_SUCCESS

//          Success.

//

//      ERROR_CANCELLED

//          User aborted the operation.

//

//      ERROR_INVALID_PARAMETER

//          The device structure in pbtdi is invalid.

//

//      ERROR_NO_MORE_ITEMS

//          The device in pbtdi is already been marked as authenticated.

//

//      other WIN32 error

//          Failure. Return value is the error code.

//

//      For "Blind mode," here is the current mapping of Bluetooth status

//      code to Win32 error codes:

//

//          { BTH_ERROR_SUCCESS,                ERROR_SUCCESS },

//          { BTH_ERROR_NO_CONNECTION,          ERROR_DEVICE_NOT_CONNECTED },

//          { BTH_ERROR_PAGE_TIMEOUT,           WAIT_TIMEOUT },

//          { BTH_ERROR_HARDWARE_FAILURE,       ERROR_GEN_FAILURE },

//          { BTH_ERROR_AUTHENTICATION_FAILURE, ERROR_NOT_AUTHENTICATED },

//          { BTH_ERROR_MEMORY_FULL,            ERROR_NOT_ENOUGH_MEMORY },

//          { BTH_ERROR_CONNECTION_TIMEOUT,     WAIT_TIMEOUT },

//          { BTH_ERROR_LMP_RESPONSE_TIMEOUT,   WAIT_TIMEOUT },

//          { BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS, ERROR_REQ_NOT_ACCEP },

//          { BTH_ERROR_PAIRING_NOT_ALLOWED,    ERROR_ACCESS_DENIED },

//          { BTH_ERROR_UNSPECIFIED_ERROR,      ERROR_NOT_READY },

//          { BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION, ERROR_VC_DISCONNECTED },

//

 

function BluetoothAuthenticateDevice(

   hwndParent: HWND;

   hRadio: THandle;

   pbtbi: PBLUETOOTH_DEVICE_INFO;

   pszPasskey: PWideChar;

   ulPasskeyLength: ULONG): DWORD; stdcall;

{$EXTERNALSYM BluetoothAuthenticateDevice}

 

//

//  Description:

//      Allows the caller to prompt for multiple devices to be authenticated

//      within a single instance of the "Bluetooth Connection Wizard."

//

//  Parameters:

//

//      hwndParent

//          The window to parent the authentication wizard. If NULL, the

//          wizard will be parented off the desktop.

//

//      hRadio

//          A valid local radio handle or NULL. If NULL, then all radios will

//          be tired. If any of the radios succeed, then the call will

//          succeed.

//

//      cDevices

//          Number of devices in the rgbtdi array.

//

//      rgbtdi

//          An array BLUETOOTH_DEVICE_INFO records of the devices to be

//          authenticated.

//

//  Return Values:

//

//      ERROR_SUCCESS

//          Success. Check the fAuthenticate flag on each of the devices.

//

//      ERROR_CANCELLED

//          User aborted the operation. Check the fAuthenticate flags on

//          each device to determine if any of the devices were authenticated

//          before the user cancelled the operation.

//

//      ERROR_INVALID_PARAMETER

//          One of the items in the array of devices is invalid.

//

//      ERROR_NO_MORE_ITEMS

//          All the devices in the array of devices are already been marked as

//          being authenticated.

//

//      other WIN32 error

//          Failure. Return value is the error code.

//

 

function BluetoothAuthenticateMultipleDevices(

   hwndParent: HWND;

   hRadio: THandle;

   cDevices: DWORD;

   pbtdi: PBLUETOOTH_DEVICE_INFO): DWORD; stdcall;

{$EXTERNALSYM BluetoothAuthenticateMultipleDevices}

 

// ***************************************************************************

//

//  Bluetooth Services

//

// ***************************************************************************

 

const

BLUETOOTH_SERVICE_DISABLE  = $00;

{$EXTERNALSYM BLUETOOTH_SERVICE_DISABLE}

BLUETOOTH_SERVICE_ENABLE   = $01;

{$EXTERNALSYM BLUETOOTH_SERVICE_ENABLE}

BLUETOOTH_SERVICE_MASK     = BLUETOOTH_SERVICE_ENABLE or BLUETOOTH_SERVICE_DISABLE;

{$EXTERNALSYM BLUETOOTH_SERVICE_MASK}

 

//

//  Description:

//      Enables/disables the services for a particular device.

//

//      The system maintains a mapping of service guids to supported drivers for

//      Bluetooth-enabled devices. Enabling a service installs the corresponding

//      device driver. Disabling a service removes the corresponding device driver.

//

//      If a non-supported service is enabled, a driver will not be installed.

//

//  Parameters

//      hRadio

//          Handle of the local Bluetooth radio device.

//

//      pbtdi

//          Pointer to a BLUETOOTH_DEVICE_INFO record.

//

//      pGuidService

//          The service GUID on the remote device.

//

//      dwServiceFlags

//          Flags to adjust the service.

//              BLUETOOTH_SERVICE_DISABLE   -   disable the service

//              BLUETOOTH_SERVICE_ENABLE    -   enables the service

//

//  Return Values:

//      ERROR_SUCCESS

//          The call was successful.

//

//      ERROR_INVALID_PARAMETER

//          dwServiceFlags are invalid.

//

//      ERROR_SERVICE_DOES_NOT_EXIST

//          The GUID in pGuidService is not supported.

//

//      other WIN32 error

//          The call failed.

//

 

function BluetoothSetServiceState(

   hRadio: THandle;

   pbtdi: PBLUETOOTH_DEVICE_INFO;

   const pGuidService: TGUID;

   dwServiceFlags: DWORD): DWORD; stdcall;

{$EXTERNALSYM BluetoothSetServiceState}

 

//

//  Description:

//      Enumerates the services guids enabled on a particular device. If hRadio

//      is NULL, all device will be searched for the device and all the services

//      enabled will be returned.

//

//  Parameters:

//      hRadio

//          Handle of the local Bluetooth radio device. If NULL, it will search

//          all the radios for the address in the pbtdi.

//

//      pbtdi

//          Pointer to a BLUETOOTH_DEVICE_INFO record.

//

//      pcService

//          On input, the number of records pointed to by pGuidServices.

//          On output, the number of valid records return in pGuidServices.

//

//      pGuidServices

//          Pointer to memory that is at least *pcService in length.

//

//  Return Values:

//      ERROR_SUCCESS

//          The call succeeded. pGuidServices is valid.

//

//      ERROR_MORE_DATA

//          The call succeeded. pGuidService contains an incomplete list of

//          enabled service GUIDs.

//

//      other WIN32 errors

//          The call failed.

//

 

function BluetoothEnumerateInstalledServices(

   hRadio: THandle;

   pbtdi: PBLUETOOTH_DEVICE_INFO;

   var pcServices: DWORD;

   pGuidServices: PGUID): DWORD; stdcall;

{$EXTERNALSYM BluetoothEnumerateInstalledServices}

 

//

//  Description:

//      Change the discovery state of the local radio(s).

//      If hRadio is NULL, all the radios will be set.

//

//      Use BluetoothIsDiscoverable() to determine the radios current state.

//

//      The system ensures that a discoverable system is connectable, thus

//      the radio must allow incoming connections (see

//      BluetoothEnableIncomingConnections) prior to making a radio

//      discoverable. Failure to do so will result in this call failing

//      (returns FALSE).

//

//  Parameters:

//      hRadio

//          If not NULL, changes the state of a specific radio.

//          If NULL, the API will interate through all the radios.

//

//      fEnabled

//          If FALSE, discovery will be disabled.

//

//  Return Values

//      TRUE

//          State was successfully changed. If the caller specified NULL for

//          hRadio, at least of the radios accepted the state change.

//

//      FALSE

//          State was not changed. If the caller specified NULL for hRadio, all

//          of the radios did not accept the state change.

//

 

function BluetoothEnableDiscovery(hRadio: THandle; fEnabled: BOOL): BOOL; stdcall;

{$EXTERNALSYM BluetoothEnableDiscovery}

 

//

//  Description:

//      Determines if the Bluetooth radios are discoverable. If there are

//      multiple radios, the first one to say it is discoverable will cause

//      this function to return TRUE.

//

//  Parameters:

//      hRadio

//          Handle of the radio to check. If NULL, it will check all local

//          radios.

//

//  Return Values:

//      TRUE

//          A least one radio is discoverable.

//

//      FALSE

//          No radios are discoverable.

//

 

function BluetoothIsDiscoverable(hRadio: THandle): BOOL; stdcall;

{$EXTERNALSYM BluetoothIsDiscoverable}

 

//

//  Description:

//      Enables/disables the state of a radio to accept incoming connections.

//      If hRadio is NULL, all the radios will be set.

//

//      Use BluetoothIsConnectable() to determine the radios current state.

//

//      The system enforces that a radio that is not connectable is not

//      discoverable too. The radio must be made non-discoverable (see

//      BluetoothEnableDiscovery) prior to making a radio non-connectionable.

//      Failure to do so will result in this call failing (returns FALSE).

//

//  Parameters:

//      hRadio

//          If not NULL, changes the state of a specific radio.

//          If NULL, the API will interate through all the radios.

//

//      fEnabled

//          If FALSE, incoming connection will be disabled.

//

//  Return Values

//      TRUE

//          State was successfully changed. If the caller specified NULL for

//          hRadio, at least of the radios accepted the state change.

//

//      FALSE

//          State was not changed. If the caller specified NULL for hRadio, all

//          of the radios did not accept the state change.

//

 

function BluetoothEnableIncomingConnections(hRadio: THandle; fEnabled: BOOL): BOOL; stdcall;

{$EXTERNALSYM BluetoothEnableIncomingConnections}

 

//

//  Description:

//      Determines if the Bluetooth radios are connectable. If there are

//      multiple radios, the first one to say it is connectable will cause

//      this function to return TRUE.

//

//  Parameters:

//      hRadio

//          Handle of the radio to check. If NULL, it will check all local

//          radios.

//

//  Return Values:

//      TRUE

//          A least one radio is allowing incoming connections.

//

//      FALSE

//          No radios are allowing incoming connections.

//

 

function BluetoothIsConnectable(hRadio: THandle): BOOL; stdcall;

{$EXTERNALSYM BluetoothIsConnectable}

 

// ***************************************************************************

//

//  Authentication Registration

//

// ***************************************************************************

 

type

HBLUETOOTH_AUTHENTICATION_REGISTRATION = THandle;

{$EXTERNALSYM HBLUETOOTH_AUTHENTICATION_REGISTRATION}

 

PFN_AUTHENTICATION_CALLBACK = function(pvParam: Pointer; pDevice: PBLUETOOTH_DEVICE_INFO): BOOL; stdcall;

{$EXTERNALSYM PFN_AUTHENTICATION_CALLBACK}

 

//

//  Description:

//      Registers a callback function to be called when a particular device

//      requests authentication. The request is sent to the last application

//      that requested authentication for a particular device.

//

//  Parameters:

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure. The Bluetooth

//          address will be used for comparision.

//

//      phRegHandle

//          A pointer to where the registration HANDLE value will be

//          stored. Call BluetoothUnregisterAuthentication() to close

//          the handle.

//

//      pfnCallback

//          The function that will be called when the authentication event

//          occurs. This function should match PFN_AUTHENTICATION_CALLBACK's

//          prototype.

//

//      pvParam

//          Optional parameter to be past through to the callback function.

//          This can be anything the application was to define.

//

//  Return Values:

//      ERROR_SUCCESS

//          Success. A valid registration handle was returned.

//

//      ERROR_OUTOFMEMORY

//          Out of memory.

//

//      other Win32 error.

//          Failure. The registration handle is invalid.

//

 

function BluetoothRegisterForAuthentication(

   pbtdi: PBLUETOOTH_DEVICE_INFO;

   var phRegHandle: HBLUETOOTH_AUTHENTICATION_REGISTRATION;

   pfnCallback: PFN_AUTHENTICATION_CALLBACK;

   pvParam: Pointer): DWORD; stdcall;

{$EXTERNALSYM BluetoothRegisterForAuthentication}

 

//

//  Description:

//      Unregisters an authentication callback and closes the handle. See

//      BluetoothRegisterForAuthentication() for more information about

//      authentication registration.

//

//  Parameters:

//      hRegHandle

//          Handle returned by BluetoothRegisterForAuthentication().

//

//  Return Value:

//      TRUE

//          The handle was successfully closed.

//

//      FALSE

//          The handle was not successfully closed. Check GetLastError for

//          more details.

//

//          ERROR_INVALID_HANDLE

//              The handle is NULL.

//

//          other Win32 errors.

//

 

function BluetoothUnregisterAuthentication(hRegHandle: HBLUETOOTH_AUTHENTICATION_REGISTRATION): BOOL; stdcall;

{$EXTERNALSYM BluetoothUnregisterAuthentication}

 

//

//  Description:

//      This function should be called after receiving an authentication request

//      to send the passkey response.

//

//  Parameters:

//

//      hRadio

//          Optional handle to the local radio. If NULL, the function will try

//          each radio until one succeeds.

//

//      pbtdi

//          A pointer to a BLUETOOTH_DEVICE_INFO structure describing the device

//          being authenticated. This can be the same structure passed to the

//          callback function.

//

//      pszPasskey

//          A pointer to UNICODE zero-terminated string of the passkey response

//          that should be sent back to the authenticating device.

//

//  Return Values:

//      ERROR_SUCESS

//          The device accepted the passkey response. The device is authenticated.

//

//      ERROR_CANCELED

//          The device denied the passkey reponse. This also will returned if there

//          is a communications problem with the local radio.

//

//      E_FAIL

//          The device returned a failure code during authentication.

//

//      other Win32 error codes

//

 

function BluetoothSendAuthenticationResponse(

   hRadio: THandle;

   pbtdi: PBLUETOOTH_DEVICE_INFO;

   pszPasskey: LPWSTR): DWORD; stdcall;

{$EXTERNALSYM BluetoothSendAuthenticationResponse}

 

// ***************************************************************************

//

//  SDP Parsing Functions

//

// ***************************************************************************

 

type

TSpdElementDataString = record

   // raw string buffer, may not be encoded as ANSI, use

   // BluetoothSdpGetString to convert the value if it is described

   // by the base language attribute ID list

   value: PBYTE;

   // raw length of the string, may not be NULL terminuated

   length: ULONG;

end;

 

TSpdElementDataUrl = record

   value: PBYTE;

   length: ULONG;

end;

 

// type == SDP_TYPE_SEQUENCE

TSpdElementDataSequence = record

   // raw sequence, starts at sequence element header

   value: PBYTE;

   // raw sequence length

   length: ULONG;

end;

 

// type == SDP_TYPE_ALTERNATIVE

TSpdElementDataAlternative = record

   // raw alternative, starts at alternative element header

   value: PBYTE;

   // raw alternative length

   length: ULONG;

end;

 

_SDP_ELEMENT_DATA = record

   //

   // Enumeration of SDP element types.  Generic element types will have a

   // specificType value other then SDP_ST_NONE.  The generic types are:

   // o SDP_TYPE_UINT

   // o SDP_TYPE_INT

   // o SDP_TYPE_UUID

   //

   type_: SDP_TYPE;

 

   //

   // Specific types for the generic SDP element types.

   //

   specificType: SDP_SPECIFICTYPE;

 

   //

   // Union of all possible data types.  type and specificType will indicate

   // which field is valid.  For types which do not have a valid specificType,

   // specific type will be SDP_ST_NONE.

   //

   case Integer of

       // type == SDP_TYPE_INT

       0: (int128: SDP_LARGE_INTEGER_16);        // specificType == SDP_ST_INT128

       1: (int64: LONGLONG);                     // specificType == SDP_ST_INT64

       2: (int32: Integer);                         // specificType == SDP_ST_INT32

       3: (int16: SHORT);                        // specificType == SDP_ST_INT16

       4: (int8: CHAR);                          // specificType == SDP_ST_INT8

 

       // type == SDP_TYPE_UINT

       5: (uint128: SDP_ULARGE_INTEGER_16);      // specificType == SDP_ST_UINT128

       6: (uint64: Int64);                   // specificType == SDP_ST_UINT64

       7: (uint32: ULONG);                       // specificType == SDP_ST_UINT32

       8: (uint16: Word);                      // specificType == SDP_ST_UINT16

       9: (uint8: UCHAR);                        // specificType == SDP_ST_UINT8

 

       // type == SDP_TYPE_BOOLEAN

       10: (booleanVal: UCHAR);

 

       // type == SDP_TYPE_UUID

       11: (uuid128: TGUID);                       // specificType == SDP_ST_UUID128

       12: (uuid32: ULONG);                       // specificType == SDP_ST_UUID32

       13: (uuid16: Word);                      // specificType == SDP_ST_UUID32

 

       // type == SDP_TYPE_STRING

       14: (string_: TSpdElementDataString);

       // type == SDP_TYPE_URL

       15: (url: TSpdElementDataUrl);

 

       // type == SDP_TYPE_SEQUENCE

       16: (sequence: TSpdElementDataSequence);

 

       // type == SDP_TYPE_ALTERNATIVE

       17: (alternative: TSpdElementDataAlternative);

end;

{$EXTERNALSYM _SDP_ELEMENT_DATA}

SDP_ELEMENT_DATA = _SDP_ELEMENT_DATA;

{$EXTERNALSYM SDP_ELEMENT_DATA}

PSDP_ELEMENT_DATA = ^SDP_ELEMENT_DATA;

{$EXTERNALSYM PSDP_ELEMENT_DATA}

TSdpElementData = SDP_ELEMENT_DATA;

PSdpElementData = PSDP_ELEMENT_DATA; 

 

//

// Description:

//      Retrieves and parses the element found at pSdpStream

//

// Parameters:

//      IN pSdpStream

//          pointer to valid SDP stream

//

//      IN cbSdpStreamLength

//          length of pSdpStream in bytes

//

//      OUT pData

//          pointer to be filled in with the data of the SDP element at the

//          beginning of pSdpStream

//

// Return Values:

//      ERROR_INVALID_PARAMETER

//          one of required parameters is NULL or the pSdpStream is invalid

//

//      ERROR_SUCCESS

//          the sdp element was parsed correctly

//

 

function BluetoothSdpGetElementData(

   pSdpStream: PBYTE;

   cbSdpStreamLength: ULONG;

   pData: PSDP_ELEMENT_DATA): DWORD; stdcall;

{$EXTERNALSYM BluetoothSdpGetElementData}

 

type

HBLUETOOTH_CONTAINER_ELEMENT = THandle;

{$EXTERNALSYM HBLUETOOTH_CONTAINER_ELEMENT}

 

//

// Description:

//      Iterates over a container stream, returning each elemetn contained with

//      in the container element at the beginning of pContainerStream

//

// Parameters:

//      IN pContainerStream

//          pointer to valid SDP stream whose first element is either a sequence

//          or alternative

//

//      IN cbContainerlength

//          length in bytes of pContainerStream

//

//      IN OUT pElement

//          Value used to keep track of location within the stream.  The first

//          time this function is called for a particular container, *pElement

//          should equal NULL.  Upon subsequent calls, the value should be

//          unmodified.

//

//      OUT pData

//          pointer to be filled in with the data of the SDP element at the

//          current element of pContainerStream

//

//  Return Values:

//      ERROR_SUCCESS

//          The call succeeded, pData contains the data

//

//      ERROR_NO_MORE_ITEMS

//          There are no more items in the list, the caller should cease calling

//          BluetoothSdpGetContainerElementData for this container.

//

//      ERROR_INVALID_PARAMETER

//          A required pointer is NULL or the container is not a valid SDP

//          stream

//

// Usage example:

//

// HBLUETOOTH_CONTAINER_ELEMENT element;

// SDP_ELEMENT_DATA data;

// ULONG result;

//

// element = NULL;

//

// while (TRUE) {

//      result = BluetoothSdpGetContainerElementData(

//          pContainer, ulContainerLength, &element, &data);

//

//      if (result == ERROR_NO_MORE_ITEMS) {

//          // We are done

//          break;

//      }

//      else if (result != ERROR_SUCCESS) {

//          // error

//      }

//

//      // do something with data ...

// }

//

//

 

function BluetoothSdpGetContainerElementData(

   pContainerStream: PBYTE;

   cbContainerLength: ULONG;

   var pElement: HBLUETOOTH_CONTAINER_ELEMENT;

   pData: PSDP_ELEMENT_DATA): DWORD; stdcall;

{$EXTERNALSYM BluetoothSdpGetContainerElementData}

 

//

// Description:

//      Retrieves the attribute value for the given attribute ID.  pRecordStream

//      must be an SDP stream that is formatted as an SDP record, a SEQUENCE

//      containing UINT16 + element pairs.

//

// Parameters:

//      IN pRecordStream

//          pointer to a valid SDP stream which is formatted as a singl SDP

//          record

//

//      IN cbRecordlnegh

//          length of pRecordStream in bytes

//

//      IN usAttributeId

//          the attribute ID to search for.  see bthdef.h for SDP_ATTRIB_Xxx

//          values.

//

//      OUT pAttributeData

//          pointer that will contain the attribute ID's value

//

// Return Values:

//      ERRROR_SUCCESS

//          Call succeeded, pAttributeData contains the attribute value

//

//      ERROR_INVALID_PARAMETER

//          One of the required pointers was NULL, pRecordStream was not a valid

//          SDP stream, or pRecordStream was not a properly formatted SDP record

//

//      ERROR_FILE_NOT_FOUND

//          usAttributeId was not found in the record

//

// Usage:

//

// ULONG result;

// SDP_DATA_ELEMENT data;

//

// result = BluetoothSdpGetAttributeValue(

//      pRecordStream, cbRecordLength, SDP_ATTRIB_RECORD_HANDLE, &data);

// if (result == ERROR_SUCCESS) {

//      printf("record handle is 0x%x\n", data.data.uint32);

// }

//

 

function BluetoothSdpGetAttributeValue(

   pRecordStream: PBYTE;

   cbRecordLength: ULONG;

   usAttributeId: Word;

   pAttributeData: PSDP_ELEMENT_DATA): DWORD; stdcall;

{$EXTERNALSYM BluetoothSdpGetAttributeValue}

 

//

// These three fields correspond one to one with the triplets defined in the

// SDP specification for the language base attribute ID list.

//

 

type

_SDP_STRING_TYPE_DATA = record

   //

   // How the string is encoded according to ISO 639:1988 (E/F): "Code

   // for the representation of names of languages".

   //

   encoding: Word;

 

   //

   // MIBE number from IANA database

   //

   mibeNum: Word;

 

   //

   // The base attribute where the string is to be found in the record

   //

   attributeId: Word;

end;

{$EXTERNALSYM _SDP_STRING_TYPE_DATA}

SDP_STRING_TYPE_DATA = _SDP_STRING_TYPE_DATA;

{$EXTERNALSYM SDP_STRING_TYPE_DATA}

PSDP_STRING_TYPE_DATA = ^SDP_STRING_TYPE_DATA;

{$EXTERNALSYM PSDP_STRING_TYPE_DATA}

TSdpStringTypeData = SDP_STRING_TYPE_DATA;

PSdpStringTypeData = PSDP_STRING_TYPE_DATA; 

 

//

// Description:

//      Converts a raw string embedded in the SDP record into a UNICODE string

//

// Parameters:

//      IN pRecordStream

//          a valid SDP stream which is formatted as an SDP record

//

//      IN cbRecordLength

//          length of pRecordStream in bytes

//

//      IN pStringData

//          if NULL, then the calling thread's locale will be used to search

//          for a matching string in the SDP record.  If not NUL, the mibeNum

//          and attributeId will be used to find the string to convert.

//

//      IN usStringOffset

//          the SDP string type offset to convert.  usStringOffset is added to

//          the base attribute id of the string.   SDP specification defined

//          offsets are: STRING_NAME_OFFSET, STRING_DESCRIPTION_OFFSET, and

//          STRING_PROVIDER_NAME_OFFSET (found in bthdef.h).

//

//      OUT pszString

//          if NULL, pcchStringLength will be filled in with the required number

//          of characters (not bytes) to retrieve the converted string.

//

//      IN OUT pcchStringLength

//          Upon input, if pszString is not NULL, will contain the length of

//          pszString in characters.  Upon output, it will contain either the

//          number of required characters including NULL if an error is returned

//          or the number of characters written to pszString (including NULL).

//

//  Return Values:

//      ERROR_SUCCES

//          Call was successful and pszString contains the converted string

//

//      ERROR_MORE_DATA

//          pszString was NULL or too small to contain the converted string,

//          pccxhStringLength contains the required length in characters

//

//      ERROR_INVALID_DATA

//          Could not perform the conversion

//

//      ERROR_NO_SYSTEM_RESOURCES

//          Could not allocate memory internally to perform the conversion

//

//      ERROR_INVALID_PARAMETER

//          One of the rquired pointers was NULL, pRecordStream was not a valid

//          SDP stream, pRecordStream was not a properly formatted record, or

//          the desired attribute + offset was not a string.

//

//      Other HRESULTs returned by COM

//

 

function BluetoothSdpGetString(

   pRecordStream: PBYTE;

   cbRecordLength: ULONG;

   pStringData: PSDP_STRING_TYPE_DATA;

   usStringOffset: Word;

   pszString: PWideChar;

   pcchStringLength: PULONG): DWORD; stdcall;

{$EXTERNALSYM BluetoothSdpGetString}

 

// ***************************************************************************

//

//  Raw Attribute  Enumeration

//

// ***************************************************************************

 

type

PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK = function(

   uAttribId: ULONG;

   pValueStream: PBYTE;

   cbStreamSize: ULONG;

   pvParam: Pointer): BOOL; stdcall;

{$EXTERNALSYM PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK}

 

//

//  Description:

//      Enumerates through the SDP record stream calling the Callback function

//      for each attribute in the record. If the Callback function returns

//      FALSE, the enumeration is stopped.

//

//  Return Values:

//      TRUE

//          Success! Something was enumerated.

//

//      FALSE

//          Failure. GetLastError() could be one of the following:

//

//          ERROR_INVALID_PARAMETER

//              pSDPStream or pfnCallback is NULL.

//

//          ERROR_INVALID_DATA

//              The SDP stream is corrupt.

//

//          other Win32 errors.

//

 

function BluetoothSdpEnumAttributes(

   pSDPStream: PBYTE;

   cbStreamSize: ULONG;

   pfnCallback: PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK;

   pvParam: Pointer): BOOL; stdcall;

{$EXTERNALSYM BluetoothSdpEnumAttributes}

 

// (rom) MACRO

function BluetoothEnumAttributes(

   pSDPStream: PBYTE;

   cbStreamSize: ULONG;

   pfnCallback: PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK;

   pvParam: Pointer): BOOL;

{$EXTERNALSYM BluetoothEnumAttributes}

 

implementation

 

const

btapi = 'irprops.cpl';

 

// (rom) MACRO implementation

function BluetoothEnumAttributes(pSDPStream: PBYTE; cbStreamSize: ULONG;

pfnCallback: PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK; pvParam: Pointer): BOOL;

begin

Result := BluetoothSdpEnumAttributes(pSDPStream, cbStreamSize, pfnCallback, pvParam);

end;

 

function BluetoothFindFirstRadio; external btapi name 'BluetoothFindFirstRadio';

function BluetoothFindNextRadio; external btapi name 'BluetoothFindNextRadio';

function BluetoothFindRadioClose; external btapi name 'BluetoothFindRadioClose';

function BluetoothGetRadioInfo; external btapi name 'BluetoothGetRadioInfo';

function BluetoothFindFirstDevice; external btapi name 'BluetoothFindFirstDevice';

function BluetoothFindNextDevice; external btapi name 'BluetoothFindNextDevice';

function BluetoothFindDeviceClose; external btapi name 'BluetoothFindDeviceClose';

function BluetoothGetDeviceInfo; external btapi name 'BluetoothGetDeviceInfo';

function BluetoothUpdateDeviceRecord; external btapi name 'BluetoothUpdateDeviceRecord';

function BluetoothRemoveDevice; external btapi name 'BluetoothRemoveDevice';

function BluetoothSelectDevices; external btapi name 'BluetoothSelectDevices';

function BluetoothSelectDevicesFree; external btapi name 'BluetoothSelectDevicesFree';

function BluetoothDisplayDeviceProperties; external btapi name 'BluetoothDisplayDeviceProperties';

function BluetoothAuthenticateDevice; external btapi name 'BluetoothAuthenticateDevice';

function BluetoothAuthenticateMultipleDevices; external btapi name 'BluetoothAuthenticateMultipleDevices';

function BluetoothSetServiceState; external btapi name 'BluetoothSetServiceState';

function BluetoothEnumerateInstalledServices; external btapi name 'BluetoothEnumerateInstalledServices';

function BluetoothEnableDiscovery; external btapi name 'BluetoothEnableDiscovery';

function BluetoothIsDiscoverable; external btapi name 'BluetoothIsDiscoverable';

function BluetoothEnableIncomingConnections; external btapi name 'BluetoothEnableIncomingConnections';

function BluetoothIsConnectable; external btapi name 'BluetoothIsConnectable';

function BluetoothRegisterForAuthentication; external btapi name 'BluetoothRegisterForAuthentication';

function BluetoothUnregisterAuthentication; external btapi name 'BluetoothUnregisterAuthentication';

function BluetoothSendAuthenticationResponse; external btapi name 'BluetoothSendAuthenticationResponse';

function BluetoothSdpGetElementData; external btapi name 'BluetoothSdpGetElementData';

function BluetoothSdpGetContainerElementData; external btapi name 'BluetoothSdpGetContainerElementData';

function BluetoothSdpGetAttributeValue; external btapi name 'BluetoothSdpGetAttributeValue';

function BluetoothSdpGetString; external btapi name 'BluetoothSdpGetString';

function BluetoothSdpEnumAttributes; external btapi name 'BluetoothSdpEnumAttributes';

 

end.

 

 

 
 

 


 

 

Code:

 

{

Copyright (C)  Mike B. Petrichenko

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

  

All Rights Reserved.

 

Only for non commercial purpose.

}

unit BTDevice;

 

interface

 

uses

BTRadio, BluetoothAPI, Windows;

 

type

TBTDeviceSearchFlag = (sfReturnAuthenticated, sfReturnRemembered,

                        sfReturnUnknown, sfReturnConnected);

TBTDeviceSearchFlags = set of TBTDeviceSearchFlag;

 

TBTDeviceSelectFlag = (dsForceAuthentication, dsShowAuthenticated,

                        dsShowRemembered, dsShowUnknown, dsAddNewDeviceWizard,

                        dsSkipServicesPage);

TBTDeviceSelectFlags = set of TBTDeviceSelectFlag;

 

TBTAuthenticateEvent = procedure (Sender: TObject; var Pwd: string);

 

TBTDevice = class

private

   FAddress: BTH_ADDR;

   FAuReg: HBLUETOOTH_AUTHENTICATION_REGISTRATION;

   FBTRadio: TBTRadio;

   FOnAuthenticate: TBTAuthenticateEvent;

 

   function GetAuthenticated: boolean;

   function GetClassOfDevice: cardinal;

   function GetConnected: boolean;

   function GetDeviceInfo: BLUETOOTH_DEVICE_INFO;

   function GetLastSeen: TDateTime;

   function GetLastUsed: TDateTime;

   function GetName: string;

   function GetRemembered: boolean;

 

   procedure SetOnAuthenticate(const Value: TBTAuthenticateEvent);

 

   procedure DoAuthenticate;

 

protected

   property DeviceInfo: BLUETOOTH_DEVICE_INFO read GetDeviceInfo;

 

public

   constructor Create(const Addr: BTH_ADDR; const ABTRadio: TBTRadio);

   destructor Destroy; override;

 

   procedure Authenticate(const Pwd: string);

   procedure DisplayProperties;

   procedure Remove;

   procedure Select(const FLags: TBTDeviceSelectFlags);

   procedure Update(const NewName: string);

 

   property Address: BTH_ADDR read FAddress;

   property Authenticated: boolean read GetAuthenticated;

   property BTRadio: TBTRadio read FBTRadio;

   property ClassofDevice: cardinal read GetClassOfDevice;

   property Connected: boolean read GetConnected;

   property LastSeen: TDateTime read GetLastSeen;

   property LastUsed: TDateTime read GetLastUsed;

   property Name: string read GetName;

   property Remembered: boolean read GetRemembered;

 

   property OnAuthenticate: TBTAuthenticateEvent read FOnAuthenticate write SetOnAuthenticate;

end;

 

function BTGetDeviceByAddr(const Addr: BTH_ADDR; const ABTRadio: TBTRadio): TBTDevice;

 

procedure BTEnumDevices(const BTRadio: TBTRadio; const SearchFlags: TBTDeviceSearchFlags; var Devices: TBTAddrArray);

 

implementation

 

uses

BTExceptions, BTStrings, SysUtils;

 

function BTAuCallBack(pvParam: Pointer; pDevice: PBLUETOOTH_DEVICE_INFO): BOOL; stdcall;

begin

TBTDevice(pvParam).DoAuthenticate;

Result := true;

end;

 

function BTGetDeviceByAddr(const Addr: BTH_ADDR; const ABTRadio: TBTRadio): TBTDevice;

begin

  if (not Assigned(ABTRadio)) then raise BTException.Create(STR_ERROR_INVALID_PARAMETER);

 

  Result := TBTDevice.Create(Addr, ABTRadio);

end;

 

procedure BTEnumDevices(const BTRadio: TBTRadio; const SearchFlags: TBTDeviceSearchFlags; var Devices: TBTAddrArray);

var

hFind: HBLUETOOTH_DEVICE_FIND;

SearchParams: BLUETOOTH_DEVICE_SEARCH_PARAMS;

SearchParamsSize: dword;

DeviceInfo: BLUETOOTH_DEVICE_INFO;

DeviceInfoSize: dword;

Ndx: word;

begin

if (not Assigned(BTRadio)) then raise BTException.Create(STR_ERROR_INVALID_PARAMETER);

 

Ndx := 0;

 

SearchParamsSize := SizeOf(BLUETOOTH_DEVICE_SEARCH_PARAMS);

FillChar(SearchParams, SearchParamsSize, 0);

with SearchParams do begin

   dwSize := SearchParamsSize;

   hRadio := BTRadio.Handle;

   fReturnAuthenticated := (sfReturnAuthenticated in SearchFlags);

   fReturnRemembered := (sfReturnRemembered in SearchFlags);

   fReturnUnknown := (sfReturnUnknown in SearchFlags);

   fReturnConnected := (sfReturnConnected in SearchFlags);

end;

 

DeviceInfoSize := SizeOf(BLUETOOTH_DEVICE_INFO);

FillChar(DeviceInfo, DeviceInfoSize, 0);

DeviceInfo.dwSize := DeviceInfoSize;

 

hFind :=  BluetoothFindFirstDevice(SearchParams, DeviceInfo);

if (hFind <> 0) then begin

   repeat

     Inc(Ndx);

     SetLength(Devices, Ndx);

     Devices[Ndx - 1] := DeviceInfo.Address.ullLong;

 

     FillChar(DeviceInfo, DeviceInfoSize, 0);

     DeviceInfo.dwSize := DeviceInfoSize;

   until (not BluetoothFindNextDevice(hFind, DeviceInfo));

 

   BluetoothFindDeviceClose(hFind);

end;

end;

 

function TBTDevice.GetAuthenticated: boolean;

begin

Result := boolean(GetDeviceInfo.fAuthenticated);

end;

 

function TBTDevice.GetClassOfDevice: cardinal;

begin

Result := GetDeviceInfo.ulClassofDevice;

end;

 

function TBTDevice.GetConnected: boolean;

begin

Result := boolean(GetDeviceInfo.fConnected);

end;

 

function TBTDevice.GetDeviceInfo: BLUETOOTH_DEVICE_INFO;

var

DeviceInfoSize: dword;

Res: dword;

begin

DeviceInfoSize := SizeOf(BLUETOOTH_DEVICE_INFO);

 

FillChar(Result, DeviceInfoSize, 0);

with Result do begin

   dwSize := DeviceInfoSize;

   Address.ullLong := FAddress;

end;

 

Res := BluetoothGetDeviceInfo(FBTRadio.Handle, Result);

 

if (Res <> ERROR_SUCCESS) then

   case Res of

     ERROR_REVISION_MISMATCH: raise BTException.Create(STR_ERROR_REVISION_MISMATCH_DEV);

     ERROR_INVALID_PARAMETER: raise BTException.Create(STR_ERROR_INVALID_PARAMETER_DEV);

   else

     RaiseLastOSError;

   end;

end;

 

function TBTDevice.GetLastSeen: TDateTime;

begin

Result := SystemTimeToDateTime(GetDeviceInfo.stLastSeen);

end;

 

function TBTDevice.GetLastUsed: TDateTime;

begin

Result := SystemTimeToDateTime(GetDeviceInfo.stLastUsed);

end;

 

function TBTDevice.GetName: string;

begin

Result := string(widestring(GetDeviceInfo.szName));

end;

 

function TBTDevice.GetRemembered: boolean;

begin

Result := boolean(GetDeviceInfo.fRemembered);

end;

 

procedure TBTDevice.SetOnAuthenticate(const Value: TBTAuthenticateEvent);

 

procedure Unreg;

begin

   if (FAuReg <> 0) then

     if (not BluetoothUnregisterAuthentication(FAuReg)) then

       RaiseLastOsError;

   FAuReg := 0;

   FOnAuthenticate := nil;

end;

 

begin

if Assigned(Value) then begin

   Unreg;

   if (BluetoothRegisterForAuthentication(GetDeviceInfo, FAuReg, BTAuCallBack, Self) <> ERROR_SUCCESS) then begin

     FAuReg := 0;

     RaiseLastOSError;

   end;

   FOnAuthenticate := Value;

end else

   Unreg;

end;

 

procedure TBTDevice.DoAuthenticate;

var

Pwd: string;

begin

if Assigned(FOnAuthenticate) then begin

   FOnAuthenticate(Self, Pwd);

   BluetoothSendAuthenticationResponse(FBTRadio.Handle, GetDeviceInfo, pwidechar(widestring(Pwd)));

end;

end;

 

constructor TBTDevice.Create(const Addr: BTH_ADDR; const ABTRadio: TBTRadio);

begin

if (not Assigned(FBTRadio)) then raise BTException.Create(STR_ERROR_INVALID_PARAMETER);

 

FAddress := Addr;

FAuReg := 0;

FBTRadio := ABTRadio;

FOnAuthenticate := nil;

end;

 

destructor TBTDevice.Destroy;

begin

if Assigned(FOnAuthenticate) then OnAuthenticate := nil;

 

inherited;

end;

 

procedure TBTDevice.Authenticate(const Pwd: string);

var

Res: dword;

PPwd: pwidechar;

PPwdLength: dword;

begin

if (Pwd = '') then begin

   PPwd := nil;

   PPwdLength := 0;

end else begin

   PPwd := pwidechar(widestring(Pwd));

   PPwdLength := Length(WideString(Pwd));

end;

 

Res := BluetoothAuthenticateDevice(0, FBTRadio.Handle, GetDeviceInfo, PPwd, PPwdLength);

if (Res <> ERROR_SUCCESS) then RaiseLastOsError;

end;

 

procedure TBTDevice.DisplayProperties;

begin

if (not BluetoothDisplayDeviceProperties(0, GetDeviceInfo)) then RaiseLastOsError;

end;

 

procedure TBTDevice.Remove;

var

Addr: BLUETOOTH_ADDRESS;

begin

Addr.ullLong := FAddress;

if (BluetoothRemoveDevice(Addr) <> ERROR_SUCCESS) then RaiseLastOsError;

end;

 

procedure TBTDevice.Select(const FLags: TBTDeviceSelectFlags);

var

SelectParams: BLUETOOTH_SELECT_DEVICE_PARAMS;

SelectParamsSize: dword;

Res: dword;

begin

SelectParamsSize := SizeOf(BLUETOOTH_SELECT_DEVICE_PARAMS);

FillChar(SelectParams, SelectParamsSize, 0);

with SelectParams do begin

   dwSize := SelectParamsSize;

   fForceAuthentication := (dsForceAuthentication in Flags);

   fShowAuthenticated := (dsShowAuthenticated in Flags);

   fShowRemembered := (dsShowRemembered in Flags);

   fShowUnknown := (dsShowUnknown in Flags);

   fAddNewDeviceWizard := (dsAddNewDeviceWizard in Flags);

   fSkipServicesPage := (dsSkipServicesPage in Flags);

end;

 

if BluetoothSelectDevices(@SelectParams) then begin

   FAddress := BLUETOOTH_DEVICE_INFO(SelectParams.pDevices).Address.ullLong;

   BluetoothSelectDevicesFree(@SelectParams);

end else begin

   Res := GetLastError;

   if (Res <> ERROR_CANCELLED) then

     case Res of

       ERROR_INVALID_PARAMETER: raise BTException.Create(STR_ERROR_INVALID_PARAMETER_SEL);

       ERROR_REVISION_MISMATCH: raise BTException.Create(STR_ERROR_REVISION_MISMATCH_SEL);

     else

       RaiseLastOSError;

     end;

end;

end;

 

procedure TBTDevice.Update(const NewName: string);

var

DeviceInfo: BLUETOOTH_DEVICE_INFO;

DeviceInfoSize: dword;

Res: dword;

begin

DeviceInfoSize := SizeOf(BLUETOOTH_DEVICE_INFO);

FillChar(DeviceInfo, DeviceInfoSize, 0);

with DeviceInfo do begin

   dwSize := DeviceInfoSize;

   Address.ullLong := FAddress;

   lstrcpyw(szName, pwidechar(widestring(NewName)));

end;

 

Res := BluetoothUpdateDeviceRecord(DeviceInfo);

if (Res <> ERROR_SUCCESS) then

   case Res of

     ERROR_INVALID_PARAMETER: raise BTException.Create(STR_ERROR_INVALID_PARAMETER_DEV);

     ERROR_REVISION_MISMATCH: raise BTException.Create(STR_ERROR_REVISION_MISMATCH_DEV);

   else

     RaiseLastOsError;

   end;

end;

 

end.

 


Code:

{

Copyright (C) 2006 Mike B. Petrichenko

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

ICQ: 190812766

Phone: +7 (928) 324-58-24

        +7 (928) 819-46-40

 

All Rights Reserved.

 

Only for non commercial purpose.

}

unit BTExceptions;

 

interface

 

uses

SysUtils;

 

type

BTException = class(Exception);

 

implementation

 

end.

 


Code:

unit BthSdpDef;

 

interface

 

uses

Windows;

 

type

SDP_LARGE_INTEGER_16 = record

   LowPart: Int64;

   HighPart: Int64;

end;

{$EXTERNALSYM SDP_LARGE_INTEGER_16}

PSDP_LARGE_INTEGER_16 = ^SDP_LARGE_INTEGER_16;

{$EXTERNALSYM PSDP_LARGE_INTEGER_16}

LPSDP_LARGE_INTEGER_16 = PSDP_LARGE_INTEGER_16;

{$EXTERNALSYM LPSDP_LARGE_INTEGER_16}

TSdpLargeInteger = SDP_LARGE_INTEGER_16;

PSdpLargeInteger = PSDP_LARGE_INTEGER_16;

 

SDP_ULARGE_INTEGER_16 = record

   LowPart: Int64;

   HighPart: Int64;

end;

{$EXTERNALSYM SDP_ULARGE_INTEGER_16}

PSDP_ULARGE_INTEGER_16 = ^SDP_ULARGE_INTEGER_16;

{$EXTERNALSYM PSDP_ULARGE_INTEGER_16}

LPSDP_ULARGE_INTEGER_16 = PSDP_ULARGE_INTEGER_16;

{$EXTERNALSYM LPSDP_ULARGE_INTEGER_16}

TSdpULargeInteger16 = SDP_ULARGE_INTEGER_16;

PSdpULargeInteger16 = PSDP_ULARGE_INTEGER_16;

 

NodeContainerType = (NodeContainerTypeSequence, NodeContainerTypeAlternative);

TNodeContainerType = NodeContainerType;

 

SDP_ERROR = Word;

{$EXTERNALSYM SDP_ERROR}

PSDP_ERROR = ^SDP_ERROR;

{$EXTERNALSYM PSDP_ERROR}

TSdpError = SDP_ERROR;

PSdpError = PSDP_ERROR;

 

type

SDP_TYPE = DWORD;

{$EXTERNALSYM SDP_TYPE}

TSdpType = SDP_TYPE;

 

const

SDP_TYPE_NIL = $00;

{$EXTERNALSYM SDP_TYPE_NIL}

SDP_TYPE_UINT = $01;

{$EXTERNALSYM SDP_TYPE_UINT}

SDP_TYPE_INT = $02;

{$EXTERNALSYM SDP_TYPE_INT}

SDP_TYPE_UUID = $03;

{$EXTERNALSYM SDP_TYPE_UUID}

SDP_TYPE_STRING = $04;

{$EXTERNALSYM SDP_TYPE_STRING}

SDP_TYPE_BOOLEAN = $05;

{$EXTERNALSYM SDP_TYPE_BOOLEAN}

SDP_TYPE_SEQUENCE = $06;

{$EXTERNALSYM SDP_TYPE_SEQUENCE}

SDP_TYPE_ALTERNATIVE = $07;

{$EXTERNALSYM SDP_TYPE_ALTERNATIVE}

SDP_TYPE_URL = $08;

{$EXTERNALSYM SDP_TYPE_URL}

// 9 - 31 are reserved

SDP_TYPE_CONTAINER = $20;

{$EXTERNALSYM SDP_TYPE_CONTAINER}

 

// allow for a little easier type checking / sizing for integers and UUIDs

// ((SDP_ST_XXX & 0xF0) >> 4) == SDP_TYPE_XXX

// size of the data (in bytes) is encoded as ((SDP_ST_XXX & 0xF0) >> 8)

 

type

SDP_SPECIFICTYPE = DWORD;

{$EXTERNALSYM SDP_SPECIFICTYPE}

TSdpSpecificType = SDP_SPECIFICTYPE;

 

const

SDP_ST_NONE = $0000;

{$EXTERNALSYM SDP_ST_NONE}

 

SDP_ST_UINT8 = $0010;

{$EXTERNALSYM SDP_ST_UINT8}

SDP_ST_UINT16 = $0110;

{$EXTERNALSYM SDP_ST_UINT16}

SDP_ST_UINT32 = $0210;

{$EXTERNALSYM SDP_ST_UINT32}

SDP_ST_UINT64 = $0310;

{$EXTERNALSYM SDP_ST_UINT64}

SDP_ST_UINT128 = $0410;

{$EXTERNALSYM SDP_ST_UINT128}

 

SDP_ST_INT8 = $0020;

{$EXTERNALSYM SDP_ST_INT8}

SDP_ST_INT16 = $0120;

{$EXTERNALSYM SDP_ST_INT16}

SDP_ST_INT32 = $0220;

{$EXTERNALSYM SDP_ST_INT32}

SDP_ST_INT64 = $0320;

{$EXTERNALSYM SDP_ST_INT64}

SDP_ST_INT128 = $0420;

{$EXTERNALSYM SDP_ST_INT128}

 

SDP_ST_UUID16 = $0130;

{$EXTERNALSYM SDP_ST_UUID16}

SDP_ST_UUID32 = $0220;

{$EXTERNALSYM SDP_ST_UUID32}

SDP_ST_UUID128 = $0430;

{$EXTERNALSYM SDP_ST_UUID128}

 

type

_SdpAttributeRange = record

   minAttribute: Word;

   maxAttribute: Word;

end;

{$EXTERNALSYM _SdpAttributeRange}

SdpAttributeRange = _SdpAttributeRange;

{$EXTERNALSYM SdpAttributeRange}

TSdpAttributeRange = SdpAttributeRange;

 

SdpQueryUuidUnion = record

   case Integer of

     0: (uuid128: TGUID);

     1: (uuid32: ULONG);

     2: (uuid16: Word);

end;

TSdpQueryUuidUnion = SdpQueryUuidUnion;

 

_SdpQueryUuid = record

   u: SdpQueryUuidUnion;

   uuidType: Word;

end;

{$EXTERNALSYM _SdpQueryUuid}

SdpQueryUuid = _SdpQueryUuid;

{$EXTERNALSYM SdpQueryUuid}

TSdpQueryUuid = SdpQueryUuid;

 

implementation

 

end.

 

 


Code:

{

Copyright (C) 2006 Mike B. Petrichenko

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

ICQ: 190812766

Phone: +7 (928) 324-58-24

        +7 (928) 819-46-40

 

All Rights Reserved.

 

Only for non commercial purpose.

}

unit BTRadio;

 

interface

 

uses

Windows, BluetoothAPI;

 

type

TBTAddrArray = array of BTH_ADDR;

 

TBTRadio = class

private

   FAddress: BTH_ADDR;

   FClassOfDevice: cardinal;

   FHandle: THandle;

   FManufacturer: word;

   FName: string;

   FSubversion: word;

 

   function GetConnectable: boolean;

   function GetDiscoverable: boolean;

 

   procedure SetConnectable(const Value: boolean);

   procedure SetDiscoverable(const Value: boolean);

 

public

   constructor Create(const AHandle: THandle);

   destructor Destroy; override;

 

   property Address: BTH_ADDR read FAddress;

   property ClassOfDevice: cardinal read FClassOfDevice;

   property Connectable: boolean read GetConnectable write SetConnectable;

   property Discoverable: boolean read GetDiscoverable write SetDiscoverable;

   property Handle: THandle read FHandle;

   property Manufacturer: word read FManufacturer;

   property Name: string read FName;

   property Subversion: word read FSubversion;

end;

 

function BTGetRadioByAddr(const Addr: BTH_ADDR): TBTRadio;

 

procedure BTEnumRadios(var Radios: TBTAddrArray);

 

implementation

 

uses

SysUtils, BTStrings, BTExceptions;

 

function BTGetRadioByAddr(const Addr: BTH_ADDR): TBTRadio;

var

hFind: HBLUETOOTH_RADIO_FIND;

SearchParams: BLUETOOTH_FIND_RADIO_PARAMS;

hRadio: THandle;

RadioInfo: BLUETOOTH_RADIO_INFO;

RadioInfoSize: dword;

begin

Result := nil;

 

SearchParams.dwSize := SizeOf(BLUETOOTH_FIND_RADIO_PARAMS);

 

hFind := BluetoothFindFirstRadio(@SearchParams, hRadio);

if (hFind <> 0) then begin

   repeat

     RadioInfoSize := SizeOf(BLUETOOTH_RADIO_INFO);

     FillChar(RadioInfo, RadioInfoSize, 0);

     RadioInfo.dwSize := RadioInfoSize;

 

     if (BluetoothGetRadioInfo(hRadio, RadioInfo) = ERROR_SUCCESS) then

       if (RadioInfo.address.ullLong = Addr) then begin

         Result := TBTRadio.Create(hRadio);

         Break;

       end;

 

     CloseHandle(hRadio);

   until (not BluetoothFindNextRadio(hFind, hRadio));

 

   BluetoothFindRadioClose(hFind);

end;

end;

 

procedure BTEnumRadios(var Radios: TBTAddrArray);

var

hFind: HBLUETOOTH_RADIO_FIND;

SearchParams: BLUETOOTH_FIND_RADIO_PARAMS;

hRadio: THandle;

Ndx: word;

RadioInfo: BLUETOOTH_RADIO_INFO;

RadioInfoSize: dword;

begin

Radios := nil;

Ndx := 0;

 

SearchParams.dwSize := SizeOf(BLUETOOTH_FIND_RADIO_PARAMS);

 

hFind := BluetoothFindFirstRadio(@SearchParams, hRadio);

if (hFind <> 0) then begin

   repeat

     RadioInfoSize := SizeOf(BLUETOOTH_RADIO_INFO);

     FillChar(RadioInfo, RadioInfoSize, 0);

     RadioInfo.dwSize := RadioInfoSize;

 

     if (BluetoothGetRadioInfo(hRadio, RadioInfo) = ERROR_SUCCESS) then begin

       Inc(Ndx);

       SetLength(Radios, Ndx);

       CopyMemory(@Radios[Ndx - 1], @RadioInfo, RadioInfoSize);

     end;

 

     CloseHandle(hRadio);

   until (not BluetoothFindNextRadio(hFind, hRadio));

 

   BluetoothFindRadioClose(hFind);

end;

end;

 

function TBTRadio.GetConnectable: boolean;

begin

Result := BluetoothIsConnectable(FHandle);

end;

 

function TBTRadio.GetDiscoverable: boolean;

begin

Result := BluetoothIsDiscoverable(FHandle);

end;

 

procedure TBTRadio.SetConnectable(const Value: boolean);

begin

if (not BluetoothEnableIncomingConnections(FHandle, Value)) then raise BTException.Create(STR_ERROR_ENABLE_CONNECTION);

end;

 

procedure TBTRadio.SetDiscoverable(const Value: boolean);

begin

if (not BluetoothEnableDiscovery(FHandle, Value)) then raise BTException.Create(STR_ERROR_ENABLE_DISCOVERY);

end;

 

constructor TBTRadio.Create(const AHandle: THandle);

var

RadioInfo: BLUETOOTH_RADIO_INFO;

RadioInfoSize: dword;

Res: dword;

begin

FHandle := AHandle;

 

RadioInfoSize := SizeOf(BLUETOOTH_RADIO_INFO);

FillChar(RadioInfo, RadioInfoSize, 0);

RadioInfo.dwSize := RadioInfoSize;

 

Res := BluetoothGetRadioInfo(FHandle, RadioInfo);

if (Res = ERROR_SUCCESS) then begin

   FAddress := RadioInfo.address.ullLong;

   FClassOfDevice := RadioInfo.ulClassofDevice;

   FManufacturer := RadioInfo.manufacturer;

   FName := string(widestring(RadioInfo.szName));

   FSubversion := RadioInfo.lmpSubversion;

 

end else

   case Res of

     ERROR_INVALID_PARAMETER: raise BTException.Create(STR_ERROR_INVALID_PARAMETER);

     ERROR_REVISION_MISMATCH: raise BTException.Create(STR_ERROR_REVISION_MISMATCH);

 

   else

     RaiseLastOSError;

   end;

end;

 

destructor TBTRadio.Destroy;

begin

CloseHandle(FHandle);

 

inherited;

end;

 

end.

 

 


Code:

{

Copyright (C) 2006 Mike B. Petrichenko

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

ICQ: 190812766

Phone: +7 (928) 324-58-24

        +7 (928) 819-46-40

 

All Rights Reserved.

 

Only for non commercial purpose.

}

unit BTStrings;

 

interface

 

resourcestring

STR_ERROR_INVALID_PARAMETER     = 'The hRadio or pRadioInfo parameter is NULL.';

STR_ERROR_REVISION_MISMATCH     = 'The dwSize member of the BLUETOOTH_RADIO_INFO structure pointed to by pRadioInfo is not valid.';

STR_ERROR_ENABLE_CONNECTION     = 'Unable change incoming connection state.';

STR_ERROR_ENABLE_DISCOVERY      = 'Unable change discovery state';

STR_ERROR_REVISION_MISMATCH_DEV = 'The size of the BLUETOOTH_DEVICE_INFO is not compatible. Check the dwSize member of the BLUETOOTH_DEVICE_INFO structure.';

STR_ERROR_NOT_FOUND                  = 'The radio is not known by the system, or the Address member of the BLUETOOTH_DEVICE_INFO structure is all zeros.';

STR_ERROR_INVALID_PARAMETER_DEV = 'The pbtdi parameter is NULL.';

STR_ERROR_INVALID_PARAMETER_SEL = 'The pbtsdp is NULL.';

STR_ERROR_REVISION_MISMATCH_SEL = 'The structure passed in as pbtsdp is of an unknown size.';

 

implementation

 

end.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить