1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* soup-session-async.c
*
* Copyright (C) 2000-2003, Ximian, Inc.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "soup-session-async.h"
#include "soup.h"
#include "soup-session-private.h"
#include "soup-message-private.h"
#include "soup-message-queue.h"
#include "soup-misc-private.h"
/**
* SECTION:soup-session-async
* @short_description: SoupSession for asynchronous (main-loop-based) I/O
* (deprecated).
*
* #SoupSessionAsync is an implementation of #SoupSession that uses
* non-blocking I/O via the glib main loop for all I/O.
*
* Deprecated: 2.42: Use the #SoupSession class (which uses both asynchronous
* and synchronous I/O, depending on the API used). See the
* <link linkend="libsoup-session-porting">porting guide</link>.
**/
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
G_DEFINE_TYPE (SoupSessionAsync, soup_session_async, SOUP_TYPE_SESSION)
static void
soup_session_async_init (SoupSessionAsync *sa)
{
}
/**
* soup_session_async_new:
*
* Creates an asynchronous #SoupSession with the default options.
*
* Return value: the new session.
*
* Deprecated: #SoupSessionAsync is deprecated; use a plain
* #SoupSession, created with soup_session_new(). See the <link
* linkend="libsoup-session-porting">porting guide</link>.
**/
SoupSession *
soup_session_async_new (void)
{
return g_object_new (SOUP_TYPE_SESSION_ASYNC, NULL);
}
/**
* soup_session_async_new_with_options:
* @optname1: name of first property to set
* @...: value of @optname1, followed by additional property/value pairs
*
* Creates an asynchronous #SoupSession with the specified options.
*
* Return value: the new session.
*
* Deprecated: #SoupSessionAsync is deprecated; use a plain
* #SoupSession, created with soup_session_new_with_options(). See the
* <link linkend="libsoup-session-porting">porting guide</link>.
**/
SoupSession *
soup_session_async_new_with_options (const char *optname1, ...)
{
SoupSession *session;
va_list ap;
va_start (ap, optname1);
session = (SoupSession *)g_object_new_valist (SOUP_TYPE_SESSION_ASYNC,
optname1, ap);
va_end (ap);
return session;
}
static guint
soup_session_async_send_message (SoupSession *session, SoupMessage *msg)
{
SoupMessageQueueItem *item;
GMainContext *async_context =
soup_session_get_async_context (session);
item = soup_session_append_queue_item (session, msg, TRUE, FALSE,
NULL, NULL);
soup_session_kick_queue (session);
while (item->state != SOUP_MESSAGE_FINISHED)
g_main_context_iteration (async_context, TRUE);
soup_message_queue_item_unref (item);
return msg->status_code;
}
static void
soup_session_async_cancel_message (SoupSession *session, SoupMessage *msg,
guint status_code)
{
SoupMessageQueue *queue;
SoupMessageQueueItem *item;
SOUP_SESSION_CLASS (soup_session_async_parent_class)->
cancel_message (session, msg, status_code);
queue = soup_session_get_queue (session);
item = soup_message_queue_lookup (queue, msg);
if (!item)
return;
/* Force it to finish immediately, so that
* soup_session_abort (session); g_object_unref (session);
* will work. (The soup_session_cancel_message() docs
* point out that the callback will be invoked from
* within the cancel call.)
*/
if (soup_message_io_in_progress (msg))
soup_message_io_finished (msg);
else if (item->state != SOUP_MESSAGE_FINISHED)
item->state = SOUP_MESSAGE_FINISHING;
if (item->state != SOUP_MESSAGE_FINISHED)
soup_session_process_queue_item (session, item, NULL, FALSE);
soup_message_queue_item_unref (item);
}
static void
soup_session_async_class_init (SoupSessionAsyncClass *soup_session_async_class)
{
SoupSessionClass *session_class = SOUP_SESSION_CLASS (soup_session_async_class);
/* virtual method override */
session_class->send_message = soup_session_async_send_message;
session_class->cancel_message = soup_session_async_cancel_message;
}
G_GNUC_END_IGNORE_DEPRECATIONS;
|