palm-os-sdk/sdk-5r4/include/Extensions/Bluetooth/BtLib.h
2018-08-30 15:18:26 +01:00

1583 lines
70 KiB
C
Executable File
Raw Blame History

/******************************************************************************
*
* Copyright (c) 2000-2004 PalmSource, Inc. All rights reserved.
*
* File: BtLib.h
*
* Release: eclipse 5 SDK (68K) R4.
*
* Description:
* This file describes the API for Bluetooth communication. The API is
* asynchronous meaning that, for operations dependent on a response from
* the remote device or local radio module, instead of blocking until the
* operation is complete the operation is set up to complete in the
* background and the API returns immediately. When the operation is
* complete Bluetooth sends an event through callbacks.
* Also, events initiated from remote devices (i.e. receiving data) are
* handled through callback events.
* Events are divided into two categories:
* 1. Management events for ACL links and global bluetooth settings.
* 2. Socket events for communication via RFCOMM, L2CAP, and SDP.
*
*****************************************************************************/
#ifndef __BTLIB_H
#define __BTLIB_H
#include "BtLibTypes.h"
#ifdef BTLIB_INTERNAL
#define BTLIB_TRAP(trapNum)
#else
#define BTLIB_TRAP(trapNum) SYS_TRAP(trapNum)
#endif
#ifdef __cplusplus
extern "C" {
#endif
#pragma mark *---------Library Common------*
/********************************************************************
* Library Common
********************************************************************/
//--------------------------------------------------------------------
// Initializes the Bluetooth library. The open call also attempts to
// bring up the Bluetooth stack and intialize ocmmunications with the radio.
//
// btLibRefNum -> the reference number for the bluetooth library
// allowStackToFail -> if allowStackToFail is false, and the Bluetooth Lib
// can not initialize the Bluetooth Stack for some reason
// (for example, it can't find a radio), the Lib show an error dialog,return a
// btLibErrRadioFailed error and the stack will be left closed. Setting allowStackToFail
// to true will supress the error dialog, and allow the Lib to come up without the stack.
// In this case, the open call will return btLibErrRadioFailed if the stack
// fails to initialize, but the Library will remain open!! This can be usefull
// if an application only wants to use a few of the Libraries utility functions
// and doesn't need to talk to the radio.
//
// Any aplication that actually needs to communicate
// with the radio must set allowStackToFail to false.
//
// Returns:
// btLibErrNoError - callback registered successfully.
// btLibErrBusy - the Bluetooth Library is in use by
// the Bluetooth serial VDRV.
// btLibErrAlreadyOpen - The Lib is already open. Note
// that this is not really an error, and the app
// should still call BtLibClose when is is finished.
// btLibErrRadioInitFailed - The stack or radio could not be initialized.
// The library may or may not be open, based upon the value of
// allowStackToFail. See the comment above.
//
// Events:
// None
//
Err BtLibOpen( UInt16 btLibRefNum, Boolean allowStackToFail)
BTLIB_TRAP(sysLibTrapOpen);
// closes the lib
Err BtLibClose( UInt16 btLibRefNum)
BTLIB_TRAP(sysLibTrapClose);
// Closes existing connections,
// save the current accessible mode
// sets mode to connectable only
Err BtLibSleep( UInt16 btLibRefNum)
BTLIB_TRAP(sysLibTrapSleep);
// restores the accessible mode
Err BtLibWake( UInt16 btLibRefNum)
BTLIB_TRAP(sysLibTrapWake);
// Handles the (BtKeyChar + libEvtHookKeyMask) callback
Err BtLibHandleEvent (UInt16 btLibRefNum, void *eventP)
BTLIB_TRAP(btLibTrapHandleEvent);
//********************************************************************
// Used by device driver to inform of Attach, Detach, Attention,
// Sleep and Wake.
//
void BtLibHandleTransportEvent(UInt16 btLibRefNum, void *transportEventP)
BTLIB_TRAP(btLibTrapHandleTransportEvent);
#pragma mark *---------Management----------*
/********************************************************************
* Management
*
* The management APIs are used for discovery, ACL links,
* and global bluetooth settings.
********************************************************************/
//--------------------------------------------------------------------
// Registers for ME callbacks. In general, applications
// should unregister for the Management callback before terminating.
// BtLibRegisterManagementNotification does not prevent an application
// from regitering multiple notification callbacks.
//
// btLibRefNum -> the reference number for the bluetooth library
// callbackP -> a callback proc.
// refCon -> Caller-defined data to pass to the callback handler.
//
// Returns:
// btLibErrNoError - callback registered successfully.
// btLibErrAlreadyRegistered - callbackP is already registered
// btLibErrParamErroror - Invalid parameter passed in.
//
// Events:
// None
//
Err BtLibRegisterManagementNotification( UInt16 btLibRefNum, BtLibManagementProcPtr callbackP, UInt32 refCon)
BTLIB_TRAP(btLibTrapRegisterManagementNotification);
//--------------------------------------------------------------------
// Unregisters for callback
//
// btLibRefNum -> the reference number for the bluetooth library
// callbackP -> the callback proc to unregister
//
// Returns:
// btLibErrNoError - callback unregistered successfully.
//
// btLibErrParamErroror - Invalid parameter passed in.
//
// Events:
// None
//
Err BtLibUnregisterManagementNotification(UInt16 btLibRefNum, BtLibManagementProcPtr callbackP)
BTLIB_TRAP(btLibTrapUnregisterManagementNotification);
//--------------------------------------------------------------------
// Starts an inquiry, devices returned through callbacks
//
// btLibRefNum -> the reference number for the bluetooth library
// timeOut -> Maximum amount of time before the Inquiry is
// halted, in seconds. Max is 60 Seconds. Because of the
// constants defined within the Bt Spec, time value will be rounded down
// to nearest multiple of 1.28 seconds. Value greater than 60
// will be treated as 60.
// Pass in NULL to use the default value specified by the
// Generic Access Profile (~10 seconds).
//
// maxResp -> The maximum number of responses. Responses may not
// be unique.
//
// Returns:
// btLibErrPending - The results will be returned through callbacks.
//
// btLibErrInProgress - An inquiry is already in process.
//
// Events:
// btLibManagementEventInquiryResult - occurs every time a device is discovered.
//
// btLibManagementEventInquiryComplete - occurs when the inquiry is complete.
//
Err BtLibStartInquiry( UInt16 btLibRefNum, UInt8 timeOut, UInt8 maxResp)
BTLIB_TRAP(btLibTrapStartInquiry);
//--------------------------------------------------------------------
// Cancels an inquiry process in progress
//
// btLibRefNum -> the reference number for the bluetooth library
//
// Returns:
// btLibErrPending - A callback with the event btLibManagementEventInquiryCanceled
// signals the completion of this operation.
//
// btLibErrNotInProgress - No inquiry is in progress to be canceled.
//
// btLibErrInProgress - The inquiry is in already being cancled.
//
// btLibErrNoError - The inquiry process was canceled
// immediately. It actually never was started.
//
// Events:
// btLibManagementEventInquiryCanceled - occurs to confirm that an inquiry has been
// canceled.
//
Err BtLibCancelInquiry( UInt16 btLibRefNum )
BTLIB_TRAP(btLibTrapCancelInquiry);
//--------------------------------------------------------------------
// This blocking call performs a full discovery for an application, including name and feature retreval
// and testing. This function takes over the UI and presents a choice box to the user, allowing
// the user to select one device from the list of devices that were discovered and meet the criteria.
//
// btLibRefNum -> the reference number for the bluetooth library
// instructionTxt -> the text displayed at teh top of the selection box, NULL for default
// deviceFilterList -> array of BtLibClassOfDeviceTypes, function checks each element in list against the remote
// device's BtLibClassOfDeviceType value. Any match in the list is considered
// a success. Passing NULL skips this test.
// deviceFilterListLen -> number of elements in deviceFilterList
// selectedDeviceP <- pointer to a allocated BtLibDeviceAddressType. Selected device addres is returned here
// addressAsName -> a debug option to show the remote devices bluetooth addresses instead of friendly names
// showLastList -> if true, causes all other paramaters to be ignored and displays the same list as the
// previous call to BtLibDiscoverSingleDevice. Calling BtLibStartInquiry in between calls
// to BtLibDiscoverSingleDevice may cause only a partial list to be displayed.
//
// Returns:
// btLibErrNoError - success
// btLibErrCanceled - user canceled
//
// Events:
// None
//
Err BtLibDiscoverSingleDevice( UInt16 btLibRefNum, Char* instructionTxt, BtLibClassOfDeviceType* deviceFilterList,
UInt8 deviceFilterListLen , BtLibDeviceAddressType *selectedDeviceP, Boolean addressAsName, Boolean showLastList)
BTLIB_TRAP(btLibTrapDiscoverSingleDevice);
//--------------------------------------------------------------------
// This blocking call performs a full discovery for an application, including name and feature retreval
// and testing. This function takes over the UI and presents a choice box to the user, allowing
// the user to select multiple devices from the list of devices that were discovered and meet the criteria.
//
// btLibRefNum -> the reference number for the bluetooth library
// instructionTxt -> the text displayed at the top of the selection box, NULL for default
// buttonTxt -> test for the done button, NULL for default
// deviceFilterList -> array of BtLibClassOfDeviceTypes, function checks each element in list against the remote
// device's BtLibClassOfDeviceType value. Any match in the list is considered
// a success. Passing NULL skips this test.
// deviceFilterListLen -> number of elements in deviceFilterList
// numDevicesSelected <- pointer to a allocated UInt8. returns number of deices selected. App should call
// BtLibGetSelectedDevices go get the actuall device list
// addressAsName -> a debug option to show the remote devices bluetooth addresses instead of friendly names
// showLastList -> if true, causes all other paramaters to be ignored and displays the same list as the
// previous call to BtLibDiscoverMultipleDevices. Calling BtLibStartInquiry in between calls
// to BtLibDiscoverMultipleDevices may cause only a partial list to be displayed.
//
// Returns:
// btLibErrNoError - success
// btLibErrCanceled - user canceled
//
// Events:
// None
//
Err BtLibDiscoverMultipleDevices( UInt16 btLibRefNum, Char* instructionTxt, Char* buttonTxt, BtLibClassOfDeviceType* deviceFilterList,
UInt8 deviceFilterListLen , UInt8 *numDevicesSelected, Boolean addressAsName, Boolean showLastList)
BTLIB_TRAP(btLibTrapDiscoverMultipleDevices);
//--------------------------------------------------------------------
// Gets the list of devices selected during the last BtLibDiscoverMultipleDevices
//
// btLibRefNum -> the reference number for the bluetooth library
// selectedDeviceArray <-> array to place the results in
// arraySize -> number of elements in selectedDeviceArray
// numDevicesReturned <- number of results placed in selectedDeviceArray
// Returns:
// btLibErrNoError - success
//
// Events:
// None
//
Err BtLibGetSelectedDevices( UInt16 btLibRefNum, BtLibDeviceAddressType* selectedDeviceArray, UInt8 arraySize, UInt8 *numDevicesReturned)
BTLIB_TRAP(btLibTrapGetSelectedDevices);
//--------------------------------------------------------------------
// Get the remote device's name. The bluetooth library keeps a small cache of device names.
// If retrievalMethod is not btLibRemoteOnly, this routine firsts checks that cache for a name.
// If the name is not in the cache and the retrival method is not btLibCachedOnly, the function
// queries the remote device for its name, forming a temporary ACL connection if one is not already in place.
// If the name is in the cache, the value is returned immediately, otherwise the function returns a
// btLibErrPending error, and the name is returned through registered callbacks
//
// btLibRefNum -> the reference number for the bluetooth library
// remoteDevice -> the address of the device who's name is desired
// nameP -> pointer to name structure to be filled in by the call. Must allocate enough memory
// for the name and the null terminator (249 bytes is the max possible)
// retrievalMethod -> get the name from the cache or the remote device
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
//
// btLibErrBusy - There is already a name request pending
//
// btLibErrNoError - Name structure was filled in from cache successfully. No callback
// will be returned
//
//
// Events:
// btLibManagementEventNameResult - This event with a status equal to btLibErrNoError
// signals that the friendly name was successfully filled in.
//
//
Err BtLibGetRemoteDeviceName( UInt16 btLibRefNum, BtLibDeviceAddressTypePtr remoteDeviceP,
BtLibFriendlyNameType* nameP, BtLibGetNameEnum retrievalMethod)
BTLIB_TRAP(btLibTrapGetRemoteDeviceName);
//--------------------------------------------------------------------
// Attempts to create an ACL link to a remote device. In order to create links to
// more than one device. you must call BtLibPiconetCreate. Outbound connects
// allow the master slave switch when you have not called BtLibPiconetCreate.
//
// btLibRefNum -> the reference number for the bluetooth library
// remoteDeviceP -> a remote device address
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrAlreadyConnected - The connection is already in place (no event returned)
// btLibErrTooMany - Reached maximum number of ACL Links allowed.
//
// Events:
// btLibManagementEventACLConnectOutbound - This event with a status equal to 0 signals
// that the ACL link is up.
//
Err BtLibLinkConnect( UInt16 btLibRefNum, BtLibDeviceAddressTypePtr remoteDeviceP)
BTLIB_TRAP(btLibTrapLinkConnect);
//--------------------------------------------------------------------
// Disconnect ACL Link. Result returned through callback event.
//
// btLibRefNum -> the reference number for the bluetooth library
// remoteDeviceP -> the address of the remote device
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrNoError - A connection attempt was canceled before completing.
// No event will be generated.
// btLibErrNoAclLink - No link exists to disconnect. (No event generated)
//
// Events:
// btLibManagementEventACLDisconnect - This event signals that the link has
// disconnected. The error field of the event contains the reason the link
// was disconnected.
//
Err BtLibLinkDisconnect( UInt16 btLibRefNum, BtLibDeviceAddressTypePtr remoteDeviceP)
BTLIB_TRAP(btLibTrapLinkDisconnect);
//--------------------------------------------------------------------
// Set up to be the master of a piconet. Set up initial state for whether
// to allow inbound connections or not.
//
// btLibRefNum -> the reference number for the bluetooth library
// unlockInbound -> If true the piconet will accept inbound connections. This
// initializes the piconet to the unlocked state. A value of false initializes
// the piconet to the locked state which only allows outbound connections.
// discoverable -> unlockInbound must be true or this parameter is ignored.
// If true the radio will be set to respond to inquiries. If false the
// radio is just connectable.
//
// Returns:
// btLibErrNoError - Successfully configured to be master.
// btLibErrPending - This happens when there is a pre-existing ACL link
// because the link needs its link policy changed and may need a role
// switch.
// btLibErrFailed - A piconet already exists.
//
// Events:
// btLibManagementEventPiconetCreated - Piconet created. A non-zero status
// gives the reason for failure.
//
// btLibManagementEventAccessibilityChange - If the radio is discoverable
// and accessable then this event will let you know that the radio
// is no longer discoverable or connectable.
//
Err BtLibPiconetCreate(UInt16 btLibRefNum, Boolean unlockInbound, Boolean discoverable)
BTLIB_TRAP(btLibTrapPiconetCreate);
//--------------------------------------------------------------------
// Disconnect links to all devices. Remove all retrictions on our master/slave
// role.
//
// btLibRefNum -> the reference number for the bluetooth library
//
// Returns:
// btLibErrPending - Destroying the piconet.
// btLibErrNoError - Piconet destroyed.
// btLibErrNoPiconet - Piconet does not exist.
//
// Events:
// btLibManagementEventACLDisconnect - This event signals that the link has
// disconnected.
//
// btLibManagementEventPiconetDestroyed - This event signals that the piconet has been
// completely destroyed.
//
Err BtLibPiconetDestroy(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapPiconetDestroy);
//--------------------------------------------------------------------
// Accept inbound ACL links into the piconet. Allowing inbound connections
// lowers the bandwidth availble for data transmission within the current
// members of the piconet because the radio periodically has to scan for
// incoming links.
//
// btLibRefNum -> the reference number for the bluetooth library
// discoverable -> If true the radio will be set to respond to
// inquiries. If false the radio is just connectable.
//
// Returns:
// btLibErrNoError - Devices can be added to the piconet.
// btLibErrNoPiconet - BtLibPicoCreate has not been succesfully called.
//
// Events:
// btLibManagementEventAccessibilityChange - If allowInbound is true then
// this event informs you that you are discoverable and connectable
//
Err BtLibPiconetUnlockInbound(UInt16 btLibRefNum, Boolean discoverable)
BTLIB_TRAP(btLibTrapPiconetUnlock);
//--------------------------------------------------------------------
// Don't allow remote devices to connect into the piconet. (Outbound
// connections are still allowed). When a piconet is locked bandwith
// is maximized for data transmission between the members of the piconet.
//
// btLibRefNum -> the reference number for the bluetooth library
//
// Returns:
// btLibErrNoError - Devices cannnot be added to the piconet.
// btLibErrNoPiconet - BtLibPicoCreate has not been succesfully called.
//
// Events:
// btLibManagementEventAccessibilityChange - If the radio is discoverable
// and accessable then this event will let you know that the radio
// is no longer discoverable or connectable.
//
Err BtLibPiconetLockInbound(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapPiconetLock);
//--------------------------------------------------------------------
// Set the state of an ACL link
//
// btLibRefNum -> Bluetooth library reference number.
// remoteDevice -> the address of the remote device (identifies ACL link).
// pref -> link preference to set.
// linkState -> value corresponding to preference.
// linkStateSize -> size in bytes of linkState.
//
// pref: linkState:
// btLibLinkPref_Authenticated ignored, size is also ignored
// btLibLinkPref_Encrypted Boolean (Note: link must first be authenticated)
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrFailed - You must first authenticate a link before you can
// encrypt it.
//
// Events:
// btLibManagementEventAuthenticationComplete - Signals that link authentication request has completed.
//
// btLibManagementEventEncryptionChange - Signals encryption change.
//
Err BtLibLinkSetState( UInt16 btLibRefNum, BtLibDeviceAddressTypePtr remoteDeviceP, BtLibLinkPrefsEnum pref, void* linkState, UInt16 linkStateSize)
BTLIB_TRAP(btLibTrapLinkSetState);
//--------------------------------------------------------------------
// Get the state of an ACL link
//
// btLibRefNum -> Bluetooth library reference number.
// remoteDevice -> the address of the remote device (identifies ACL link).
// pref -> link preference to get (see LINK PREFERENCES comment below).
// linkState <- memory to store linkState value (see LINK PREFERENCES comment below).
// linkStateSize <- size in bytes of linkState.
//
// pref: linkState:
// btLibLinkPref_Authenticated Boolean
// btLibLinkPref_Encrypted Boolean
// btLibLinkPref_LinkRole BtLibConnectionRoleEnum
//
// Returns:
// btLibErrNoError - the linkState variable has been filled in.
//
// Events:
// None
//
Err BtLibLinkGetState( UInt16 btLibRefNum, BtLibDeviceAddressTypePtr remoteDeviceP, BtLibLinkPrefsEnum pref, void* linkState, UInt16 linkStateSize)
BTLIB_TRAP(btLibTrapLinkGetState);
//--------------------------------------------------------------------
// Set the general management preferences
//
// btLibRefNum -> Bluetooth library reference number.
// pref -> management preference to set.
// prefValue -> value corresponding to preference.
// prefValueSize -> size in bytes of prefValue
//
// pref: prefValue:
// btLibPref_Name BtLibFriendlyNameType // In general, only the OS should set the device name
// btLibPref_UnconnectedAccessible BtLibAccessiblityInfoType // In general, only the OS should set the unconnected accessible mode
// btLibPref_LocalClassOfDevice BtLibClassOfDeviceType // In general, only the OS should set btLibPref_LocalClassOfDevice
//
// Returns:
// btLibErrNoError - Preference set.
//
// btLibErrPending - The results will be returned through a callback.
//
// Events:
// btLibManagementEventAccessibilityChange - Signals that accessibility has been changed
//
// btLibManagementEventLocalNameChange - Signals that name has been changed.
//
Err BtLibSetGeneralPreference( UInt16 btLibRefNum, BtLibGeneralPrefEnum pref, void* prefValue, UInt16 prefValueSize)
BTLIB_TRAP(btLibTrapSetGeneralPreference);
//--------------------------------------------------------------------
// Get the general management preferences
//
// btLibRefNum -> Bluetooth library reference number.
// pref -> management preference to get.
// prefValue -> memory to store prefValue.
// prefValueSize -> size in bytes of prefValue.
//
// pref: prefValue:
// btLibPref_LocalName BtLibFriendlyNameType
// btLibPref_UnconnectedAccessible BtLibAccessibleModeEnum
// btLibPref_CurrentAccessible BtLibAccessibleModeEnum
// btLibPref_LocalClassOfDevice BtLibClassOfDeviceType
// btLibPref_LocalDeviceAddress BtLibDeviceAddressType
//
// Returns:
// btLibErrNoError - Preference stored in prefValue.
//
// Events:
// None
//
Err BtLibGetGeneralPreference( UInt16 btLibRefNum, BtLibGeneralPrefEnum pref, void* prefValue, UInt16 prefValueSize)
BTLIB_TRAP(btLibTrapGetGeneralPreference);
#pragma mark *---------Sockets--------------*
/********************************************************************
* Sockets
*
* The sockets API is used to manage RFCOMM, L2CAP, and SDP
* communications.
********************************************************************/
//--------------------------------------------------------------------
// Create a socket. In general, applications should detroy
// all sockets before terminating.
//
// btLibRefNum -> the reference number for the bluetooth library
// socketP <- the returned socket value
// callbackP -> the socket callback proc.
// refCon -> Caller-defined data to pass to the callback handler.
// socketProtocol -> the protocol (L2CAP, RFComm, or SDP) to associate with this socket
//
// Returns:
// btLibErrNoError - Indicates that the socket was created.
//
// btLibErrOutOfMemory - Not enough memory to create socket.
//
// btLibErrTooMany - Failed because reached maximum number of sockets
// allocated for system.
//
// Events:
// None
//
Err BtLibSocketCreate( UInt16 btLibRefNum, BtLibSocketRef* socketRefP, BtLibSocketProcPtr callbackP,
UInt32 refCon,BtLibProtocolEnum socketProtocol)
BTLIB_TRAP(btLibTrapSocketCreate);
//--------------------------------------------------------------------
// Close a socket, free's associated resources and kills connections
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> the socket to close
//
// Returns:
// btLibErrNoError - Socket closed successfully.
// btLibErrSocket - Invalid socket passed in.
//
// Events:
// None
//
Err BtLibSocketClose( UInt16 btLibRefNum, BtLibSocketRef socket)
BTLIB_TRAP(btLibTrapSocketClose);
//--------------------------------------------------------------------
// Sets up an L2Cap or RfComm socket as a listener
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a listener socket
// listenInfo -> protocol specific listening information
//
// Returns:
// btLibErrNoError - Socket listening for incoming connections.
// btLibErrSocketPsmUnavailable - the given PSM is in use (L2CAP only)
// btLibErrTooMany - There are no resources to create a listener sock of this type
// Events:
// btLibSocketEventConnectRequest - Once a socket is set to listen, when a remote
// device initiates a connection then this event is sent. This event will set the
// listener socket up to respond to the correct RfComm or L2cap channel. You must
// respond to this callback with a call to BtLibSocketRespondToConnection on the
// listener socket to accept or reject the connection.
//
Err BtLibSocketListen( UInt16 btLibRefNum, BtLibSocketRef socket, BtLibSocketListenInfoType *listenInfo)
BTLIB_TRAP(btLibTrapSocketListen);
//--------------------------------------------------------------------
// Create an outbound L2Cap or RfComm connection
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a socket
// listenInfo -> Bluetooth device address and protocol specific connection information
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
//
// btLibErrNoAclLink - ACL link for remote device does not exist
//
// Events:
// btLibSocketEventConnectedOutbound - This event with a status of zero signals success of the
// connections. A non-zero status gives a reason for failure.
//
// btLibSocketEventDisconnected - If the connection fails or if connection establishment is
// successful then this event can occur when the channel disconnects.
//
// btLibSocketEventData - If connection establishment is successful then
// this event can occur if the remote device sends data.
//
Err BtLibSocketConnect( UInt16 btLibRefNum, BtLibSocketRef socket, BtLibSocketConnectInfoType* connectInfo)
BTLIB_TRAP(btLibTrapSocketConnect);
//--------------------------------------------------------------------
// Accept or reject an in-bound connection on a given listener socket. Called in response
// to btLibSocketEventConnectRequest event devlivered to a listener socket.
// A New connection socket is returned in btLibSocketEventConnectedInbound callback
// to the listener socket after BtLibSocketRespondToConnection is called.
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a listener socket.
// accept -> TRUE means accept connection. FALSE means reject connection.
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
//
// btLibErrSocketRole - the socket passed in is not Listening.
//
// btLibErrFailed - Listener socket does not have a pending connection. If this
// error occurs it means that the function has been called with the wrong listener,
// or that this function was called even though no btLibSocketEventConnectRequest
// callback occured for the socket.
//
// Events:
// btLibSocketEventConnectedInbound - the connection was made. contains
// the reference for the new connection socket (which will use the same callback
// as the listener)
// btLibSocketEventDisconnected - the connection failed, or the rejection is complete.
//
//
Err BtLibSocketRespondToConnection( UInt16 btLibRefNum, BtLibSocketRef socket, Boolean accept)
BTLIB_TRAP(btLibTrapSocketRespondToConnection);
//--------------------------------------------------------------------
// Send data over a connected L2Cap or RFCOMM socket. dataLen must be less then the mtu
// for the socket. Completion returned through callback.
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a connection socket
// data -> Buffer containing the data to send. If this function returns btLibErrPending, the
// contents of the buffer must not be modified until the btLibSocketEventSendComplete occurs.
// dataLen -> Length of data to send.
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
//
// btLibErrBusy - A send is already in process.
//
// btLibErrNoAclLink - ACL link for remote device does not exist
//
// btLibErrSocketRole - Socket is not connected.
//
// Events:
// btLibSocketEventSendComplete - This event, with a status of 0, signals
// that the data has been successfully transmitted.
//
Err BtLibSocketSend( UInt16 btLibRefNum, BtLibSocketRef socket, UInt8 *data, UInt32 dataLen)
BTLIB_TRAP(btLibTrapSocketSend);
//--------------------------------------------------------------------
// RFCOMM uses a credit based flow control mechanism. This function advances
// credit on a given RFCOMM connectiontion socket. Multiple calls to this function
// have a cummulative effect.
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> an RFCOMM connection socket
// credit -> Each credit value represents one RFCOMM packet. Advancing n
// credits allows the remote device to send n packets. Once those
// packets have been sent, the remote device can no longer send (flow
// is off). Subsequent calls to RF_AdvanceCredit() will allow the
// remote device to send again (flow is on). Credits are additive,
// so calling this function once with 3 credits and then with 2 credits
// will grant a total of 5 credits to the remote device, allowing the
// remote device to send 5 RFCOMM packets.
//
// Returns:
// btLibErrNoError - success
// btLibErrFailed - to many credits advanced
// btLibErrSocket - bad socket value
// btLibErrSocketProtocol - socket is not an RFCOMM socket
// btLibErrSocketRole - socket is not a connection socket
//
Err BtLibSocketAdvanceCredit( UInt16 btLibRefNum, BtLibSocketRef socket, UInt8 credit)
BTLIB_TRAP(btLibTrapSocketAdvanceCredit);
//--------------------------------------------------------------------
// Get socket information
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a socket
// infoType -> type of info to get (see SOCKET INFO comment below).
// valueP <- memory to store result (see SOCKET INFO comment below).
// valueSize -> size in bytes of memory for ValueP
//
// btLibSocketInfo_Protocol BtLibProtocolEnum*
// btLibSocketInfo_RemoteDeviceAddress BtLibDeviceAddressType*
//
// btLibSocketInfo_SendPending Boolean*
// btLibSocketInfo_MaxTxSize UInt32*
// btLibSocketInfo_MaxRxSize UInt32*
//
// The MaxTxSize and MaxRxSize will be the same except in the case where RFCOMM is
// using credit based flow control. In that case MaxRxSize will be equal to the negotiated
// frame size and the MaxTxSize will equal MaxRxSize - 1. We transmit packets with credit
// information which takes one byte away from the maximum frame size available for transmit.
// However, the spec does not require that the credit information is always included so it is
// possible that a non-palm implementation of RFCOMM could send a packet where the byte we
// we reserve for credit information is used for additional data.
//
// btLibSocketInfo_L2CapPsm BtLibL2CapPsmType*
//
// For an outbound L2Cap socket the psm returned represents the psm used to connect to the
// remote device. For an inbound L2Cap socket the psm returned represents the psm remote
// devices would use to connect to us.
//
// btLibSocketInfo_L2CapChannel BtLibL2CapChannelIdType*
//
// btLibSocketInfo_RfCommServerId BtLibRfCommServerIdType*
// btLibSocketInfo_RfCommOutstandingCredits UInt16*
//
// The RFCOMM Service ID is only valid for RFCOMM listener sockets.
//
// btLibSocketInfo_SdpServiceRecordHandle BtLibSdpRemoteServiceRecordHandle*
// Returns:
// btLibErrNoError - success, results are placed in valueP.
// btLibErrSocket - the socket is not in use
// btLibErrSocketRole - the socket has the wrong role for the request
// btLibErrSocketProtocol - the socket has the wrong protocol for the request
// btLibErrParamError - an invalid param was passed in.
// Events:
// None
//
Err BtLibSocketGetInfo( UInt16 btLibRefNum, BtLibSocketRef socket, BtLibSocketInfoEnum infoType,
void * valueP, UInt32 valueSize)
BTLIB_TRAP(btLibTrapSocketGetInfo);
#pragma mark *---------SDP-----------------*
/********************************************************************
* SDP
*
* The SDP API is used create and advertise service records to remote
* devices and to discover services available on remote devices. Only
* one outstanding query at a time is allowed per socket.
********************************************************************/
//--------------------------------------------------------------------
// Get available RFCOMM server channel for a UUID service list
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> an SDP socket
// rDev -> remote device to query
// serviceUUIDList -> List of UUIDs for service record. All UUIDs in
// the serviceUUIDList must be present in the remote record for a match.
// uuidListLen -> Length of serviceUUIDList. Max of 12.
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrSocket - Invalid socket passed into function.
// btLibErrSocketRole - Socket has incorrect role.
// btLibErrSocketProtocol - Must pass in an SDP socket.
// btLibErrOutOfMemory - Could not get memory to perform the query.
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// btLibSocketEventSdpGetServerChannelByUuid - This event with
// a status of btLibErrNoError signals that serverChannel has been filled in.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpGetServerChannelByUuid( UInt16 btLibRefNum, BtLibSocketRef socket,
BtLibDeviceAddressType *rDev, BtLibSdpUuidType* serviceUUIDList, UInt8 uuidListLen)
BTLIB_TRAP(btLibTrapSdpGetGetServerChannelByUuid);
//--------------------------------------------------------------------
// Get available L2Cap psm for a UUID service list
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> an SDP socket
// rDev -> remote device to query
// serviceUUIDList -> List of UUIDs for service record. All UUIDs in
// the serviceUUIDList must be present in the remote record for a match.
// uuidListLen -> Length of serviceUUIDList. Max of 12.
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrSocket - Invalid socket passed into function.
// btLibErrSocketRole - Socket has incorrect role.
// btLibErrSocketProtocol - Must pass in an SDP socket.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// btLibSocketEventSdpGetPsmByUuid - - This event with
// a status of btLibErrNoError signals that psm has been filled in.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpGetPsmByUuid( UInt16 btLibRefNum, BtLibSocketRef socket,
BtLibDeviceAddressType *rDev, BtLibSdpUuidType* serviceUUIDList, UInt8 uuidListLen)
BTLIB_TRAP(btLibTrapSdpGetPsmByUuid);
//--------------------------------------------------------------------
// Create an SDP Record.
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH <- Handle to the newly created service record.
//
// Returns:
// btLibErrNoError - Indicates that the SDP Record was created.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to create the record.
//
// Events:
// None
//
Err BtLibSdpServiceRecordCreate( UInt16 btLibRefNum, BtLibSdpRecordHandle* recordH )
BTLIB_TRAP(btLibTrapSdpServiceRecordCreate);
//--------------------------------------------------------------------
// Destroy an sdp record (free's memory)
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> Sdp record to be destroyed.
//
// Returns:
// btLibErrNoError - Indicates that the SDP Record was destroyed.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// None
//
Err BtLibSdpServiceRecordDestroy( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH)
BTLIB_TRAP(btLibTrapSdpServiceRecordDestroy);
//--------------------------------------------------------------------
// Advertises a service record so that remote devices can query it.
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> SDP record not currently advertised.
//
// Returns:
// btLibErrNoError - Indicates that the SDP Record is being advertised.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrSdpFormat - Sdp record is improperly formatted.
// btLibErrSdpRemoteRecord - Operation not valid on remote record.
// btLibErrSdpAdvertised - Record is already advertised.
//
// Events:
// None
//
Err BtLibSdpServiceRecordStartAdvertising( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH)
BTLIB_TRAP(btLibTrapSdpServiceRecordStartAdvertising);
//--------------------------------------------------------------------
// Stop advertising an Sdp record
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> SDP record that is currently advertised.
//
// Returns:
// btLibErrNoError - Indicates that the SDP Record is no longer advertised.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrSdpNotAdvertised - Record was not advertised.
//
// Events:
// None
//
Err BtLibSdpServiceRecordStopAdvertising( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH)
BTLIB_TRAP(btLibTrapSdpServiceRecordStopAdvertising);
//--------------------------------------------------------------------
// Sets up a basic Sdp record for L2Cap and RFCOMM listener sockets
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> a RFCOMM or L2CAP socket in listening mode
// serviceUUIDList -> List of UUIDs for service record
// uuidListLen -> Length of serviceUUIDList. Max of 12.
// serviceName -> Name of the service (English only)
// serviceNameLen -> Length of serviceName.
// recordH -> The service record to be set up
//
// Returns:
// btLibErrNoError - Indicates that the SDP Record was set up.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrSdpRemoteRecord - Operation not valid on remote record.
// btLibErrSdpAdvertised - Operation not valid on advertised record.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrSocket - Invalid socket passed into function.
//
// Events:
// None
//
Err BtLibSdpServiceRecordSetAttributesForSocket( UInt16 btLibRefNum, BtLibSocketRef socket,
BtLibSdpUuidType* serviceUUIDList, UInt8 uuidListLen, const Char* serviceName, UInt16 serviceNameLen,
BtLibSdpRecordHandle recordH)
BTLIB_TRAP(btLibTrapSdpServiceRecordSetAttributesForSocket);
//--------------------------------------------------------------------
// Get the service record handle(s) for service classes advertised on a remote device
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> an SDP socket
// rDev -> remote device to query
// uuidList -> list of uuids identifying service classes that the remote service should support.
// All UUIDs in the serviceUUIDList must be present in the remote record for a match.
// uuidListLen -> number of elements in the uuidList. Max value is 12.
// serviceRecordList <- array to store results of query
// numSrvRec <-> number of service records serviceRecordList can store. This value is sent to
// the SDP server so it can limit the number of responses. This value is set
// upon receiving btLibSocketEventSdpServiceRecordHandle to the actual number of
// record handles received.
//
// Returns:
// btLibErrPending - The results will be returned through a callback.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrSocket - Invalid socket passed into function.
// btLibErrSocketProtocol - Must pass in an SDP socket.
// btLibErrInProgress - Query already pending on this socket.
// btLibErrNoAclLink - No ACL link in place to remote device.
// btLibErrOutOfMemory - Could not get memory to do the query.
// btLibErrBusy - Failed because connection is parked.
//
// Events:
// btLibSocketEventSdpServiceRecordHandle - This event with a status of btLibErrNoError
// signals that the serviceRecordList and numSrvRec has been filled in with the SDP
// response results. If the status is btLibErrNoError then the associated event data
// is valid, otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpServiceRecordsGetByServiceClass( UInt16 btLibRefNum, BtLibSocketRef socket,
BtLibDeviceAddressType *rDev, BtLibSdpUuidType* uuidList, UInt16 uuidListLen,
BtLibSdpRemoteServiceRecordHandle *serviceRecordList, UInt16 *numSrvRec)
BTLIB_TRAP(btLibTrapSdpServiceRecordsGetByServiceClass);
//--------------------------------------------------------------------
// Associate an SDPRecord with a socket and a remote device so that
// BtLibSdpServiceRecordGetAttribute() can be called to get remote attributes.
//
// btLibRefNum -> the reference number for the bluetooth library
// socket -> an SDP socket
// rDev -> device to query
// remoteHandle -> remote service record handle
// recordH -> an empty SDP record.
//
// Returns:
// btLibErrNoError - Indicates that the mapping was successful.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrSocket - Invalid socket passed into function.
// btLibErrSocketProtocol - Must pass in an SDP socket.
// btLibErrSdpMapped - socket or SDP record is already mapped.
// btLibErrOutOfMemory - Could not get memory to do the mapping.
//
// Events:
// None
//
Err BtLibSdpServiceRecordMapRemote( UInt16 btLibRefNum, BtLibSocketRef socket,
BtLibDeviceAddressType* rDev, BtLibSdpRemoteServiceRecordHandle remoteHandle,
BtLibSdpRecordHandle recordH)
BTLIB_TRAP(btLibTrapSdpServiceRecordMapRemote);
//--------------------------------------------------------------------
// Set a specific attribute type's value for a given record. This function only works
// on sdp records that are local and not currently advertised.
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> SDP record
// attribute -> type of attribute to set
// attributeValues -> attributes that correspond to attribute type
// listNumber -> identifies which list to use (usually 0) Ignored for non
// ProtocolDescriptorListEntry attributes.
// listEntry -> The item to get in the list. Ignored for non list atttributes.
//
// Returns:
// btLibErrNoError - Indicates that the attribute value was set successfully.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrSdpRemoteRecord - Operation not valid on remote record.
// btLibErrSdpAdvertised - Operation not valid on advertised record.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
//
// Events:
// None
//
Err BtLibSdpServiceRecordSetAttribute( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, BtLibSdpAttributeDataType *attributeValues, UInt16 listNumber,
UInt16 listEntry)
BTLIB_TRAP(btLibTrapSdpServiceRecordSetAttribute);
//--------------------------------------------------------------------
// Get a specific attribute type's value for a given record
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> SDP record
// attribute -> type of attribute to get
// attributeValues <- space for attribute value to be received.
// listNumber -> identifies which list to use (usually 0) Ignored for non
// ProtocolDescriptorListEntry attributes.
// listEntry -> The item to get in the list. Ignored for non list atttributes.
//
// Returns:
// btLibErrNoError - Indicates that getting the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetAttribute - This event with a status of btLibErrNoError
// signals that attributeValues has been filled in with the SDP response results.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpServiceRecordGetAttribute( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, BtLibSdpAttributeDataType* attributeValues, UInt16 listNumber,
UInt16 listEntry)
BTLIB_TRAP(btLibTrapSdpServiceRecordGetAttribute);
//--------------------------------------------------------------------
// Get the size of a string or URL type of atttribute for a given record
//
// btLibRefNum -> the reference number for the bluetooth library
// recordH -> SDP record
// attribute -> type of attribute to get size for
// size <- size of attribute.
//
// Returns:
// btLibErrNoError - Indicates that getting the size of the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetStringLen - This event with a status of btLibErrNoError
// signals that size variable has been filled in with the SDP response results.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpServiceRecordGetStringOrUrlLength( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, UInt16* size)
BTLIB_TRAP(btLibTrapSdpServiceRecordGetStringOrUrltLength);
//--------------------------------------------------------------------
// Get the number of entries in an atribute list
// valid for: ServiceClassIdListEntry, ProtocolDescriptorListEntry, BrowseGroupListEntry,
// LanguageBaseAttributeIDListEntry and ProfileDescriptorListEntry
//
// btLibRefNum -> the reference number for the bluetooth library.
// recordH -> SDP record.
// attribute -> type of attribute to get number of list entries for.
// listNumber -> identifies which list to use (usually 0) Ignored for non
// ProtocolDescriptorListEntry attributes.
// numEntries <- size of attribute.
//
// Returns:
// btLibErrNoError - Indicates that getting the size of the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetNumListEntries - This event with a status of btLibErrNoError
// signals that numEntries variable has been filled in with the SDP response results.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpServiceRecordGetNumListEntries( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, UInt16 listNumber, UInt16 *numEntries )
BTLIB_TRAP(btLibTrapSdpServiceRecordGetNumListEntries);
//--------------------------------------------------------------------
// Get the number of lists since there can be more than one protocol descriptor
// list in an SDP record.
// valid for: ProtocolDescriptorListEntry
//
// btLibRefNum -> the reference number for the bluetooth library.
// recordH -> SDP record.
// attribute -> type of attribute to get number of lists for.
// numLists <- number of lists.
//
// Returns:
// btLibErrNoError - Indicates that getting the size of the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetNumLists - This event with a status of btLibErrNoError
// signals that numLists variable has been filled in with the SDP response results.
// If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not
// complete successfully.
//
Err BtLibSdpServiceRecordGetNumLists( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, UInt16 *numLists )
BTLIB_TRAP(btLibTrapSdpServiceRecordGetNumLists);
//--------------------------------------------------------------------
// Compare two UUIDs
//
// btLibRefNum -> the reference number for the bluetooth library.
// uuid1 -> a uuid
// uuid2 -> another uuid
//
// Returns:
// btLibErrNoError - UUIDs match
// btLibErrError - UUIDs do not match
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// None
//
Err BtLibSdpCompareUuids(UInt16 btLibRefNum, BtLibSdpUuidType *uuid1, BtLibSdpUuidType *uuid2)
BTLIB_TRAP(btLibTrapSdpCompareUuids);
#pragma mark *--------Raw SDP----------*
// Raw SDP APIs - If you have a profile or application specific SDP attribute then you
// will need to use the Raw SDP APIs to form and parse SDP protocol data yourself. (Refer
// to the bluetooth 1.1 specification to see how SDP data is formatted.)
//
//--------------------------------------------------------------------
// Set the value for any attribute type for a given record. This function only works
// on SDP records that are local and not currently advertised.
//
// btLibRefNum -> the reference number for the bluetooth library.
// recordH -> SDP record.
// attributeID -> type of attribute to set.
// value -> raw SDP attribute data (as would appear in raw SDP protocol data).
// valSize -> size in bytes of value.
//
// Returns:
// btLibErrNoError - Indicates that the attribute value was set successfully.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrSdpRemoteRecord - Operation not valid on remote record.
// btLibErrSdpAdvertised - Operation not valid on advertised record.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
//
// Events:
// None
//
Err BtLibSdpServiceRecordSetRawAttribute( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, const UInt8* value, UInt16 valSize)
BTLIB_TRAP(btLibTrapSdpServiceRecordSetRawAttribute);
//--------------------------------------------------------------------
// Get the value for any attribute type for a given record
//
// btLibRefNum -> the reference number for the bluetooth library.
// recordH -> SDP record.
// attributeID -> type of attribute to get.
// value <- raw SDP attribute data (as would appear in raw SDP protocol data).
// valSize <-> pointer to size of value buffer (in) pointer to number of bytes in attribute (out).
//
// Returns:
// btLibErrNoError - Indicates that getting the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetRawAttribute - This event with a status of btLibErrNoError
// signals that value and valSize variables has been filled in with the SDP response
// results. If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not complete
// successfully.
//
Err BtLibSdpServiceRecordGetRawAttribute( UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, UInt8* value, UInt16* valSize)
BTLIB_TRAP(btLibTrapSdpServiceRecordGetRawAttribute);
//--------------------------------------------------------------------
// Get the size of any attribute type for a given record
//
// btLibRefNum -> the reference number for the bluetooth library.
// recordP -> SDP record.
// attributeID -> type of attribute to get the size of.
// size <- size of attribute corresponding to attributeID.
//
// Returns:
// btLibErrNoError - Indicates that getting the attribute value was successful.
// btLibErrSdpAttributeNotSet - Attribute is not in record.
// btLibErrNotOpen - BtLib needs to be open to make this call.
// btLibErrPending - For remote records the data may need to be retrieved from the
// remote device. The results will be returned through a callback.
// btLibErrNoAclLink - ACL link for remote device does not exist.
// btLibErrParamError - Invalid parameter passed into function.
// btLibErrOutOfMemory - Could not get memory to perform the operation.
// btLibErrInProgress - Query already pending on this socket. (remote only)
// btLibErrBusy - Failed because connection is parked. (remote only)
//
// Events:
// btLibSocketEventSdpGetRawAttributeSize - This event with a status of btLibErrNoError
// signals that the size variable has been filled in with the SDP response
// results. If the status is btLibErrNoError then the associated event data is valid,
// otherwise the eventData is not valid because the SDP operation did not complete
// successfully.
//
Err BtLibSdpServiceRecordGetSizeOfRawAttribute(UInt16 btLibRefNum, BtLibSdpRecordHandle recordH,
BtLibSdpAttributeIdType attributeID, UInt16* size)
BTLIB_TRAP(btLibTrapSdpServiceRecordGetSizeOfRawAttribute);
//--------------------------------------------------------------------
// Determines the offset and number of bytes in a Data Element. Note that
// offset plus length is the total size of the Data Element.
//
// btLibRefNum -> the reference number for the bluetooth library.
// value -> raw SDP attribute data.
// offsetP <- stores the offset from value to the start of the data
// elements data field.
// lengthP <- stores length of data element.
//
// Returns:
// btLibErrNoError - successfully parsed the attribute.
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// none
//
Err BtLibSdpParseRawDataElement(UInt16 btLibRefNum, const UInt8* value, UInt16 *offset,
UInt32 *length)
BTLIB_TRAP(btLibTrapSdpParseRawDataElement);
//--------------------------------------------------------------------
// Verifies that a raw Sdp Data Element is properly formed. All size descriptors
// in the element are checked to make sure that the complete Data Element
// fits into the indicated length.
//
// In the case of Data Element Sequences or Alternates, this
// function is called recursively. The parameter "maxLevel" is used
// to stop the recursion in the case of bad data. "maxLevel" must
// be large enough to handle the complete Data Element. For example,
// a simple data element such as btLibDETD_UINT would need a "maxLevel" of 1,
// but a Data Element Sequence of UUIDs would need a "maxLevel" of 2.
//
// btLibRefNum -> the reference number for the bluetooth library.
// value -> raw SDP attribute data.
// valSize -> size of value in bytes. The size of the Data Element must
// be less than or equal to this parameter or this function will fail.
// maxLevel -> The maximum level of recursion. Must be at least 1.
//
// Returns:
// btLibErrNoError - Sdp Data is properly formatted.
// btLibErrError - Sdp Data is not properly formatted.
// btLibErrParamError - Invalid parameter passed into function.
//
// Events:
// none
//
Err BtLibSdpVerifyRawDataElement(UInt16 btLibRefNum, const UInt8 *value, UInt16 valSize,
UInt8 maxLevel)
BTLIB_TRAP(btLibTrapSdpVerifyRawDataElement);
//---------------------------------------------------------------------------
// Returns a Data Element's type.
//
// header -> The first byte of a Data Element
//
// Returns:
// The type of the Data Element.
//
#define BtLibSdpGetRawElementType(header) ((header) & btLibDETD_MASK)
//---------------------------------------------------------------------------
// Returns a Data Element's size descriptor.
//
// header -> The first byte of a Data Element
//
// Returns:
// The size characteristic of the Data Element.
//
#define BtLibSdpGetRawDataElementSize(header) ((header) & btLibDESD_MASK)
#pragma mark *--------Security----------*
//---------------------------------------------------------------------------
// Search the device database for the device with the specified
// Bluetooth address. Return the index of the corresponding device
// record in the database.
//
// btLibRefNum -> Reference number for the Bluetooth library.
// addrP -> Bluetooth address of remote device.
// index <- Index of the record.
//
// Returns:
// btLibErrNoError - successful.
// btLibErrNotFound - a record with the specified remote device
// address could not be found.
//
Err BtLibSecurityFindTrustedDeviceRecord(UInt16 btLibRefNum, BtLibDeviceAddressTypePtr addrP, UInt16 *index)
BTLIB_TRAP(btLibTrapSecurityFindTrustedDeviceRecord);
//---------------------------------------------------------------------------
// Remove a device record from the device database.
//
// btLibRefNum -> Reference number for the Bluetooth library.
// index -> Index of the record.
//
// Returns:
// btLibErrNoError - if successful.
// btLibErrNotFound - if a record with the specified index
// could not be found.
//
Err BtLibSecurityRemoveTrustedDeviceRecord(UInt16 btLibRefNum, UInt16 index)
BTLIB_TRAP(btLibTrapSecurityRemoveTrustedDeviceRecord);
//---------------------------------------------------------------------------
// Get information from a device record in the device database.
//
// btLibRefNum -> Reference number for the Bluetooth library.
// index -> Index of the record to Remove.
// addrP <- Bluetooth address of remote device. NULL if not desired.
// nameBuffer <- Pointer to buffer to store user-friendly name of
// remote device. NULL if not desired.
// nameBufferSize -> Size of the nameBuffer buffer. If less than
// btLibMaxDeviceNameLength, name may be truncated. Ignored if
// nameBuffer is NULL.
// cod <- Pointer to a BtLibClassOfDeviceType representing
// the class of the device. NULL if not desired.
// lastConnected <- The date since the device last connected. This
// date is measured in seconds since midnight
// January 1, 1904. NULL if not desired.
// persistent <- If true, the device is bonded and can connect
// to the local device without authentication. If
// false, the device is paired but not bonded<65>it
// will need to reauthenticate if it connects again. NULL if not desired.
//
// Returns:
// btLibErrNoError - if successful.
// btLibErrNotFound - if a record with the specified index
// could not be found.
//
Err BtLibSecurityGetTrustedDeviceRecordInfo(UInt16 btLibRefNum, UInt16 index, BtLibDeviceAddressTypePtr addrP,
Char* nameBuffer, UInt8 NameBufferSize, BtLibClassOfDeviceType *cod,
UInt32 *lastConnected, Boolean *persistentP)
BTLIB_TRAP(btLibTrapSecurityGetTrustedDeviceRecordInfo);
//---------------------------------------------------------------------------
// Return the number of bonded devices in the device database or
// return the total number of devices in the device database.
//
// btLibRefNum -> Reference number for the Bluetooth library.
// persistentOnly -> true to obtain the total number of bonded
// devices in the database. These are the same
// devices that appear in the trusted devices list.
// false to obtain the total number of devices in
// the device database. This includes the devices
// that are bonded and the devices that are paired
// but not bonded.
//
// Returns:
// Returns the requested number of device records.
//
UInt16 BtLibSecurityNumTrustedDeviceRecords( UInt16 btLibRefNum, Boolean persistentOnly)
BTLIB_TRAP(btLibTrapSecurityNumTrustedDeviceRecords);
/********************************************************************
* Bluetooth byte ordering routines
********************************************************************/
#define _BtLibNetSwap16(x) \
((((x) >> 8) & 0xFF) | \
(((x) & 0xFF) << 8))
#define _BtLibNetSwap32(x) \
((((x) >> 24) & 0x00FF) | \
(((x) >> 8) & 0xFF00) | \
(((x) & 0xFF00) << 8) | \
(((x) & 0x00FF) << 24))
#if (CPU_ENDIAN == CPU_ENDIAN_BIG)
// convert SDP byte orders (SDP is Big Endian)
// convert network long to host long
#define BtLibSdpNToHL(x) (x)
// convert network Int16 to host Int16
#define BtLibSdpNToHS(x) (x)
// convert host long to network long
#define BtLibSdpHToNL(x) (x)
// convert host Int16 to network Int16
#define BtLibSdpHToNS(x) (x)
// convert RFCOMM byte orders (RFCOMM is Big Endian)
#define BtLibRfCommNToHL(x) (x)
#define BtLibRfCommNToHS(x) (x)
#define BtLibRfCommHToNL(x) (x)
#define BtLibRfCommHToNS(x) (x)
// convert L2CAP byte orders (L2CAP is Little Endian)
#define BtLibL2CapNToHL(x) _BtLibNetSwap32(x)
#define BtLibL2CapNToHS(x) _BtLibNetSwap16(x)
#define BtLibL2CapHToNL(x) _BtLibNetSwap32(x)
#define BtLibL2CapHToNS(x) _BtLibNetSwap16(x)
#elif (CPU_ENDIAN == CPU_ENDIAN_LITTLE)
// convert SDP byte orders (SDP is Big Endian)
// convert network long to host long
#define BtLibSdpNToHL(x) _BtLibNetSwap32(x)
// convert network Int16 to host Int16
#define BtLibSdpNToHS(x) _BtLibNetSwap16(x)
// convert host long to network long
#define BtLibSdpHToNL(x) _BtLibNetSwap32(x)
// convert host Int16 to network Int16
#define BtLibSdpHToNS(x) _BtLibNetSwap16(x)
// convert RFCOMM byte orders (RFCOMM is Big Endian)
#define BtLibRfCommNToHL(x) _BtLibNetSwap32(x)
#define BtLibRfCommNToHS(x) _BtLibNetSwap16(x)
#define BtLibRfCommHToNL(x) _BtLibNetSwap32(x)
#define BtLibRfCommHToNS(x) _BtLibNetSwap16(x)
// convert L2CAP byte orders (L2CAP is Little Endian)
#define BtLibL2CapNToHL(x) (x)
#define BtLibL2CapNToHS(x) (x)
#define BtLibL2CapHToNL(x) (x)
#define BtLibL2CapHToNS(x) (x)
#else
#error "No CPU_ENDIAN defined"
#endif
/********************************************************************
* Bluetooth device address translation and conversion routines
********************************************************************/
//--------------------------------------------------------------------
// Convert 48-bit BtLibAddressType to ascii colon seperated form.
//
// btLibRefNum -> the reference number for the bluetooth library
// btDevP -> address of a Bluetooth device
// spaceP <- memory to hold null terminated ascii formatted bluetooth device address
// spaceSize <-> size of spaceP in bytes (in), Length of spaceP excluding NULL (out)
//
// Returns:
// btLibErrNoError - Indicates successful conversion
//
// Events:
// None
//
Err BtLibAddrBtdToA(UInt16 libRefNum, BtLibDeviceAddressType *btDevP, Char *spaceP,
UInt16 spaceSize)
BTLIB_TRAP(btLibTrapAddrBtdToA);
//--------------------------------------------------------------------
// Convert a colon separated ascii string format of a Bluetooth device
// address into a 48-bit BtLibDeviceAddressType.
//
// btLibRefNum -> the reference number for the bluetooth library
// btDevP <- memory to receive address of a Bluetooth device
// a <- string with ascii colon seperated bluetooth device address
//
// Returns:
// btLibErrNoError - Indicates successful conversion
//
// Events:
// None
//
Err BtLibAddrAToBtd(UInt16 libRefNum, const Char *a, BtLibDeviceAddressType *btDevP)
BTLIB_TRAP(btLibTrapAddrAToBtd);
#pragma mark *--------Service----------*
// ** The Service's API is not yet documented **//
//--------------------------------------------------------------------
// Used by services to open the Lib instead of BtLibOpen
//
Err BtLibServiceOpen(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapServiceOpen);
//--------------------------------------------------------------------
// Used by services to close the Lib instead of BtLibClose
//
Err BtLibServiceClose(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapServiceClose);
//--------------------------------------------------------------------
// Used by services to note that they have begun a session
//
Err BtLibServiceIndicateSessionStart(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapServiceIndicateSessionStart);
//--------------------------------------------------------------------
// Used by services to indicate a session start to the user
//
Err BtLibServicePlaySound(UInt16 btLibRefNum)
BTLIB_TRAP(btLibTrapServicePlaySound);
#ifdef __cplusplus
}
#endif
#endif __BTLIB_H