aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_member_store.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messenger/gnunet-service-messenger_member_store.c')
-rw-r--r--src/messenger/gnunet-service-messenger_member_store.c268
1 files changed, 0 insertions, 268 deletions
diff --git a/src/messenger/gnunet-service-messenger_member_store.c b/src/messenger/gnunet-service-messenger_member_store.c
deleted file mode 100644
index e96ee3883..000000000
--- a/src/messenger/gnunet-service-messenger_member_store.c
+++ /dev/null
@@ -1,268 +0,0 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2020--2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @author Tobias Frisch
22 * @file src/messenger/gnunet-service-messenger_member_store.c
23 * @brief GNUnet MESSENGER service
24 */
25
26#include "gnunet-service-messenger_member_store.h"
27
28#include "gnunet-service-messenger_member.h"
29#include "gnunet-service-messenger_service.h"
30#include "gnunet-service-messenger_room.h"
31
32void
33init_member_store (struct GNUNET_MESSENGER_MemberStore *store,
34 struct GNUNET_MESSENGER_SrvRoom *room)
35{
36 GNUNET_assert ((store) && (room));
37
38 store->room = room;
39 store->members = GNUNET_CONTAINER_multishortmap_create(8, GNUNET_NO);
40}
41
42static int
43iterate_destroy_members (void *cls,
44 const struct GNUNET_ShortHashCode *key,
45 void *value)
46{
47 struct GNUNET_MESSENGER_Member *member = value;
48 destroy_member(member);
49 return GNUNET_YES;
50}
51
52void
53clear_member_store (struct GNUNET_MESSENGER_MemberStore *store)
54{
55 GNUNET_assert ((store) && (store->members));
56
57 GNUNET_CONTAINER_multishortmap_iterate (store->members, iterate_destroy_members, NULL);
58 GNUNET_CONTAINER_multishortmap_destroy (store->members);
59}
60
61
62struct GNUNET_MESSENGER_ContactStore*
63get_member_contact_store (struct GNUNET_MESSENGER_MemberStore *store)
64{
65 GNUNET_assert ((store) && (store->room));
66
67 struct GNUNET_MESSENGER_SrvRoom *room = store->room;
68
69 return get_service_contact_store(room->service);
70}
71
72const struct GNUNET_HashCode*
73get_member_store_key (const struct GNUNET_MESSENGER_MemberStore *store)
74{
75 GNUNET_assert (store);
76
77 return get_room_key((const struct GNUNET_MESSENGER_SrvRoom*) store->room);
78}
79
80static int
81callback_scan_for_members (void *cls,
82 const char *filename)
83{
84 struct GNUNET_MESSENGER_MemberStore *store = cls;
85
86 if (GNUNET_YES == GNUNET_DISK_directory_test (filename, GNUNET_YES))
87 {
88 char *directory;
89
90 GNUNET_asprintf (&directory, "%s%c", filename, DIR_SEPARATOR);
91
92 load_member(store, directory);
93
94 GNUNET_free(directory);
95 }
96
97 return GNUNET_OK;
98}
99
100static int
101iterate_load_next_member_sessions (void *cls,
102 const struct GNUNET_ShortHashCode *id,
103 void *value)
104{
105 const char *sync_dir = cls;
106
107 struct GNUNET_MESSENGER_Member *member = value;
108
109 if (!member)
110 return GNUNET_YES;
111
112 char *member_dir;
113 GNUNET_asprintf (&member_dir, "%s%s%c", sync_dir, GNUNET_sh2s(id), DIR_SEPARATOR);
114
115 if (GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_YES))
116 load_member_next_sessions (member, member_dir);
117
118 GNUNET_free(member_dir);
119 return GNUNET_YES;
120}
121
122static int
123iterate_sync_member_contacts (void *cls,
124 const struct GNUNET_ShortHashCode *id,
125 void *value)
126{
127 struct GNUNET_MESSENGER_Member *member = value;
128
129 if (!member)
130 return GNUNET_YES;
131
132 sync_member_contacts (member);
133 return GNUNET_YES;
134}
135
136void
137load_member_store (struct GNUNET_MESSENGER_MemberStore *store,
138 const char *directory)
139{
140 GNUNET_assert ((store) && (directory));
141
142 char *scan_dir;
143 GNUNET_asprintf (&scan_dir, "%s%s%c", directory, "members", DIR_SEPARATOR);
144
145 if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES))
146 GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_members, store);
147
148 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_load_next_member_sessions, scan_dir);
149 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_sync_member_contacts, NULL);
150
151 GNUNET_free(scan_dir);
152}
153
154static int
155iterate_save_members (void *cls,
156 const struct GNUNET_ShortHashCode *id,
157 void *value)
158{
159 const char *save_dir = cls;
160
161 struct GNUNET_MESSENGER_Member *member = value;
162
163 if (!member)
164 return GNUNET_YES;
165
166 char *member_dir;
167 GNUNET_asprintf (&member_dir, "%s%s%c", save_dir, GNUNET_sh2s(id), DIR_SEPARATOR);
168
169 if ((GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_NO)) ||
170 (GNUNET_OK == GNUNET_DISK_directory_create (member_dir)))
171 save_member(member, member_dir);
172
173 GNUNET_free(member_dir);
174 return GNUNET_YES;
175}
176
177void
178save_member_store (struct GNUNET_MESSENGER_MemberStore *store,
179 const char *directory)
180{
181 GNUNET_assert ((store) && (directory));
182
183 char* save_dir;
184 GNUNET_asprintf (&save_dir, "%s%s%c", directory, "members", DIR_SEPARATOR);
185
186 if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
187 (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
188 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_save_members, save_dir);
189
190 GNUNET_free(save_dir);
191}
192
193struct GNUNET_MESSENGER_Member*
194get_store_member (const struct GNUNET_MESSENGER_MemberStore *store,
195 const struct GNUNET_ShortHashCode *id)
196{
197 GNUNET_assert ((store) && (store->members) && (id));
198
199 return GNUNET_CONTAINER_multishortmap_get (store->members, id);
200}
201
202struct GNUNET_MESSENGER_Member*
203get_store_member_of (struct GNUNET_MESSENGER_MemberStore *store,
204 const struct GNUNET_MESSENGER_Message *message)
205{
206 if ((GNUNET_MESSENGER_KIND_INFO == message->header.kind) ||
207 (GNUNET_MESSENGER_KIND_JOIN == message->header.kind))
208 return add_store_member(store, &(message->header.sender_id));
209 else
210 return get_store_member(store, &(message->header.sender_id));
211}
212
213struct GNUNET_MESSENGER_Member*
214add_store_member (struct GNUNET_MESSENGER_MemberStore *store,
215 const struct GNUNET_ShortHashCode *id)
216{
217 GNUNET_assert ((store) && (store->members));
218
219 struct GNUNET_MESSENGER_Member *member = id? get_store_member(store, id) : NULL;
220
221 if (member)
222 return member;
223
224 member = create_member(store, id);
225
226 if (!member)
227 return NULL;
228
229 if (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (store->members, get_member_id(member), member,
230 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
231 {
232 destroy_member(member);
233 return NULL;
234 }
235
236 return member;
237}
238
239struct GNUNET_MESSENGER_ClosureIterateMembers {
240 GNUNET_MESSENGER_MemberIteratorCallback it;
241 void *cls;
242};
243
244static int
245iterate_store_members_it (void *cls,
246 const struct GNUNET_ShortHashCode *key,
247 void *value)
248{
249 struct GNUNET_MESSENGER_ClosureIterateMembers *iterate = cls;
250 struct GNUNET_MESSENGER_Member *member = value;
251
252 return iterate_member_sessions(member, iterate->it, iterate->cls);
253}
254
255int
256iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
257 GNUNET_MESSENGER_MemberIteratorCallback it,
258 void* cls)
259{
260 GNUNET_assert ((store) && (store->members) && (it));
261
262 struct GNUNET_MESSENGER_ClosureIterateMembers iterate;
263
264 iterate.it = it;
265 iterate.cls = cls;
266
267 return GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_store_members_it, &iterate);
268}