/******************************************************************************
 *
 *  Copyright 2014 Google, Inc.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

#pragma once

#include <hardware/bluetooth.h>
#include <stdbool.h>
#include <stdint.h>

typedef struct buffer_t buffer_t;
typedef struct l2cap_client_t l2cap_client_t;

typedef struct {
  void (*connected)(l2cap_client_t* client, void* context);
  void (*disconnected)(l2cap_client_t* client, void* context);
  void (*read_ready)(l2cap_client_t* client, buffer_t* packet, void* context);
  void (*write_ready)(l2cap_client_t* client, void* context);
} l2cap_client_callbacks_t;

// Returns a new buffer with enough space for |size| bytes of L2CAP payload.
// |size| must be greater than zero. This function returns NULL if the buffer
// could not be allocated. The returned buffer must be freed with |buffer_free|
// when it is no longer needed.
buffer_t* l2cap_buffer_new(size_t size);

// Creates and returns a new L2CAP client object. |callbacks| must not be NULL
// and must specify a set of functions that should be called back when events
// occur on the L2CAP connection. |context| may be NULL and will be passed as
// the argument to all callbacks in |l2cap_client_callbacks_t|. The returned
// object must be freed with |l2cap_client_free|.
l2cap_client_t* l2cap_client_new(const l2cap_client_callbacks_t* callbacks,
                                 void* context);

// Frees the L2CAP client object allocated with |l2cap_client_new|. |client| may
// be NULL.
void l2cap_client_free(l2cap_client_t* client);

// Attempts to connect the |client| to a peer device specified by
// |remote_bdaddr| using the |psm| protocol specifier. This function returns
// true if the connect operation could be started and will indicate completion
// with either a 'connected' callback (success) or a 'disconnected' callback
// (failure).
//
// This function must not be called while a connect operation is in progress or
// while |l2cap_client_is_connected|. |client| and |remote_bdaddr| must not be
// NULL. |psm| must be greater than zero.
bool l2cap_client_connect(l2cap_client_t* client,
                          const RawAddress& remote_bdaddr, uint16_t psm);

// Disconnects a connected |client|. This function is asynchronous and
// idempotent. It will indicate completion with a 'disconnected' callback.
// |client| must not be NULL.
void l2cap_client_disconnect(l2cap_client_t* client);

// Returns true if |client| is connected and is ready to accept data written
// to it. |client| must not be NULL.
bool l2cap_client_is_connected(const l2cap_client_t* client);

// Writes data contained in |packet| to a connected |client|. This function
// returns true if the packet was successfully queued for delivery, false if the
// client cannot accept more data at this time. If this function returns false,
// the caller must wait for the 'write_ready' callback to write additional data
// to the client. Neither |client| nor |packet| may be NULL.
bool l2cap_client_write(l2cap_client_t* client, buffer_t* packet);
