+/**
+ * Cancel sending the message. Message must have been sent with
+ * #GNUNET_MQ_send before. May not be called after the notify sent
+ * callback has been called
+ *
+ * @param ev queued envelope to cancel
+ */
+void
+GNUNET_MQ_send_cancel (struct GNUNET_MQ_Envelope *ev)
+{
+ struct GNUNET_MQ_Handle *mq = ev->parent_queue;
+
+ GNUNET_assert (NULL != mq);
+ GNUNET_assert (NULL != mq->cancel_impl);
+
+ if (mq->current_envelope == ev) {
+ // complex case, we already started with transmitting
+ // the message
+ mq->cancel_impl (mq, mq->impl_state);
+ // continue sending the next message, if any
+ if (NULL == mq->envelope_head)
+ {
+ mq->current_envelope = NULL;
+ }
+ else
+ {
+ mq->current_envelope = mq->envelope_head;
+ GNUNET_CONTAINER_DLL_remove (mq->envelope_head,
+ mq->envelope_tail,
+ mq->current_envelope);
+ mq->send_impl (mq, mq->current_envelope->mh, mq->impl_state);
+ }
+ } else {
+ // simple case, message is still waiting in the queue
+ GNUNET_CONTAINER_DLL_remove (mq->envelope_head, mq->envelope_tail, ev);
+ }
+
+ ev->parent_queue = NULL;
+ ev->mh = NULL;
+ GNUNET_free (ev);
+}
+
+/* end of mq.c */