GNUnet 0.21.1
messenger_api_room.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2020--2024 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 */
26#include "messenger_api_room.h"
27
28#include "gnunet_common.h"
34#include <string.h>
35
38 const struct GNUNET_HashCode *key)
39{
40 GNUNET_assert ((handle) && (key));
41
42 struct GNUNET_MESSENGER_Room *room = GNUNET_new (struct
44
45 room->handle = handle;
46 GNUNET_memcpy (&(room->key), key, sizeof(*key));
47
48 memset (&(room->last_message), 0, sizeof(room->last_message));
49
50 room->opened = GNUNET_NO;
53
54 room->sender_id = NULL;
55
56 init_list_tunnels (&(room->entries));
57
61
62 init_queue_messages (&(room->queue));
63
64 room->control = create_message_control (room);
65
66 return room;
67}
68
69
72 const struct GNUNET_HashCode *key,
73 void *value)
74{
76
77 destroy_message (entry->message);
78 GNUNET_free (entry);
79
80 return GNUNET_YES;
81}
82
83
86 const struct GNUNET_HashCode *key,
87 void *value)
88{
89 struct GNUNET_HashCode *hash = value;
90 GNUNET_free (hash);
91 return GNUNET_YES;
92}
93
94
95void
97{
98 GNUNET_assert (room);
99
101
102 clear_queue_messages (&(room->queue));
103 clear_list_tunnels (&(room->entries));
104
105 if (room->messages)
106 {
109
111 }
112
113 if (room->members)
115
116 if (room->links)
117 {
120
122 }
123
124 if (room->sender_id)
125 GNUNET_free (room->sender_id);
126
127 GNUNET_free (room);
128}
129
130
133{
134 GNUNET_assert (room);
135
136 if (! get_room_sender_id (room))
137 return GNUNET_NO;
138
139 if ((GNUNET_YES == room->opened) || (room->entries.head))
140 return GNUNET_YES;
141 else
142 return GNUNET_NO;
143}
144
145
148{
149 GNUNET_assert (room);
150
151 return room->handle;
152}
153
154
155const struct GNUNET_ShortHashCode*
157{
158 GNUNET_assert (room);
159
160 return room->sender_id;
161}
162
163
164void
166 const struct GNUNET_ShortHashCode *id)
167{
168 GNUNET_assert (room);
169
170 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Set member id for room: %s\n",
171 GNUNET_h2s (&(room->key)));
172
173 if (! id)
174 {
175 if (room->sender_id)
176 GNUNET_free (room->sender_id);
177
178 room->sender_id = NULL;
179 return;
180 }
181
182 if (! room->sender_id)
184
185 GNUNET_memcpy (room->sender_id, id, sizeof(struct GNUNET_ShortHashCode));
186}
187
188
189const struct GNUNET_MESSENGER_Message*
191 const struct GNUNET_HashCode *hash)
192{
193 GNUNET_assert ((room) && (hash));
194
197 room->messages, hash);
198
199 if ((! entry) || (GNUNET_YES != entry->completed))
200 return NULL;
201
202 return entry->message;
203}
204
205
208 const struct GNUNET_HashCode *hash)
209{
210 GNUNET_assert ((room) && (hash));
211
214 room->messages, hash);
215
216 if ((! entry) || (GNUNET_YES != entry->completed))
217 return NULL;
218
219 return entry->sender;
220}
221
222
225 const struct GNUNET_HashCode *hash)
226{
227 GNUNET_assert ((room) && (hash));
228
231 room->messages, hash);
232
233 if ((! entry) || (GNUNET_YES != entry->completed))
234 return NULL;
235
236 return entry->recipient;
237}
238
239
240void
242 const struct GNUNET_HashCode *hash)
243{
244 GNUNET_assert ((room) && (hash));
245
246 struct GNUNET_MESSENGER_Handle *handle = room->handle;
247
248 if (! handle)
249 return;
250
252 entry = GNUNET_CONTAINER_multihashmap_get (room->messages, hash);
253
254 if (! entry)
255 return;
256
257 if (handle->msg_callback)
258 handle->msg_callback (handle->msg_cls, room,
259 entry->sender,
260 entry->recipient,
261 entry->message,
262 hash,
263 entry->flags);
264
267}
268
269
270static void
272 const struct GNUNET_HashCode *hash,
274
275
276void
278 const struct GNUNET_HashCode *hash,
280{
281 GNUNET_assert ((room) && (hash) && (entry));
282
283 if (! entry->sender)
284 {
286 room->handle);
288
289 get_context_from_member (&(room->key), &(entry->message->header.sender_id),
290 &context);
291
292 entry->sender = get_store_contact (store, &context,
293 &(entry->message->body.join.key));
294 }
295
297 room->members, &(entry->message->header.sender_id), entry->sender)) &&
299 &(entry->message->header
300 .sender_id),
301 entry->sender,
304}
305
306
307static void
309 const struct GNUNET_HashCode *hash,
311{
312 GNUNET_assert ((room) && (hash) && (entry));
313
314 if ((! entry->sender) ||
316 &(entry->message->
317 header.sender_id),
318 entry->sender)))
319 return;
320
321 if (GNUNET_YES == decrease_contact_rc (entry->sender))
323 "A contact does not share any room with you anymore!\n");
324}
325
326
327static void
329 const struct GNUNET_HashCode *hash,
331{
332 GNUNET_assert ((room) && (hash) && (entry));
333
335 {
337 "Set rule for using handle name in room: %s\n",
338 GNUNET_h2s (&(room->key)));
339
340 const char *handle_name = get_handle_name (room->handle);
341
342 if ((handle_name) && (0 == strcmp (handle_name,
343 entry->message->body.name.name)))
345 }
346
347 if (! entry->sender)
348 return;
349
350 set_contact_name (entry->sender, entry->message->body.name.name);
351}
352
353
354static void
356 const struct GNUNET_HashCode *hash,
358{
359 GNUNET_assert ((room) && (hash) && (entry));
360
361 if (! entry->sender)
362 return;
363
365 get_context_from_member (&(room->key), &(entry->message->header.sender_id),
366 &context);
367
369 room->handle);
370
371 update_store_contact (store, entry->sender, &context, &context,
372 &(entry->message->body.key.key));
373}
374
375
376static void
378 const struct GNUNET_HashCode *hash,
380{
381 GNUNET_assert ((room) && (hash) && (entry));
382
384 set_room_sender_id (room, &(entry->message->body.id.id));
385
386 if ((! entry->sender) ||
388 &(entry->message->
389 header.sender_id),
390 entry->sender)) ||
392 &(entry->message->body.
393 id.id),
394 entry->sender,
396 return;
397
398 struct GNUNET_HashCode context, next_context;
399 get_context_from_member (&(room->key), &(entry->message->header.sender_id),
400 &context);
401 get_context_from_member (&(room->key), &(entry->message->body.id.id),
402 &next_context);
403
405 room->handle);
406
407 update_store_contact (store, entry->sender, &context, &next_context,
408 get_contact_key (entry->sender));
409}
410
411
412static void
414 const struct GNUNET_HashCode *hash,
416{
417 GNUNET_assert ((room) && (hash) && (entry));
418
419 if (0 == (GNUNET_MESSENGER_FLAG_SENT & entry->flags))
420 return;
421
423 &(room->entries), &(entry->message->body.miss.peer), NULL);
424
425 if (match)
426 remove_from_list_tunnels (&(room->entries), match);
427}
428
429
430static void
432 const struct GNUNET_HashCode *hash,
434{
435 GNUNET_assert ((room) && (hash) && (entry));
436
437 struct GNUNET_MESSENGER_Message *private_message = copy_message (
438 entry->message);
439
440 if (! private_message)
441 return;
442
443 if (GNUNET_YES != decrypt_message (private_message,
444 get_handle_key (room->handle)))
445 {
446 destroy_message (private_message);
447 private_message = NULL;
448 }
449
450 if (! private_message)
451 return;
452
453 destroy_message (entry->message);
454
455 entry->recipient = get_handle_contact (room->handle, &(room->key));
456
457 entry->message = private_message;
459
460 if ((entry->sender) && (entry->recipient))
461 handle_message (room, hash, entry);
462}
463
464
465extern void
467 const struct GNUNET_HashCode *hash,
468 const struct GNUNET_TIME_Relative delay);
469
470
471static void
473 const struct GNUNET_HashCode *hash,
475{
476 GNUNET_assert ((room) && (hash) && (entry));
477
478 const struct GNUNET_HashCode *target_hash =
479 &(entry->message->body.deletion.hash);
480
481 if (get_handle_contact (room->handle, &(room->key)) == entry->sender)
482 {
483 struct GNUNET_TIME_Relative delay;
485
487
490
492 action);
493
494 link_room_deletion (room, target_hash, delay, delete_message_in_room);
495 }
496
497 struct GNUNET_MESSENGER_RoomMessageEntry *target =
498 GNUNET_CONTAINER_multihashmap_get (room->messages, target_hash);
499
500 if (! target)
501 return;
502
503 if (((target->sender != entry->sender) &&
504 (get_handle_contact (room->handle, &(room->key)) != entry->sender)))
505 return;
506
508 callback_room_message (room, target_hash);
509
511 target_hash,
512 target))
513 {
514 destroy_message (target->message);
515 GNUNET_free (target);
516 }
517}
518
519
520static void
522 const struct GNUNET_HashCode *hash,
524{
525 GNUNET_assert ((room) && (hash) && (entry));
526
527 if (get_handle_contact (room->handle, &(room->key)) != entry->sender)
528 return;
529
530 const struct GNUNET_HashCode *original_hash =
531 &(entry->message->body.transcript.hash);
533 room->handle);
534
535 struct GNUNET_MESSENGER_RoomMessageEntry *original =
536 GNUNET_CONTAINER_multihashmap_get (room->messages, original_hash);
537 struct GNUNET_MESSENGER_Message *original_message;
538
539 if (original)
540 goto read_transcript;
541
543
544 if (! original)
545 return;
546
547 original->sender = NULL;
548 original->recipient = NULL;
549
550 original->message = NULL;
552 original->completed = GNUNET_NO;
553
555 original_hash,
556 original,
558 {
559 GNUNET_free (original);
560 return;
561 }
562
563read_transcript:
564 original_message = copy_message (entry->message);
565
566 if (! original_message)
567 return;
568
569 if (GNUNET_YES != read_transcript_message (original_message))
570 {
571 destroy_message (original_message);
572 return;
573 }
574
575 original->recipient = get_store_contact (store,
576 NULL,
577 &(entry->message->body.transcript.key));
578
579 if (original->message)
580 {
583
584 copy_message_header (original_message, &(original->message->header));
585 destroy_message (original->message);
586 }
587
588 original->message = original_message;
589
590 link_room_message (room, hash, original_hash);
591 link_room_message (room, original_hash, hash);
592
593 if ((original->sender) && (original->recipient))
594 {
596 handle_message (room, original_hash, original);
597 }
598}
599
600
601static void
603 const struct GNUNET_HashCode *hash,
605{
606 GNUNET_assert ((room) && (hash) && (entry));
607
608 switch (entry->message->header.kind)
609 {
611 handle_join_message (room, hash, entry);
612 break;
614 handle_leave_message (room, hash, entry);
615 break;
617 handle_name_message (room, hash, entry);
618 break;
620 handle_key_message (room, hash, entry);
621 break;
623 handle_id_message (room, hash, entry);
624 break;
626 handle_miss_message (room, hash, entry);
627 break;
629 handle_private_message (room, hash, entry);
630 break;
632 handle_delete_message (room, hash, entry);
633 break;
635 handle_transcript_message (room, hash, entry);
636 break;
637 default:
638 break;
639 }
640
642 callback_room_message (room, hash);
643}
644
645
646void
648 struct GNUNET_MESSENGER_Contact *sender,
649 const struct GNUNET_MESSENGER_Message *message,
650 const struct GNUNET_HashCode *hash,
652{
653 GNUNET_assert ((room) && (message) && (hash));
654
656 entry = GNUNET_CONTAINER_multihashmap_get (room->messages, hash);
657
658 if (entry)
659 goto update_entry;
660
662
663 if (! entry)
664 return;
665
666 entry->sender = NULL;
667 entry->recipient = NULL;
668
669 entry->message = NULL;
671 entry->completed = GNUNET_NO;
672
674 entry,
676 {
677 GNUNET_free (entry);
678 return;
679 }
680
681update_entry:
682 entry->sender = sender;
683 entry->flags = flags;
684
685 if (entry->message)
686 {
689
691 }
692 else
693 entry->message = copy_message (message);
694
695 entry->completed = GNUNET_YES;
696
697 handle_message (room, hash, entry);
698}
699
700
701void
703 const struct GNUNET_HashCode *hash)
704{
705 GNUNET_assert ((room) && (hash));
706
707 GNUNET_memcpy (&(room->last_message), hash, sizeof(room->last_message));
708}
709
710
712{
715 void *cls;
716};
717
720 const struct GNUNET_ShortHashCode *key,
721 void *value)
722{
724 struct GNUNET_MESSENGER_Contact *contact = value;
725
726 return call->callback (call->cls, call->room, contact);
727}
728
729
730int
733 void *cls)
734{
735 GNUNET_assert (room);
736
737 if (! callback)
738 return GNUNET_CONTAINER_multishortmap_iterate (room->members, NULL, NULL);
739
741
742 call.room = room;
743 call.callback = callback;
744 call.cls = cls;
745
747
750 &call);
751}
752
753
755{
758};
759
762 const struct GNUNET_ShortHashCode *key,
763 void *value)
764{
765 struct GNUNET_MESSENGER_MemberFind *find = cls;
766 struct GNUNET_MESSENGER_Contact *contact = value;
767
768 if (contact == find->contact)
769 {
770 find->result = GNUNET_YES;
771 return GNUNET_NO;
772 }
773
774 return GNUNET_YES;
775}
776
777
780 const struct GNUNET_MESSENGER_Contact *contact)
781{
782 GNUNET_assert (room);
783
784 struct GNUNET_MESSENGER_MemberFind find;
785
786 find.contact = contact;
787 find.result = GNUNET_NO;
788
790 &find);
791
792 return find.result;
793}
794
795
798 const struct GNUNET_HashCode *key,
799 void *value)
800{
801 const struct GNUNET_HashCode **result = cls;
802 struct GNUNET_HashCode *hash = value;
803
804 if (0 == GNUNET_CRYPTO_hash_cmp (hash, *result))
805 {
806 *result = NULL;
807 return GNUNET_NO;
808 }
809
810 return GNUNET_YES;
811}
812
813
814void
816 const struct GNUNET_HashCode *hash,
817 const struct GNUNET_HashCode *other)
818{
819 GNUNET_assert ((room) && (hash) && (other));
820
821 const struct GNUNET_HashCode **result = &other;
824
825 if (! *result)
826 return;
827
828 struct GNUNET_HashCode *value = GNUNET_memdup (other, sizeof(struct
830 if (! value)
831 return;
832
836}
837
838
840{
844};
845
846
849 const struct GNUNET_HashCode *key,
850 void *value)
851{
852 struct GNUNET_HashCode **linked = cls;
853 struct GNUNET_HashCode *hash = value;
854
855 if (0 != GNUNET_CRYPTO_hash_cmp (*linked, hash))
856 return GNUNET_YES;
857
858 *linked = hash;
859 return GNUNET_NO;
860}
861
862
865 const struct GNUNET_HashCode *key,
866 void *value)
867{
869 struct GNUNET_HashCode *hash = value;
870
871 struct GNUNET_HashCode key_value;
872 GNUNET_memcpy (&key_value, key, sizeof (key_value));
873
874 struct GNUNET_HashCode *linked = &key_value;
875
877 clear_linked_hash, &linked);
878
879 if ((linked != &key_value) &&
881 hash, linked)))
882 GNUNET_free (linked);
883
884 if (info->deletion)
885 info->deletion (info->room, hash, info->delay);
886
887 GNUNET_free (hash);
888 return GNUNET_YES;
889}
890
891
892void
894 const struct GNUNET_HashCode *hash,
895 const struct GNUNET_TIME_Relative delay,
897{
898 GNUNET_assert ((room) && (hash));
899
901 info.room = room;
902 info.delay = delay;
903 info.deletion = deletion;
904
908}
static struct GNUNET_CONVERSATION_Call * call
Call handle (for active outgoing call).
struct GNUNET_HashCode key
The key used in the DHT.
static pa_context * context
Pulseaudio context.
static char * value
Value of the record to add/remove.
static int result
Global testing status.
#define info
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
Definition: crypto_hash.c:221
int GNUNET_CONTAINER_multihashmap_remove_all(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Remove all entries for the given key from the map.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
struct GNUNET_CONTAINER_MultiShortmap * GNUNET_CONTAINER_multishortmap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multishortmap_put(struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
int GNUNET_CONTAINER_multishortmap_iterate(struct GNUNET_CONTAINER_MultiShortmap *map, GNUNET_CONTAINER_ShortmapIterator it, void *it_cls)
Iterate over all entries in the map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
int GNUNET_CONTAINER_multishortmap_contains_value(const struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, const void *value)
Check if the map contains the given value under the given key.
void GNUNET_CONTAINER_multishortmap_destroy(struct GNUNET_CONTAINER_MultiShortmap *map)
Destroy a hash map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
int GNUNET_CONTAINER_multishortmap_remove(struct GNUNET_CONTAINER_MultiShortmap *map, const struct GNUNET_ShortHashCode *key, const void *value)
Remove the given key-value pair from the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_memdup(buf, size)
Allocate and initialize a block of memory.
GNUNET_MESSENGER_MessageFlags
Enum for the different supported flags used by message handling.
enum GNUNET_GenericReturnValue(* GNUNET_MESSENGER_MemberCallback)(void *cls, struct GNUNET_MESSENGER_Room *room, const struct GNUNET_MESSENGER_Contact *contact)
Method called for each member in a room during iteration.
@ GNUNET_MESSENGER_KIND_MISS
The miss kind.
@ GNUNET_MESSENGER_KIND_PRIVATE
The private kind.
@ GNUNET_MESSENGER_KIND_NAME
The name kind.
@ GNUNET_MESSENGER_KIND_LEAVE
The leave kind.
@ GNUNET_MESSENGER_KIND_TRANSCRIPT
The transcript kind.
@ GNUNET_MESSENGER_KIND_KEY
The key kind.
@ GNUNET_MESSENGER_KIND_JOIN
The join kind.
@ GNUNET_MESSENGER_KIND_DELETE
The delete kind.
@ GNUNET_MESSENGER_KIND_ID
The id kind.
@ GNUNET_MESSENGER_FLAG_PRIVATE
The private flag.
@ GNUNET_MESSENGER_FLAG_SENT
The sent flag.
@ GNUNET_MESSENGER_FLAG_UPDATE
The update flag.
@ GNUNET_MESSENGER_FLAG_NONE
The none flag.
@ GNUNET_MESSENGER_FLAG_DELETE
The delete flag.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_ntoh(struct GNUNET_TIME_RelativeNBO a)
Convert relative time from network byte order.
Definition: time.c:628
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:111
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:737
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_add(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Relative duration)
Add a given relative duration to the given start time.
Definition: time.c:450
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Absolute end)
Compute the time difference between the given start and end times.
Definition: time.c:421
enum GNUNET_GenericReturnValue decrease_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Decreases the reference counter if possible (can not underflow!) of a given contact and returns GNUNE...
const struct GNUNET_CRYPTO_PublicKey * get_contact_key(const struct GNUNET_MESSENGER_Contact *contact)
Returns the public key of a given contact.
void set_contact_name(struct GNUNET_MESSENGER_Contact *contact, const char *name)
Changes the current name of a given contact by copying it from the parameter name.
void increase_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Increases the reference counter of a given contact which is zero as default.
void get_context_from_member(const struct GNUNET_HashCode *key, const struct GNUNET_ShortHashCode *id, struct GNUNET_HashCode *context)
Calculates the context hash of a member in a room and returns it.
void update_store_contact(struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *next_context, const struct GNUNET_CRYPTO_PublicKey *pubkey)
Moves a contact from the store to another location matching a given public key and member context.
struct GNUNET_MESSENGER_Contact * get_store_contact(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_CRYPTO_PublicKey *pubkey)
Returns a contact using a specific public key.
struct GNUNET_MESSENGER_ContactStore * get_handle_contact_store(struct GNUNET_MESSENGER_Handle *handle)
Returns the used contact store of a given handle.
struct GNUNET_MESSENGER_Contact * get_handle_contact(struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key)
Returns the contact of a given handle in a room identified by a given key.
const char * get_handle_name(const struct GNUNET_MESSENGER_Handle *handle)
Returns the current name of a given handle or NULL if no valid name was assigned yet.
const struct GNUNET_CRYPTO_PrivateKey * get_handle_key(const struct GNUNET_MESSENGER_Handle *handle)
Returns the private key of a given handle.
void init_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Initializes list of tunnels peer identities as empty list.
struct GNUNET_MESSENGER_ListTunnel * find_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, size_t *index)
Searches linearly through the list of tunnels peer identities for matching a specific peer identity a...
void clear_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Clears the list of tunnels peer identities.
struct GNUNET_MESSENGER_ListTunnel * remove_from_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, struct GNUNET_MESSENGER_ListTunnel *element)
Removes a specific element from the list of tunnels peer identities and returns the next element in t...
struct GNUNET_MESSENGER_Message * copy_message(const struct GNUNET_MESSENGER_Message *message)
Creates and allocates a copy of a given message.
enum GNUNET_GenericReturnValue decrypt_message(struct GNUNET_MESSENGER_Message *message, const struct GNUNET_CRYPTO_PrivateKey *key)
Decrypts a private message using a given private key and replaces its body and kind with the inner en...
void copy_message_header(struct GNUNET_MESSENGER_Message *message, const struct GNUNET_MESSENGER_MessageHeader *header)
Copy message header details from another message to a given message.
void destroy_message(struct GNUNET_MESSENGER_Message *message)
Destroys a message and frees its memory fully.
enum GNUNET_GenericReturnValue read_transcript_message(struct GNUNET_MESSENGER_Message *message)
Read the original message from a transcript message and replaces its body and kind with the inner enc...
struct GNUNET_MESSENGER_MessageControl * create_message_control(struct GNUNET_MESSENGER_Room *room)
Creates and allocates a new message control for a room of the client API.
void destroy_message_control(struct GNUNET_MESSENGER_MessageControl *control)
Destroys a message control and frees its memory fully from the client API.
void init_queue_messages(struct GNUNET_MESSENGER_QueueMessages *messages)
Initializes queue of messages as empty queue.
void clear_queue_messages(struct GNUNET_MESSENGER_QueueMessages *messages)
Clears the queue of messages.
static void handle_name_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static void handle_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
enum GNUNET_GenericReturnValue find_room_member(const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_MESSENGER_Contact *contact)
Checks through all members of a given room if a specific contact is found and returns a result depend...
static enum GNUNET_GenericReturnValue delete_linked_hash(void *cls, const struct GNUNET_HashCode *key, void *value)
static void handle_id_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
struct GNUNET_MESSENGER_Contact * get_room_sender(const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Returns a messages sender locally stored from a map for a given hash in a room.
void set_room_sender_id(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_ShortHashCode *id)
Sets the member id of the room's sender to a specific id or NULL.
void handle_room_message(struct GNUNET_MESSENGER_Room *room, struct GNUNET_MESSENGER_Contact *sender, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, enum GNUNET_MESSENGER_MessageFlags flags)
Handles a message with a given hash in a room for the client API to update members and its informatio...
void link_room_deletion(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, const struct GNUNET_TIME_Relative delay, GNUNET_MESSENGER_RoomLinkDeletion deletion)
Delete all remaining links to a certain message identified by its hash inside a given room and cause ...
const struct GNUNET_MESSENGER_Message * get_room_message(const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Returns a message locally stored from a map for a given hash in a room.
void update_room_last_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Updates the last message hash of a room for the client API so that new messages can point to the late...
static void handle_private_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static enum GNUNET_GenericReturnValue iterate_find_member(void *cls, const struct GNUNET_ShortHashCode *key, void *value)
enum GNUNET_GenericReturnValue is_room_available(const struct GNUNET_MESSENGER_Room *room)
Checks whether a room is available to send messages.
void callback_room_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Executes the message callback for a given hash in a room.
void delete_message_in_room(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, const struct GNUNET_TIME_Relative delay)
static void handle_leave_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static void handle_miss_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static void handle_transcript_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static enum GNUNET_GenericReturnValue iterate_destroy_link(void *cls, const struct GNUNET_HashCode *key, void *value)
static void handle_key_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static void handle_delete_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
static enum GNUNET_GenericReturnValue iterate_destroy_message(void *cls, const struct GNUNET_HashCode *key, void *value)
struct GNUNET_MESSENGER_Handle * get_room_handle(struct GNUNET_MESSENGER_Room *room)
Returns the messenger handle of the room.
const struct GNUNET_ShortHashCode * get_room_sender_id(const struct GNUNET_MESSENGER_Room *room)
Returns the member id of the room's sender.
static enum GNUNET_GenericReturnValue clear_linked_hash(void *cls, const struct GNUNET_HashCode *key, void *value)
static enum GNUNET_GenericReturnValue iterate_local_members(void *cls, const struct GNUNET_ShortHashCode *key, void *value)
void link_room_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, const struct GNUNET_HashCode *other)
Links a message identified by its hash inside a given room with another message identified by its oth...
void handle_join_message(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, struct GNUNET_MESSENGER_RoomMessageEntry *entry)
int iterate_room_members(struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_MemberCallback callback, void *cls)
Iterates through all members of a given room to forward each of them to a selected callback with a cu...
void destroy_room(struct GNUNET_MESSENGER_Room *room)
Destroys a room and frees its memory fully from the client API.
static enum GNUNET_GenericReturnValue find_linked_hash(void *cls, const struct GNUNET_HashCode *key, void *value)
struct GNUNET_MESSENGER_Contact * get_room_recipient(const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
Returns a messages recipient locally stored from a map for a given hash in a room.
struct GNUNET_MESSENGER_Room * create_room(struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_HashCode *key)
Creates and allocates a new room for a handle with a given key for the client API.
void(* GNUNET_MESSENGER_RoomLinkDeletion)(struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash, const struct GNUNET_TIME_Relative delay)
A 512-bit hashcode.
struct GNUNET_MESSENGER_ListTunnel * head
GNUNET_MESSENGER_MemberCallback callback
struct GNUNET_MESSENGER_Room * room
const struct GNUNET_MESSENGER_Contact * contact
enum GNUNET_GenericReturnValue result
struct GNUNET_MESSENGER_MessageId id
struct GNUNET_MESSENGER_MessageName name
struct GNUNET_MESSENGER_MessageTranscript transcript
struct GNUNET_MESSENGER_MessageKey key
struct GNUNET_MESSENGER_MessageMiss miss
struct GNUNET_MESSENGER_MessageJoin join
struct GNUNET_MESSENGER_MessageDelete deletion
struct GNUNET_HashCode hash
The hash of the message to delete.
struct GNUNET_TIME_RelativeNBO delay
The delay of the delete operation to get processed.
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_TIME_AbsoluteNBO timestamp
The timestamp of the message.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.
struct GNUNET_ShortHashCode id
The new id which will replace the senders id in a room.
struct GNUNET_CRYPTO_PublicKey key
The senders public key to verify its signatures.
struct GNUNET_CRYPTO_PublicKey key
The new public key which replaces the current senders public key.
struct GNUNET_PeerIdentity peer
The peer identity of a disconnected door to a room.
char * name
The new name which replaces the current senders name.
struct GNUNET_HashCode hash
The hash of the original message.
struct GNUNET_CRYPTO_PublicKey key
The key from the recipient of the original message.
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_MessageBody body
Body.
struct GNUNET_MESSENGER_Room * room
GNUNET_MESSENGER_RoomLinkDeletion deletion
struct GNUNET_MESSENGER_Contact * recipient
enum GNUNET_MESSENGER_MessageFlags flags
struct GNUNET_MESSENGER_Message * message
struct GNUNET_MESSENGER_Contact * sender
enum GNUNET_GenericReturnValue completed
struct GNUNET_CONTAINER_MultiHashMap * links
struct GNUNET_MESSENGER_Handle * handle
enum GNUNET_GenericReturnValue opened
enum GNUNET_GenericReturnValue wait_for_sync
struct GNUNET_CONTAINER_MultiShortmap * members
struct GNUNET_MESSENGER_MessageControl * control
struct GNUNET_CONTAINER_MultiHashMap * messages
enum GNUNET_GenericReturnValue use_handle_name
struct GNUNET_MESSENGER_QueueMessages queue
struct GNUNET_MESSENGER_ListTunnels entries
struct GNUNET_ShortHashCode * sender_id
struct GNUNET_HashCode key
struct GNUNET_HashCode last_message
A 256-bit hashcode.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.