typedef struct {
GSource source;
SoupMessage *msg;
+ gboolean paused;
} SoupMessageSource;
static gboolean
-message_source_prepare (GSource *source,
- gint *timeout)
+message_source_check (GSource *source)
{
- *timeout = -1;
- return FALSE;
+ SoupMessageSource *message_source = (SoupMessageSource *)source;
+
+ if (message_source->paused) {
+ SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (message_source->msg);
+ SoupMessageIOData *io = priv->io_data;
+
+ if (!io || io->paused)
+ return FALSE;
+ else
+ return TRUE;
+ } else
+ return FALSE;
}
static gboolean
-message_source_check (GSource *source)
+message_source_prepare (GSource *source,
+ gint *timeout)
{
- return FALSE;
+ *timeout = -1;
+ return message_source_check (source);
}
static gboolean
GSource *base_source, *source;
SoupMessageSource *message_source;
- if (io && SOUP_MESSAGE_IO_STATE_POLLABLE (io->read_state)) {
+ if (!io) {
+ base_source = g_timeout_source_new (0);
+ } else if (io->paused) {
+ base_source = NULL;
+ } else if (SOUP_MESSAGE_IO_STATE_POLLABLE (io->read_state)) {
GPollableInputStream *istream;
if (io->body_istream)
else
istream = G_POLLABLE_INPUT_STREAM (io->istream);
base_source = g_pollable_input_stream_create_source (istream, cancellable);
- } else if (io && SOUP_MESSAGE_IO_STATE_POLLABLE (io->write_state)) {
+ } else if (SOUP_MESSAGE_IO_STATE_POLLABLE (io->write_state)) {
GPollableOutputStream *ostream;
if (io->body_ostream)
} else
base_source = g_timeout_source_new (0);
- g_source_set_dummy_callback (base_source);
source = g_source_new (&message_source_funcs,
sizeof (SoupMessageSource));
g_source_set_name (source, "SoupMessageSource");
message_source = (SoupMessageSource *)source;
message_source->msg = g_object_ref (msg);
+ message_source->paused = io && io->paused;
- g_source_add_child_source (source, base_source);
- g_source_unref (base_source);
+ if (base_source) {
+ g_source_set_dummy_callback (base_source);
+ g_source_add_child_source (source, base_source);
+ g_source_unref (base_source);
+ }
g_source_set_callback (source, (GSourceFunc) callback, user_data, NULL);
return source;
}
done = (io->read_state >= read_state &&
io->write_state >= write_state);
+ if (io->paused && !done) {
+ g_set_error_literal (error, G_IO_ERROR,
+ G_IO_ERROR_WOULD_BLOCK,
+ _("Operation would block"));
+ g_object_unref (msg);
+ return FALSE;
+ }
+
g_object_unref (msg);
return done;
}
g_return_if_fail (io != NULL);
+ if (io->item && io->item->new_api)
+ g_return_if_fail (io->read_state < SOUP_MESSAGE_IO_STATE_BODY);
+
if (io->io_source) {
g_source_destroy (io->io_source);
g_source_unref (io->io_source);
g_return_if_fail (io != NULL);
+ if (io->item && io->item->new_api) {
+ g_return_if_fail (io->read_state < SOUP_MESSAGE_IO_STATE_BODY);
+ io->paused = FALSE;
+ return;
+ }
+
if (!io->blocking) {
if (!io->unpause_source) {
io->unpause_source = soup_add_completion (
priv = SOUP_SESSION_GET_PRIVATE (session);
item = soup_message_queue_lookup (priv->queue, msg);
g_return_if_fail (item != NULL);
- g_return_if_fail (!item->new_api);
item->paused = TRUE;
if (item->state == SOUP_MESSAGE_RUNNING)
priv = SOUP_SESSION_GET_PRIVATE (session);
item = soup_message_queue_lookup (priv->queue, msg);
g_return_if_fail (item != NULL);
- g_return_if_fail (!item->new_api);
item->paused = FALSE;
if (item->state == SOUP_MESSAGE_RUNNING)