Remove build warning
[platform/upstream/libsoup.git] / libsoup / soup-requester.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * soup-requester.c:
4  *
5  * Copyright (C) 2010, Igalia S.L.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24
25 #define LIBSOUP_USE_UNSTABLE_REQUEST_API
26
27 #include "soup-requester.h"
28 #include "soup.h"
29
30 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
31
32 static SoupSessionFeatureInterface *soup_requester_default_feature_interface;
33 static void soup_requester_session_feature_init (SoupSessionFeatureInterface *feature_interface, gpointer interface_data);
34
35 struct _SoupRequesterPrivate {
36         SoupSession *session;
37 };
38
39 G_DEFINE_TYPE_WITH_CODE (SoupRequester, soup_requester, G_TYPE_OBJECT,
40                          G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE,
41                                                 soup_requester_session_feature_init))
42
43 static void
44 soup_requester_init (SoupRequester *requester)
45 {
46         requester->priv = G_TYPE_INSTANCE_GET_PRIVATE (requester,
47                                                        SOUP_TYPE_REQUESTER,
48                                                        SoupRequesterPrivate);
49 }
50
51 static void
52 soup_requester_class_init (SoupRequesterClass *requester_class)
53 {
54         g_type_class_add_private (requester_class, sizeof (SoupRequesterPrivate));
55 }
56
57 static void
58 soup_requester_attach (SoupSessionFeature *feature, SoupSession *session)
59 {
60         SoupRequester *requester = SOUP_REQUESTER (feature);
61
62         requester->priv->session = session;
63
64         soup_requester_default_feature_interface->attach (feature, session);
65 }
66
67 static void
68 soup_requester_detach (SoupSessionFeature *feature, SoupSession *session)
69 {
70         SoupRequester *requester = SOUP_REQUESTER (feature);
71
72         requester->priv->session = NULL;
73
74         soup_requester_default_feature_interface->detach (feature, session);
75 }
76
77 static gboolean
78 soup_requester_add_feature (SoupSessionFeature *feature, GType type)
79 {
80         SoupRequester *requester = SOUP_REQUESTER (feature);
81
82         if (!g_type_is_a (type, SOUP_TYPE_REQUEST))
83                 return FALSE;
84
85         soup_session_add_feature_by_type (requester->priv->session, type);
86         return TRUE;
87 }
88
89 static gboolean
90 soup_requester_remove_feature (SoupSessionFeature *feature, GType type)
91 {
92         SoupRequester *requester = SOUP_REQUESTER (feature);
93
94         if (!g_type_is_a (type, SOUP_TYPE_REQUEST))
95                 return FALSE;
96
97         soup_session_remove_feature_by_type (requester->priv->session, type);
98         return TRUE;
99 }
100
101 static gboolean
102 soup_requester_has_feature (SoupSessionFeature *feature, GType type)
103 {
104         SoupRequester *requester = SOUP_REQUESTER (feature);
105
106         if (!g_type_is_a (type, SOUP_TYPE_REQUEST))
107                 return FALSE;
108
109         return soup_session_has_feature (requester->priv->session, type);
110 }
111
112 static void
113 soup_requester_session_feature_init (SoupSessionFeatureInterface *feature_interface,
114                                      gpointer interface_data)
115 {
116         soup_requester_default_feature_interface =
117                 g_type_default_interface_peek (SOUP_TYPE_SESSION_FEATURE);
118
119         feature_interface->attach = soup_requester_attach;
120         feature_interface->detach = soup_requester_detach;
121         feature_interface->add_feature = soup_requester_add_feature;
122         feature_interface->remove_feature = soup_requester_remove_feature;
123         feature_interface->has_feature = soup_requester_has_feature;
124 }
125
126 SoupRequester *
127 soup_requester_new (void)
128 {
129         return g_object_new (SOUP_TYPE_REQUESTER, NULL);
130 }
131
132 static void
133 translate_error (GError *error)
134 {
135         if (error->domain != SOUP_REQUEST_ERROR)
136                 return;
137
138         error->domain = SOUP_REQUESTER_ERROR;
139         if (error->code == SOUP_REQUEST_ERROR_BAD_URI)
140                 error->code = SOUP_REQUESTER_ERROR_BAD_URI;
141         else if (error->code == SOUP_REQUEST_ERROR_UNSUPPORTED_URI_SCHEME)
142                 error->code = SOUP_REQUESTER_ERROR_UNSUPPORTED_URI_SCHEME;
143         else
144                 g_warn_if_reached ();
145 }
146
147 /**
148  * soup_requester_request:
149  *
150  * Return value: (transfer full):
151  */
152 SoupRequest *
153 soup_requester_request (SoupRequester *requester, const char *uri_string,
154                         GError **error)
155 {
156         SoupRequest *req;
157
158         g_return_val_if_fail (SOUP_IS_REQUESTER (requester), NULL);
159
160         req = soup_session_request (requester->priv->session,
161                                     uri_string, error);
162         if (req || !error)
163                 return req;
164
165         translate_error (*error);
166         return NULL;
167 }
168
169 /**
170  * soup_requester_request_uri:
171  *
172  * Return value: (transfer full):
173  */
174 SoupRequest *
175 soup_requester_request_uri (SoupRequester *requester, SoupURI *uri,
176                             GError **error)
177 {
178         SoupRequest *req;
179
180         g_return_val_if_fail (SOUP_IS_REQUESTER (requester), NULL);
181
182         req = soup_session_request_uri (requester->priv->session,
183                                         uri, error);
184         if (req || !error)
185                 return req;
186
187         translate_error (*error);
188         return NULL;
189 }
190
191 GQuark
192 soup_requester_error_quark (void)
193 {
194         static GQuark error;
195         if (!error)
196                 error = g_quark_from_static_string ("soup_requester_error_quark");
197         return error;
198 }
199
200 G_GNUC_END_IGNORE_DEPRECATIONS