/src/libsoup/libsoup/http1/soup-message-io-source.c
Line | Count | Source |
1 | | /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ |
2 | | /* |
3 | | * soup-message-io-source.c |
4 | | * |
5 | | * Copyright (C) 2000-2003, Ximian, Inc. |
6 | | * Copyright (C) 2021 Igalia S.L. |
7 | | */ |
8 | | |
9 | | #ifdef HAVE_CONFIG_H |
10 | | #include "config.h" |
11 | | #endif |
12 | | |
13 | | #include "soup-message-io-source.h" |
14 | | |
15 | | static gboolean |
16 | | message_io_source_prepare (GSource *source, |
17 | | gint *timeout) |
18 | 0 | { |
19 | 0 | SoupMessageIOSource *message_io_source = (SoupMessageIOSource *)source; |
20 | 0 | *timeout = -1; |
21 | 0 | return message_io_source->check_func (source); |
22 | 0 | } |
23 | | |
24 | | static gboolean |
25 | | message_io_source_dispatch (GSource *source, |
26 | | GSourceFunc callback, |
27 | | gpointer user_data) |
28 | 0 | { |
29 | 0 | SoupMessageIOSourceFunc func = (SoupMessageIOSourceFunc)callback; |
30 | 0 | SoupMessageIOSource *message_io_source = (SoupMessageIOSource *)source; |
31 | |
|
32 | 0 | return (*func) (message_io_source->msg, user_data); |
33 | 0 | } |
34 | | |
35 | | static void |
36 | | message_io_source_finalize (GSource *source) |
37 | 0 | { |
38 | 0 | SoupMessageIOSource *message_io_source = (SoupMessageIOSource *)source; |
39 | |
|
40 | 0 | g_object_unref (message_io_source->msg); |
41 | 0 | } |
42 | | |
43 | | static gboolean |
44 | | message_io_source_closure_callback (SoupMessage *msg, |
45 | | gpointer data) |
46 | 0 | { |
47 | 0 | GClosure *closure = data; |
48 | 0 | GValue param = G_VALUE_INIT; |
49 | 0 | GValue result_value = G_VALUE_INIT; |
50 | 0 | gboolean result; |
51 | |
|
52 | 0 | g_value_init (&result_value, G_TYPE_BOOLEAN); |
53 | |
|
54 | 0 | g_value_init (¶m, SOUP_TYPE_MESSAGE); |
55 | 0 | g_value_set_object (¶m, msg); |
56 | |
|
57 | 0 | g_closure_invoke (closure, &result_value, 1, ¶m, NULL); |
58 | |
|
59 | 0 | result = g_value_get_boolean (&result_value); |
60 | 0 | g_value_unset (&result_value); |
61 | 0 | g_value_unset (¶m); |
62 | |
|
63 | 0 | return result; |
64 | 0 | } |
65 | | |
66 | | static GSourceFuncs message_io_source_funcs = |
67 | | { |
68 | | message_io_source_prepare, |
69 | | NULL, |
70 | | message_io_source_dispatch, |
71 | | message_io_source_finalize, |
72 | | (GSourceFunc)message_io_source_closure_callback, |
73 | | (GSourceDummyMarshal)g_cclosure_marshal_generic, |
74 | | }; |
75 | | |
76 | | GSource * |
77 | | soup_message_io_source_new (GSource *base_source, |
78 | | GObject *msg, |
79 | | gboolean paused, |
80 | | gboolean (*check_func) (GSource*)) |
81 | 0 | { |
82 | 0 | GSource *source = g_source_new (&message_io_source_funcs, sizeof (SoupMessageIOSource)); |
83 | 0 | g_source_set_name (source, "SoupMessageIOSource"); |
84 | 0 | SoupMessageIOSource *message_io_source = (SoupMessageIOSource *)source; |
85 | 0 | message_io_source->msg = g_object_ref (msg); |
86 | 0 | message_io_source->paused = paused; |
87 | 0 | message_io_source->check_func = check_func; |
88 | |
|
89 | 0 | if (base_source) { |
90 | 0 | g_source_set_dummy_callback (base_source); |
91 | 0 | g_source_add_child_source (source, base_source); |
92 | 0 | g_source_unref (base_source); |
93 | 0 | } |
94 | |
|
95 | 0 | return source; |
96 | 0 | } |