예제 #1
0
// Function for deleting all data beloning to a peer.
// These operations will be sent to FDS one at a time.
static void peer_data_delete()
{
    ret_code_t        ret;
    pm_peer_id_t      peer_id;
    uint16_t          file_id;
    fds_record_desc_t desc;
    fds_find_token_t  ftok;

    memset(&ftok, 0x00, sizeof(fds_find_token_t));
    peer_id = peer_id_get_next_deleted(PM_PEER_ID_INVALID);

    while (    (peer_id != PM_PEER_ID_INVALID)
            && (fds_record_find_in_file(peer_id_to_file_id(peer_id), &desc, &ftok)
            == FDS_ERR_NOT_FOUND))
    {
        peer_id_free(peer_id);
        peer_id = peer_id_get_next_deleted(peer_id);
    }

    if (!m_peer_delete_ongoing && (peer_id != PM_PEER_ID_INVALID))
    {
        m_peer_delete_ongoing = true;

        file_id = peer_id_to_file_id(peer_id);
        ret     = fds_file_delete(file_id);

        if (ret == FDS_ERR_NO_SPACE_IN_QUEUES)
        {
            m_peer_delete_queued = true;
        }
        else if (ret != NRF_SUCCESS)
        {
            m_peer_delete_ongoing = false;

            pds_evt_t pds_evt;

            pds_evt.evt_id      = PDS_EVT_ERROR_UNEXPECTED;
            pds_evt.peer_id     = peer_id;
            pds_evt.data_id     = PM_PEER_DATA_ID_INVALID;
            pds_evt.store_token = PM_STORE_TOKEN_INVALID;
            pds_evt.result      = ret;

            pds_evt_send(&pds_evt);
        }
    }
}
예제 #2
0
// Function for clearing all peer data of one peer.
// These operations will be sent to FDS one at a time.
static void peer_data_clear()
{
    ret_code_t        retval;
    uint16_t          file_id;
    fds_record_desc_t desc;
    fds_find_token_t  token   = {0};
    pm_peer_id_t      peer_id = peer_id_get_next_deleted(PM_PEER_ID_INVALID);

    while (    (peer_id != PM_PEER_ID_INVALID)
            && (fds_record_find_in_file(peer_id_to_file_id(peer_id), &desc, &token)
            == FDS_ERR_NOT_FOUND))
    {
        peer_id_free(peer_id);
        peer_id = peer_id_get_next_deleted(peer_id);
    }

    if (!m_pds.clearing && (peer_id != PM_PEER_ID_INVALID))
    {
        file_id = peer_id_to_file_id(peer_id);
        retval  = fds_file_delete(file_id);

        if (retval == FDS_SUCCESS)
        {
            m_pds.clearing = true;
        }
        else if (retval == FDS_ERR_NO_SPACE_IN_QUEUES)
        {
            m_pds.clear_queued = true;
        }
        else
        {
            pds_evt_t pds_evt;

            pds_evt.evt_id      = PDS_EVT_ERROR_UNEXPECTED;
            pds_evt.peer_id     = peer_id;
            pds_evt.data_id     = PM_PEER_DATA_ID_INVALID;
            pds_evt.store_token = PM_STORE_TOKEN_INVALID;
            pds_evt.result      = retval;

            pds_evt_send(&pds_evt);
        }
    }
}
예제 #3
0
static void fds_evt_handler(fds_evt_t const * const p_fds_evt)
{
    pds_evt_t pds_evt;
    bool      send_event = true;

    pds_evt.result = (p_fds_evt->result == FDS_SUCCESS);

    switch(p_fds_evt->id)
    {
        case FDS_EVT_WRITE:
            pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_STORED :
                                                                  PDS_EVT_ERROR_STORE;

            pds_evt.peer_id     = file_id_to_peer_id(p_fds_evt->write.file_id);
            pds_evt.data_id     = record_key_to_peer_data_id(p_fds_evt->write.record_key);
            pds_evt.result      = p_fds_evt->result;
            pds_evt.store_token = p_fds_evt->write.record_id;
            break;

        case FDS_EVT_UPDATE:
            pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_UPDATED :
                                                                  PDS_EVT_ERROR_UPDATE;

            pds_evt.peer_id     = file_id_to_peer_id(p_fds_evt->write.file_id);
            pds_evt.data_id     = record_key_to_peer_data_id(p_fds_evt->write.record_key);
            pds_evt.result      = p_fds_evt->result;
            pds_evt.store_token = p_fds_evt->write.record_id;
            break;

        case FDS_EVT_DEL_RECORD:
            pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_CLEARED :
                                                                  PDS_EVT_ERROR_CLEAR;

            pds_evt.peer_id     = file_id_to_peer_id(p_fds_evt->del.file_id);
            pds_evt.data_id     = record_key_to_peer_data_id(p_fds_evt->del.record_key);
            pds_evt.store_token = p_fds_evt->del.record_id;
            break;

        case FDS_EVT_DEL_FILE:
            {
                if ((p_fds_evt->del.record_key == FDS_RECORD_KEY_DIRTY) &&
                    (p_fds_evt->del.file_id    != FDS_FILE_ID_INVALID))
                {
                    pds_evt.peer_id = file_id_to_peer_id(p_fds_evt->del.file_id);
                    pds_evt.data_id = record_key_to_peer_data_id(p_fds_evt->del.record_key);

                    pds_evt.data_id = PM_PEER_DATA_ID_INVALID;
                    if (p_fds_evt->result == FDS_SUCCESS)
                    {
                        pds_evt.evt_id = PDS_EVT_PEER_ID_CLEAR;
                        peer_id_free(pds_evt.peer_id);
                    }
                    else
                    {
                        pds_evt.evt_id = PDS_EVT_ERROR_PEER_ID_CLEAR;
                    }
                    m_pds.clearing = false;
                    m_pds.clear_queued = false;

                    peer_data_clear();
                }
            }
            break;

        case FDS_EVT_GC:
            pds_evt.evt_id = PDS_EVT_COMPRESSED;
            break;

        default:
            send_event = false;
            break;
    }

    if (send_event)
    {
        pds_evt_send(&pds_evt);
    }

    if (m_pds.clear_queued)
    {
        m_pds.clear_queued = false;
        peer_data_clear();
    }
}
예제 #4
0
static void fds_evt_handler(fds_evt_t const * const p_fds_evt)
{
    pds_evt_t pds_evt;

    pds_evt.result = (p_fds_evt->result == FDS_SUCCESS);

    switch (p_fds_evt->id)
    {
        case FDS_EVT_WRITE:
        case FDS_EVT_UPDATE:
            if (   file_id_within_pm_range(p_fds_evt->write.file_id)
                || record_key_within_pm_range(p_fds_evt->write.record_key))
            {
                pds_evt.peer_id = file_id_to_peer_id(p_fds_evt->write.file_id);
                pds_evt.data_id = record_key_to_peer_data_id(p_fds_evt->write.record_key);

                if (p_fds_evt->id == FDS_EVT_WRITE)
                {
                    pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_STORED :
                                                                          PDS_EVT_ERROR_STORE;
                }
                else
                {
                    pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_UPDATED :
                                                                          PDS_EVT_ERROR_UPDATE;
                }

                pds_evt.result      = p_fds_evt->result;
                pds_evt.store_token = p_fds_evt->write.record_id;

                pds_evt_send(&pds_evt);
            }
            break;

        case FDS_EVT_DEL_RECORD:
            if (   file_id_within_pm_range(p_fds_evt->del.file_id)
                || record_key_within_pm_range(p_fds_evt->del.record_key))
            {
                pds_evt.peer_id = file_id_to_peer_id(p_fds_evt->del.file_id);
                pds_evt.data_id = record_key_to_peer_data_id(p_fds_evt->del.record_key);

                pds_evt.evt_id = (p_fds_evt->result == FDS_SUCCESS) ? PDS_EVT_CLEARED :
                                                                      PDS_EVT_ERROR_CLEAR;

                pds_evt.store_token = p_fds_evt->del.record_id;

                pds_evt_send(&pds_evt);
            }
            break;

        case FDS_EVT_DEL_FILE:
            {
                if (    file_id_within_pm_range(p_fds_evt->del.file_id)
                    && (p_fds_evt->del.record_key == FDS_RECORD_KEY_DIRTY))
                {
                    pds_evt.peer_id = file_id_to_peer_id(p_fds_evt->del.file_id);
                    pds_evt.data_id = record_key_to_peer_data_id(p_fds_evt->del.record_key);

                    pds_evt.data_id = PM_PEER_DATA_ID_INVALID;
                    if (p_fds_evt->result == FDS_SUCCESS)
                    {
                        pds_evt.evt_id = PDS_EVT_PEER_ID_CLEAR;
                        peer_id_free(pds_evt.peer_id);
                    }
                    else
                    {
                        pds_evt.evt_id = PDS_EVT_ERROR_PEER_ID_CLEAR;
                    }

                    m_peer_delete_queued  = false;
                    m_peer_delete_ongoing = false;

                    peer_data_delete();

                    pds_evt_send(&pds_evt);
                }
            }
            break;

        case FDS_EVT_GC:
            pds_evt.evt_id = PDS_EVT_COMPRESSED;
            pds_evt_send(&pds_evt);
            break;

        default:
            break;
    }

    if (m_peer_delete_queued)
    {
        m_peer_delete_queued  = false;
        peer_data_delete();
    }
}