/******************************************************************************
 *
 *  Copyright (C) 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 "allocator.h"
#include "bt_types.h"
#include "hci_layer.h"

typedef void (*transmit_finished_cb)(BT_HDR *packet, bool all_fragments_sent);
typedef void (*packet_reassembled_cb)(BT_HDR *packet);
typedef void (*packet_fragmented_cb)(BT_HDR *packet, bool send_transmit_finished);

typedef struct {
  // Called for every packet fragment.
  packet_fragmented_cb fragmented;

  // Called for every completely reassembled packet.
  packet_reassembled_cb reassembled;

  // Called when the fragmenter finishes sending all requested fragments,
  // but the packet has not been entirely sent.
  transmit_finished_cb transmit_finished;
} packet_fragmenter_callbacks_t;

typedef struct packet_fragmenter_t {
  // Initialize the fragmenter, specifying the |result_callbacks|.
  void (*init)(const packet_fragmenter_callbacks_t *result_callbacks);

  // Release all resources associated with the fragmenter.
  void (*cleanup)(void);

  // Fragments |packet| if necessary and hands off everything to the fragmented callback.
  void (*fragment_and_dispatch)(BT_HDR *packet);
  // If |packet| is a complete packet, forwards to the reassembled callback. Otherwise
  // holds onto it until all fragments arrive, at which point the reassembled callback is called
  // with the reassembled data.
  void (*reassemble_and_dispatch)(BT_HDR *packet);
} packet_fragmenter_t;

const packet_fragmenter_t *packet_fragmenter_get_interface();

const packet_fragmenter_t *packet_fragmenter_get_test_interface(
    const controller_t *controller_interface,
    const allocator_t *buffer_allocator_interface);
