// 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.gatt;

// Codes that can be returned in the |protocol_error_code| field of a
// bluetooth.Error.
enum ErrorCode {
    // Indicates that the operation was successful.
    NO_ERROR = 0;

    // Indicates that the offset used in a read or write request exceeds the
    // bounds of the value.
    INVALID_OFFSET = 1;

    // Indicates that the value given in a write request would exceed the maximum
    // length allowed for the destionation characteristic or descriptor.
    INVALID_VALUE_LENGTH = 2;

    // Indicates that a read or write request is not permitted.
    NOT_PERMITTED = 3;
};

// Represents encryption, authentication, and authorization permissions that can
// be assigned to a specific access permission.
struct SecurityRequirements {
    // If true, the physical link must be encrypted to access this attribute.
    bool encryption_required;

    // If true, the physical link must be authenticated to access this
    // attribute.
    bool authentication_required;

    // If true, the client needs to be authorized before accessing this
    // attribute.
    bool authorization_required;
};

// Specifies the access permissions for a specific attribute value.
struct AttributePermissions {
    // Specifies whether or not an attribute has the read permission. If null,
    // then the attribute value cannot be read. Otherwise, it can be read only if
    // the permissions specified in the Permissions struct are satisfied.
    SecurityRequirements? read;

    // Specifies whether or not an attribute has the write permission. If null,
    // then the attribute value cannot be written. Otherwise, it be written only
    // if the permissions specified in the Permissions struct are satisfied.
    SecurityRequirements? write;

    // 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 can not be null. Otherwise, this field
    // must be left as null.
    //
    // This field is ignored for Descriptors.
    SecurityRequirements? update;
};

// Possible values for the characteristic properties bitfield. These specify the
// GATT procedures that are allowed for a particular characteristic.
const uint32 kPropertyBroadcast = 1;
const uint32 kPropertyRead = 2;
const uint32 kPropertyWriteWithoutResponse = 4;
const uint32 kPropertyWrite = 8;
const uint32 kPropertyNotify = 16;
const uint32 kPropertyIndicate = 32;
const uint32 kPropertyAuthenticatedSignedWrites = 64;
const uint32 kPropertyReliableWrite = 256;
const uint32 kPropertyWritableAuxiliaries = 512;

// Represents a local or remote GATT service.
struct ServiceInfo {
    // Uniquely identifies this GATT service. This value will be ignored for local
    // services. Remote services will always have an identifier.
    uint64 id;

    // Indicates whether this is a primary or secondary service.
    bool primary;

    // The 128-bit UUID that identifies the type of this service. This is a string
    // in the canonical 8-4-4-4-12 format.
    string type;

    // The characteristics of this service.
    vector<Characteristic>? characteristics;

    // Ids of other services that are included by this service.
    vector<uint64>? includes;
};

// Represents a local or remote GATT characteristic.
struct Characteristic {
    // Uniquely identifies this characteristic within a service.
    uint64 id;

    // The 128-bit UUID that identifies the type of this characteristic. This is a
    // string in the canonical 8-4-4-4-12 format.
    string type;

    // The characteristic properties bitfield. See kProperty* above for possible
    // values.
    uint32 properties;

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

    // The descriptors of this characteristic.
    vector<Descriptor>? descriptors;
};

// Represents a local or remote GATT characteristic descriptor.
struct Descriptor {
    // Uniquely identifies this descriptor within the characteristic that it
    // belongs to.
    uint64 id;

    // The 128-bit UUID that identifies the type of this descriptor. This is a
    // string in the canonical 8-4-4-4-12 format.
    string type;

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