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.
65 * @param mvar variable to store the allocated message in;
66 * must have a header field
67 * @param mc message to concatenate, can be NULL
68 * @param type type of the message
69 * @return the MQ message, NULL if mc is to large to be concatenated
71 #define GNUNET_MQ_msg_concat(mvar, mc, t) GNUNET_MQ_msg_concat_(((void) mvar->header, (struct GNUNET_MessageHeader **) &(mvar)), \
72 sizeof *mvar, (struct GNUNET_MessageHeader *) mc, t)
76 * Allocate a GNUNET_MQ_Message, where the message only consists of a header.
77 * The allocated message will already have the type and size field set.
79 * @param mvar variable to store the allocated message in;
80 * must have a header field
81 * @param type type of the message
83 #define GNUNET_MQ_msg_header(type) GNUNET_MQ_msg_ (NULL, sizeof (struct GNUNET_MessageHeader), type)
87 * Allocate a GNUNET_MQ_Message, where the message only consists of a header and extra space.
88 * The allocated message will already have the type and size field set.
90 * @param mvar variable to store the allocated message in;
91 * must have a header field
92 * @param esize extra space to allocate after the message header
93 * @param type type of the message
95 #define GNUNET_MQ_msg_header_extra(mh, esize, type) GNUNET_MQ_msg_ (&mh, sizeof (struct GNUNET_MessageHeader), type)
99 * End-marker for the handlers array
101 #define GNUNET_MQ_HANDLERS_END {NULL, 0}
104 * Opaque handle to a message queue
106 struct GNUNET_MQ_MessageQueue;
109 * Opaque handle to an allocated message
111 struct GNUNET_MQ_Message;
114 * Called when a message has been received.
117 * @param msg the received message
119 typedef void (*GNUNET_MQ_MessageCallback) (void *cls, const struct GNUNET_MessageHeader *msg);
123 * Message handler for a specific message type.
125 struct GNUNET_MQ_Handler
128 * Callback, called every time a new message of
129 * the specified type has been receied.
131 GNUNET_MQ_MessageCallback cb;
134 * Type of the message we are interested in
140 * Callback used for notifications
144 typedef void (*GNUNET_MQ_NotifyCallback) (void *cls);
147 * Create a new message for MQ.
149 * @param mhp message header to store the allocated message header in, can be NULL
150 * @param size size of the message to allocate
151 * @param type type of the message, will be set in the allocated message
152 * @return the allocated MQ message
154 struct GNUNET_MQ_Message *
155 GNUNET_MQ_msg_ (struct GNUNET_MessageHeader **mhp, uint16_t size, uint16_t type);
159 * Create a new message for MQ, by concatenating another message
160 * after a message of the specified type.
162 * @retrn the allocated MQ message
164 struct GNUNET_MQ_Message *
165 GNUNET_MQ_msg_concat_ (struct GNUNET_MessageHeader **mhp, uint16_t base_size, struct GNUNET_MessageHeader *m, uint16_t type);
169 * Discard the message queue message, free all
170 * allocated resources. Must be called in the event
171 * that a message is created but should not actually be sent.
173 * @param mqm the message to discard
176 GNUNET_MQ_discard (struct GNUNET_MQ_Message *mqm);
180 * Send a message with the give message queue.
181 * May only be called once per message.
183 * @param mq message queue
184 * @param mqm the message to send.
187 GNUNET_MQ_send (struct GNUNET_MQ_MessageQueue *mq, struct GNUNET_MQ_Message *mqm);
191 * Cancel sending the message. Message must have been sent with GNUNET_MQ_send before.
192 * May not be called after the notify sent callback has been called
194 * @param mqm queued message to cancel
197 GNUNET_MQ_send_cancel (struct GNUNET_MQ_Message *mqm);
201 * Associate the assoc_data in mq with a unique request id.
203 * @param mq message queue, id will be unique for the queue
204 * @param mqm message to associate
205 * @param data to associate
208 GNUNET_MQ_assoc_add (struct GNUNET_MQ_MessageQueue *mq,
209 struct GNUNET_MQ_Message *mqm,
213 * Get the data associated with a request id in a queue
215 * @param mq the message queue with the association
216 * @param request_id the request id we are interested in
217 * @return the associated data
220 GNUNET_MQ_assoc_get (struct GNUNET_MQ_MessageQueue *mq, uint32_t request_id);
224 * Remove the association for a request id
226 * @param mq the message queue with the association
227 * @param request_id the request id we want to remove
228 * @return the associated data
231 GNUNET_MQ_assoc_remove (struct GNUNET_MQ_MessageQueue *mq, uint32_t request_id);
236 * Create a message queue for a GNUNET_CLIENT_Connection.
237 * If handlers are specfied, receive messages from the connection.
239 * @param connection the client connection
240 * @param handlers handlers for receiving messages
241 * @param cls closure for the handlers
242 * @return the message queue
244 struct GNUNET_MQ_MessageQueue *
245 GNUNET_MQ_queue_for_connection_client (struct GNUNET_CLIENT_Connection *connection,
246 const struct GNUNET_MQ_Handler *handlers,
251 * Create a message queue for a GNUNET_STREAM_Socket.
253 * @param param client the client
254 * @return the message queue
256 struct GNUNET_MQ_MessageQueue *
257 GNUNET_MQ_queue_for_server_client (struct GNUNET_SERVER_Client *client);
262 * Create a message queue for a GNUNET_STREAM_Socket.
263 * If handlers are specfied, receive messages from the stream socket.
265 * @param socket the stream socket
266 * @param handlers handlers for receiving messages
267 * @param cls closure for the handlers
268 * @return the message queue
270 struct GNUNET_MQ_MessageQueue *
271 GNUNET_MQ_queue_for_stream_socket (struct GNUNET_STREAM_Socket *socket,
272 const struct GNUNET_MQ_Handler *handlers,
276 * Replace the handlers of a message queue with new handlers.
277 * Takes effect immediately, even for messages that already have been received, but for
278 * with the handler has not been called.
280 * @param mq message queue
281 * @param new_handlers new handlers
282 * @param cls new closure for the handlers
285 GNUNET_MQ_replace_handlers (struct GNUNET_MQ_MessageQueue *mq,
286 const struct GNUNET_MQ_Handler *new_handlers,
292 * Call a callback once the message has been sent, that is, the message
293 * can not be canceled anymore.
294 * There can be only one notify sent callback per message.
296 * @param mqm message to call the notify callback for
297 * @param cb the notify callback
298 * @param cls closure for the callback
301 GNUNET_MQ_notify_sent (struct GNUNET_MQ_Message *mqm,
302 GNUNET_MQ_NotifyCallback cb,
307 * Destroy the message queue.
309 * @param mq message queue to destroy
312 GNUNET_MQ_destroy (struct GNUNET_MQ_MessageQueue *mq);