/*
 * Copyright 2018 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef _PERSIST_H_
#define _PERSIST_H_

#include "newblue-macros.h"
#include "bt.h"
#include "types.h"


//key types are also bits in "haveKeys" for enumeration
#define KEY_TYPE_MITM_PROTECTED          0 /* EDR key generated with MITM protection */
#define KEY_TYPE_MITM_UNPROTECTED        1 /* EDR key generated without MITM protection */
#define KEY_TYPE_CSRK                    2 /* LE connection signature resolving key */
#define KEY_TYPE_IRK                     3 /* LE identity resolving key */
#define KEY_TYPE_DHK                     4 /* LE diversifier hiding key */
#define KEY_TYPE_LTK                     5 /* LE long term key generated and given by peer device*/
#define KEY_TYPE_MY_LTK                  6 /* LE long term key generated by us */

//number types are also bits in "haveNums" for enumeration
#define PERSIST_NUM_TYPE_SM_RANDOM       0 /* random number generated and given by peer device */
#define PERSIST_NUM_TYPE_SM_MY_RANDOM    1 /* random number generated by us */
#define PERSIST_NUM_TYPE_SM_EDIV         2 /* encrypted diversifier value generated by peer device */
#define PERSIST_NUM_TYPE_SM_MY_DIV       3 /* diversifier value generated by us */
#define PERSIST_NUM_TYPE_SM_MITM_PROTECT 4 /* MITM protection provided by the stored LTKs */
#define PERSIST_NUM_TYPE_SM_BOND         5 /* bonding relationship with the peer device */

//address types
#define PERSIST_ADDRESS_TYPE_IDENTITY    0 /* identity address given by peer device */

/* callbacks are called with internal mutex held - do not call back into persist funcs or wait too
 * long! Return true go on enumerating. False to stop. */
typedef bool (*persistKnownDevEnumeratorF)(void *cbkData, const struct bt_addr *addr,
    const void *name, uint32_t nameLen, uint32_t devCls, uint32_t haveKeys,
    const uint8_t *wantedKey, uint32_t haveNums, const uint64_t *wantedNum);



void persistLoad(void);  //load prefs
void persistStore(void); //store prefs
void persistFree(void);  //free prefs data
void persistDump(void) NEWBLUE_EXPORT;  //print prefs

uint32_t persistGetDeviceName(void* buf); //should be at least HCI_DEV_NAME_LEN bytes long. actual length returned
bool persistSetDeviceName(const void *buf, uint32_t len); //should be at most HCI_DEV_NAME_LEN bytes long

uint8_t persistGetDiscoveryLength(void);
bool persistSetDiscoveryLength(uint8_t len);

//return false if callback terminated enumeration. wantedKeyType can be null if we don't care about
//keys. wantedNumType can be null if we don't care about numbers.
bool persistEnumKnownDevs(persistKnownDevEnumeratorF enumF, void *cbkData,
                          const uint8_t *wantedKeyType, const uint8_t *wantedNumType);

bool persistGetKnownDev(const struct bt_addr *addr, void *name, uint32_t *nameLen, uint32_t *devCls);
void persistAddKnownDev(const struct bt_addr *addr, const void *name, const uint32_t *nameLen, bool nameIsFull, const uint32_t *devCls);
void persistDelKnownDev(const struct bt_addr *addr);

bool persistAddDevKey(const struct bt_addr *addr, uint8_t keyType, const uint8_t *key); //addr = NULL for our own keys, all keys are HCI_LINK_KEY_LEN bytes long
bool persistGetDevKey(const struct bt_addr *addr, uint8_t keyType, uint8_t *key);       //addr = NULL for our own keys, all keys are HCI_LINK_KEY_LEN bytes long
bool persistDelDevKeys(const struct bt_addr *addr);                                     //addr = NULL for our own keys, all keys are HCI_LINK_KEY_LEN bytes long

bool persistAddDevNumber(const struct bt_addr *addr, uint8_t numType, uint64_t num);    //addr = NULL for our own numbers
bool persistGetDevNumber(const struct bt_addr *addr, uint8_t numType, uint64_t *num);   //addr = NULL for our own numbers
bool persistDelDevNumbers(const struct bt_addr *addr);                                  //addr = NULL for our own numbers

//addr = NULL for our own other address in which case only PERSIST_ADDRESS_TYPE_IDENTITY is supported
bool persistAddDevOtherAddr(const struct bt_addr *addr, uint8_t addrType, const struct bt_addr *otherAddr);
//addr = NULL for our own other address in which case only PERSIST_ADDRESS_TYPE_IDENTITY is supported
bool persistGetDevOtherAddr(const struct bt_addr *addr, uint8_t addrType, struct bt_addr *otherAddr);
//addr = NULL for our own other address in which case only PERSIST_ADDRESS_TYPE_IDENTITY is supported
bool persistDelDevOtherAddr(const struct bt_addr *addr, uint8_t addrType);


#endif

