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
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* soup-session-sync.c
*
* Copyright (C) 2000-2003, Ximian, Inc.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "soup-session-sync.h"
#include "soup.h"
#include "soup-session-private.h"
#include "soup-message-private.h"
#include "soup-message-queue.h"
/**
* SECTION:soup-session-sync
* @short_description: (Deprecated) SoupSession for blocking I/O in
* multithreaded programs.
*
* #SoupSessionSync is an implementation of #SoupSession that uses
* synchronous I/O, intended for use in multi-threaded programs.
*
* As of libsoup 2.42, this is deprecated in favor of the plain
* #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_DEFINE_TYPE (SoupSessionSync, soup_session_sync, SOUP_TYPE_SESSION)
static void
soup_session_sync_init (SoupSessionSync *ss)
{
}
/**
* soup_session_sync_new:
*
* Creates an synchronous #SoupSession with the default options.
*
* Return value: the new session.
*
* Deprecated: #SoupSessionSync is deprecated; use a plain
* #SoupSession, created with soup_session_new(). See the <link
* linkend="libsoup-session-porting">porting guide</link>.
**/
SoupSession *
soup_session_sync_new (void)
{
return g_object_new (SOUP_TYPE_SESSION_SYNC, NULL);
}
/**
* soup_session_sync_new_with_options:
* @optname1: name of first property to set
* @...: value of @optname1, followed by additional property/value pairs
*
* Creates an synchronous #SoupSession with the specified options.
*
* Return value: the new session.
*
* Deprecated: #SoupSessionSync 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_sync_new_with_options (const char *optname1, ...)
{
SoupSession *session;
va_list ap;
va_start (ap, optname1);
session = (SoupSession *)g_object_new_valist (SOUP_TYPE_SESSION_SYNC,
optname1, ap);
va_end (ap);
return session;
}
static gboolean
queue_message_callback (gpointer data)
{
SoupMessageQueueItem *item = data;
item->callback (item->session, item->msg, item->callback_data);
soup_message_queue_item_unref (item);
return FALSE;
}
static gpointer
queue_message_thread (gpointer data)
{
SoupMessageQueueItem *item = data;
soup_session_process_queue_item (item->session, item, NULL, TRUE);
if (item->callback) {
soup_add_completion (soup_session_get_async_context (item->session),
queue_message_callback, item);
} else
soup_message_queue_item_unref (item);
return NULL;
}
static void
soup_session_sync_queue_message (SoupSession *session, SoupMessage *msg,
SoupSessionCallback callback, gpointer user_data)
{
SoupMessageQueueItem *item;
GThread *thread;
item = soup_session_append_queue_item (session, msg, FALSE, FALSE,
callback, user_data);
thread = g_thread_new ("SoupSessionSync:queue_message",
queue_message_thread, item);
g_thread_unref (thread);
}
static void
soup_session_sync_class_init (SoupSessionSyncClass *session_sync_class)
{
SoupSessionClass *session_class = SOUP_SESSION_CLASS (session_sync_class);
/* virtual method override */
session_class->queue_message = soup_session_sync_queue_message;
}
|