guint status_code);
static void auth_required (SoupSession *session, SoupMessage *msg,
SoupAuth *auth, gboolean retrying);
+static void flush_queue (SoupSession *session);
G_DEFINE_TYPE (SoupSessionSync, soup_session_sync, SOUP_TYPE_SESSION)
session_class->send_message = send_message;
session_class->cancel_message = cancel_message;
session_class->auth_required = auth_required;
+ session_class->flush_queue = flush_queue;
+
object_class->finalize = finalize;
}
SOUP_SESSION_CLASS (soup_session_sync_parent_class)->
auth_required (session, msg, auth, retrying);
}
+
+static void
+flush_queue (SoupSession *session)
+{
+ SoupSessionSyncPrivate *priv = SOUP_SESSION_SYNC_GET_PRIVATE (session);
+ SoupMessageQueue *queue;
+ SoupMessageQueueItem *item;
+ GHashTable *current;
+ gboolean done = FALSE;
+
+ /* Record the current contents of the queue */
+ current = g_hash_table_new (NULL, NULL);
+ queue = soup_session_get_queue (session);
+ for (item = soup_message_queue_first (queue);
+ item;
+ item = soup_message_queue_next (queue, item))
+ g_hash_table_insert (current, item, item);
+
+ /* Cancel everything */
+ SOUP_SESSION_CLASS (soup_session_sync_parent_class)->flush_queue (session);
+
+ /* Wait until all of the items in @current have been removed
+ * from the queue. (This is not the same as "wait for the
+ * queue to be empty", because the app may queue new requests
+ * in response to the cancellation of the old ones. We don't
+ * try to cancel those requests as well, since we'd likely
+ * just end up looping forever.)
+ */
+ g_mutex_lock (priv->lock);
+ do {
+ done = TRUE;
+ for (item = soup_message_queue_first (queue);
+ item;
+ item = soup_message_queue_next (queue, item)) {
+ if (g_hash_table_lookup (current, item))
+ done = FALSE;
+ }
+
+ if (!done)
+ g_cond_wait (priv->cond, priv->lock);
+ } while (!done);
+ g_mutex_unlock (priv->lock);
+}
guint status_code);
static void auth_required (SoupSession *session, SoupMessage *msg,
SoupAuth *auth, gboolean retrying);
+static void flush_queue (SoupSession *session);
static void auth_manager_authenticate (SoupAuthManager *manager,
SoupMessage *msg, SoupAuth *auth,
session_class->requeue_message = requeue_message;
session_class->cancel_message = cancel_message;
session_class->auth_required = auth_required;
+ session_class->flush_queue = flush_queue;
/* virtual method override */
object_class->dispose = dispose;
*conns = g_slist_prepend (*conns, g_object_ref (conn));
}
+static void
+flush_queue (SoupSession *session)
+{
+ SoupSessionPrivate *priv = SOUP_SESSION_GET_PRIVATE (session);
+ SoupMessageQueueItem *item;
+
+ for (item = soup_message_queue_first (priv->queue);
+ item;
+ item = soup_message_queue_next (priv->queue, item)) {
+ soup_session_cancel_message (session, item->msg,
+ SOUP_STATUS_CANCELLED);
+ }
+}
+
/**
* soup_session_abort:
* @session: the session
soup_session_abort (SoupSession *session)
{
SoupSessionPrivate *priv;
- SoupMessageQueueItem *item;
GSList *conns, *c;
g_return_if_fail (SOUP_IS_SESSION (session));
priv = SOUP_SESSION_GET_PRIVATE (session);
- for (item = soup_message_queue_first (priv->queue);
- item;
- item = soup_message_queue_next (priv->queue, item)) {
- soup_session_cancel_message (session, item->msg,
- SOUP_STATUS_CANCELLED);
- }
+ SOUP_SESSION_GET_CLASS (session)->flush_queue (session);
/* Close all connections */
g_mutex_lock (priv->host_lock);
void (*auth_required) (SoupSession *session, SoupMessage *msg,
SoupAuth *auth, gboolean retrying);
+ void (*flush_queue) (SoupSession *session);
/* Padding for future expansion */
- void (*_libsoup_reserved2) (void);
void (*_libsoup_reserved3) (void);
void (*_libsoup_reserved4) (void);
} SoupSessionClass;