// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.bluetooth.bredr;

using fuchsia.bluetooth;
using fuchsia.url;

/// The maximum length that a sequence or set of alternatives supported in a
/// DataElement list. If a list is provided that is longer than this from a
/// peer, it is truncated.
const uint8 MAX_SEQUENCE_LENGTH = 255;
/// Maximum length of a string that is alowed in a DataElement.  If a
/// DataElement string longer than this is sent by a peer it will be truncated.
const uint16 MAX_STRING_LENGTH = 1024;

/// A DataElement is one element in a SDP record. SDP attributes and other parameters are
/// expresssed in DataElements.
union DataElement {
    1: int8 int8;
    2: int16 int16;
    3: int32 int32;
    4: int64 int64;
    5: uint8 uint8;
    6: uint16 uint16;
    7: uint32 uint32;
    8: uint64 uint64;
    9: string:MAX_STRING_LENGTH str;
    10: fuchsia.url.Url url;
    11: fuchsia.bluetooth.Uuid uuid;
    12: bool b;
    13: vector<DataElement?>:MAX_SEQUENCE_LENGTH sequence;
    14: vector<DataElement?>:MAX_SEQUENCE_LENGTH alternatives;
};

/// Defined Protocol Identifiers for the Protocol Descriptor
/// We intentionally omit deprecated profile identifiers.
/// From Bluetooth Assigned Numbers:
/// https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
enum ProtocolIdentifier : uint16 {
    SDP = 1;
    RFCOMM = 3;
    ATT = 7;
    OBEX = 8;
    BNEP = 15;
    HIDP = 17;
    HARDCOPY_CONTROL_CHANNEL = 18;
    HARDCOPY_DATA_CHANNEL = 20;
    HARDCOPY_NOTIFICATION = 22;
    AVCTP = 23;
    AVDTP = 25;
    MCAP_CONTROL_CHANNEL = 30;
    MCAP_DATA_CHANNEL = 31;
    L2CAP = 256;
};

/// Defined PSMs from the Bluetooth Assigned Numbers
/// https://www.bluetooth.com/specifications/assigned-numbers/logical-link-control
/// Used in DataElement as protocol parameters for L2CAP.
const uint16 PSM_SDP = 1;
const uint16 PSM_RFCOMM = 3;
const uint16 PSM_TCSBIN = 5; // Telephony Control Specification
const uint16 PSM_TCSBIN_CORDLESS = 7;
const uint16 PSM_BNEP = 15; // Bluetooth Network Encapsulation Protocol
const uint16 PSM_HID_CONTROL = 17; // Human Interface Device
const uint16 PSM_HID_INTERRUPT = 19; // Human Interface Device
const uint16 PSM_AVCTP = 23; // Audio/Video Control Transport Protocol
const uint16 PSM_AVDTP = 25; // Audio/Video Distribution Transport Protocol
const uint16 PSM_AVCTP_BROWSE = 27; // Audio/Video Remote Control Profile (Browsing)
const uint16 PSM_ATT = 31; // ATT
const uint16 PSM_3DSP = 33; // 3D Synchronization Profile
const uint16 PSM_LE_IPSP = 35; // Internet Protocol Support Profile
const uint16 PSM_OTS = 37; // Object Transfer Service

/// Identifies a communications protocol along with protocol-specific parameters.
/// Usually used to describe a protocol endpoint in a ProtocolDescriptorList
struct ProtocolDescriptor {
    ProtocolIdentifier protocol;
    vector<DataElement>:MAX_SEQUENCE_LENGTH params;
};

/// A ProtocolDescriptorList is a list of protocols in a "stack" from lowest to highest,
/// Specifying a specific protocol endpoint that can be connected.
using ProtocolDescriptorList = vector<ProtocolDescriptor>:MAX_SEQUENCE_LENGTH;

