// Copyright 2021 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.gatt2;

using fuchsia.bluetooth as bt;

/// Errors that are returned by bluetooth.gatt2.* methods.
///
/// The values correspond with those in Bluetooth 5.2 Vol. 3 Part G Table 3.4,
/// and Supplement to the Bluetooth Core Specification v9 Part B Table 1.1,
/// but this is for ease of reference only.  Clients should *not* rely on these
/// values remaining constant.  Omitted values from the spec are handled
/// internally and will not be returned to clients.
///
/// Only certain errors can be returned by LocalService methods.  Those are noted
/// in comments.
type Error = strict enum {
    // ATT Errors

    /// The attribute indicated by the handle is invalid. It may have been removed.
    ///
    /// This may be returned by a LocalService method.
    INVALID_HANDLE = 0x1;

    /// This attribute is not readable.
    READ_NOT_PERMITTED = 0x2;

    /// This attribute is not writable.
    WRITE_NOT_PERMITTED = 0x3;

    /// Indicates that the response received from the server was invalid.
    INVALID_PDU = 0x4;

    /// This attribute requires authentication, but the client is not authenticated.
    INSUFFICIENT_AUTHENTICATION = 0x5;

    /// Indicates that the offset used in a read or write request exceeds the
    /// bounds of the value.
    ///
    /// This may be returned by a LocalService method.
    INVALID_OFFSET = 0x7;

    /// This attribute requires authorization, but the client is not authorized.
    INSUFFICIENT_AUTHORIZATION = 0x8;

    /// This attribute requires a connection encrypted by a larger encryption key.
    INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0xC;

    /// Indicates that the value given in a write request would exceed the maximum
    /// length allowed for the destionation characteristic or descriptor.
    ///
    /// This may be returned by a LocalService method.
    INVALID_ATTRIBUTE_VALUE_LENGTH = 0xD;

    /// A general error occurred that can not be classified as one of the more
    /// specific errors.
    ///
    /// This may be returned by a LocalService method.
    UNLIKELY_ERROR = 0xE;

    /// This attribute requires encryption, but the connection is not encrypted.
    INSUFFICIENT_ENCRYPTION = 0xF;

    /// The server had insufficient resources to complete the task.
    ///
    /// This may be returned by a LocalService method.
    INSUFFICIENT_RESOURCES = 0x11;

    /// The value was not allowed.
    ///
    /// This may be returned by a LocalService method.
    VALUE_NOT_ALLOWED = 0x13;

    // Application Errors

    /// Application Errors.  The uses of these are specified at the application
    /// level.
    ///
    /// These may all be returned by a LocalService method.
    APPLICATION_ERROR_80 = 0x80;
    APPLICATION_ERROR_81 = 0x81;
    APPLICATION_ERROR_82 = 0x82;
    APPLICATION_ERROR_83 = 0x83;
    APPLICATION_ERROR_84 = 0x84;
    APPLICATION_ERROR_85 = 0x85;
    APPLICATION_ERROR_86 = 0x86;
    APPLICATION_ERROR_87 = 0x87;
    APPLICATION_ERROR_88 = 0x88;
    APPLICATION_ERROR_89 = 0x89;
    APPLICATION_ERROR_8A = 0x8A;
    APPLICATION_ERROR_8B = 0x8B;
    APPLICATION_ERROR_8C = 0x8C;
    APPLICATION_ERROR_8D = 0x8D;
    APPLICATION_ERROR_8E = 0x8E;
    APPLICATION_ERROR_8F = 0x8F;
    APPLICATION_ERROR_90 = 0x90;
    APPLICATION_ERROR_91 = 0x91;
    APPLICATION_ERROR_92 = 0x92;
    APPLICATION_ERROR_93 = 0x93;
    APPLICATION_ERROR_94 = 0x94;
    APPLICATION_ERROR_95 = 0x95;
    APPLICATION_ERROR_96 = 0x96;
    APPLICATION_ERROR_97 = 0x97;
    APPLICATION_ERROR_98 = 0x98;
    APPLICATION_ERROR_99 = 0x99;
    APPLICATION_ERROR_9A = 0x9A;
    APPLICATION_ERROR_9B = 0x9B;
    APPLICATION_ERROR_9C = 0x9C;
    APPLICATION_ERROR_9D = 0x9D;
    APPLICATION_ERROR_9E = 0x9E;
    APPLICATION_ERROR_9F = 0x9F;

    // Common Profile and Service Error Codes

    /// Write request was rejected at the profile or service level.
    WRITE_REQUEST_REJECTED = 0xFC;

    /// The Client Characteristic Configuration Descriptor was improperly
    /// configured.
    CCC_DESCRIPTOR_IMPROPERLY_CONFIGURED = 0xFD;

    /// Profile or service procedure already in progress.
    PROCEDURE_ALREADY_IN_PROGRESS = 0xFE;

    /// A value was out of range at the profile or service level.
    OUT_OF_RANGE = 0xFF;

    // Errors not specified by Bluetooth.

    /// One or more of the FIDL call parameters are invalid. See the parameter
    /// documentation.
    INVALID_PARAMETERS = 0x101;

    /// Indicates that more results were read than can fit in a FIDL response.
    /// Consider reading attributes individually.
    TOO_MANY_RESULTS = 0x102;
};

