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 <stdio.h>
10 
11 #include <ble_types/types.h>
12 #include <stddef.h>
13 #include <sys/types.h>
14 #include <bt_errno.h>
15 #include <misc/__assert.h>
16 #include <ble_os.h>
17 
18 #include "settings/settings.h"
19 #include "settings_priv.h"
20 
21 // #include <logging/log.h>
22 // LOG_MODULE_DECLARE(settings, CONFIG_SETTINGS_LOG_LEVEL);
23 
24 sys_slist_t settings_load_srcs;
25 struct settings_store *settings_save_dst;
26 extern struct k_mutex settings_lock;
27 
settings_src_register(struct settings_store * cs)28 void settings_src_register(struct settings_store *cs)
29 {
30 	sys_slist_append(&settings_load_srcs, &cs->cs_next);
31 }
32 
settings_dst_register(struct settings_store * cs)33 void settings_dst_register(struct settings_store *cs)
34 {
35 	settings_save_dst = cs;
36 }
37 
settings_load(void)38 int settings_load(void)
39 {
40     printf("enter %s\n", __func__);
41 	return settings_load_subtree(NULL);
42 }
43 
settings_load_subtree(const char * subtree)44 int settings_load_subtree(const char *subtree)
45 {
46 	struct settings_store *cs;
47 	int rc;
48 	const struct settings_load_arg arg = {
49 		.subtree = subtree
50 	};
51 
52 	/*
53 	 * for every config store
54 	 *    load config
55 	 *    apply config
56 	 *    commit all
57 	 */
58 	k_mutex_lock(&settings_lock, K_FOREVER);
59 	SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) {
60 		cs->cs_itf->csi_load(cs, &arg);
61 	}
62 	rc = settings_commit_subtree(subtree);
63 	k_mutex_unlock(&settings_lock);
64 	return rc;
65 }
66 
settings_load_subtree_direct(const char * subtree,settings_load_direct_cb cb,void * param)67 int settings_load_subtree_direct(
68 	const char             *subtree,
69 	settings_load_direct_cb cb,
70 	void                   *param)
71 {
72 	struct settings_store *cs;
73 
74 	const struct settings_load_arg arg = {
75 		.subtree = subtree,
76 		.cb = cb,
77 		.param = param
78 	};
79 	/*
80 	 * for every config store
81 	 *    load config
82 	 *    apply config
83 	 *    commit all
84 	 */
85 	k_mutex_lock(&settings_lock, K_FOREVER);
86 	SYS_SLIST_FOR_EACH_CONTAINER(&settings_load_srcs, cs, cs_next) {
87 		cs->cs_itf->csi_load(cs, &arg);
88 	}
89 	k_mutex_unlock(&settings_lock);
90 	return 0;
91 }
92 
93 /*
94  * Append a single value to persisted config. Don't store duplicate value.
95  */
settings_save_one(const char * name,const void * value,size_t val_len)96 int settings_save_one(const char *name, const void *value, size_t val_len)
97 {
98 	int rc;
99 	struct settings_store *cs;
100 
101 	cs = settings_save_dst;
102 	if (!cs) {
103 		return -ENOENT;
104 	}
105 
106 	k_mutex_lock(&settings_lock, K_FOREVER);
107 
108 	rc = cs->cs_itf->csi_save(cs, name, (char *)value, val_len);
109 
110 	k_mutex_unlock(&settings_lock);
111 
112 	return rc;
113 }
114 
settings_delete(const char * name)115 int settings_delete(const char *name)
116 {
117 	return settings_save_one(name, NULL, 0);
118 }
119 
settings_save(void)120 int settings_save(void)
121 {
122 	struct settings_store *cs;
123 	int rc;
124 	int rc2;
125 
126 	cs = settings_save_dst;
127 	if (!cs) {
128 		return -ENOENT;
129 	}
130 
131 	if (cs->cs_itf->csi_save_start) {
132 		cs->cs_itf->csi_save_start(cs);
133 	}
134 	rc = 0;
135 #if 0
136 	Z_STRUCT_SECTION_FOREACH(settings_handler_static, ch) {
137 		if (ch->h_export) {
138 			rc2 = ch->h_export(settings_save_one);
139 			if (!rc) {
140 				rc = rc2;
141 			}
142 		}
143 	}
144 #endif
145 #if defined(CONFIG_SETTINGS_DYNAMIC_HANDLERS)
146 	struct settings_handler *ch;
147 	SYS_SLIST_FOR_EACH_CONTAINER(&settings_handlers, ch, node) {
148 		if (ch->h_export) {
149 			rc2 = ch->h_export(settings_save_one);
150 			if (!rc) {
151 				rc = rc2;
152 			}
153 		}
154 	}
155 #endif /* CONFIG_SETTINGS_DYNAMIC_HANDLERS */
156 
157 	if (cs->cs_itf->csi_save_end) {
158 		cs->cs_itf->csi_save_end(cs);
159 	}
160 	return rc;
161 }
162 
settings_store_init(void)163 void settings_store_init(void)
164 {
165 	sys_slist_init(&settings_load_srcs);
166 }
167