Coverage Report

Created: 2026-08-31 06:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 (&param, SOUP_TYPE_MESSAGE);
55
0
        g_value_set_object (&param, msg);
56
57
0
        g_closure_invoke (closure, &result_value, 1, &param, NULL);
58
59
0
        result = g_value_get_boolean (&result_value);
60
0
        g_value_unset (&result_value);
61
0
        g_value_unset (&param);
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
}