/**
- * Implementation of the GNUNET_MQ_extract_nexted_mh macro.
+ * Implementation of the #GNUNET_MQ_extract_nexted_mh macro.
*
* @param mh message header to extract nested message header from
* @param base_size size of the message before the nested message's header appears
uint16_t base_size);
+/**
+ * Opaque handle to an envelope.
+ */
+struct GNUNET_MQ_Envelope;
+
+
/**
* Implementation of the #GNUNET_MQ_msg_nested_mh macro.
*
*/
struct GNUNET_MQ_Handle;
-/**
- * Opaque handle to an envelope.
- */
-struct GNUNET_MQ_Envelope;
-
/**
* Error codes for the queue.
/**
* End-marker for the handlers array
*/
-#define GNUNET_MQ_handler_end() {NULL, NULL, NULL, 0, 0}
+#define GNUNET_MQ_handler_end() { NULL, NULL, NULL, 0, 0 }
/**
* const struct GNUNET_MessageTest *msg)
* { ... }
*
- * GNUNET_MQ_hd_fixed_size(test_message,
- * GNUNET_MESSAGE_TYPE_TEST,
- * struct GNUNET_MessageTest);
* struct GNUNET_MQ_MessageHandler handlers[] = {
- * make_test_message_handler (),
+ * GNUNET_MQ_hd_fixed_size(test_message,
+ * GNUNET_MESSAGE_TYPE_TEST,
+ * struct GNUNET_MessageTest,
+ * "context"),
* GNUNET_MQ_handler_end()
* };
*
* @param name unique basename for the functions
* @param code message type constant
* @param str type of the message (a struct)
+ * @param ctx context for the callbacks
*/
-#define GNUNET_MQ_hd_fixed_size(name,code,str) \
- struct GNUNET_MQ_MessageHandler \
- make_##name##_handler (void *cls) { \
- void (*cb)(void *cls, const str *msg) = &handle_##name; \
- struct GNUNET_MQ_MessageHandler mh = { \
- NULL, (GNUNET_MQ_MessageCallback) cb, \
- cls, code, sizeof (str) }; \
- return mh; \
- }
+#define GNUNET_MQ_hd_fixed_size(name,code,str,ctx) \
+ ({ \
+ void (*_cb)(void *cls, const str *msg) = &handle_##name; \
+ ((struct GNUNET_MQ_MessageHandler) { \
+ NULL, (GNUNET_MQ_MessageCallback) _cb, \
+ (ctx), (code), sizeof (str) }); \
+ })
/**
* The macro is to be used as follows:
* <code>
* struct GNUNET_MessageTest { ... }; // can be variable size
- * GNUNET_MQ_hd_var_size(test_message,
- * GNUNET_MESSAGE_TYPE_TEST,
- * struct GNUNET_MessageTest);
* static int
* check_test (void *cls,
* const struct GNUNET_MessageTest *msg)
* }
*
* struct GNUNET_MQ_MessageHandler handlers[] = {
- * make_test_message_handler ("context"),
+ * GNUNET_MQ_hd_var_size(test_message,
+ * GNUNET_MESSAGE_TYPE_TEST,
+ * struct GNUNET_MessageTest,
+ * "context"),
* GNUNET_MQ_handler_end()
* };
*
* @param name unique basename for the functions
* @param code message type constant
* @param str type of the message (a struct)
+ * @param ctx context for the callbacks
*/
-#define GNUNET_MQ_hd_var_size(name,code,str) \
- struct GNUNET_MQ_MessageHandler \
- make_##name##_handler (void *ctx) { \
- int (*mv)(void *cls, const str *msg) = &check_##name; \
- void (*cb)(void *cls, const str *msg) = &handle_##name;\
- struct GNUNET_MQ_MessageHandler mh = \
- { (GNUNET_MQ_MessageValidationCallback) mv, \
- (GNUNET_MQ_MessageCallback) cb, \
- ctx, code, sizeof (str) }; \
- return mh; \
- }
+#define GNUNET_MQ_hd_var_size(name,code,str,ctx) \
+ ({ \
+ int (*_mv)(void *cls, const str *msg) = &check_##name; \
+ void (*_cb)(void *cls, const str *msg) = &handle_##name; \
+ ((struct GNUNET_MQ_MessageHandler) \
+ { (GNUNET_MQ_MessageValidationCallback) _mv, \
+ (GNUNET_MQ_MessageCallback) _cb, \
+ (ctx), (code), sizeof (str) }); \
+ })
/**
uint16_t type);
+/**
+ * Create a new envelope by copying an existing message.
+ *
+ * @param hdr header of the message to copy
+ * @return envelope containing @a hdr
+ */
+struct GNUNET_MQ_Envelope *
+GNUNET_MQ_msg_copy (const struct GNUNET_MessageHeader *hdr);
+
+
/**
* Discard the message queue message, free all
* allocated resources. Must be called in the event
/**
- * Send a message with the give message queue.
+ * Function to obtain the current envelope
+ * from within #GNUNET_MQ_SendImpl implementations.
+ *
+ * @param mq message queue to interrogate
+ * @return the current envelope
+ */
+struct GNUNET_MQ_Envelope *
+GNUNET_MQ_get_current_envelope (struct GNUNET_MQ_Handle *mq);
+
+
+/**
+ * Function to obtain the last envelope in the queue.
+ *
+ * @param mq message queue to interrogate
+ * @return the last envelope in the queue
+ */
+struct GNUNET_MQ_Envelope *
+GNUNET_MQ_get_last_envelope (struct GNUNET_MQ_Handle *mq);
+
+
+/**
+ * Set application-specific options for this envelope.
+ * Overrides the options set for the queue with
+ * #GNUNET_MQ_set_options() for this message only.
+ *
+ * @param env message to set options for
+ * @param flags flags to use (meaning is queue-specific)
+ * @param extra additional buffer for further data (also queue-specific)
+ */
+void
+GNUNET_MQ_env_set_options (struct GNUNET_MQ_Envelope *env,
+ uint64_t flags,
+ const void *extra);
+
+
+/**
+ * Get application-specific options for this envelope.
+ *
+ * @param env message to set options for
+ * @param[out] flags set to flags to use (meaning is queue-specific)
+ * @return extra additional buffer for further data (also queue-specific)
+ */
+const void *
+GNUNET_MQ_env_get_options (struct GNUNET_MQ_Envelope *env,
+ uint64_t *flags);
+
+
+/**
+ * Set application-specific options for this queue.
+ *
+ * @param mq message queue to set options for
+ * @param flags flags to use (meaning is queue-specific)
+ * @param extra additional buffer for further data (also queue-specific)
+ */
+void
+GNUNET_MQ_set_options (struct GNUNET_MQ_Handle *mq,
+ uint64_t flags,
+ const void *extra);
+
+
+/**
+ * Obtain the current length of the message queue.
+ *
+ * @param mq queue to inspect
+ * @return number of queued, non-transmitted messages
+ */
+unsigned int
+GNUNET_MQ_get_length (struct GNUNET_MQ_Handle *mq);
+
+
+/**
+ * Send a message with the given message queue.
* May only be called once per message.
*
* @param mq message queue
struct GNUNET_MQ_Envelope *ev);
+/**
+ * Send a copy of a message with the given message queue.
+ * Can be called repeatedly on the same envelope.
+ *
+ * @param mq message queue
+ * @param ev the envelope with the message to send.
+ */
+void
+GNUNET_MQ_send_copy (struct GNUNET_MQ_Handle *mq,
+ const struct GNUNET_MQ_Envelope *ev);
+
+
/**
* Cancel sending the message. Message must have been sent with
* #GNUNET_MQ_send before. May not be called after the notify sent
void *cls);
+/**
+ * Change the closure argument in all of the `handlers` of the
+ * @a mq.
+ *
+ * @param mq to modify
+ * @param handlers_cls new closure to use
+ */
+void
+GNUNET_MQ_set_handlers_closure (struct GNUNET_MQ_Handle *mq,
+ void *handlers_cls);
+
+
/**
* Call a callback once the envelope has been sent, that is,
* sending it can not be canceled anymore.