diff options
| author | Electric-Blue <Electric-Blue@users.noreply.github.com> | 2016-01-26 02:03:48 +0300 |
|---|---|---|
| committer | Electric-Blue <Electric-Blue@users.noreply.github.com> | 2016-01-26 02:03:48 +0300 |
| commit | 0c4a1cc1c2083a871562364de5df4f9d88ec321e (patch) | |
| tree | ddb8428845b663c078359eda4ec81bdcc157414f /nimbluez/msbt/ms_bluetoothapis.nim | |
| parent | 27a7a2a18a6db8b67cbe0e86c37cb174de2a1295 (diff) | |
| download | NimBluez-0c4a1cc1c2083a871562364de5df4f9d88ec321e.tar.gz NimBluez-0c4a1cc1c2083a871562364de5df4f9d88ec321e.zip | |
First version.
Diffstat (limited to 'nimbluez/msbt/ms_bluetoothapis.nim')
| -rw-r--r-- | nimbluez/msbt/ms_bluetoothapis.nim | 1653 |
1 files changed, 1653 insertions, 0 deletions
diff --git a/nimbluez/msbt/ms_bluetoothapis.nim b/nimbluez/msbt/ms_bluetoothapis.nim new file mode 100644 index 0000000..c895128 --- /dev/null +++ b/nimbluez/msbt/ms_bluetoothapis.nim @@ -0,0 +1,1653 @@ +# +# Copyright 2002 - 2004, Microsoft Corporation +# +#//////////////////////////////////////////////////////////////////////////// + +{.deadCodeElim: on.} +when not defined(windows): + {.error: "MSBT is supported by windows".} + + +const + libbluetooth* = "bthprops.cpl" + +import winlean +import ms_bthdef, ms_bthsdpdef + +const + BTH_MAX_PIN_SIZE = 16 + +const + BLUETOOTH_MAX_NAME_SIZE* = (248) + BLUETOOTH_MAX_PASSKEY_SIZE* = (16) + BLUETOOTH_MAX_PASSKEY_BUFFER_SIZE* = (BLUETOOTH_MAX_PASSKEY_SIZE + 1) + BLUETOOTH_MAX_SERVICE_NAME_SIZE* = (256) + BLUETOOTH_DEVICE_NAME_SIZE* = (256) + +# *************************************************************************** +# +# Bluetooth Address +# +# *************************************************************************** +type + INNER_C_UNION_1866013399* = object {.union.} + ullLong*: BTH_ADDR # easier to compare again BLUETOOTH_NULL_ADDRESS + rgBytes*: array[6, BYTE] # easier to format when broken out + BLUETOOTH_ADDRESS_STRUCT* = object + ano_116103095*: INNER_C_UNION_1866013399 + BLUETOOTH_ADDRESS* = BLUETOOTH_ADDRESS_STRUCT + +const + BLUETOOTH_NULL_ADDRESS* = 0x0'i64 +type + BLUETOOTH_LOCAL_SERVICE_INFO_STRUCT* = object + Enabled*: BOOL # If TRUE, the enable the services + btAddr*: BLUETOOTH_ADDRESS # If service is to be advertised for a particular remote device + szName*: array[BLUETOOTH_MAX_SERVICE_NAME_SIZE, WCHAR] # SDP Service Name to be advertised. + szDeviceString*: array[BLUETOOTH_DEVICE_NAME_SIZE, WCHAR] # Local device name (if any) like COM4 or LPT1 + BLUETOOTH_LOCAL_SERVICE_INFO* = BLUETOOTH_LOCAL_SERVICE_INFO_STRUCT + PBLUETOOTH_LOCAL_SERVICE_INFO* = ptr BLUETOOTH_LOCAL_SERVICE_INFO +# *************************************************************************** +# +# 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* = object + dwSize*: DWORD # IN sizeof this structure + + HBLUETOOTH_RADIO_FIND* = HANDLE +# +# 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. +# +proc BluetoothFindFirstRadio*(pbtfrp: ptr BLUETOOTH_FIND_RADIO_PARAMS; + phRadio: ptr HANDLE): HBLUETOOTH_RADIO_FIND {. + stdcall, importc: "BluetoothFindFirstRadio", dynlib: libbluetooth.} +# +# 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 +# +proc BluetoothFindNextRadio*(hFind: HBLUETOOTH_RADIO_FIND; + phRadio: ptr HANDLE): BOOL {.stdcall, + importc: "BluetoothFindNextRadio", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothFindRadioClose*(hFind: HBLUETOOTH_RADIO_FIND): BOOL {.stdcall, + importc: "BluetoothFindRadioClose", dynlib: libbluetooth.} +# *************************************************************************** +# +# Radio Information +# +# *************************************************************************** +type + BLUETOOTH_RADIO_INFO* = object + dwSize*: DWORD # Size, in bytes, of this entire data structure + address*: BLUETOOTH_ADDRESS # Address of the local radio + szName*: array[BLUETOOTH_MAX_NAME_SIZE, WCHAR] # Name of the local radio + ulClassofDevice*: ULONG # Class of device for the local radio + lmpSubversion*: USHORT # lmpSubversion, manufacturer specifc. + manufacturer*: USHORT # 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. + + PBLUETOOTH_RADIO_INFO* = ptr BLUETOOTH_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. +# +proc BluetoothGetRadioInfo*(hRadio: HANDLE; + pRadioInfo: PBLUETOOTH_RADIO_INFO): DWORD {. + stdcall, importc: "BluetoothGetRadioInfo", dynlib: libbluetooth.} +# *************************************************************************** +# +# Device Information Stuctures +# +# *************************************************************************** +type + BLUETOOTH_DEVICE_INFO_STRUCT* = object + 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[BLUETOOTH_MAX_NAME_SIZE, WCHAR] # Name of the device + + BLUETOOTH_DEVICE_INFO* = BLUETOOTH_DEVICE_INFO_STRUCT + PBLUETOOTH_DEVICE_INFO* = ptr BLUETOOTH_DEVICE_INFO +# +# Support added after KB942567 +# +type + INNER_C_UNION_2689769052* = object {.union.} + Numeric_Value*: ULONG + Passkey*: ULONG + +type + BLUETOOTH_AUTHENTICATION_METHOD* {.size: sizeof(cint).} = enum + BLUETOOTH_AUTHENTICATION_METHOD_LEGACY = 0x00000001, + BLUETOOTH_AUTHENTICATION_METHOD_OOB, + BLUETOOTH_AUTHENTICATION_METHOD_NUMERIC_COMPARISON, + BLUETOOTH_AUTHENTICATION_METHOD_PASSKEY_NOTIFICATION, + BLUETOOTH_AUTHENTICATION_METHOD_PASSKEY + PBLUETOOTH_AUTHENTICATION_METHOD* = ptr BLUETOOTH_AUTHENTICATION_METHOD + BLUETOOTH_IO_CAPABILITY* {.size: sizeof(cint).} = enum + BLUETOOTH_IO_CAPABILITY_DISPLAYONLY = 0x00000000, + BLUETOOTH_IO_CAPABILITY_DISPLAYYESNO = 0x00000001, + BLUETOOTH_IO_CAPABILITY_KEYBOARDONLY = 0x00000002, + BLUETOOTH_IO_CAPABILITY_NOINPUTNOOUTPUT = 0x00000003, + BLUETOOTH_IO_CAPABILITY_UNDEFINED = 0x000000FF + BLUETOOTH_AUTHENTICATION_REQUIREMENTS* {.size: sizeof(cint).} = enum + BLUETOOTH_MITM_ProtectionNotRequired = 0, + BLUETOOTH_MITM_ProtectionRequired = 0x00000001, + BLUETOOTH_MITM_ProtectionNotRequiredBonding = 0x00000002, + BLUETOOTH_MITM_ProtectionRequiredBonding = 0x00000003, + BLUETOOTH_MITM_ProtectionNotRequiredGeneralBonding = 0x00000004, + BLUETOOTH_MITM_ProtectionRequiredGeneralBonding = 0x00000005, + BLUETOOTH_MITM_ProtectionNotDefined = 0x000000FF + BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS* = object + deviceInfo*: BLUETOOTH_DEVICE_INFO + authenticationMethod*: BLUETOOTH_AUTHENTICATION_METHOD + ioCapability*: BLUETOOTH_IO_CAPABILITY + authenticationRequirements*: BLUETOOTH_AUTHENTICATION_REQUIREMENTS + ano_869376366*: INNER_C_UNION_2689769052 + + PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS* = ptr BLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS +# *************************************************************************** +# +# 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* = object + 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*: HANDLE # IN handle to radio to enumerate - NULL == all radios will be searched + + HBLUETOOTH_DEVICE_FIND* = HANDLE +# +# 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. +# +proc BluetoothFindFirstDevice*(pbtsp: ptr BLUETOOTH_DEVICE_SEARCH_PARAMS; + pbtdi: ptr BLUETOOTH_DEVICE_INFO): HBLUETOOTH_DEVICE_FIND {. + stdcall, importc: "BluetoothFindFirstDevice", dynlib: libbluetooth.} +# +# 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 +# +proc BluetoothFindNextDevice*(hFind: HBLUETOOTH_DEVICE_FIND; + pbtdi: ptr BLUETOOTH_DEVICE_INFO): BOOL {. + stdcall, importc: "BluetoothFindNextDevice", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothFindDeviceClose*(hFind: HBLUETOOTH_DEVICE_FIND): BOOL {. + stdcall, importc: "BluetoothFindDeviceClose", dynlib: libbluetooth.} +# +# 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 +# +proc BluetoothGetDeviceInfo*(hRadio: HANDLE; + pbtdi: ptr BLUETOOTH_DEVICE_INFO): DWORD {. + stdcall, importc: "BluetoothGetDeviceInfo", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothUpdateDeviceRecord*(pbtdi: ptr BLUETOOTH_DEVICE_INFO): DWORD {. + stdcall, importc: "BluetoothUpdateDeviceRecord", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothRemoveDevice*(pAddress: ptr BLUETOOTH_ADDRESS): DWORD {. + stdcall, importc: "BluetoothRemoveDevice", dynlib: libbluetooth.} +when not (hostCPU == "arm"): + # + # *************************************************************************** + # + # 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* = object + ulCODMask*: ULONG # ClassOfDevice mask to compare + pcszDescription*: LPCWSTR # Descriptive string of mask + + PFN_DEVICE_CALLBACK* = proc (pvParam: LPVOID; + pDevice: ptr BLUETOOTH_DEVICE_INFO): BOOL {. + stdcall.} + BLUETOOTH_SELECT_DEVICE_PARAMS* = object + dwSize*: DWORD # IN sizeof this structure + cNumOfClasses*: ULONG # IN Number in prgClassOfDevice - if ZERO search for all devices + prgClassOfDevices*: ptr BLUETOOTH_COD_PAIRS # 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*: LPVOID # 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 + + # + # 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 + # + proc BluetoothSelectDevices*(pbtsdp: ptr BLUETOOTH_SELECT_DEVICE_PARAMS): BOOL {. + stdcall, importc: "BluetoothSelectDevices", dynlib: libbluetooth.} + # + # 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. + # + proc BluetoothSelectDevicesFree*(pbtsdp: ptr BLUETOOTH_SELECT_DEVICE_PARAMS): BOOL {. + stdcall, importc: "BluetoothSelectDevicesFree", dynlib: libbluetooth.} +# *************************************************************************** +# +# 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. +# +proc BluetoothDisplayDeviceProperties*(hwndParent: HWND; + pbtdi: ptr BLUETOOTH_DEVICE_INFO): BOOL {.stdcall, + importc: "BluetoothDisplayDeviceProperties", dynlib: libbluetooth.} +# *************************************************************************** +# +# 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 }, +# +proc BluetoothAuthenticateDevice*(hwndParent: HWND; hRadio: HANDLE; + pbtbi: ptr BLUETOOTH_DEVICE_INFO; + pszPasskey: PWSTR; ulPasskeyLength: ULONG): DWORD {. + stdcall, importc: "BluetoothAuthenticateDevice", dynlib: libbluetooth, + deprecated.} +# +# Support added after KB942567 +# +# +# Replaces previous API +# +# +# Common header for all PIN related structures +# +type + BLUETOOTH_PIN_INFO* = object + pin*: array[BTH_MAX_PIN_SIZE, UCHAR] + pinLength*: UCHAR + + PBLUETOOTH_PIN_INFO* = ptr BLUETOOTH_PIN_INFO + BLUETOOTH_OOB_DATA_INFO* = object + C*: array[16, UCHAR] + R*: array[16, UCHAR] + + PBLUETOOTH_OOB_DATA_INFO* = ptr BLUETOOTH_OOB_DATA_INFO + BLUETOOTH_NUMERIC_COMPARISON_INFO* = object + NumericValue*: ULONG + + PBLUETOOTH_NUMERIC_COMPARISON_INFO* = ptr BLUETOOTH_NUMERIC_COMPARISON_INFO + BLUETOOTH_PASSKEY_INFO* = object + passkey*: ULONG + + PBLUETOOTH_PASSKEY_INFO* = ptr BLUETOOTH_PASSKEY_INFO +# +# 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 pbtOobData is NULL. This will cause +# the "Bluetooth Connection Wizard" to be invoked. The user will be +# prompted to respond to the device authentication 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 pbtOobData 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. +# +# pbtOobData +# Out of band data 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. +# +# authenticationRequirement +# The Authentication Requirement of the caller. MITMProtection* +# +# +# 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 }, +# +proc BluetoothAuthenticateDeviceEx*(hwndParentIn: HWND; hRadioIn: HANDLE; + pbtdiInout: ptr BLUETOOTH_DEVICE_INFO; + pbtOobData: PBLUETOOTH_OOB_DATA_INFO; + authenticationRequirement: BLUETOOTH_AUTHENTICATION_REQUIREMENTS): DWORD {. + stdcall, importc: "BluetoothAuthenticateDeviceEx", + dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothAuthenticateMultipleDevices*(hwndParent: HWND; hRadio: HANDLE; + cDevices: DWORD; rgbtdi: ptr BLUETOOTH_DEVICE_INFO): DWORD {.stdcall, + importc: "BluetoothAuthenticateMultipleDevices", dynlib: libbluetooth, + deprecated.} +# +# Deprecated after Vista SP1 and KB942567 +# + +# *************************************************************************** +# +# Bluetooth Services +# +# *************************************************************************** +const + BLUETOOTH_SERVICE_DISABLE* = 0x00000000 + BLUETOOTH_SERVICE_ENABLE* = 0x00000001 + BLUETOOTH_SERVICE_MASK* = ( + BLUETOOTH_SERVICE_DISABLE or BLUETOOTH_SERVICE_ENABLE) +# +# 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. +# +proc BluetoothSetServiceState*(hRadio: HANDLE; + pbtdi: ptr BLUETOOTH_DEVICE_INFO; + pGuidService: ptr GUID; dwServiceFlags: DWORD): DWORD {. + stdcall, importc: "BluetoothSetServiceState", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothEnumerateInstalledServices*(hRadio: HANDLE; + pbtdi: ptr BLUETOOTH_DEVICE_INFO; pcServiceInout: ptr DWORD; + pGuidServices: ptr GUID): DWORD {.stdcall, + importc: "BluetoothEnumerateInstalledServices", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothEnableDiscovery*(hRadio: HANDLE; fEnabled: BOOL): BOOL {. + stdcall, importc: "BluetoothEnableDiscovery", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothIsDiscoverable*(hRadio: HANDLE): BOOL {.stdcall, + importc: "BluetoothIsDiscoverable", dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothEnableIncomingConnections*(hRadio: HANDLE; fEnabled: BOOL): BOOL {. + stdcall, importc: "BluetoothEnableIncomingConnections", + dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothIsConnectable*(hRadio: HANDLE): BOOL {.stdcall, + importc: "BluetoothIsConnectable", dynlib: libbluetooth.} +# *************************************************************************** +# +# Authentication Registration +# +# *************************************************************************** +type + HBLUETOOTH_AUTHENTICATION_REGISTRATION* = HANDLE + PFN_AUTHENTICATION_CALLBACK* = proc (pvParam: LPVOID; + pDevice: PBLUETOOTH_DEVICE_INFO): BOOL {.stdcall.} +# +# 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. +# +proc BluetoothRegisterForAuthentication*(pbtdi: ptr BLUETOOTH_DEVICE_INFO; + phRegHandle: ptr HBLUETOOTH_AUTHENTICATION_REGISTRATION; + pfnCallback: PFN_AUTHENTICATION_CALLBACK; pvParam: PVOID): DWORD {. + stdcall, importc: "BluetoothRegisterForAuthentication", + dynlib: libbluetooth, + deprecated.} +# +# Support added in KB942567 +# +# +# Replaces previous API +# +type + PFN_AUTHENTICATION_CALLBACK_EX* = proc (pvParam: LPVOID; + pAuthCallbackParams: PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS): BOOL {. + stdcall.} +# +# 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_EX'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. +# +proc BluetoothRegisterForAuthenticationEx*( + pbtdiIn: ptr BLUETOOTH_DEVICE_INFO; + phRegHandleOut: ptr HBLUETOOTH_AUTHENTICATION_REGISTRATION; + pfnCallbackIn: PFN_AUTHENTICATION_CALLBACK_EX; pvParam: PVOID): DWORD {. + stdcall, importc: "BluetoothRegisterForAuthenticationEx", + dynlib: libbluetooth.} +# +# 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. +# +proc BluetoothUnregisterAuthentication*( + hRegHandle: HBLUETOOTH_AUTHENTICATION_REGISTRATION): BOOL {.stdcall, + importc: "BluetoothUnregisterAuthentication", dynlib: libbluetooth.} +# +# 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 +# +proc BluetoothSendAuthenticationResponse*(hRadio: HANDLE; + pbtdi: ptr BLUETOOTH_DEVICE_INFO; pszPasskey: LPCWSTR): DWORD {.stdcall, + importc: "BluetoothSendAuthenticationResponse", dynlib: libbluetooth, + deprecated.} +# +# Support added in KB942567 +# +# +# Replaces previous API +# +# +# Structure used when responding to BTH_REMOTE_AUTHENTICATE_REQUEST event +# +type + INNER_C_UNION_1965546500* = object {.union.} + pinInfo*: BLUETOOTH_PIN_INFO + oobInfo*: BLUETOOTH_OOB_DATA_INFO + numericCompInfo*: BLUETOOTH_NUMERIC_COMPARISON_INFO + passkeyInfo*: BLUETOOTH_PASSKEY_INFO + +type + BLUETOOTH_AUTHENTICATE_RESPONSE* = object + bthAddressRemote*: BLUETOOTH_ADDRESS + authMethod*: BLUETOOTH_AUTHENTICATION_METHOD + ano_660658457*: INNER_C_UNION_1965546500 + negativeResponse*: UCHAR + + PBLUETOOTH_AUTHENTICATE_RESPONSE* = ptr BLUETOOTH_AUTHENTICATE_RESPONSE +# +# Description: +# This function should be called after receiving an authentication request +# to send the authentication response. (Bluetooth 2.1 and above) +# +# 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. +# +# pauthResponse +# A pointer to a BTH_AUTHENTICATION_RESPONSE structure. +# +# 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 +# +proc BluetoothSendAuthenticationResponseEx*(hRadioIn: HANDLE; + pauthResponse: PBLUETOOTH_AUTHENTICATE_RESPONSE): DWORD {.stdcall, + importc: "BluetoothSendAuthenticationResponseEx", dynlib: libbluetooth.} +# *************************************************************************** +# +# SDP Parsing Functions +# +# *************************************************************************** +type + INNER_C_STRUCT_3139021411* = object + value*: LPBYTE # 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 + # raw length of the string, may not be NULL terminuated + length*: ULONG + +type + INNER_C_STRUCT_467337881* = object + value*: LPBYTE + length*: ULONG + +type + INNER_C_STRUCT_4155600511* = object + value*: LPBYTE # raw sequence, starts at sequence element header + # raw sequence length + length*: ULONG + +type + INNER_C_STRUCT_1234813489* = object + value*: LPBYTE # raw alternative, starts at alternative element header + # raw alternative length + length*: ULONG + +type + INNER_C_UNION_122694421* = object {.union.} + int128*: SDP_LARGE_INTEGER_16 # type == SDP_TYPE_INT + # specificType == SDP_ST_INT128 + int64*: LONGLONG # specificType == SDP_ST_INT64 + int32*: LONG # specificType == SDP_ST_INT32 + int16*: SHORT # specificType == SDP_ST_INT16 + int8*: CHAR # specificType == SDP_ST_INT8 + # type == SDP_TYPE_UINT + uint128*: SDP_ULARGE_INTEGER_16 # specificType == SDP_ST_UINT128 + uint64*: ULONGLONG # specificType == SDP_ST_UINT64 + uint32*: ULONG # specificType == SDP_ST_UINT32 + uint16*: USHORT # specificType == SDP_ST_UINT16 + uint8*: UCHAR # specificType == SDP_ST_UINT8 + # type == SDP_TYPE_BOOLEAN + booleanVal*: UCHAR # type == SDP_TYPE_UUID + uuid128*: GUID # specificType == SDP_ST_UUID128 + uuid32*: ULONG # specificType == SDP_ST_UUID32 + uuid16*: USHORT # specificType == SDP_ST_UUID32 + # type == SDP_TYPE_STRING + string*: INNER_C_STRUCT_3139021411 # type == SDP_TYPE_URL + url*: INNER_C_STRUCT_467337881 # type == SDP_TYPE_SEQUENCE + sequence*: INNER_C_STRUCT_4155600511 # type == SDP_TYPE_ALTERNATIVE + alternative*: INNER_C_STRUCT_1234813489 + +type + SDP_ELEMENT_DATA* = object + `type`*: SDP_TYPE # + # 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 + # + # + # 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. + # + data*: INNER_C_UNION_122694421 + + PSDP_ELEMENT_DATA* = ptr SDP_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 +# +proc BluetoothSdpGetElementData*(pSdpStream: LPBYTE; + cbSdpStreamLength: ULONG; + pData: PSDP_ELEMENT_DATA): DWORD {.stdcall, + importc: "BluetoothSdpGetElementData", dynlib: libbluetooth.} +type + HBLUETOOTH_CONTAINER_ELEMENT* = HANDLE +# +# 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 ... +# } +# +# +proc BluetoothSdpGetContainerElementData*(pContainerStream: LPBYTE; + cbContainerLength: ULONG; pElement: ptr HBLUETOOTH_CONTAINER_ELEMENT; + pData: PSDP_ELEMENT_DATA): DWORD {.stdcall, + importc: "BluetoothSdpGetContainerElementData", dynlib: libbluetooth.} +# +# 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); +# } +# +proc BluetoothSdpGetAttributeValue*(pRecordStream: LPBYTE; + cbRecordLength: ULONG; + usAttributeId: USHORT; + pAttributeData: PSDP_ELEMENT_DATA): DWORD {. + stdcall, importc: "BluetoothSdpGetAttributeValue", dynlib: libbluetooth.} +# +# 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* = object + encoding*: USHORT # + # How the string is encoded according to ISO 639:1988 (E/F): "Code + # for the representation of names of languages". + # + # + # MIBE number from IANA database + # + mibeNum*: USHORT # + # The base attribute where the string is to be found in the record + # + attributeId*: USHORT + + PSDP_STRING_TYPE_DATA* = ptr SDP_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 +# +proc BluetoothSdpGetString*(pRecordStream: LPBYTE; cbRecordLength: ULONG; + pStringData: PSDP_STRING_TYPE_DATA; + usStringOffset: USHORT; pszString: PWSTR; + pcchStringLength: PULONG): DWORD {.stdcall, + importc: "BluetoothSdpGetString", dynlib: libbluetooth.} +# *************************************************************************** +# +# Raw Attribute Enumeration +# +# *************************************************************************** +type + PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK* = proc (uAttribId: ULONG; + pValueStream: LPBYTE; cbStreamSize: ULONG; pvParam: LPVOID): BOOL {. + stdcall.} +# +# 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. +# +proc BluetoothSdpEnumAttributes*(pSDPStream: LPBYTE; cbStreamSize: ULONG; + pfnCallback: PFN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK; pvParam: LPVOID): BOOL {. + stdcall, importc: "BluetoothSdpEnumAttributes", dynlib: libbluetooth.} +const + BluetoothEnumAttributes* = BluetoothSdpEnumAttributes +# +# The following APIs are only available on Vista or later +# +proc BluetoothSetLocalServiceInfo*(hRadioIn: HANDLE; pClassGuid: ptr GUID; + ulInstance: ULONG; pServiceInfoIn: ptr BLUETOOTH_LOCAL_SERVICE_INFO): DWORD {. + stdcall, importc: "BluetoothSetLocalServiceInfo", dynlib: libbluetooth.} + +# +# Support added in KB942567 +# + +# +# IsBluetoothVersionAvailable +# +# Description: +# Indicate if the installed Bluetooth binary set supports +# the requested version +# +# Return Values: +# TRUE if the installed bluetooth binaries support the given +# Major & Minor versions +# +# Note this function is only exported in version 2.1 and later. +# +proc BluetoothIsVersionAvailable*(MajorVersion: UCHAR; MinorVersion: UCHAR): BOOL {. + stdcall, importc: "BluetoothIsVersionAvailable", dynlib: libbluetooth.} |