/// Errors that can occur during service publication.
type PublishServiceError = flexible enum {
    /// The provided LocalService client_end was not a valid instance of the protocol.
    INVALID_LOCAL_SERVICE = 1;
    /// The service handle is invalid or already in use on the Server publishing the service.
    INVALID_SERVICE_HANDLE = 2;
    /// Invalid service UUID provided.
    INVALID_UUID = 3;
    /// The `ServiceInfo.characteristics` field was formatted invalidly or missing. If the service
    /// is meant to be empty, the vector should be empty, but present.
    INVALID_CHARACTERISTICS = 4;
    /// A general error occurred that can not be classified as one of the more specific errors.
    UNLIKELY_ERROR = 5;
};

// A Handle uniquely identifies a characteristic or descriptor.
type Handle = struct {
    value uint64;
};

// A ServiceHandle uniquely identifies a GATT service within a particular scope.
type ServiceHandle = struct {
    value uint64;
};

/// The kind ("type") of a GATT Service as outlined in Bluetooth Core Spec v5.3 Vol. 1 Part A 6.5.1.
type ServiceKind = strict enum {
    /// A "service that provides functionality of a device that can be used on its own" (Ibid)
    PRIMARY = 1;
    /// A "service that provides additional functionality [...] in association with a primary
    /// service and is included from at least one primary service" (Ibid)
    SECONDARY = 2;
};

/// Represents encryption, authentication, and authorization permissions that can
/// be assigned to a specific access permission.
type SecurityRequirements = table {
    /// If true, the physical link must be encrypted to access this attribute. If not present or
    /// false, this attribute permits unencrypted access.
    1: encryption_required bool;

    /// If true, the physical link must be authenticated to access this attribute. If not present or
    /// false, this attribute permits unauthenticated access.
    2: authentication_required bool;

    /// If true, the client needs to be authorized to access this attribute. If not present or
    /// false, this attribute permits access without authorization.
    3: authorization_required bool;
};

/// Specifies the access permissions for a specific attribute value.
type AttributePermissions = table {
    /// Specifies whether an attribute has the read permission. If not present,
    /// the attribute value cannot be read. Otherwise, it can be read only if the
    /// permissions specified in the SecurityRequirements table are satisfied.
    1: read SecurityRequirements;

    /// Specifies whether an attribute has the write permission. If not present,
    /// the attribute value cannot be written. Otherwise, it can be written only
    /// if the permissions specified in the SecurityRequirements table are satisfied.
    2: write SecurityRequirements;

    /// Specifies the security requirements for a client to subscribe to
    /// notifications or indications on a characteristic. A characteristic's
    /// support for notifications or indiciations is specified using the NOTIFY and
    /// INDICATE characteristic properties. If a local characteristic has one of
    /// these properties then this field must be present. Otherwise, this field
    /// must not be present.
    ///
    /// This field is ignored for Descriptors.
    3: update SecurityRequirements;
};

/// Possible values for the characteristic properties bitfield. These specify the
/// GATT procedures that are allowed for a particular characteristic.
type CharacteristicPropertyBits = strict bits : uint16 {
    BROADCAST = 0x1;
    READ = 0x2;
    WRITE_WITHOUT_RESPONSE = 0x4;
    WRITE = 0x8;
    NOTIFY = 0x10;
    INDICATE = 0x20;
    AUTHENTICATED_SIGNED_WRITES = 0x40;
    RELIABLE_WRITE = 0x100;
    WRITABLE_AUXILIARIES = 0x200;
};

/// Represents a local or remote GATT service.
type ServiceInfo = table {
    /// Unique identifier for this GATT service.
    /// Always present if this represents a remote service, in which case this is unique across the
    /// Client that returned this ServiceInfo.
    /// Required for local services, in which case this must be unique across all services published
    /// to a single Server instance. Can be used in the `ServiceInfo.includes` of other
    /// PublishService calls to the Server where this service is published.
    1: handle ServiceHandle;

    /// Indicates whether this is a primary or secondary service.
    /// Always present for remote services. Optional for local services
    /// Default: ServiceKind::PRIMARY
    2: kind ServiceKind;

    /// The UUID that identifies the type of this service.
    /// There may be multiple services with the same UUID.
    /// Always present for remote services. Required for local services.
    3: type bt.Uuid;

    /// The characteristics of this service.
    /// Required for local services. Never present for remote services.
    4: characteristics vector<Characteristic>:MAX_CHARACTERISTIC_COUNT;

    /// Handles of other services that are included by this service.
    /// Optional for local services. Never present for remote services.
    /// TODO(fxbug.dev/685): This is not currently supported for local services.
    5: includes vector<ServiceHandle>:MAX_SERVICE_COUNT;
};

