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