/// Identifiers that are valid for Bluetooth Classes / Profiles.
/// We intentionally omit classes and profile IDs that are unsupported, deprecated,
/// or reserved for use by Fuchsia Bluetooth.
/// These numbers are sourced from the Bluetooth Assigned Numbers for SDP.
/// https://www.bluetooth.com/specifications/assigned-numbers/service-discovery
enum ServiceClassProfileIdentifier : uint16 {
    // ServiceDiscoveryService and BrowseGroupDescriptorService claimed by Fuchsia
    /// Serial Port Profile (SPP)
    SERIAL_PORT = 0x1101;
    // LANAccessUsingPPP omitted (deprecated)
    /// Dial-up Networking Profile (DUN)
    DIALUP_NETWORKING = 0x1103;
    /// Object Push Profile (OPP)
    OBEX_OBJECT_PUSH = 0x1105;
    /// File Transfer Profile (FTP)
    OPEX_FILE_TRANSFER = 0x1106;
    /// Headset Profile (HSP)
    HEADSET = 0x1108;
    // CordlessTelephony (CTP) omitted (deprecated)
    // Fax Profile (FAX) omitted (deprecated)
    HEADSET_AUDIO_GATEWAY = 0x1112;
    HEADSET_HS = 0x1131;
    /// Advanced Audio Distribution Profile (A2DP)
    AUDIO_SOURCE = 0x110A;
    AUDIO_SINK = 0x110B;
    ADVANCED_AUDIO_DISTRIBUTION = 0x110D;
    /// Audio/Video Remote Control Profile (AVRCP)
    AV_REMOTE_CONTROL_TARGET = 0x110C;
    AV_REMOTE_CONTROL = 0x110E;
    AV_REMOTE_CONTROL_CONTROLLER = 0x110F;
    // Intercom (ICP) omitted (deprecated)
    // Wap and Wap Client (WAP) omitted (deprecated)
    // Synchronization Profile (SYNC) omitted (unsupported)
    /// Personal Area Networking (PAN)
    PANU = 0x1115;
    NAP = 0x1116;
    GN = 0x1117;
    // Basic Printing and Basic Imaging Profiles omitted (unsupported)
    /// Hands-Free Profile (HFP)
    HANDSFREE = 0x111E;
    HANDSFREE_AUDIO_GATEWAY = 0x111F;
    // Human Interface Device and Hardcopy Cable Replacement Profile omitted (unsupported)
    /// Sim Access Profile (SAP)
    SIM_ACCESS = 0x112D;
    /// Phonebook Access Profile (PBAP)
    PHONEBOOK_PCE = 0x112E;
    PHONEBOOK_PSE = 0x112F;
    PHONEBOOK = 0x1130;
    /// Message Access Profile (MAP)
    MESSAGE_ACCESS_SERVER = 0x1132;
    MESSAGE_NOTIFICATION_SERVER = 0x1133;
    MESSAGE_ACCESS_PROFILE = 0x1134;
    // GNSS and 3DSP omitted (unsupported)
    /// Multi-Profile Specification (MPS)
    MPS_PROFILE = 0x113A;
    MPS_CLASS = 0x113B;
    // Calendar, Task, and Notes Profile omitted (unsupported)
    // Device ID claimed by Fuchsia
    /// Generic Networking
    GENERIC_NETWORKING = 0x1201;
    /// Generic File Transfer
    GENERIC_FILE_TRANSFER = 0x1202;
    /// Generic Audio
    GENERIC_AUDIO = 0x1203;
    /// Generic Telephony
    GENERIC_TELEPHONY = 0x1204;
    // Enhanced Service Discovery Profile (ESDP) service classes omitted (deprecated).
    /// Video Distribution Profile (VDP)
    VIDEO_SOURCE = 0x1303;
    VIDEO_SINK = 0x1304;
    VIDEO_DISTRIBUTION = 0x1305;
    /// Health Device Profile (HDP)
    HDP = 0x1400;
    HDP_SOURCE = 0x1401;
    HDP_SINK = 0x1402;
};