/// Represents a local or remote GATT characteristic.
type Characteristic = table {
    /// Uniquely identifies this characteristic within a service.
    /// For local characteristics, the specified handle must be unique across
    /// all characteristic and descriptor handles in this service.
    ///
    /// Always present. For local characteristics, this value is mandatory.
    1: handle Handle;

    /// The UUID that identifies the type of this characteristic.
    /// Always present. Mandatory for local characteristics.
    2: type bt.Uuid;

    /// The characteristic properties bitfield. See `CharacteristicPropertyBits`
    /// above for possible values.
    /// Always present. Mandatory for local characteristics.
    3: properties uint32;

    /// The attribute permissions of this characteristic. For remote
    /// characteristics, this value will not be present until the permissions are
    /// discovered via read and write requests.
    ///
    /// For local characteristics, this value is mandatory.
    4: permissions AttributePermissions;

    /// The descriptors of this characteristic.
    /// Present only if non-empty. Optional for local characteristics.
    5: descriptors vector<Descriptor>:MAX_DESCRIPTOR_COUNT;
};

/// Represents a local or remote GATT characteristic descriptor.
type Descriptor = table {
    /// Uniquely identifies this descriptor within a service.
    /// For local descriptors, the specified handle must be unique
    /// across all characteristic and descriptor handles in this service.
    ///
    /// Always present. For local descriptors, this value is mandatory.
    1: handle Handle;

    /// The UUID that identifies the type of this descriptor.
    /// Always present. For local descriptors, this value is mandatory.
    2: type bt.Uuid;

    /// The attribute permissions of this descriptor. For remote
    /// descriptors, this value will not be present until the permissions are
    /// discovered via read and write requests.
    ///
    /// For local descriptors, this value is mandatory.
    3: permissions AttributePermissions;
};

/// Represents the supported options to read a long characteristic or descriptor
/// value from a server. Long values are those that may not fit in a single
/// message (longer than 22 bytes).
type LongReadOptions = table {
    /// The byte to start the read at. Must be less than the length of the value.
    /// Optional.
    /// Default: 0
    1: offset uint16;
    /// The maximum number of bytes to read.
    /// Optional.
    /// Default: `MAX_VALUE_LENGTH`
    2: max_bytes uint16;
};

/// Represents the options for reading a short characteristic or descriptor
/// value from a server. Short values are those that fit in a single message,
/// which is at least 22 bytes. This is an empty placeholder for now, as there
/// are no options.
type ShortReadOptions = struct {};

/// Represents the supported options to read a characteristic or descriptor
/// value from a server.
type ReadOptions = flexible union {
    /// Perform a short read, which may be truncated (as indicated by the
    /// maybe_truncated in the result)
    /// Most reads in GATT services are short reads (<= 22 bytes).
    1: short_read ShortReadOptions;
    /// If present, perform a long read using the indicated options.
    /// Optional.
    /// Default: A short read will be performed.
    2: long_read LongReadOptions;
};

/// Represents the supported write modes for writing characteristics &
/// descriptors to the server.
type WriteMode = flexible enum {
    /// In `DEFAULT` mode, wait for a response from the server before returning
    /// and do not verify the echo response.
    /// Supported for both characteristics and descriptors.
    DEFAULT = 1;
    /// In `RELIABLE` mode, every value blob is verified against an echo
    /// response from the server. The procedure is aborted if a value blob has
    /// not been reliably delivered to the peer.
    /// Only supported for characteristics.
    RELIABLE = 2;
    /// In `WITHOUT_RESPONSE` mode, delivery will not be confirmed before
    /// returning. Writing without a response is only supported for short
    /// characteristics with the `WRITE_WITHOUT_RESPONSE` property. The value
    /// must fit into a single message. It is guaranteed that at least 20 bytes
    /// will fit into a single message. If the value does not fit, a `FAILURE`
    /// error will be produced. The value will be written at offset 0.
    /// Only supported for characteristics.
    WITHOUT_RESPONSE = 3;
};

/// Represents the supported options to write a characteristic/descriptor value
/// to a server.
type WriteOptions = table {
    /// The mode of the write operation. For descriptors, only
    /// [`WriteMode.DEFAULT`] is supported
    /// Optional.
    /// Default: [`WriteMode.DEFAULT`]
    1: write_mode WriteMode;
    /// Request a write starting at the byte indicated.
    /// Must be missing or 0 if `write_mode` is [`WriteMode.WITHOUT_RESPONSE`].
    /// Optional.
    /// Default: 0
    2: offset uint16;
};
