Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f2f2d45 authored by Andre Eisenbach's avatar Andre Eisenbach Committed by Android Git Automerger
Browse files

am 0dc5b523: Merge "Implement GATT service cache" into lmp-dev

* commit '0dc5b523':
  Implement GATT service cache
parents 2485d0fa 0dc5b523
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -1667,12 +1667,11 @@ void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)

    APPL_TRACE_DEBUG("bta_gattc_ci_load conn_id=%d load status=%d" ,
                      p_clcb->bta_conn_id, p_data->ci_load.status );
    bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);

    if ((p_data->ci_load.status == BTA_GATT_OK ||
         p_data->ci_load.status == BTA_GATT_MORE) &&
        p_data->ci_load.num_attr > 0)
    if (p_data->ci_load.status == BTA_GATT_OK ||
         p_data->ci_load.status == BTA_GATT_MORE)
    {
        if (p_data->ci_load.num_attr != 0)
            bta_gattc_rebuild_cache(p_clcb->p_srcb, p_data->ci_load.num_attr,
                                p_data->ci_load.attr, p_clcb->p_srcb->attr_index);

@@ -1680,7 +1679,7 @@ void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
        {
            p_clcb->p_srcb->attr_index = 0;
            bta_gattc_reset_discover_st(p_clcb->p_srcb, BTA_GATT_OK);

            bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
        }
        else /* load more */
        {
@@ -1694,6 +1693,7 @@ void bta_gattc_ci_load(tBTA_GATTC_CLCB *p_clcb, tBTA_GATTC_DATA *p_data)
    }
    else
    {
        bta_gattc_co_cache_close(p_clcb->p_srcb->server_bda, 0);
        p_clcb->p_srcb->state = BTA_GATTC_SERV_DISC;
        p_clcb->p_srcb->attr_index = 0;
        /* cache load failure, start discovery */
+64 −7
Original line number Diff line number Diff line
@@ -25,6 +25,43 @@
#if( defined BLE_INCLUDED ) && (BLE_INCLUDED == TRUE)
#if( defined BTA_GATT_INCLUDED ) && (BTA_GATT_INCLUDED == TRUE)

#define GATT_CACHE_PREFIX "/data/misc/bluedroid/gatt_cache_"

static FILE* sCacheFD = 0;

static void getFilename(char *buffer, BD_ADDR bda)
{
    sprintf(buffer, "%s%02x%02x%02x%02x%02x%02x", GATT_CACHE_PREFIX
        , bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
}

static void cacheClose()
{
    if (sCacheFD != 0)
    {
        fclose(sCacheFD);
        sCacheFD = 0;
    }
}

static bool cacheOpen(BD_ADDR bda, bool to_save)
{
    char fname[255] = {0};
    getFilename(fname, bda);

    cacheClose();
    sCacheFD = fopen(fname, to_save ? "w" : "r");

    return (sCacheFD != 0);
}

static void cacheReset(BD_ADDR bda)
{
    char fname[255] = {0};
    getFilename(fname, bda);
    unlink(fname);
}


/*****************************************************************************
**  Function Declarations
@@ -47,10 +84,12 @@
*******************************************************************************/
void bta_gattc_co_cache_open(BD_ADDR server_bda, UINT16 evt, UINT16 conn_id, BOOLEAN to_save)
{
    /* open NV cache and send call in */
    tBTA_GATT_STATUS    status = BTA_GATT_OK;
    UNUSED(to_save);
    if (!cacheOpen(server_bda, to_save))
        status = BTA_GATT_ERROR;

    /* open NV cache and send call in */
    BTIF_TRACE_DEBUG("%s() - status=%d", __FUNCTION__, status);
    bta_gattc_ci_cache_open(server_bda, evt, status, conn_id);
}

@@ -73,11 +112,19 @@ void bta_gattc_co_cache_load(BD_ADDR server_bda, UINT16 evt, UINT16 start_index,
{
    UINT16              num_attr = 0;
    tBTA_GATTC_NV_ATTR  attr[BTA_GATTC_NV_LOAD_MAX];
    tBTA_GATT_STATUS    status = BTA_GATT_MORE;
    UNUSED(start_index);
    tBTA_GATT_STATUS    status = BTA_GATT_ERROR;

    if (sCacheFD && (0 == fseek(sCacheFD, start_index * sizeof(tBTA_GATTC_NV_ATTR), SEEK_SET)))
    {
        num_attr = fread(attr, sizeof(tBTA_GATTC_NV_ATTR), BTA_GATTC_NV_LOAD_MAX, sCacheFD);
        status = (num_attr < BTA_GATTC_NV_LOAD_MAX ? BTA_GATT_OK : BTA_GATT_MORE);
    }

    BTIF_TRACE_DEBUG("%s() - sCacheFD=%p, start_index=%d, read=%d, status=%d",
        __FUNCTION__, sCacheFD, start_index, num_attr, status);
    bta_gattc_ci_cache_load(server_bda, evt, num_attr, attr, status, conn_id);
}

/*******************************************************************************
**
** Function         bta_gattc_co_cache_save
@@ -98,10 +145,14 @@ void bta_gattc_co_cache_save (BD_ADDR server_bda, UINT16 evt, UINT16 num_attr,
                              tBTA_GATTC_NV_ATTR *p_attr_list, UINT16 attr_index, UINT16 conn_id)
{
    tBTA_GATT_STATUS    status = BTA_GATT_OK;
    UNUSED(num_attr);
    UNUSED(p_attr_list);
    UNUSED(attr_index);

    if (sCacheFD != 0)
    {
        int num = fwrite(p_attr_list, sizeof(tBTA_GATTC_NV_ATTR), num_attr, sCacheFD);
        BTIF_TRACE_DEBUG("%s() wrote %d", __FUNCTION__, num);
    }

    bta_gattc_ci_cache_save(server_bda, evt, status, conn_id);
}

@@ -122,8 +173,13 @@ void bta_gattc_co_cache_close(BD_ADDR server_bda, UINT16 conn_id)
{
    UNUSED(server_bda);
    UNUSED(conn_id);

    cacheClose();

    /* close NV when server cache is done saving or loading,
       does not need to do anything for now on Insight */

    BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
}

/*******************************************************************************
@@ -140,7 +196,8 @@ void bta_gattc_co_cache_close(BD_ADDR server_bda, UINT16 conn_id)
*******************************************************************************/
void bta_gattc_co_cache_reset(BD_ADDR server_bda)
{
    UNUSED(server_bda);
    BTIF_TRACE_DEBUG("%s()", __FUNCTION__);
    cacheReset(server_bda);
}

#endif