aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authort3sserakt <t3ss@posteo.de>2024-03-05 11:20:52 +0100
committert3sserakt <t3ss@posteo.de>2024-03-05 11:20:52 +0100
commitabbd40ba2df305e6c8b2573f074e9037760640a4 (patch)
treeaf8ec74962262a536a3c1e778453c66abdfc10af
parent4bb95b3dc24d360756f1782b95f2bdc6b0272c08 (diff)
parent28c33aabecf1a00eff1c82583efe26e57fe59a64 (diff)
downloadgnunet-abbd40ba2df305e6c8b2573f074e9037760640a4.tar.gz
gnunet-abbd40ba2df305e6c8b2573f074e9037760640a4.zip
Merge branch 'master' of ssh://git.gnunet.org/gnunet
-rw-r--r--src/service/messenger/Makefile.am1
-rw-r--r--src/service/messenger/meson.build1
-rw-r--r--src/service/messenger/messenger_api.c19
-rw-r--r--src/service/messenger/messenger_api_message_control.c248
-rw-r--r--src/service/messenger/messenger_api_message_control.h105
-rw-r--r--src/service/messenger/messenger_api_message_kind.c4
-rw-r--r--src/service/messenger/messenger_api_message_kind.h10
-rw-r--r--src/service/messenger/messenger_api_room.c14
-rw-r--r--src/service/messenger/messenger_api_room.h13
9 files changed, 396 insertions, 19 deletions
diff --git a/src/service/messenger/Makefile.am b/src/service/messenger/Makefile.am
index b1ecc13c8..93dcf9a78 100644
--- a/src/service/messenger/Makefile.am
+++ b/src/service/messenger/Makefile.am
@@ -37,6 +37,7 @@ libgnunetmessenger_la_SOURCES = \
37 messenger_api_contact.c messenger_api_contact.h \ 37 messenger_api_contact.c messenger_api_contact.h \
38 messenger_api_contact_store.c messenger_api_contact_store.h \ 38 messenger_api_contact_store.c messenger_api_contact_store.h \
39 messenger_api_message.c messenger_api_message.h \ 39 messenger_api_message.c messenger_api_message.h \
40 messenger_api_message_control.c messenger_api_message_control.h \
40 messenger_api_message_kind.c messenger_api_message_kind.h \ 41 messenger_api_message_kind.c messenger_api_message_kind.h \
41 messenger_api_list_tunnels.c messenger_api_list_tunnels.h \ 42 messenger_api_list_tunnels.c messenger_api_list_tunnels.h \
42 messenger_api_queue_messages.c messenger_api_queue_messages.h \ 43 messenger_api_queue_messages.c messenger_api_queue_messages.h \
diff --git a/src/service/messenger/meson.build b/src/service/messenger/meson.build
index 1e37e192f..4a472b6b5 100644
--- a/src/service/messenger/meson.build
+++ b/src/service/messenger/meson.build
@@ -2,6 +2,7 @@ libgnunetmessenger_src = ['messenger_api.c',
2 'messenger_api_contact.c', 2 'messenger_api_contact.c',
3 'messenger_api_contact_store.c', 3 'messenger_api_contact_store.c',
4 'messenger_api_message.c', 4 'messenger_api_message.c',
5 'messenger_api_message_control.c',
5 'messenger_api_message_kind.c', 6 'messenger_api_message_kind.c',
6 'messenger_api_list_tunnels.c', 7 'messenger_api_list_tunnels.c',
7 'messenger_api_queue_messages.c', 8 'messenger_api_queue_messages.c',
diff --git a/src/service/messenger/messenger_api.c b/src/service/messenger/messenger_api.c
index 8afb9e42e..1d782ac13 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -34,6 +34,7 @@
34#include "messenger_api_contact_store.h" 34#include "messenger_api_contact_store.h"
35#include "messenger_api_handle.h" 35#include "messenger_api_handle.h"
36#include "messenger_api_message.h" 36#include "messenger_api_message.h"
37#include "messenger_api_message_control.h"
37#include "messenger_api_message_kind.h" 38#include "messenger_api_message_kind.h"
38#include "messenger_api_room.h" 39#include "messenger_api_room.h"
39#include "messenger_api_util.h" 40#include "messenger_api_util.h"
@@ -295,22 +296,16 @@ handle_recv_message (void *cls,
295 goto skip_message; 296 goto skip_message;
296 } 297 }
297 298
298 struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
299 handle);
300
301 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 299 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
302 "Raw contact from sender and context: (%s : %s)\n", 300 "Raw contact from sender and context: (%s : %s)\n",
303 GNUNET_h2s (sender), GNUNET_h2s_full (context)); 301 GNUNET_h2s (sender), GNUNET_h2s_full (context));
304 302
305 struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw ( 303 process_message_control (room->control,
306 store, context, sender); 304 sender,
307 305 context,
308 handle_room_message (room, contact, &message, hash, flags); 306 hash,
309 307 &message,
310 if (flags & GNUNET_MESSENGER_FLAG_RECENT) 308 flags);
311 update_room_last_message (room, hash);
312
313 callback_room_message (room, hash);
314 309
315skip_message: 310skip_message:
316 cleanup_message (&message); 311 cleanup_message (&message);
diff --git a/src/service/messenger/messenger_api_message_control.c b/src/service/messenger/messenger_api_message_control.c
new file mode 100644
index 000000000..30c52587f
--- /dev/null
+++ b/src/service/messenger/messenger_api_message_control.c
@@ -0,0 +1,248 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 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 */
20/**
21 * @author Tobias Frisch
22 * @file src/messenger/messenger_api_message_control.c
23 * @brief messenger api: client and service implementation of GNUnet MESSENGER service
24 */
25
26#include "messenger_api_message_control.h"
27
28#include "gnunet_common.h"
29#include "gnunet_messenger_service.h"
30#include "gnunet_scheduler_lib.h"
31#include "messenger_api_contact.h"
32#include "messenger_api_contact_store.h"
33#include "messenger_api_handle.h"
34#include "messenger_api_message.h"
35#include "messenger_api_room.h"
36
37struct GNUNET_MESSENGER_MessageControl*
38create_message_control (struct GNUNET_MESSENGER_Room *room)
39{
40 GNUNET_assert (room);
41
42 struct GNUNET_MESSENGER_MessageControl *control;
43
44 control = GNUNET_new (struct GNUNET_MESSENGER_MessageControl);
45 control->room = room;
46
47 control->peer_messages = GNUNET_CONTAINER_multishortmap_create (8, GNUNET_NO);
48 control->member_messages = GNUNET_CONTAINER_multishortmap_create (8,
49 GNUNET_NO);
50
51 control->head = NULL;
52 control->tail = NULL;
53
54 return control;
55}
56
57
58void
59destroy_message_control (struct GNUNET_MESSENGER_MessageControl *control)
60{
61 GNUNET_assert (control);
62
63 struct GNUNET_MESSENGER_MessageControlQueue *queue;
64 while (control->head)
65 {
66 queue = control->head;
67
68 if (queue->task)
69 GNUNET_SCHEDULER_cancel (queue->task);
70
71 destroy_message (queue->message);
72
73 GNUNET_CONTAINER_DLL_remove (control->head, control->tail, queue);
74 GNUNET_free (queue);
75 }
76
77 GNUNET_CONTAINER_multishortmap_destroy (control->peer_messages);
78 GNUNET_CONTAINER_multishortmap_destroy (control->member_messages);
79
80 GNUNET_free (control);
81}
82
83
84static void
85enqueue_message_control (struct GNUNET_MESSENGER_MessageControl *control,
86 const struct GNUNET_HashCode *sender,
87 const struct GNUNET_HashCode *context,
88 const struct GNUNET_HashCode *hash,
89 const struct GNUNET_MESSENGER_Message *message,
90 enum GNUNET_MESSENGER_MessageFlags flags)
91{
92 GNUNET_assert ((control) && (sender) && (context) && (hash) && (message));
93
94 struct GNUNET_CONTAINER_MultiShortmap *map;
95 if (GNUNET_YES == is_peer_message (message))
96 map = control->peer_messages;
97 else
98 map = control->member_messages;
99
100 struct GNUNET_MESSENGER_MessageControlQueue *queue;
101
102 queue = GNUNET_new (struct GNUNET_MESSENGER_MessageControlQueue);
103 queue->control = control;
104
105 GNUNET_memcpy (&(queue->sender), sender, sizeof (queue->sender));
106 GNUNET_memcpy (&(queue->context), context, sizeof (queue->context));
107 GNUNET_memcpy (&(queue->hash), hash, sizeof (queue->hash));
108
109 queue->message = copy_message (message);
110 queue->flags = flags;
111 queue->task = NULL;
112
113 GNUNET_CONTAINER_DLL_insert (control->head, control->tail, queue);
114
115 GNUNET_CONTAINER_multishortmap_put (map,
116 &(message->header.sender_id),
117 queue,
118 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
119}
120
121
122static void
123handle_message_control (struct GNUNET_MESSENGER_MessageControl *control,
124 struct GNUNET_MESSENGER_Contact *contact,
125 const struct GNUNET_HashCode *hash,
126 const struct GNUNET_MESSENGER_Message *message,
127 enum GNUNET_MESSENGER_MessageFlags flags)
128{
129 GNUNET_assert ((control) && (hash) && (message));
130
131 handle_room_message (control->room, contact, message, hash, flags);
132
133 if (flags & GNUNET_MESSENGER_FLAG_RECENT)
134 update_room_last_message (control->room, hash);
135
136 callback_room_message (control->room, hash);
137}
138
139
140static void
141task_message_control (void *cls)
142{
143 GNUNET_assert (cls);
144
145 struct GNUNET_MESSENGER_MessageControlQueue *queue = cls;
146 struct GNUNET_MESSENGER_MessageControl *control = queue->control;
147
148 queue->task = NULL;
149
150 struct GNUNET_MESSENGER_Handle *handle = get_room_handle (control->room);
151 struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
152 handle);
153
154 struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw (
155 store, &(queue->context), &(queue->sender));
156
157 struct GNUNET_CONTAINER_MultiShortmap *map;
158 if (GNUNET_YES == is_peer_message (queue->message))
159 map = control->peer_messages;
160 else
161 map = control->member_messages;
162
163 GNUNET_CONTAINER_multishortmap_remove (map,
164 &(queue->message->header.sender_id),
165 queue);
166
167 GNUNET_CONTAINER_DLL_remove (control->head, control->tail, queue);
168
169 handle_message_control (control,
170 contact,
171 &(queue->hash),
172 queue->message,
173 queue->flags);
174
175 destroy_message (queue->message);
176
177 GNUNET_free (queue);
178}
179
180
181static enum GNUNET_GenericReturnValue
182iterate_message_control (void *cls,
183 const struct GNUNET_ShortHashCode *key,
184 void *value)
185{
186 GNUNET_assert ((cls) && (key) && (value));
187
188 struct GNUNET_MESSENGER_MessageControlQueue *queue = value;
189
190 if (queue->task)
191 return GNUNET_YES;
192
193 queue->task = GNUNET_SCHEDULER_add_now (task_message_control, queue);
194 return GNUNET_YES;
195}
196
197
198void
199process_message_control (struct GNUNET_MESSENGER_MessageControl *control,
200 const struct GNUNET_HashCode *sender,
201 const struct GNUNET_HashCode *context,
202 const struct GNUNET_HashCode *hash,
203 const struct GNUNET_MESSENGER_Message *message,
204 enum GNUNET_MESSENGER_MessageFlags flags)
205{
206 GNUNET_assert ((control) && (sender) && (context) && (hash) && (message));
207
208 struct GNUNET_MESSENGER_Handle *handle = get_room_handle (control->room);
209 struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
210 handle);
211
212 struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw (
213 store, context, sender);
214
215 if ((! contact) &&
216 (GNUNET_MESSENGER_KIND_JOIN != message->header.kind) &&
217 (GNUNET_MESSENGER_KIND_PEER != message->header.kind))
218 enqueue_message_control (control, sender, context, hash, message, flags);
219 else
220 handle_message_control (control, contact, hash, message, flags);
221
222 struct GNUNET_CONTAINER_MultiShortmap *map = NULL;
223 const struct GNUNET_ShortHashCode *id = &(message->header.sender_id);
224
225 switch (message->header.kind)
226 {
227 case GNUNET_MESSENGER_KIND_JOIN:
228 map = control->member_messages;
229 break;
230 case GNUNET_MESSENGER_KIND_PEER:
231 map = control->peer_messages;
232 break;
233 case GNUNET_MESSENGER_KIND_ID:
234 map = control->member_messages;
235 id = &(message->body.id.id);
236 break;
237 default:
238 break;
239 }
240
241 if (! map)
242 return;
243
244 GNUNET_CONTAINER_multishortmap_get_multiple (map,
245 id,
246 iterate_message_control,
247 NULL);
248}
diff --git a/src/service/messenger/messenger_api_message_control.h b/src/service/messenger/messenger_api_message_control.h
new file mode 100644
index 000000000..a990210f0
--- /dev/null
+++ b/src/service/messenger/messenger_api_message_control.h
@@ -0,0 +1,105 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 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 */
20/**
21 * @author Tobias Frisch
22 * @file src/messenger/messenger_api_message_control.h
23 * @brief messenger api: client and service implementation of GNUnet MESSENGER service
24 */
25
26#ifndef GNUNET_MESSENGER_API_MESSAGE_CONTROL_H
27#define GNUNET_MESSENGER_API_MESSAGE_CONTROL_H
28
29#include "gnunet_common.h"
30#include "gnunet_messenger_service.h"
31#include "gnunet_util_lib.h"
32
33struct GNUNET_MESSENGER_Message;
34struct GNUNET_MESSENGER_MessageControl;
35
36struct GNUNET_MESSENGER_MessageControlQueue
37{
38 struct GNUNET_MESSENGER_MessageControl *control;
39
40 struct GNUNET_HashCode sender;
41 struct GNUNET_HashCode context;
42 struct GNUNET_HashCode hash;
43
44 struct GNUNET_MESSENGER_Message *message;
45 enum GNUNET_MESSENGER_MessageFlags flags;
46 struct GNUNET_SCHEDULER_Task *task;
47
48 struct GNUNET_MESSENGER_MessageControlQueue *prev;
49 struct GNUNET_MESSENGER_MessageControlQueue *next;
50};
51
52struct GNUNET_MESSENGER_Room;
53
54struct GNUNET_MESSENGER_MessageControl
55{
56 struct GNUNET_MESSENGER_Room *room;
57
58 struct GNUNET_CONTAINER_MultiShortmap *peer_messages;
59 struct GNUNET_CONTAINER_MultiShortmap *member_messages;
60
61 struct GNUNET_MESSENGER_MessageControlQueue *head;
62 struct GNUNET_MESSENGER_MessageControlQueue *tail;
63};
64
65/**
66 * Creates and allocates a new message control for a <i>room</i> of the client API.
67 *
68 * @param[in,out] room Room
69 * @return New message control
70 */
71struct GNUNET_MESSENGER_MessageControl*
72create_message_control (struct GNUNET_MESSENGER_Room *room);
73
74/**
75 * Destroys a message control and frees its memory fully from the client API.
76 *
77 * @param[in,out] control Message control
78 */
79void
80destroy_message_control (struct GNUNET_MESSENGER_MessageControl *control);
81
82/**
83 * Processes a new <i>message</i> with its <i>hash</i> and regarding information about
84 * <i>sender</i>, <i>context</i> and message <i>flags</i> using a selected message
85 * <i>control</i>.
86 *
87 * The message control will ensure order of messages so that senders of messages
88 * can be identified via previously processed messages.
89 *
90 * @param[in,out] control Message control
91 * @param[in] sender Sender hash
92 * @param[in] context Context hash
93 * @param[in] hash Message hash
94 * @param[in] message Message
95 * @param[in] flags Message flags
96 */
97void
98process_message_control (struct GNUNET_MESSENGER_MessageControl *control,
99 const struct GNUNET_HashCode *sender,
100 const struct GNUNET_HashCode *context,
101 const struct GNUNET_HashCode *hash,
102 const struct GNUNET_MESSENGER_Message *message,
103 enum GNUNET_MESSENGER_MessageFlags flags);
104
105#endif //GNUNET_MESSENGER_API_MESSAGE_CONTROL_H \ No newline at end of file
diff --git a/src/service/messenger/messenger_api_message_kind.c b/src/service/messenger/messenger_api_message_kind.c
index 537d54708..33338af9d 100644
--- a/src/service/messenger/messenger_api_message_kind.c
+++ b/src/service/messenger/messenger_api_message_kind.c
@@ -19,8 +19,8 @@
19 */ 19 */
20/** 20/**
21 * @author Tobias Frisch 21 * @author Tobias Frisch
22 * @file src/messenger/gnunet-service-messenger_message_kind.c 22 * @file src/messenger/messenger_api_message_kind.c
23 * @brief GNUnet MESSENGER service 23 * @brief messenger api: client and service implementation of GNUnet MESSENGER service
24 */ 24 */
25 25
26#include "messenger_api_message_kind.h" 26#include "messenger_api_message_kind.h"
diff --git a/src/service/messenger/messenger_api_message_kind.h b/src/service/messenger/messenger_api_message_kind.h
index 97952d11f..a5bb12947 100644
--- a/src/service/messenger/messenger_api_message_kind.h
+++ b/src/service/messenger/messenger_api_message_kind.h
@@ -19,12 +19,12 @@
19 */ 19 */
20/** 20/**
21 * @author Tobias Frisch 21 * @author Tobias Frisch
22 * @file src/messenger/gnunet-service-messenger_message_kind.h 22 * @file src/messenger/messenger_api_message_kind.h
23 * @brief GNUnet MESSENGER service 23 * @brief messenger api: client and service implementation of GNUnet MESSENGER service
24 */ 24 */
25 25
26#ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H 26#ifndef GNUNET_MESSENGER_API_MESSAGE_KIND_H
27#define GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H 27#define GNUNET_MESSENGER_API_MESSAGE_KIND_H
28 28
29#include "gnunet_messenger_service.h" 29#include "gnunet_messenger_service.h"
30#include "gnunet_reclaim_lib.h" 30#include "gnunet_reclaim_lib.h"
@@ -136,4 +136,4 @@ create_message_delete (const struct GNUNET_HashCode *hash,
136struct GNUNET_MESSENGER_Message* 136struct GNUNET_MESSENGER_Message*
137create_message_ticket (const struct GNUNET_RECLAIM_Identifier *identifier); 137create_message_ticket (const struct GNUNET_RECLAIM_Identifier *identifier);
138 138
139#endif //GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H 139#endif //GNUNET_MESSENGER_API_MESSAGE_KIND_H
diff --git a/src/service/messenger/messenger_api_room.c b/src/service/messenger/messenger_api_room.c
index 715934f1c..e1970b668 100644
--- a/src/service/messenger/messenger_api_room.c
+++ b/src/service/messenger/messenger_api_room.c
@@ -30,6 +30,7 @@
30#include "messenger_api_contact_store.h" 30#include "messenger_api_contact_store.h"
31#include "messenger_api_handle.h" 31#include "messenger_api_handle.h"
32#include "messenger_api_message.h" 32#include "messenger_api_message.h"
33#include "messenger_api_message_control.h"
33#include <string.h> 34#include <string.h>
34 35
35struct GNUNET_MESSENGER_Room* 36struct GNUNET_MESSENGER_Room*
@@ -60,6 +61,8 @@ create_room (struct GNUNET_MESSENGER_Handle *handle,
60 61
61 init_queue_messages (&(room->queue)); 62 init_queue_messages (&(room->queue));
62 63
64 room->control = create_message_control (room);
65
63 return room; 66 return room;
64} 67}
65 68
@@ -94,6 +97,8 @@ destroy_room (struct GNUNET_MESSENGER_Room *room)
94{ 97{
95 GNUNET_assert (room); 98 GNUNET_assert (room);
96 99
100 destroy_message_control (room->control);
101
97 clear_queue_messages (&(room->queue)); 102 clear_queue_messages (&(room->queue));
98 clear_list_tunnels (&(room->entries)); 103 clear_list_tunnels (&(room->entries));
99 104
@@ -138,6 +143,15 @@ is_room_available (const struct GNUNET_MESSENGER_Room *room)
138} 143}
139 144
140 145
146struct GNUNET_MESSENGER_Handle*
147get_room_handle (struct GNUNET_MESSENGER_Room *room)
148{
149 GNUNET_assert (room);
150
151 return room->handle;
152}
153
154
141const struct GNUNET_ShortHashCode* 155const struct GNUNET_ShortHashCode*
142get_room_sender_id (const struct GNUNET_MESSENGER_Room *room) 156get_room_sender_id (const struct GNUNET_MESSENGER_Room *room)
143{ 157{
diff --git a/src/service/messenger/messenger_api_room.h b/src/service/messenger/messenger_api_room.h
index 4a7f6d6a2..f8460f4e1 100644
--- a/src/service/messenger/messenger_api_room.h
+++ b/src/service/messenger/messenger_api_room.h
@@ -32,8 +32,10 @@
32 32
33#include "gnunet_messenger_service.h" 33#include "gnunet_messenger_service.h"
34 34
35#include "messenger_api_handle.h"
35#include "messenger_api_list_tunnels.h" 36#include "messenger_api_list_tunnels.h"
36#include "messenger_api_contact.h" 37#include "messenger_api_contact.h"
38#include "messenger_api_message_control.h"
37#include "messenger_api_queue_messages.h" 39#include "messenger_api_queue_messages.h"
38 40
39struct GNUNET_MESSENGER_RoomMessageEntry 41struct GNUNET_MESSENGER_RoomMessageEntry
@@ -66,6 +68,8 @@ struct GNUNET_MESSENGER_Room
66 struct GNUNET_CONTAINER_MultiHashMap *links; 68 struct GNUNET_CONTAINER_MultiHashMap *links;
67 69
68 struct GNUNET_MESSENGER_QueueMessages queue; 70 struct GNUNET_MESSENGER_QueueMessages queue;
71
72 struct GNUNET_MESSENGER_MessageControl *control;
69}; 73};
70 74
71typedef void (*GNUNET_MESSENGER_RoomLinkDeletion) (struct 75typedef void (*GNUNET_MESSENGER_RoomLinkDeletion) (struct
@@ -104,6 +108,15 @@ enum GNUNET_GenericReturnValue
104is_room_available (const struct GNUNET_MESSENGER_Room *room); 108is_room_available (const struct GNUNET_MESSENGER_Room *room);
105 109
106/** 110/**
111 * Returns the messenger handle of the <i>room</i>.
112 *
113 * @param[in,out] room Room
114 * @return Messenger handle or NULL
115 */
116struct GNUNET_MESSENGER_Handle*
117get_room_handle (struct GNUNET_MESSENGER_Room *room);
118
119/**
107 * Returns the member id of the <i>room</i>'s sender. 120 * Returns the member id of the <i>room</i>'s sender.
108 * 121 *
109 * @param[in] room Room 122 * @param[in] room Room