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.c96
1 files changed, 62 insertions, 34 deletions
diff --git a/src/messenger/gnunet-service-messenger_member_store.c b/src/messenger/gnunet-service-messenger_member_store.c
index 8b2bd7ac8..e7876b382 100644
--- a/src/messenger/gnunet-service-messenger_member_store.c
+++ b/src/messenger/gnunet-service-messenger_member_store.c
@@ -37,25 +37,28 @@ init_member_store (struct GNUNET_MESSENGER_MemberStore *store,
37 GNUNET_assert ((store) && (room)); 37 GNUNET_assert ((store) && (room));
38 38
39 store->room = room; 39 store->room = room;
40 store->members = GNUNET_CONTAINER_multishortmap_create(8, GNUNET_NO); 40 store->members = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
41} 41}
42 42
43
43static int 44static int
44iterate_destroy_members (void *cls, 45iterate_destroy_members (void *cls,
45 const struct GNUNET_ShortHashCode *key, 46 const struct GNUNET_ShortHashCode *key,
46 void *value) 47 void *value)
47{ 48{
48 struct GNUNET_MESSENGER_Member *member = value; 49 struct GNUNET_MESSENGER_Member *member = value;
49 destroy_member(member); 50 destroy_member (member);
50 return GNUNET_YES; 51 return GNUNET_YES;
51} 52}
52 53
54
53void 55void
54clear_member_store (struct GNUNET_MESSENGER_MemberStore *store) 56clear_member_store (struct GNUNET_MESSENGER_MemberStore *store)
55{ 57{
56 GNUNET_assert ((store) && (store->members)); 58 GNUNET_assert ((store) && (store->members));
57 59
58 GNUNET_CONTAINER_multishortmap_iterate (store->members, iterate_destroy_members, NULL); 60 GNUNET_CONTAINER_multishortmap_iterate (store->members,
61 iterate_destroy_members, NULL);
59 GNUNET_CONTAINER_multishortmap_destroy (store->members); 62 GNUNET_CONTAINER_multishortmap_destroy (store->members);
60} 63}
61 64
@@ -67,17 +70,20 @@ get_member_contact_store (struct GNUNET_MESSENGER_MemberStore *store)
67 70
68 struct GNUNET_MESSENGER_SrvRoom *room = store->room; 71 struct GNUNET_MESSENGER_SrvRoom *room = store->room;
69 72
70 return get_service_contact_store(room->service); 73 return get_service_contact_store (room->service);
71} 74}
72 75
76
73const struct GNUNET_HashCode* 77const struct GNUNET_HashCode*
74get_member_store_key (const struct GNUNET_MESSENGER_MemberStore *store) 78get_member_store_key (const struct GNUNET_MESSENGER_MemberStore *store)
75{ 79{
76 GNUNET_assert (store); 80 GNUNET_assert (store);
77 81
78 return get_srv_room_key((const struct GNUNET_MESSENGER_SrvRoom*) store->room); 82 return get_srv_room_key ((const struct
83 GNUNET_MESSENGER_SrvRoom*) store->room);
79} 84}
80 85
86
81static int 87static int
82callback_scan_for_members (void *cls, 88callback_scan_for_members (void *cls,
83 const char *filename) 89 const char *filename)
@@ -90,14 +96,15 @@ callback_scan_for_members (void *cls,
90 96
91 GNUNET_asprintf (&directory, "%s%c", filename, DIR_SEPARATOR); 97 GNUNET_asprintf (&directory, "%s%c", filename, DIR_SEPARATOR);
92 98
93 load_member(store, directory); 99 load_member (store, directory);
94 100
95 GNUNET_free(directory); 101 GNUNET_free (directory);
96 } 102 }
97 103
98 return GNUNET_OK; 104 return GNUNET_OK;
99} 105}
100 106
107
101static int 108static int
102iterate_load_next_member_sessions (void *cls, 109iterate_load_next_member_sessions (void *cls,
103 const struct GNUNET_ShortHashCode *id, 110 const struct GNUNET_ShortHashCode *id,
@@ -107,19 +114,21 @@ iterate_load_next_member_sessions (void *cls,
107 114
108 struct GNUNET_MESSENGER_Member *member = value; 115 struct GNUNET_MESSENGER_Member *member = value;
109 116
110 if (!member) 117 if (! member)
111 return GNUNET_YES; 118 return GNUNET_YES;
112 119
113 char *member_dir; 120 char *member_dir;
114 GNUNET_asprintf (&member_dir, "%s%s%c", sync_dir, GNUNET_sh2s(id), DIR_SEPARATOR); 121 GNUNET_asprintf (&member_dir, "%s%s%c", sync_dir, GNUNET_sh2s (id),
122 DIR_SEPARATOR);
115 123
116 if (GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_YES)) 124 if (GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_YES))
117 load_member_next_sessions (member, member_dir); 125 load_member_next_sessions (member, member_dir);
118 126
119 GNUNET_free(member_dir); 127 GNUNET_free (member_dir);
120 return GNUNET_YES; 128 return GNUNET_YES;
121} 129}
122 130
131
123static int 132static int
124iterate_sync_member_contacts (void *cls, 133iterate_sync_member_contacts (void *cls,
125 const struct GNUNET_ShortHashCode *id, 134 const struct GNUNET_ShortHashCode *id,
@@ -127,13 +136,14 @@ iterate_sync_member_contacts (void *cls,
127{ 136{
128 struct GNUNET_MESSENGER_Member *member = value; 137 struct GNUNET_MESSENGER_Member *member = value;
129 138
130 if (!member) 139 if (! member)
131 return GNUNET_YES; 140 return GNUNET_YES;
132 141
133 sync_member_contacts (member); 142 sync_member_contacts (member);
134 return GNUNET_YES; 143 return GNUNET_YES;
135} 144}
136 145
146
137void 147void
138load_member_store (struct GNUNET_MESSENGER_MemberStore *store, 148load_member_store (struct GNUNET_MESSENGER_MemberStore *store,
139 const char *directory) 149 const char *directory)
@@ -146,12 +156,16 @@ load_member_store (struct GNUNET_MESSENGER_MemberStore *store,
146 if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES)) 156 if (GNUNET_OK == GNUNET_DISK_directory_test (scan_dir, GNUNET_YES))
147 GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_members, store); 157 GNUNET_DISK_directory_scan (scan_dir, callback_scan_for_members, store);
148 158
149 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_load_next_member_sessions, scan_dir); 159 GNUNET_CONTAINER_multishortmap_iterate (store->members,
150 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_sync_member_contacts, NULL); 160 iterate_load_next_member_sessions,
161 scan_dir);
162 GNUNET_CONTAINER_multishortmap_iterate (store->members,
163 iterate_sync_member_contacts, NULL);
151 164
152 GNUNET_free(scan_dir); 165 GNUNET_free (scan_dir);
153} 166}
154 167
168
155static int 169static int
156iterate_save_members (void *cls, 170iterate_save_members (void *cls,
157 const struct GNUNET_ShortHashCode *id, 171 const struct GNUNET_ShortHashCode *id,
@@ -161,36 +175,40 @@ iterate_save_members (void *cls,
161 175
162 struct GNUNET_MESSENGER_Member *member = value; 176 struct GNUNET_MESSENGER_Member *member = value;
163 177
164 if (!member) 178 if (! member)
165 return GNUNET_YES; 179 return GNUNET_YES;
166 180
167 char *member_dir; 181 char *member_dir;
168 GNUNET_asprintf (&member_dir, "%s%s%c", save_dir, GNUNET_sh2s(id), DIR_SEPARATOR); 182 GNUNET_asprintf (&member_dir, "%s%s%c", save_dir, GNUNET_sh2s (id),
183 DIR_SEPARATOR);
169 184
170 if ((GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_NO)) || 185 if ((GNUNET_YES == GNUNET_DISK_directory_test (member_dir, GNUNET_NO)) ||
171 (GNUNET_OK == GNUNET_DISK_directory_create (member_dir))) 186 (GNUNET_OK == GNUNET_DISK_directory_create (member_dir)))
172 save_member(member, member_dir); 187 save_member (member, member_dir);
173 188
174 GNUNET_free(member_dir); 189 GNUNET_free (member_dir);
175 return GNUNET_YES; 190 return GNUNET_YES;
176} 191}
177 192
193
178void 194void
179save_member_store (struct GNUNET_MESSENGER_MemberStore *store, 195save_member_store (struct GNUNET_MESSENGER_MemberStore *store,
180 const char *directory) 196 const char *directory)
181{ 197{
182 GNUNET_assert ((store) && (directory)); 198 GNUNET_assert ((store) && (directory));
183 199
184 char* save_dir; 200 char *save_dir;
185 GNUNET_asprintf (&save_dir, "%s%s%c", directory, "members", DIR_SEPARATOR); 201 GNUNET_asprintf (&save_dir, "%s%s%c", directory, "members", DIR_SEPARATOR);
186 202
187 if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) || 203 if ((GNUNET_YES == GNUNET_DISK_directory_test (save_dir, GNUNET_NO)) ||
188 (GNUNET_OK == GNUNET_DISK_directory_create (save_dir))) 204 (GNUNET_OK == GNUNET_DISK_directory_create (save_dir)))
189 GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_save_members, save_dir); 205 GNUNET_CONTAINER_multishortmap_iterate (store->members,
206 iterate_save_members, save_dir);
190 207
191 GNUNET_free(save_dir); 208 GNUNET_free (save_dir);
192} 209}
193 210
211
194struct GNUNET_MESSENGER_Member* 212struct GNUNET_MESSENGER_Member*
195get_store_member (const struct GNUNET_MESSENGER_MemberStore *store, 213get_store_member (const struct GNUNET_MESSENGER_MemberStore *store,
196 const struct GNUNET_ShortHashCode *id) 214 const struct GNUNET_ShortHashCode *id)
@@ -200,48 +218,55 @@ get_store_member (const struct GNUNET_MESSENGER_MemberStore *store,
200 return GNUNET_CONTAINER_multishortmap_get (store->members, id); 218 return GNUNET_CONTAINER_multishortmap_get (store->members, id);
201} 219}
202 220
221
203struct GNUNET_MESSENGER_Member* 222struct GNUNET_MESSENGER_Member*
204get_store_member_of (struct GNUNET_MESSENGER_MemberStore *store, 223get_store_member_of (struct GNUNET_MESSENGER_MemberStore *store,
205 const struct GNUNET_MESSENGER_Message *message) 224 const struct GNUNET_MESSENGER_Message *message)
206{ 225{
207 GNUNET_assert((store) && (message)); 226 GNUNET_assert ((store) && (message));
208 227
209 if (GNUNET_YES == is_peer_message(message)) 228 if (GNUNET_YES == is_peer_message (message))
210 return NULL; 229 return NULL;
211 230
212 if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind) 231 if (GNUNET_MESSENGER_KIND_JOIN == message->header.kind)
213 return add_store_member(store, &(message->header.sender_id)); 232 return add_store_member (store, &(message->header.sender_id));
214 else 233 else
215 return get_store_member(store, &(message->header.sender_id)); 234 return get_store_member (store, &(message->header.sender_id));
216} 235}
217 236
237
218struct GNUNET_MESSENGER_Member* 238struct GNUNET_MESSENGER_Member*
219add_store_member (struct GNUNET_MESSENGER_MemberStore *store, 239add_store_member (struct GNUNET_MESSENGER_MemberStore *store,
220 const struct GNUNET_ShortHashCode *id) 240 const struct GNUNET_ShortHashCode *id)
221{ 241{
222 GNUNET_assert ((store) && (store->members)); 242 GNUNET_assert ((store) && (store->members));
223 243
224 struct GNUNET_MESSENGER_Member *member = id? get_store_member(store, id) : NULL; 244 struct GNUNET_MESSENGER_Member *member = id? get_store_member (store, id) :
245 NULL;
225 246
226 if (member) 247 if (member)
227 return member; 248 return member;
228 249
229 member = create_member(store, id); 250 member = create_member (store, id);
230 251
231 if (!member) 252 if (! member)
232 return NULL; 253 return NULL;
233 254
234 if (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (store->members, get_member_id(member), member, 255 if (GNUNET_OK != GNUNET_CONTAINER_multishortmap_put (store->members,
256 get_member_id (member),
257 member,
235 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) 258 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
236 { 259 {
237 destroy_member(member); 260 destroy_member (member);
238 return NULL; 261 return NULL;
239 } 262 }
240 263
241 return member; 264 return member;
242} 265}
243 266
244struct GNUNET_MESSENGER_ClosureIterateMembers { 267
268struct GNUNET_MESSENGER_ClosureIterateMembers
269{
245 GNUNET_MESSENGER_MemberIteratorCallback it; 270 GNUNET_MESSENGER_MemberIteratorCallback it;
246 void *cls; 271 void *cls;
247}; 272};
@@ -254,13 +279,14 @@ iterate_store_members_it (void *cls,
254 struct GNUNET_MESSENGER_ClosureIterateMembers *iterate = cls; 279 struct GNUNET_MESSENGER_ClosureIterateMembers *iterate = cls;
255 struct GNUNET_MESSENGER_Member *member = value; 280 struct GNUNET_MESSENGER_Member *member = value;
256 281
257 return iterate_member_sessions(member, iterate->it, iterate->cls); 282 return iterate_member_sessions (member, iterate->it, iterate->cls);
258} 283}
259 284
285
260int 286int
261iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store, 287iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
262 GNUNET_MESSENGER_MemberIteratorCallback it, 288 GNUNET_MESSENGER_MemberIteratorCallback it,
263 void* cls) 289 void *cls)
264{ 290{
265 GNUNET_assert ((store) && (store->members) && (it)); 291 GNUNET_assert ((store) && (store->members) && (it));
266 292
@@ -269,5 +295,7 @@ iterate_store_members (struct GNUNET_MESSENGER_MemberStore *store,
269 iterate.it = it; 295 iterate.it = it;
270 iterate.cls = cls; 296 iterate.cls = cls;
271 297
272 return GNUNET_CONTAINER_multishortmap_iterate(store->members, iterate_store_members_it, &iterate); 298 return GNUNET_CONTAINER_multishortmap_iterate (store->members,
299 iterate_store_members_it,
300 &iterate);
273} 301}