/// A description of a profile that this service conforms to.
/// See Bluetooth Specification v5.2 Vol 3, Part B, Section 5.1.11
struct ProfileDescriptor {
    ServiceClassProfileIdentifier profile_id;
    uint8 major_version;
    uint8 minor_version;
};

/// Maximum number of languages that are supported by SDP at the moment.
// Note: all informations must be within 0x0100 - 0x01FF per Spec Vol 3, Part B,
// Sec 5.1.8.  Since each information consumes three spaces, this means there is
// a max of 256 / 3 = 85 supported.
const uint8 MAX_INFORMATION_COUNT = 85;

/// Human-readable information about a service. Strings are encoded in UTF-8.
/// See Bluetooth Specification v5.2 Vol 3, Part B, Sections 5.1.15 through 5.1.17
table Information {
    /// Language that the other fields in this table are in.
    /// Must be two characters long and a valid ICO 639:1988 identifier.
    /// Must be present.
    1: string:2 language;

    /// Service name
    2: string:MAX_STRING_LENGTH name;

    /// A human-readable description
    3: string:MAX_STRING_LENGTH description;

    /// The provider of this service (person or organization)
    4: string:MAX_STRING_LENGTH provider;
};

/// A generic attribute, used for protocol information;
struct Attribute {
    uint16 id;
    DataElement element;
};

/// Universal attribute IDs.
/// From the Bluetooth Specification v5.2, Vol 3, Part B
const uint16 ATTR_SERVICE_RECORD_HANDLE = 0x0000;
const uint16 ATTR_SERVICE_CLASS_ID_LIST = 0x0001;
const uint16 ATTR_SERVICE_RECORD_STATE = 0x0002;
const uint16 ATTR_SERVICE_ID = 0x0003;
const uint16 ATTR_PROTOCOL_DESCRIPTOR_LIST = 0x0004;
const uint16 ATTR_ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST = 0x000D;
const uint16 ATTR_BROWSE_GROUP_LIST = 0x0005;
const uint16 ATTR_LANGUAGE_BASE_ATTRIBUTE_ID_LIST = 0x0006;
const uint16 ATTR_SERVICE_INFO_TIME_TO_LIVE = 0x0007;
const uint16 ATTR_SERVICE_AVAILABILITY = 0x0008;
const uint16 ATTR_BLUETOOTH_PROFILE_DESCRIPTOR_LIST = 0x0009;

/// Maximum additional attributes as defined by the spec. All attributes
/// must be above 0x0200 per the Bluetooth Specfication, Ver 5.2 Vol 3, Part B,
/// Section 5
const uint16 MAX_ADDITIONAL_ATTRIBUTES = 0xFDFF;

/// Definition for a service that is to be advertised as available via Bluetooth BR/EDR.
table ServiceDefinition {
    /// UUIDs of service classes that this service record conforms to.
    /// This field is required - all advertised services must have at least one service class.
    1: vector<fuchsia.bluetooth.Uuid>:MAX_SEQUENCE_LENGTH service_class_uuids;

    /// Specification for the primary protocol that can be used to gain access to this
    /// service, with their protocol-specific identifiers.
    /// This is ordered from lowest level (typically L2CAP) to highest.
    2: ProtocolDescriptorList protocol_descriptor_list;

    /// Additional protocol descriptor lists, if the service requires more channels
    /// in addition to the main service.
    3: vector<ProtocolDescriptorList>:MAX_SEQUENCE_LENGTH additional_protocol_descriptor_lists;

    /// Bluetooth profiles that are supported by this service.
    4: vector<ProfileDescriptor>:MAX_SEQUENCE_LENGTH profile_descriptors;

    /// Human-readable service information, in one or more languages.
    /// The first set of information is considered the primary language.
    5: vector<Information>:MAX_INFORMATION_COUNT information;

    /// Additional attributes to be included in the Service Definition for specific
    /// services or profiles.
    /// All of these attributes should have an Attribute ID above 0x0200.
    6: vector<Attribute>:MAX_ADDITIONAL_ATTRIBUTES additional_attributes;
};
