1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * soup-proxy-resolver-static.c: Static proxy "resolution"
5 * Copyright (C) 2008 Red Hat, Inc.
14 #include "soup-proxy-resolver-static.h"
15 #include "soup-address.h"
16 #include "soup-message.h"
17 #include "soup-misc.h"
18 #include "soup-session-feature.h"
23 } SoupProxyResolverStaticPrivate;
24 #define SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_PROXY_RESOLVER_STATIC, SoupProxyResolverStaticPrivate))
26 static void soup_proxy_resolver_static_interface_init (SoupProxyURIResolverInterface *proxy_resolver_interface);
28 G_DEFINE_TYPE_EXTENDED (SoupProxyResolverStatic, soup_proxy_resolver_static, G_TYPE_OBJECT, 0,
29 G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, NULL)
30 G_IMPLEMENT_INTERFACE (SOUP_TYPE_PROXY_URI_RESOLVER, soup_proxy_resolver_static_interface_init))
40 static void set_property (GObject *object, guint prop_id,
41 const GValue *value, GParamSpec *pspec);
42 static void get_property (GObject *object, guint prop_id,
43 GValue *value, GParamSpec *pspec);
45 static void get_proxy_uri_async (SoupProxyURIResolver *proxy_resolver,
47 GMainContext *async_context,
48 GCancellable *cancellable,
49 SoupProxyURIResolverCallback callback,
51 static guint get_proxy_uri_sync (SoupProxyURIResolver *proxy_resolver,
53 GCancellable *cancellable,
57 soup_proxy_resolver_static_init (SoupProxyResolverStatic *resolver_static)
62 finalize (GObject *object)
64 SoupProxyResolverStaticPrivate *priv =
65 SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE (object);
68 soup_uri_free (priv->proxy_uri);
70 G_OBJECT_CLASS (soup_proxy_resolver_static_parent_class)->finalize (object);
74 soup_proxy_resolver_static_class_init (SoupProxyResolverStaticClass *static_class)
76 GObjectClass *object_class = G_OBJECT_CLASS (static_class);
78 g_type_class_add_private (static_class, sizeof (SoupProxyResolverStaticPrivate));
80 object_class->set_property = set_property;
81 object_class->get_property = get_property;
82 object_class->finalize = finalize;
84 g_object_class_install_property (
85 object_class, PROP_PROXY_URI,
86 g_param_spec_boxed (SOUP_PROXY_RESOLVER_STATIC_PROXY_URI,
88 "The HTTP Proxy to use",
94 set_property (GObject *object, guint prop_id,
95 const GValue *value, GParamSpec *pspec)
97 SoupProxyResolverStaticPrivate *priv =
98 SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE (object);
103 uri = g_value_get_boxed (value);
105 soup_uri_free (priv->proxy_uri);
107 priv->proxy_uri = uri ? soup_uri_copy (uri) : NULL;
110 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
116 get_property (GObject *object, guint prop_id,
117 GValue *value, GParamSpec *pspec)
119 SoupProxyResolverStaticPrivate *priv =
120 SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE (object);
124 g_value_set_boxed (value, priv->proxy_uri);
127 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
133 soup_proxy_resolver_static_interface_init (SoupProxyURIResolverInterface *proxy_uri_resolver_interface)
135 proxy_uri_resolver_interface->get_proxy_uri_async = get_proxy_uri_async;
136 proxy_uri_resolver_interface->get_proxy_uri_sync = get_proxy_uri_sync;
139 SoupProxyURIResolver *
140 soup_proxy_resolver_static_new (SoupURI *proxy_uri)
142 return g_object_new (SOUP_TYPE_PROXY_RESOLVER_STATIC,
143 SOUP_PROXY_RESOLVER_STATIC_PROXY_URI, proxy_uri,
148 SoupProxyURIResolver *proxy_resolver;
149 SoupProxyURIResolverCallback callback;
151 } SoupStaticAsyncData;
154 idle_return_proxy_uri (gpointer data)
156 SoupStaticAsyncData *ssad = data;
157 SoupProxyResolverStaticPrivate *priv =
158 SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE (ssad->proxy_resolver);
160 ssad->callback (ssad->proxy_resolver,
161 SOUP_STATUS_OK, priv->proxy_uri,
163 g_object_unref (ssad->proxy_resolver);
164 g_slice_free (SoupStaticAsyncData, ssad);
170 get_proxy_uri_async (SoupProxyURIResolver *proxy_resolver,
172 GMainContext *async_context,
173 GCancellable *cancellable,
174 SoupProxyURIResolverCallback callback,
177 SoupStaticAsyncData *ssad;
179 ssad = g_slice_new0 (SoupStaticAsyncData);
180 ssad->proxy_resolver = g_object_ref (proxy_resolver);
181 ssad->callback = callback;
182 ssad->user_data = user_data;
183 soup_add_completion (async_context, idle_return_proxy_uri, ssad);
187 get_proxy_uri_sync (SoupProxyURIResolver *proxy_resolver,
189 GCancellable *cancellable,
192 SoupProxyResolverStaticPrivate *priv =
193 SOUP_PROXY_RESOLVER_STATIC_GET_PRIVATE (proxy_resolver);
195 *proxy_uri = soup_uri_copy (priv->proxy_uri);
196 return SOUP_STATUS_OK;