aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gnunet_chat_contact.c2
-rw-r--r--src/gnunet_chat_handle_intern.c70
-rw-r--r--src/gnunet_chat_lib.c19
-rw-r--r--src/gnunet_chat_lib_intern.c22
4 files changed, 106 insertions, 7 deletions
diff --git a/src/gnunet_chat_contact.c b/src/gnunet_chat_contact.c
index c023258..e539245 100644
--- a/src/gnunet_chat_contact.c
+++ b/src/gnunet_chat_contact.c
@@ -33,8 +33,6 @@ contact_create_from_member (struct GNUNET_CHAT_Handle *handle,
33 contact->handle = handle; 33 contact->handle = handle;
34 contact->context = NULL; 34 contact->context = NULL;
35 35
36 // TODO: search for private context? create private context?
37
38 contact->member = member; 36 contact->member = member;
39 37
40 contact->user_pointer = NULL; 38 contact->user_pointer = NULL;
diff --git a/src/gnunet_chat_handle_intern.c b/src/gnunet_chat_handle_intern.c
index 17bff20..a6342a9 100644
--- a/src/gnunet_chat_handle_intern.c
+++ b/src/gnunet_chat_handle_intern.c
@@ -190,21 +190,24 @@ struct GNUNET_CHAT_CheckHandleRoomMembers
190int 190int
191check_handle_room_members (void* cls, 191check_handle_room_members (void* cls,
192 GNUNET_UNUSED struct GNUNET_MESSENGER_Room *room, 192 GNUNET_UNUSED struct GNUNET_MESSENGER_Room *room,
193 const struct GNUNET_MESSENGER_Contact *contact) 193 const struct GNUNET_MESSENGER_Contact *member)
194{ 194{
195 struct GNUNET_CHAT_CheckHandleRoomMembers *check = cls; 195 struct GNUNET_CHAT_CheckHandleRoomMembers *check = cls;
196 196
197 const struct GNUNET_IDENTITY_PublicKey *contact_key = ( 197 const struct GNUNET_IDENTITY_PublicKey *member_key = (
198 GNUNET_MESSENGER_contact_get_key(contact) 198 GNUNET_MESSENGER_contact_get_key(member)
199 ); 199 );
200 200
201 if (0 == GNUNET_memcmp(contact_key, check->ignore_key)) 201 if (0 == GNUNET_memcmp(member_key, check->ignore_key))
202 return GNUNET_YES; 202 return GNUNET_YES;
203 203
204 if (check->contact) 204 if (check->contact)
205 {
206 check->contact = NULL;
205 return GNUNET_NO; 207 return GNUNET_NO;
208 }
206 209
207 check->contact = contact; 210 check->contact = member;
208 return GNUNET_YES; 211 return GNUNET_YES;
209} 212}
210 213
@@ -246,6 +249,8 @@ request_handle_context_by_room (struct GNUNET_CHAT_Handle *handle,
246 handle, check.contact 249 handle, check.contact
247 ); 250 );
248 251
252 contact->context = context;
253
249 struct GNUNET_ShortHashCode shorthash; 254 struct GNUNET_ShortHashCode shorthash;
250 util_shorthash_from_member(check.contact, &shorthash); 255 util_shorthash_from_member(check.contact, &shorthash);
251 256
@@ -295,15 +300,70 @@ find_handle_rooms (void *cls, struct GNUNET_MESSENGER_Room *room,
295 return GNUNET_YES; 300 return GNUNET_YES;
296} 301}
297 302
303int
304scan_handle_room_members (void* cls,
305 GNUNET_UNUSED struct GNUNET_MESSENGER_Room *room,
306 const struct GNUNET_MESSENGER_Contact *member)
307{
308 struct GNUNET_CHAT_Handle *handle = cls;
309
310 struct GNUNET_ShortHashCode shorthash;
311 util_shorthash_from_member(member, &shorthash);
312
313 if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_contains(
314 handle->contacts, &shorthash))
315 return GNUNET_YES;
316
317 struct GNUNET_CHAT_Contact *contact = contact_create_from_member(
318 handle, member
319 );
320
321 if (GNUNET_OK == GNUNET_CONTAINER_multishortmap_put(
322 handle->contacts, &shorthash, contact,
323 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
324 return GNUNET_YES;
325
326 contact_destroy(contact);
327 return GNUNET_NO;
328}
329
330int
331scan_handle_rooms (void *cls, struct GNUNET_MESSENGER_Room *room,
332 GNUNET_UNUSED const struct GNUNET_MESSENGER_Contact *member)
333{
334 struct GNUNET_CHAT_Handle *handle = cls;
335
336 const struct GNUNET_HashCode *key = GNUNET_MESSENGER_room_get_key(room);
337
338 struct GNUNET_CHAT_Group *group = GNUNET_CONTAINER_multihashmap_get(
339 handle->groups, key
340 );
341
342 if (!group)
343 return GNUNET_YES;
344
345 GNUNET_MESSENGER_iterate_members(room, scan_handle_room_members, handle);
346 return GNUNET_YES;
347}
348
298void 349void
299on_handle_identity(void *cls, 350on_handle_identity(void *cls,
300 GNUNET_UNUSED struct GNUNET_MESSENGER_Handle *messenger) 351 GNUNET_UNUSED struct GNUNET_MESSENGER_Handle *messenger)
301{ 352{
302 struct GNUNET_CHAT_Handle *handle = cls; 353 struct GNUNET_CHAT_Handle *handle = cls;
303 354
355 if ((0 < GNUNET_CONTAINER_multihashmap_size(handle->contexts)) ||
356 (0 < GNUNET_CONTAINER_multihashmap_size(handle->groups)) ||
357 (0 < GNUNET_CONTAINER_multishortmap_size(handle->contacts)))
358 return;
359
304 GNUNET_MESSENGER_find_rooms( 360 GNUNET_MESSENGER_find_rooms(
305 handle->messenger, NULL, find_handle_rooms, handle 361 handle->messenger, NULL, find_handle_rooms, handle
306 ); 362 );
363
364 GNUNET_MESSENGER_find_rooms(
365 handle->messenger, NULL, scan_handle_rooms, handle
366 );
307} 367}
308 368
309void 369void
diff --git a/src/gnunet_chat_lib.c b/src/gnunet_chat_lib.c
index cdce90c..294a735 100644
--- a/src/gnunet_chat_lib.c
+++ b/src/gnunet_chat_lib.c
@@ -591,6 +591,25 @@ GNUNET_CHAT_context_iterate_messages (struct GNUNET_CHAT_Context *context,
591} 591}
592 592
593 593
594int
595GNUNET_CHAT_context_iterate_files (struct GNUNET_CHAT_Context *context,
596 GNUNET_CHAT_ContextFileCallback callback,
597 void *cls)
598{
599 if (!context)
600 return GNUNET_SYSERR;
601
602 struct GNUNET_CHAT_ContextIterateFiles it;
603 it.context = context;
604 it.cb = callback;
605 it.cls = cls;
606
607 return GNUNET_CONTAINER_multihashmap_iterate(
608 context->files, it_context_iterate_files, &it
609 );
610}
611
612
594enum GNUNET_CHAT_MessageKind 613enum GNUNET_CHAT_MessageKind
595GNUNET_CHAT_message_get_kind (const struct GNUNET_CHAT_Message *message) 614GNUNET_CHAT_message_get_kind (const struct GNUNET_CHAT_Message *message)
596{ 615{
diff --git a/src/gnunet_chat_lib_intern.c b/src/gnunet_chat_lib_intern.c
index 584ebab..a2db98a 100644
--- a/src/gnunet_chat_lib_intern.c
+++ b/src/gnunet_chat_lib_intern.c
@@ -117,6 +117,28 @@ it_context_iterate_messages (void *cls,
117 return it->cb(it->cls, it->context, message); 117 return it->cb(it->cls, it->context, message);
118} 118}
119 119
120struct GNUNET_CHAT_ContextIterateFiles
121{
122 struct GNUNET_CHAT_Context *context;
123 GNUNET_CHAT_ContextFileCallback cb;
124 void *cls;
125};
126
127int
128it_context_iterate_files (void *cls,
129 GNUNET_UNUSED const struct GNUNET_HashCode *key,
130 void *value)
131{
132 struct GNUNET_CHAT_ContextIterateFiles *it = cls;
133
134 if (!(it->cb))
135 return GNUNET_YES;
136
137 struct GNUNET_CHAT_File *file = value;
138
139 return it->cb(it->cls, it->context, file);
140}
141
120struct GNUNET_CHAT_MessageIterateReadReceipts 142struct GNUNET_CHAT_MessageIterateReadReceipts
121{ 143{
122 const struct GNUNET_CHAT_Message *message; 144 const struct GNUNET_CHAT_Message *message;