19a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz/* 29a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Copyright (C) 2015 The Android Open Source Project 39a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * 49a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Licensed under the Apache License, Version 2.0 (the "License"); 59a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * you may not use this file except in compliance with the License. 69a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * You may obtain a copy of the License at 79a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * 89a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * http://www.apache.org/licenses/LICENSE-2.0 99a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * 109a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Unless required by applicable law or agreed to in writing, software 119a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * distributed under the License is distributed on an "AS IS" BASIS, 129a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * See the License for the specific language governing permissions and 149a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * limitations under the License. 159a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz */ 169a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 179a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz#pragma once 189a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 199a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz#include "bluetooth.h" 209a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 219a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz#define SDP_OPP_SUPPORTED_FORMATS_MAX_LENGTH 15 229a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 239a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz__BEGIN_DECLS 249a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 259a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz/** 269a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * These events are handled by the state machine 279a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz */ 289a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef enum { 29207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_RAW, // Used to carry raw SDP search data for unknown UUIDs 30207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_MAP_MAS, // Message Access Profile - Server 31207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_MAP_MNS, // Message Access Profile - Client (Notification Server) 32207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_PBAP_PSE, // Phone Book Profile - Server 33207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_PBAP_PCE, // Phone Book Profile - Client 34207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_OPP_SERVER, // Object Push Profile 35207331d05023ae8226219887c67a26582c1d7068Casper Bonde SDP_TYPE_SAP_SERVER // SIM Access Profile 369a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_types; 379a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 389a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_hdr { 399a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_types type; 409a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_uuid_t uuid; 419a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t service_name_length; 429a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz char *service_name; 439a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t rfcomm_channel_number; 449a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t l2cap_psm; 459a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t profile_version; 469a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_hdr; 479a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 489a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz/** 499a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Some signals need additional pointers, hence we introduce a 509a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * generic way to handle these pointers. 519a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz */ 529a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_hdr_overlay { 539a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_types type; 549a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_uuid_t uuid; 559a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t service_name_length; 569a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz char *service_name; 579a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t rfcomm_channel_number; 589a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t l2cap_psm; 599a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int32_t profile_version; 609a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 619a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz // User pointers, only used for some signals - see bluetooth_sdp_ops_record 629a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int user1_ptr_len; 639a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint8_t *user1_ptr; 649a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int user2_ptr_len; 659a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint8_t *user2_ptr; 669a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_hdr_overlay; 679a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 689a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_mas_record { 699a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 709a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t mas_instance_id; 719a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t supported_features; 729a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t supported_message_types; 739a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_mas_record; 749a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 759a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_mns_record { 769a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 779a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t supported_features; 789a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_mns_record; 799a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 809a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_pse_record { 819a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 829a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t supported_features; 839a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint32_t supported_repositories; 849a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_pse_record; 859a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 869a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_pce_record { 879a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 889a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_pce_record; 899a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 909a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct _bluetooth_sdp_ops_record { 919a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 929a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz int supported_formats_list_len; 939a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz uint8_t supported_formats_list[SDP_OPP_SUPPORTED_FORMATS_MAX_LENGTH]; 949a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_ops_record; 959a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 96207331d05023ae8226219887c67a26582c1d7068Casper Bondetypedef struct _bluetooth_sdp_sap_record { 97207331d05023ae8226219887c67a26582c1d7068Casper Bonde bluetooth_sdp_hdr_overlay hdr; 98207331d05023ae8226219887c67a26582c1d7068Casper Bonde} bluetooth_sdp_sap_record; 99207331d05023ae8226219887c67a26582c1d7068Casper Bonde 1009a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef union { 1019a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_hdr_overlay hdr; 1029a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_mas_record mas; 1039a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_mns_record mns; 1049a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_pse_record pse; 1059a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_pce_record pce; 1069a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bluetooth_sdp_ops_record ops; 107207331d05023ae8226219887c67a26582c1d7068Casper Bonde bluetooth_sdp_sap_record sap; 1089a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} bluetooth_sdp_record; 1099a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1109a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1119a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz/** Callback for SDP search */ 1129a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef void (*btsdp_search_callback)(bt_status_t status, bt_bdaddr_t *bd_addr, uint8_t* uuid, int num_records, bluetooth_sdp_record *records); 1139a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1149a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct { 1159a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Set to sizeof(btsdp_callbacks_t) */ 1169a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz size_t size; 1179a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz btsdp_search_callback sdp_search_cb; 1189a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} btsdp_callbacks_t; 1199a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1209a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulztypedef struct { 1219a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Set to size of this struct */ 1229a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz size_t size; 1239a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1249a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Register BT SDP search callbacks */ 1259a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_status_t (*init)(btsdp_callbacks_t *callbacks); 1269a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1279a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Unregister BT SDP */ 1289a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_status_t (*deinit)(); 1299a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1309a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Search for SDP records with specific uuid on remote device */ 1319a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_status_t (*sdp_search)(bt_bdaddr_t *bd_addr, const uint8_t* uuid); 1329a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1339a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** 1349a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Use listen in the socket interface to create rfcomm and/or l2cap PSM channels, 1359a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * (without UUID and service_name and set the BTSOCK_FLAG_NO_SDP flag in flags). 1369a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Then use createSdpRecord to create the SDP record associated with the rfcomm/l2cap channels. 1379a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * 1389a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * Returns a handle to the SDP record, which can be parsed to remove_sdp_record. 1399a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * 1409a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * record (in) The SDP record to create 1419a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz * record_handle (out)The corresponding record handle will be written to this pointer. 1429a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz */ 1439a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_status_t (*create_sdp_record)(bluetooth_sdp_record *record, int* record_handle); 1449a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1459a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz /** Remove a SDP record created by createSdpRecord */ 1469a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz bt_status_t (*remove_sdp_record)(int sdp_handle); 1479a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz} btsdp_interface_t; 1489a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 1499a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz__END_DECLS 1509a92a7bff0d0768888cfeef4db6b6fd81bec32aekschulz 151