/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 | } |