2 This file is part of GNUnet.
3 (C) 2012 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 2, or (at your
8 option) any later version.
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 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @author Florian Dold
24 * @brief general purpose request queue
30 #include "gnunet_common.h"
31 #include "gnunet_util_lib.h"
32 #include "gnunet_connection_lib.h"
33 #include "gnunet_server_lib.h"
34 #include "gnunet_stream_lib.h"
38 * Allocate a GNUNET_MQ_Message, with extra space allocated after the space needed
39 * by the message struct.
40 * The allocated message will already have the type and size field set.
42 * @param mvar variable to store the allocated message in;
43 * must have a header field
44 * @param esize extra space to allocate after the message
45 * @param type type of the message
46 * @return the MQ message
48 #define GNUNET_MQ_msg_extra(mvar, esize, type) GNUNET_MQ_msg_((((void)(mvar)->header), (struct GNUNET_MessageHeader**) &(mvar)), (esize) + sizeof *(mvar), (type))
51 * Allocate a GNUNET_MQ_Message.
52 * The allocated message will already have the type and size field set.
54 * @param mvar variable to store the allocated message in;
55 * must have a header field
56 * @param type type of the message
57 * @return the MQ message
59 #define GNUNET_MQ_msg(mvar, type) GNUNET_MQ_msg_extra(mvar, 0, type)
62 * Allocate a GNUNET_MQ_Message, and concatenate another message
63 * after the space needed by the message struct.
66 * @param mvar variable to store the allocated message in;
67 * must have a header field
68 * @param mc message to concatenate, can be NULL
69 * @param type type of the message
70 * @return the MQ message, NULL if mc is to large to be concatenated
72 #define GNUNET_MQ_msg_concat(mvar, mc, t) GNUNET_MQ_msg_concat_(((void) mvar->header, (struct GNUNET_MessageHeader **) &(mvar)), \
73 sizeof *mvar, (struct GNUNET_MessageHeader *) mc, t)
77 * Allocate a GNUNET_MQ_Message, where the message only consists of a header.
78 * The allocated message will already have the type and size field set.
80 * @param mvar variable to store the allocated message in;
81 * must have a header field
82 * @param type type of the message
84 #define GNUNET_MQ_msg_header(type) GNUNET_MQ_msg_ (NULL, sizeof (struct GNUNET_MessageHeader), type)
88 * Allocate a GNUNET_MQ_Message, where the message only consists of a header and extra space.
89 * The allocated message will already have the type and size field set.
91 * @param mvar variable to store the allocated message in;
92 * must have a header field
93 * @param esize extra space to allocate after the message header
94 * @param type type of the message
96 #define GNUNET_MQ_msg_header_extra(mh, esize, type) GNUNET_MQ_msg_ (&mh, sizeof (struct GNUNET_MessageHeader), type)
100 * End-marker for the handlers array
102 #define GNUNET_MQ_HANDLERS_END {NULL, 0}
105 * Opaque handle to a message queue
107 struct GNUNET_MQ_MessageQueue;
110 * Opaque handle to an allocated message
112 struct GNUNET_MQ_Message; // Entry (/ Request)
115 * Called when a message has been received.
118 * @param msg the received message
120 typedef void (*GNUNET_MQ_MessageCallback) (void *cls, const struct GNUNET_MessageHeader *msg);
124 * Message handler for a specific message type.
126 struct GNUNET_MQ_Handler
129 * Callback, called every time a new message of
130 * the specified type has been receied.
132 GNUNET_MQ_MessageCallback cb;
136 * Type of the message we are interested in
142 * Callback used for notifications
146 typedef void (*GNUNET_MQ_NotifyCallback) (void *cls);
149 * Create a new message for MQ.
151 * @param mhp message header to store the allocated message header in, can be NULL
152 * @param size size of the message to allocate
153 * @param type type of the message, will be set in the allocated message
154 * @return the allocated MQ message
156 struct GNUNET_MQ_Message *
157 GNUNET_MQ_msg_ (struct GNUNET_MessageHeader **mhp, uint16_t size, uint16_t type);
161 * Create a new message for MQ, by concatenating another message
162 * after a message of the specified type.
164 * @retrn the allocated MQ message
166 struct GNUNET_MQ_Message *
167 GNUNET_MQ_msg_concat_ (struct GNUNET_MessageHeader **mhp, uint16_t base_size, struct GNUNET_MessageHeader *m, uint16_t type);
171 * Discard the message queue message, free all
172 * allocated resources. Must be called in the event
173 * that a message is created but should not actually be sent.
175 * @param mqm the message to discard
178 GNUNET_MQ_discard (struct GNUNET_MQ_Message *mqm);
182 * Send a message with the give message queue.
183 * May only be called once per message.
185 * @param mq message queue
186 * @param mqm the message to send.
189 GNUNET_MQ_send (struct GNUNET_MQ_MessageQueue *mq, struct GNUNET_MQ_Message *mqm);
193 * Cancel sending the message. Message must have been sent with GNUNET_MQ_send before.
194 * May not be called after the notify sent callback has been called
196 * @param mqm queued message to cancel
199 GNUNET_MQ_send_cancel (struct GNUNET_MQ_Message *mqm);
203 * Associate the assoc_data in mq with a unique request id.
205 * @param mq message queue, id will be unique for the queue
206 * @param mqm message to associate
207 * @param data to associate
210 GNUNET_MQ_assoc_add (struct GNUNET_MQ_MessageQueue *mq,
211 struct GNUNET_MQ_Message *mqm,
215 * Get the data associated with a request id in a queue
217 * @param mq the message queue with the association
218 * @param request_id the request id we are interested in
219 * @return the associated data
222 GNUNET_MQ_assoc_get (struct GNUNET_MQ_MessageQueue *mq, uint32_t request_id);
226 * Remove the association for a request id
228 * @param mq the message queue with the association
229 * @param request_id the request id we want to remove
230 * @return the associated data
233 GNUNET_MQ_assoc_remove (struct GNUNET_MQ_MessageQueue *mq, uint32_t request_id);
238 * Create a message queue for a GNUNET_CLIENT_Connection.
239 * If handlers are specfied, receive messages from the connection.
241 * @param connection the client connection
242 * @param handlers handlers for receiving messages
243 * @param cls closure for the handlers
244 * @return the message queue
246 struct GNUNET_MQ_MessageQueue *
247 GNUNET_MQ_queue_for_connection_client (struct GNUNET_CLIENT_Connection *connection,
248 const struct GNUNET_MQ_Handler *handlers,
253 * Create a message queue for a GNUNET_STREAM_Socket.
255 * @param param client the client
256 * @return the message queue
258 struct GNUNET_MQ_MessageQueue *
259 GNUNET_MQ_queue_for_server_client (struct GNUNET_SERVER_Client *client);
264 * Create a message queue for a GNUNET_STREAM_Socket.
265 * If handlers are specfied, receive messages from the stream socket.
267 * @param socket the stream socket
268 * @param handlers handlers for receiving messages
269 * @param cls closure for the handlers
270 * @return the message queue
272 struct GNUNET_MQ_MessageQueue *
273 GNUNET_MQ_queue_for_stream_socket (struct GNUNET_STREAM_Socket *socket,
274 const struct GNUNET_MQ_Handler *handlers,
278 * Replace the handlers of a message queue with new handlers.
279 * Takes effect immediately, even for messages that already have been received, but for
280 * with the handler has not been called.
282 * @param mq message queue
283 * @param new_handlers new handlers
284 * @param cls new closure for the handlers
287 GNUNET_MQ_replace_handlers (struct GNUNET_MQ_MessageQueue *mq,
288 const struct GNUNET_MQ_Handler *new_handlers,
294 * Call a callback once the message has been sent, that is, the message
295 * can not be canceled anymore.
296 * There can be only one notify sent callback per message.
298 * @param mqm message to call the notify callback for
299 * @param cb the notify callback
300 * @param cls closure for the callback
303 GNUNET_MQ_notify_sent (struct GNUNET_MQ_Message *mqm,
304 GNUNET_MQ_NotifyCallback cb,
309 * Destroy the message queue.
311 * @param mq message queue to destroy
314 GNUNET_MQ_destroy (struct GNUNET_MQ_MessageQueue *mq);