SoupURI *proxy_uri;
SoupConnection *conn;
- guint redirection_count;
+ guint paused : 1;
+ guint redirection_count : 31;
SoupMessageQueueItemState state;
static guint send_message (SoupSession *session, SoupMessage *req);
static void cancel_message (SoupSession *session, SoupMessage *msg,
guint status_code);
+static void kick (SoupSession *session);
static void auth_required (SoupSession *session, SoupMessage *msg,
SoupAuth *auth, gboolean retrying);
session_class->send_message = send_message;
session_class->cancel_message = cancel_message;
session_class->auth_required = auth_required;
+ session_class->kick = kick;
object_class->finalize = finalize;
}
SoupProxyURIResolver *proxy_resolver;
do {
+ if (item->paused)
+ return;
+
switch (item->state) {
case SOUP_MESSAGE_STARTING:
proxy_resolver = (SoupProxyURIResolver *)soup_session_get_feature_for_message (session, SOUP_TYPE_PROXY_URI_RESOLVER, item->msg);
auth_required (session, msg, auth, retrying);
}
}
+
+static void
+kick (SoupSession *session)
+{
+ do_idle_run_queue (session);
+}
static void auth_required (SoupSession *session, SoupMessage *msg,
SoupAuth *auth, gboolean retrying);
static void flush_queue (SoupSession *session);
+static void kick (SoupSession *session);
G_DEFINE_TYPE (SoupSessionSync, soup_session_sync, SOUP_TYPE_SESSION)
session_class->cancel_message = cancel_message;
session_class->auth_required = auth_required;
session_class->flush_queue = flush_queue;
+ session_class->kick = kick;
object_class->finalize = finalize;
}
item->state = SOUP_MESSAGE_STARTING;
do {
+ if (item->paused) {
+ g_mutex_lock (priv->lock);
+ while (item->paused)
+ g_cond_wait (priv->cond, priv->lock);
+ g_mutex_unlock (priv->lock);
+ }
+
switch (item->state) {
case SOUP_MESSAGE_STARTING:
proxy_resolver = (SoupProxyURIResolver *)soup_session_get_feature_for_message (session, SOUP_TYPE_PROXY_URI_RESOLVER, msg);
g_hash_table_destroy (current);
}
+
+static void
+kick (SoupSession *session)
+{
+ SoupSessionSyncPrivate *priv = SOUP_SESSION_SYNC_GET_PRIVATE (session);
+
+ g_mutex_lock (priv->lock);
+ g_cond_broadcast (priv->cond);
+ g_mutex_unlock (priv->lock);
+}
soup_session_pause_message (SoupSession *session,
SoupMessage *msg)
{
+ SoupSessionPrivate *priv;
+ SoupMessageQueueItem *item;
+
g_return_if_fail (SOUP_IS_SESSION (session));
g_return_if_fail (SOUP_IS_MESSAGE (msg));
- soup_message_io_pause (msg);
+ priv = SOUP_SESSION_GET_PRIVATE (session);
+ item = soup_message_queue_lookup (priv->queue, msg);
+ g_return_if_fail (item != NULL);
+
+ item->paused = TRUE;
+ if (item->state == SOUP_MESSAGE_RUNNING)
+ soup_message_io_pause (msg);
+ soup_message_queue_item_unref (item);
}
/**
soup_session_unpause_message (SoupSession *session,
SoupMessage *msg)
{
+ SoupSessionPrivate *priv;
+ SoupMessageQueueItem *item;
+
g_return_if_fail (SOUP_IS_SESSION (session));
g_return_if_fail (SOUP_IS_MESSAGE (msg));
- soup_message_io_unpause (msg);
+ priv = SOUP_SESSION_GET_PRIVATE (session);
+ item = soup_message_queue_lookup (priv->queue, msg);
+ g_return_if_fail (item != NULL);
+
+ item->paused = FALSE;
+ if (item->state == SOUP_MESSAGE_RUNNING)
+ soup_message_io_unpause (msg);
+ soup_message_queue_item_unref (item);
+
+ SOUP_SESSION_GET_CLASS (session)->kick (session);
}
void (*flush_queue) (SoupSession *session);
+ void (*kick) (SoupSession *session);
+
/* Padding for future expansion */
- void (*_libsoup_reserved3) (void);
void (*_libsoup_reserved4) (void);
} SoupSessionClass;