Coverage Report

Created: 2025-11-09 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libsoup/libsoup/soup-session-feature.c
Line
Count
Source
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
2
/*
3
 * soup-session-feature.c: Miscellaneous session feature-provider interface
4
 *
5
 * Copyright (C) 2008 Red Hat, Inc.
6
 */
7
8
#ifdef HAVE_CONFIG_H
9
#include <config.h>
10
#endif
11
12
#include "soup-session-feature-private.h"
13
#include "soup.h"
14
#include "soup-message-private.h"
15
16
/**
17
 * SoupSessionFeature:
18
 *
19
 * Interface for miscellaneous [class@Session] features.
20
 *
21
 * [iface@SessionFeature] is the interface used by classes that extend
22
 * the functionality of a [class@Session]. Some features like HTTP
23
 * authentication handling are implemented internally via
24
 * [iface@SessionFeature]s. Other features can be added to the session
25
 * by the application. (Eg, [class@Logger], [class@CookieJar].)
26
 *
27
 * See [method@Session.add_feature], etc, to add a feature to a session.
28
 **/
29
30
/**
31
 * SoupSessionFeatureInterface:
32
 * @parent: The parent interface.
33
 * @attach: Perform setup when a feature is added to a session
34
 * @detach: Perform cleanup when a feature is removed from a session
35
 * @request_queued: Proxies the session's [signal@Session::request_queued] signal
36
 * @request_unqueued: Proxies the session's [signal@Session::request_unqueued] signal
37
 * @add_feature: adds a sub-feature to the main feature
38
 * @remove_feature: removes a sub-feature from the main feature
39
 * @has_feature: tests if the feature includes a sub-feature
40
 *
41
 * The interface implemented by [iface@SessionFeature]s.
42
 **/
43
44
0
G_DEFINE_INTERFACE (SoupSessionFeature, soup_session_feature, G_TYPE_OBJECT)
45
0
46
0
void
47
0
soup_session_feature_attach (SoupSessionFeature *feature,
48
0
           SoupSession        *session)
49
0
{
50
0
  SoupSessionFeatureInterface *iface;
51
52
0
  g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
53
0
  g_return_if_fail (SOUP_IS_SESSION (session));
54
55
0
  iface = SOUP_SESSION_FEATURE_GET_IFACE (feature);
56
0
  if (iface->attach)
57
0
    iface->attach (feature, session);
58
0
}
59
60
void
61
soup_session_feature_detach (SoupSessionFeature *feature,
62
           SoupSession        *session)
63
0
{
64
0
  SoupSessionFeatureInterface *iface;
65
66
0
  g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
67
0
  g_return_if_fail (SOUP_IS_SESSION (session));
68
69
0
  iface = SOUP_SESSION_FEATURE_GET_IFACE (feature);
70
0
  if (iface->detach)
71
0
    iface->detach (feature, session);
72
0
}
73
74
static void
75
soup_session_feature_default_init (SoupSessionFeatureInterface *iface)
76
0
{
77
0
}
78
79
void
80
soup_session_feature_request_queued (SoupSessionFeature *feature,
81
             SoupMessage        *msg)
82
0
{
83
0
  SoupSessionFeatureInterface *iface;
84
85
0
  g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
86
0
  g_return_if_fail (SOUP_IS_MESSAGE (msg));
87
88
0
  if (soup_message_disables_feature (msg, feature))
89
0
                return;
90
91
0
  iface = SOUP_SESSION_FEATURE_GET_IFACE (feature);
92
0
  if (iface->request_queued)
93
0
    iface->request_queued (feature, msg);
94
0
}
95
96
void
97
soup_session_feature_request_unqueued (SoupSessionFeature *feature,
98
               SoupMessage        *msg)
99
0
{
100
0
  SoupSessionFeatureInterface *iface;
101
102
0
  g_return_if_fail (SOUP_IS_SESSION_FEATURE (feature));
103
0
  g_return_if_fail (SOUP_IS_MESSAGE (msg));
104
105
0
  if (soup_message_disables_feature (msg, feature))
106
0
                return;
107
108
0
  iface = SOUP_SESSION_FEATURE_GET_IFACE (feature);
109
0
        if (iface->request_unqueued)
110
0
                iface->request_unqueued (feature, msg);
111
0
}
112
113
/**
114
 * soup_session_feature_add_feature:
115
 * @feature: the "base" feature
116
 * @type: the #GType of a "sub-feature"
117
 *
118
 * Adds a "sub-feature" of type @type to the base feature @feature.
119
 *
120
 * This is used for features that can be extended with multiple
121
 * different types. Eg, the authentication manager can be extended
122
 * with subtypes of [class@Auth].
123
 *
124
 * Returns: %TRUE if @feature accepted @type as a subfeature.
125
 */
126
gboolean
127
soup_session_feature_add_feature (SoupSessionFeature *feature,
128
          GType               type)
129
0
{
130
0
  SoupSessionFeatureInterface *feature_iface =
131
0
              SOUP_SESSION_FEATURE_GET_IFACE (feature);
132
133
0
  if (feature_iface->add_feature)
134
0
    return feature_iface->add_feature (feature, type);
135
0
  else
136
0
    return FALSE;
137
0
}
138
139
/**
140
 * soup_session_feature_remove_feature:
141
 * @feature: the "base" feature
142
 * @type: the #GType of a "sub-feature"
143
 *
144
 * Removes the "sub-feature" of type @type from the base feature
145
 * @feature.
146
 *
147
 * See [method@SessionFeature.add_feature].
148
 *
149
 * Returns: %TRUE if @type was removed from @feature
150
 */
151
gboolean
152
soup_session_feature_remove_feature (SoupSessionFeature *feature,
153
             GType               type)
154
0
{
155
0
  SoupSessionFeatureInterface *feature_iface =
156
0
              SOUP_SESSION_FEATURE_GET_IFACE (feature);
157
158
0
  if (feature_iface->remove_feature)
159
0
    return feature_iface->remove_feature (feature, type);
160
0
  else
161
0
    return FALSE;
162
0
}
163
164
/**
165
 * soup_session_feature_has_feature:
166
 * @feature: the "base" feature
167
 * @type: the #GType of a "sub-feature"
168
 *
169
 * Tests if @feature has a "sub-feature" of type @type.
170
 *
171
 * See [method@SessionFeature.add_feature].
172
 *
173
 * Returns: %TRUE if @feature has a subfeature of type @type
174
 */
175
gboolean
176
soup_session_feature_has_feature (SoupSessionFeature *feature,
177
          GType               type)
178
0
{
179
0
  SoupSessionFeatureInterface *feature_iface =
180
0
              SOUP_SESSION_FEATURE_GET_IFACE (feature);
181
182
0
  if (feature_iface->has_feature)
183
0
    return feature_iface->has_feature (feature, type);
184
0
  else
185
0
    return FALSE;
186
0
}