1 /*
2  * Copyright (c) 2018 Nordic Semiconductor ASA
3  * Copyright (c) 2015 Runtime Inc
4  *
5  * SPDX-License-Identifier: Apache-2.0
6  */
7 
8 #include <string.h>
9 #include <assert.h>
10 #include <ble_os.h>
11 
12 #include <aos/kv.h>
13 #include <bt_errno.h>
14 #include "settings/settings.h"
15 #include "settings/settings_kv.h"
16 #include "settings_priv.h"
17 
18 #define BT_DBG_ENABLED 0
19 #include "common/log.h"
20 
21 static int settings_kv_load(struct settings_store *cs,
22 			const struct settings_load_arg *arg);
23 static int settings_kv_save(struct settings_store *cs, const char *name,
24 			const char *value, size_t val_len);
25 
26 static struct settings_store_itf settings_kv_itf = {
27     .csi_load = settings_kv_load,
28     .csi_save = settings_kv_save,
29 };
30 
settings_kv_src(struct settings_kv * cf)31 int settings_kv_src(struct settings_kv *cf)
32 {
33     if (!cf->name) {
34         return -EINVAL;
35     }
36 
37     cf->cf_store.cs_itf = &settings_kv_itf;
38     settings_src_register(&cf->cf_store);
39 
40     return 0;
41 }
42 
settings_kv_dst(struct settings_kv * cf)43 int settings_kv_dst(struct settings_kv *cf)
44 {
45     if (!cf->name) {
46         return -EINVAL;
47     }
48 
49     cf->cf_store.cs_itf = &settings_kv_itf;
50     settings_dst_register(&cf->cf_store);
51 
52     return 0;
53 }
54 
55 struct settings_kv_read_arg_t {
56     char *val;
57     uint16_t val_size;
58 };
59 
_settings_kv_read_cb(void * cb_arg,void * data,size_t len)60 static ssize_t _settings_kv_read_cb(void *cb_arg, void *data, size_t len)
61 {
62     struct settings_kv_read_arg_t *read_arg = cb_arg;
63     size_t read_len = 0;
64 
65     BT_DBG("cb_arg %p, read_arg->val %p, read_arg->val_size %d, data %p, len %d", cb_arg, read_arg?read_arg->val:0,
66         read_arg?read_arg->val_size:0, data, len);
67 
68     if (data && read_arg && read_arg->val && read_arg->val_size && len >= read_arg->val_size)
69     {
70        read_len = len > read_arg->val_size? read_arg->val_size : len;
71        memcpy(data, read_arg->val, read_len);
72        return read_len;
73     }
74     return -1;
75 }
76 
_settings_kv_load(char * key,char * val,uint16_t val_size,void * arg)77 static void _settings_kv_load(char *key, char *val, uint16_t val_size, void *arg)
78 {
79     const char *kv_prefix = "bt/";
80     struct settings_kv_read_arg_t read_arg = {0};
81 
82     if (0 == strncmp(kv_prefix, key, 3))
83     {
84         BT_DBG("%s,size %d", key, val_size);
85         read_arg.val = val;
86         read_arg.val_size = val_size;
87         settings_call_set_handler(key, val_size, _settings_kv_read_cb, &read_arg, arg);
88     }
89 }
90 
91 /*
92  * Called to load configuration items. cb must be called for every configuration
93  * item found.
94  */
settings_kv_load(struct settings_store * cs,const struct settings_load_arg * arg)95 static int settings_kv_load(struct settings_store *cs,
96 			const struct settings_load_arg *arg)
97 {
98 
99 #ifdef CONFIG_BT_SETTINGS
100 #if 0 //remove for build error
101     extern void __kv_foreach(void (*func)(char *key, char *val, uint16_t val_size, void *arg), void *arg);
102     __kv_foreach(_settings_kv_load, (void *)arg);
103 #endif
104 #endif
105     return 0;
106 }
107 
108 /*
109  * Called to save configuration.
110  */
settings_kv_save(struct settings_store * cs,const char * name,const char * value,size_t val_len)111 static int settings_kv_save(struct settings_store *cs, const char *name,
112 			const char *value, size_t val_len)
113 {
114     int rc;
115 
116     if (!name) {
117         return -EINVAL;
118     }
119 
120     //delete key
121     if (value == NULL) {
122           aos_kv_del(name);
123           return 0;
124     }
125 
126     rc = aos_kv_set(name, (void *)value, val_len, 1);
127 
128     if (rc < 0) {
129         BT_ERR("update key fail %s,%s", name, value);
130         return -EIO;
131     }
132 
133     printf("setting update %s, %s\n", name, value);
134 
135     return 0;
136 }
137 
settings_backend_init(void)138 int settings_backend_init(void)
139 {
140     static struct settings_kv config_init_settings_kv = {
141 	    .name = "btsetting",
142     };
143 
144     settings_kv_src(&config_init_settings_kv);
145     settings_kv_dst(&config_init_settings_kv);
146 
147 	return 0;
148 }
149